关于jquery:我在乐字节学习前端的第十-一-天最常见的20道jQuery经典面试题最常见的20道jQuery经典面试题

jQuery 库中的 $() 是什么?(答案如下)$() 函数是 jQuery() 函数的别称,乍一看这很怪异,还使 jQuery 代码艰涩难懂。一旦你适应了,你会爱上它的简洁。$() 函数用于将任何对象包裹成 jQuery 对象,接着你就被容许调用定义在 jQuery 对象上的多个不同办法。你甚至能够将一个选择器字符串传入 $() 函数,它会返回一个蕴含所有匹配的 DOM 元素数组的 jQuery 对象。这个问题我曾经见过好几次被提及,只管它十分根底,它常常被用来辨别一个开发人员是否理解 jQuery。 网页上有 5 个 <div> 元素,如何应用 jQuery来抉择它们?(答案)另一个重要的 jQuery 问题是基于选择器的。jQuery 反对不同类型的选择器,例如 ID 选择器、class 选择器、标签选择器。鉴于这个问题没提到 ID 和 class,你能够用标签选择器来抉择所有的 div 元素。jQuery 代码:$("div"),这样会返回一个蕴含所有 5 个 div 标签的 jQuery 对象。更具体的解答参见下面链接的文章。 jQuery 里的 ID 选择器和 class 选择器有何不同?(答案)如果你用过 CSS,你兴许就晓得 ID 选择器和 class 选择器之间的差别,jQuery 也同样如此。ID 选择器应用 ID 来抉择元素,比方 #element1,而 class 选择器应用 CSS class 来抉择元素。当你只须要抉择一个元素时,应用 ID 选择器,而如果你想要抉择一组具备雷同 CSS class 的元素,就要用 class 选择器。在面试过程中,你有很大几率会被要求应用 ID 选择器和 class 选择器来写代码。上面的 jQuery 代码应用了 ID 选择器和 class 选择器: ...

November 30, 2020 · 2 min · jiezi

关于jquery:高德最佳实践Serverless-规模化落地有哪些价值

作者 | 何以然(以燃) 导读:已经看上去很美、始终被张望的 Serverless,现已逐步进入落地的阶段。往年的"十一出行节",高德在外围业务规模化落地 Serverless,由 Serverless 撑持的业务在流量高峰期的体现非常优良。传统利用也能带来同样的体验,那么 Serverless 的差异化价值又是什么呢?本文分享高德 Serverless 规模化落地背地的实际总结。随着 Serverless 概念的进一步遍及,开发者曾经从张望状态进入尝试阶段,更多的落地场景也在一直解锁。“Serverless 只适宜小场景吗?”、“只能被事件驱动吗?” 这些晚期对 Serverless 的质疑正在逐步消散,用户正在更多的外围场景中,开始采纳 Serverless 技术达到提效、弹性、老本优化等目标。作为地图利用的领导者,高德为带给用户更好的出行体验,一直在新技术畛域进行摸索,在外围业务规模化落地 Serverless,现已获得显著功效。 2020 年的“十一出行节”期间,高德地图发明了记录 ——截止 2020 年 10 月 1 日 13 时 27 分 27 秒,高德地图当日沉闷用户冲破 1 亿,比 2019 年 10 月 1 日提前 3 时 41 分达成此记录。 期间,Serverless 作为其中一个核心技术场景,安稳扛住了流量高峰期的考验。值得一提的是,由 Serverless 撑持的业务在流量高峰期的体现非常优良,每分钟函数调用量靠近两百万次。这再次验证了 Serverless 根底技术的价值,进一步拓展了技术场景。 业务场景自主出行是高德地图的外围业务,波及到用户出行相干的性能诉求,承载了高德地图 APP 内最大的用户流量。下图为自主出行外围业务中利用 Node FaaS 的局部场景,从左至右顺次为:主图场景页、路线布局页、导航完结页。 随着性能的进一步拓展,高德地图从导航工具降级为出行服务平台和生存信息服务入口,进一步拓展了出行相干的生存信息服务场景,带给用户更全面的用户体验。上图性能为场景举荐卡片,旨在依据用户出行用意举荐信息,晋升用户出行体验。此性能需具备疾速迭代,款式调整高灵活性的能力。因而,将卡片款式模版寄存于云端,通过服务下发的模式渲染至客户端无疑为最优抉择,能够满足业务疾速灵便迭代的目标。 通过计划评估判断,此场景类型属于无状态服务,基于阿里云 Serverless 成熟的生态,高德最终抉择接入 Node FaaS(阿里云函数计算)服务能力,出行前端搭建了场景举荐卡片服务。卡片的 UI 模版获取、数据申请聚合&逻辑解决、拼接生成 Schema 的能力均在 FaaS 层失去实现,客户端依据服务下发的 Schema 间接渲染展现,达到更加轻便灵便的指标。 ...

November 30, 2020 · 1 min · jiezi

关于jquery:2020双11养猫技术大揭秘

简介: 你养猫了没? 作者 | 淘系-珑晴在电商畛域,互动是一个重要的用户增长计划,在晋升用户黏性、沉闷以及拉新上都施展着重要的作用。往年双11,淘系互动团队推出了“超级星秀猫”,咱们不盖楼、不开车,全民参加养猫出道,3只风格各异的萌猫咪一经问世,霎时俘获了有数消费者的心。通过 EVA 互动体系一整套解决方案,大幅晋升研发效率,撑持全民养猫猫在手淘、猫客、支付宝等多个 APP 互通。借助客户端能力及 EVA 互动体系将性能与内存良好管制,让少数用户体验高清稳固的互动,实现 0 故障及秒开,同时星秀猫参加人数再创新高。这篇文章将次要从页面渲染基建、EVA 研发体系和全局稳定性计划 3 个方面,来具体论述淘系互动前端团队是如何做到双11互动又快又好又稳的。 页面渲染基建不晓得大家有没有发现,往年的双11养猫互动(以下简称双11互动)页面关上特地快,具体可看上面与去年双11互动主页在 iPhone 11 PRO 机器手机淘宝上的主页加载比照视频。不仅如此,还有个显著的变动是以往互动页面的标配--进度条没有了。 点击查看视频互动主页加载比照,左:2019年双11,右:2020年双11,机型:iPhone 11 PRO 见多识广的你兴许会问,是不是往年双11互动应用了 Native 版本?是不是往年双11互动应用了缓存计划?是不是往年双11互动也应用了预渲染技术?然而,答案是,都没有,往年双11互动与历年狂欢城一样,依然是 web 页面,且资源全副走 CDN 无额定缓存。 那么,咱们是如何做到如此顺滑的加载体验呢?这就要从 Solution 说起。 Solution 是天马搭建体系(https://zhuanlan.zhihu.com/p/137470317 )的概念,次要解决的问题是将模块+数据组合成页面,简略了解就是负责页面渲染 Layout。自去年618起,淘系互动团队全副业务都开始迁徙到天马搭建体系,Solution 也应用了官网举荐的通用 Solution。然而,通用 Solution 因为其通用性,繁杂了淘宝/天猫 60% 以上业务逻辑(粗略预计),体积大的同时易受其余业务影响导致稳定性危险高;而互动因为其业务特殊性,很多优化甚至稳定性保障计划的实现也须要在 Solution 层面进行定制。基于此,淘系互动团队定制了本人的页面渲染计划,即互动专用 Solution,这也是往年双11互动之所以那么快的外围起因。 得益于天马团队提供的新版 Solution 解决方案,既提供了标准化端渲染机制,又提供了基于插件进行业务定制的能力,还提供了产品化平台。互动专用 Solution 是在上述解决方案的根底上扩大实现,次要做了以下事件: 精简根底依赖/逻辑,去除非必要依赖及非必要逻辑依据互动场景定制模块加载程序,提供分批加载能力(以后次要是首屏/非首屏)提供数据处理能力,通过去除渲染无关字段实现数据主动瘦身内置基于客户端评分的稳定性保障计划,保障互动页面稳定性,详见上面稳定性计划章节减少资源及模块加载监控,保障稳定性集成互动通用能力,包含规范化 CSS/通用的渲染干涉能力/罕用的挪动端调试计划/页面高低线能力等 EVA 研发体系往年双11互动,十分多的用户反馈猫猫们太难看了、太萌了、特地可恶,很多人都纷纷来征询小编是如何开发进去的。接下来将重点论述双11星秀喵加工厂--EVA 研发体系,TA 是淘系互动团队提供的从素材上传到端上渲染的互动研发的一整套解决方案,以引擎、框架、工具、平台为支点,致力于为宽广前端带来简略舒服的互动研发体验。 EVA 研发体系,提供互动研发一条龙服务,咱们是认真的EVA Store:素材上传服务大家看到的星秀喵,并不是3D模型,而是如假包换的2D骨骼动画。它应用 Spine制作,通过网格自在变形和蒙皮技术在视觉上出现“3D轴”的偏转,利用此类技术的动画软件还有赫赫有名的 Live2D。在 Spine 弱小动画创作的反对下,双11的星秀喵才有了“3D化”的动画化表现力。一个规范的Spine动画文件蕴含一张雪碧图、一份骨骼数据以及一份动画数据,那么,咱们应该如何上传到 CDN 呢? ...

November 27, 2020 · 2 min · jiezi

关于jquery:了解一下这款jQuery-UI组件库的分页功能看如何让web移动开发更简单

点击获取工具>>Kendo UI Pager小部件可应用灵便直观的UI将一组数据拆分成多个页面。 Pager的用户界面对于分页具备数据源且没有内置分页的内置UI数据绑定组件很有用,例如ListView或须要分页选项的场景,例如带有数据源的Kendo模板 。 Pager是Kendo UI for jQuery的一部分,后者是一个专业级的UI库,具备90多个组件,可用于构建古代且功能丰富的应用程序。点击申请试用>> 您能够自定义页码模板或应用输出来导航到特定页面,切换上一个和下一个按钮的可见性,包含页面大小下拉列表并更改信息音讯,pager API还提供本地化其余音讯的性能。 初始化Pager要应用Pager,请应用空的<div>元素,并在初始化脚本中提供其设置。 上面的示例演示如何将pager绑定到数据源并启用pageSizes选项。 留神:您能够应用近程数据源代替本地数据数组。 在本示例中,为简洁起见,应用了本地数组。 `<div id="pager"></div> <script>var dataSource = new kendo.data.DataSource({data: [{ productName: "Tea", category: "Beverages" },{ productName: "Coffee", category: "Beverages" },{ productName: "Ham", category: "Food" },{ productName: "Bread", category: "Food" }],pageSize: 2}); $("#pager").kendoPager({dataSource: dataSource,pageSizes: [2, 3, 4, "all"]}); dataSource.read();</script><style> pager {margin-top: 100px;}</style>` 性能和特点Pager设置和类型响应式PagerPager模板全球化与音讯援用现有实例要援用现有的Pager实例,请应用jQuery.data()办法。建设援用后,请应用 Pager API来管制其操作。 var pager = $("#pager").data("kendoPager");

November 26, 2020 · 1 min · jiezi

关于jquery:我在乐字节学习前端的第九天js实现jQuery的简单方法和链式操作

我用这篇文章来理一理如何用js去实现封装jQuery的简略办法。文末有残缺代码链接,须要代码的敌人间接看文末本文js实现了上面jquery的几种办法,我将它分为8个小指标实现$(".box1").click( )办法实现$("div").click( )办法思考$( )中参数的三种状况实现jq中的on办法实现链式操作实现jq中的eq办法实现jq中的end办法实现jq中的css办法有不正确的中央还望大家在评论区指出来,谢谢啦。1. 实现$(".box1").click( )办法首先,咱们定第一个小指标,就是如何一步一步去实现下方jQuery代码的性能。 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> //同一个文件下操作的话,前面记得删除上面引入的cdn <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.min.js"></script> <style> .box1 { width: 100px; height: 100px; background: red; } </style></head><body> <div class="box1"></div></body><script> $(".box1").click(()=>{ console.log(456); })</script></html> 这里说一下哈,不会jQuery的小伙伴也别慌,只有你有一点点js根底,花个10分钟到jquery教程简略理解一下即可。$(".box1").click(()=>{ console.log(456); })复制代码 好了,言归正传,咱们来剖析下面jQuery的代码。 $(".box1") 就是实现了选择器的性能。$(".box1").click 就是选择器 + 调用click办法最初在click外面传入函数。第一个小指标就是本人封装js来实现下面代码的性能。咱们分三步走策略来实现。 js实现 $(".box1")实现 $(".box1").click()实现 $(".box1").click( ( ) => { console.log("123") } )第一步就是先用js实现 $(".box1"), 对吧 // 实现$(".box1") class jquery { constructor(arg) { console.log(document.querySelector(arg)); } } function $(arg) { return new jquery(arg); } // 实现$(".box1") let res =  $(".box1"); console.log(res);复制代码 ...

November 25, 2020 · 6 min · jiezi

关于jquery:快手基于-Apache-Flink-的优化实践

本次由快手刘建刚老师分享,内容次要分为三局部。首先介绍流式计算的基本概念, 而后介绍 Flink 的关键技术,最初讲讲 Flink 在快手生产实践中的一些利用,包含实时指标计算和疾速 failover。 一、流式计算的介绍流式计算次要针对 unbounded data(无界数据流)进行实时的计算,将计算结果疾速的输入或者修改。 这部分将分为三个大节来介绍。第一,介绍大数据系统发展史,包含初始的批处理到当初比拟成熟的流计算;第二,为大家简略比照下批处理和流解决的区别;第三,介绍流式计算外面的关键问题,这是每个优良的流式计算引擎所必须面临的问题。 1、大数据系统发展史 上图是 2003 年到 2018 年大数据系统的发展史,看看是怎么一步步走到流式计算的。 2003 年,Google 的 MapReduce 横空出世,通过经典的 Map&Reduce 定义和零碎容错等保障来不便解决各种大数据。很快就到了 Hadoop,被认为是开源版的  MapReduce, 带动了整个apache开源社区的凋敝。再往后是谷歌的 Flume,通过算子连贯等 pipeline 的形式解决了多个 MapReduce 作业连贯解决低效的问题。 流式零碎的开始以 Storm 来介绍。Storm 在2011年呈现, 具备延时短、性能低等个性, 在过后颇受青睐。然而 Storm 没有提供零碎级别的 failover 机制,无奈保障数据一致性。那时的流式计算引擎是不准确的,lamda 架构组装了流解决的实时性和批处理的准确性,已经风行一时,起初因为难以保护也逐步败落。 接下来呈现的是 Spark Streaming,能够说是第一个生产级别的流式计算引擎。Spark Streaming 晚期的实现基于成熟的批处理,通过 mini batch 来实现流计算,在 failover 时可能保障数据的一致性。 Google 在流式计算方面有很多摸索,包含 MillWheel、Cloud Dataflow、Beam,提出了很多流式计算的理念,对其余的流式计算引擎影响很大。 再来看 Kafka。Kafka 并非流式计算引擎,然而对流式计算影响特地大。Kafka 基于log 机制、通过 partition 来保留实时数据,同时也能存储很长时间的历史数据。流式计算引擎能够无缝地与kafka进行对接,一旦呈现 Failover,能够利用 Kafka 进行数据回溯,保证数据不失落。另外,Kafka 对 table 和 stream 的摸索特地多,对流式计算影响微小。 ...

November 24, 2020 · 4 min · jiezi

关于jquery:菜鸟实时数仓20进阶之路

简介:供应链物流场景下的业务复杂度高,业务链路长,节点多,实体多,实时数仓建设难度高。菜鸟跨境进口业务场景更是如此,更简单的场景带来更简单的实体数据模型,对接的业务零碎多导致ETL流程特地简单,还有海量的日均解决数据量,使得团队在建设进口实时数仓的过程中,面临着诸多挑战。如何保障简单实体关系下的数据准确性?如何升高多数据源状况下的数据处理复杂度?如何晋升实时多流Join的解决效率?如何实现实时超时统计?如何实现异常情况下的数据状态复原?本文次要分享菜鸟进口实时数仓的降级教训,以及如何利用Flink的个性解决在开发实际中遇到的问题。 次要内容包含: 相干背景介绍进口实时数仓演进过程挑战及实际总结与瞻望01 相干背景介绍1. 进口业务简介 进口业务的流程大抵比拟清晰,国内的买家下单之后,国外的卖家发货,通过清关,支线运输,到国内的清关,配送,到消费者手里,菜鸟在整个过程中负责协调链路上的各个资源,实现物流履约的服务。去年考拉融入到阿里体系之后,整个进口业务规模占国内进口单量的规模是十分高的。并且每年的单量都在迅速增长,订单履行周期特地长,两头波及的环节多,所以在数据建设时,既要思考把所有数据交融到一起,还要保证数据有效性,是十分艰难的一件事件。 2. 实时数仓加工流程 ① 个别过程 上面简略介绍一下实时数仓的加工流程,个别会对接业务库或者日志源,通过数据同步的形式,比方Sqoop或DataX把音讯同步到消息中间件中暂存,上游会接一个实时计算引擎,对音讯进行生产,生产之后会进行计算、加工,产出一些明细表或汇总指标,放到查问服务上供数据利用端应用。 ② 菜鸟外部流程 在菜鸟外部也是同样的流程,咱们将业务库数据通过DRC ( 数据备份核心 ) 增量采集Binlog日志的形式,同步到TT ( 相似Kafka的消息中间件 ) 做一个音讯暂存,前面会接一个Flink实时计算引擎进行生产,计算好之后写入两种查问服务,一种是ADB,一种是HBase ( Lindorm ),ADB是一个OLAP引擎,阿里云对外也提供服务,次要是提供一些丰盛的多维分析查问,写入的也是一些维度比拟丰盛的轻度汇总或明细数据,对于实时大屏的场景,因为维度比拟少,指标比拟固定,咱们会积淀一些高度汇总指标写到HBase中供实时大屏应用。 02 进口实时数仓演进过程 接下来讲一下进口实时数仓的演进过程: 2014年:进口业务线大略在14年时,建好了离线数仓,能提供日报。 2015年:能提供小时报,更新频度从天到小时。 2016年:基于JStorm摸索了一些实时指标的计算服务,越来越趋向于实时化。因为16年刚开始尝试实时指标,指标还不是特地丰盛。 2017年:菜鸟引进了Blink,也就是Flink在阿里的外部版本,作为咱们的流计算引擎,并且进口业务线在同一年买通了实时明细,通过实时明细大宽表对外提供数据服务。 2018年:实现了菜鸟进口实时数仓1.0的建设。 2020年:开始了实时数仓2.0的建设,为什么开始2.0?因为1.0在设计过程中存在了很多问题,整个模型架构不够灵便,扩展性不高,还有一些是因为没有理解Blink的个性,导致误用带来的一些运维老本的减少,所以前面进行了大的降级革新。 1. 实时数仓1.0 接下来讲一下实时数仓1.0的状况,一开始因为在倒退初期,业务模式不太稳固,所以一开始的策略就是围绕业务小步快跑,比方针对业务1会开发一套实时明细层,针对业务2也会开发一套实时工作,益处是能够随着业务倒退疾速迭代,相互之间不影响,晚期会更灵便。 如上图右侧所示,最底层是各个业务零碎的音讯源,实时工作次要有两层,一层是实时明细层,针对业务线会开发不同的明细表,明细表就是针对该条业务线须要的数据把它抽取过去,在这之上是ADM层,也就是实时应用层,应用层次要针对具体的场景定制,比方有个场景要看整体汇总指标,则从各个明细表抽取数据,产生一张实时汇总层表,整个过程是竖向烟囱式开发,模型比拟凌乱,难扩大,并且存在很多反复计算。 前面也是因为反复计算的问题,进行了一层形象,加了一个前置中间层,对公共的局部进行提取,然而治标不治本,整个模型还是比拟凌乱的,数据建设上也没有进行对立,模型扩展性上也很差。 2. 实时数仓2.0 2.0降级完之后是比拟清晰的一张图: 前置层:底层数据源会接入到前置中间层,屏蔽掉底层一些非常复杂的逻辑。 明细层:前置层会把比拟洁净的数据给到明细表,明细层买通了各个业务线,进行了模型的对立。汇总层:明细层之上会有轻度汇总和高度汇总,轻度汇总表维度十分多,次要写入到OLAP引擎中供多维查问剖析,高度汇总指标次要针对实时大屏场景进行积淀。接口服务:汇总层之上会依据对立的接口服务对外提供数据输入。数据利用:应用层次要接入包含实时大屏,数据利用,实时报表以及音讯推送等。这就是实时数仓2.0降级之后的模型,整个模型尽管看起来比较简单,其实背地从模型设计到开发落地,遇到了很多艰难,破费了很大的精力。上面为大家分享下咱们在降级过程中遇到的挑战及实际。 03 挑战及实际咱们在实时数仓降级的过程中,面临的挑战如下: 1. 业务线和业务模式多 第一个就是对接的业务线比拟多,不同的业务线有不同的模式,导致一开始小步快跑形式的模型比拟割裂,模型和模型之间没有复用性,开发和运维老本都很高,资源耗费重大。 解决方案:逻辑中间层降级 咱们想到的比较简单的思路就是建设对立的数据中间层,比方业务A有出库、揽收、派送等几个业务节点,业务B可能是另外几个节点,整个模型是割裂的状态,但实际上业务倒退到中后期比较稳定的时候,各个业务模式之间绝对比较稳定,这个时候能够对数据进行一个形象,比方业务A有节点1、节点5和其余几个业务模式是一样的,通过这种对齐的形式,找出哪些是公共的,哪些是非公共的,提取进去积淀到逻辑中间层里,从而屏蔽各业务之间的差距,实现对立的数据建设。把逻辑中间层进行对立,还有一个很大的起因,业务A,B,C尽管是不同的业务零碎,比方履行零碎,关务零碎,然而实质上都是同一套,底层数据源也是进行各种形象,所以数仓建模上也要通过对立的思路进行建设。 2. 业务零碎多,超大数据源 第二个就是对接的零碎十分多,每个零碎数据量很大,每天亿级别的数据源就有十几个,梳理起来十分艰难。带来的问题也比拟显著,第一个问题就是大状态的问题,须要在Flink里保护特地大的状态,还有就是接入这么多数据源之后,老本怎么管制。 解决方案:善用State State是Flink的一大个性,因为它能力保障状态计算,须要更正当的利用。咱们要认清State是干什么的,什么时候须要State,如何优化它,这些都是须要思考的事件。State有两种,一种是KeyedState,具体是跟数据的Key相干的,例如SQL中的Group By,Flink会依照键值进行相干数据的存储,比方存储到二进制的一个数组里。第二个是OperatorState,跟具体的算子相干,比方用来记录Source Connector里读取的Offset,或者算子之间工作Failover之后,状态怎么在不同算子之间进行复原。 ...

November 24, 2020 · 1 min · jiezi

关于jquery:WEBjQuery

1 jQuery概述jQuery是一个疾速、简洁的JavaScript框架。jQuery设计的主旨是“write Less,Do More”,即提倡写更少的代码,做更多的事件。它封装JavaScript罕用的性能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。jQuery的外围个性能够总结为:具备独特的链式语法和短小清晰的多功能接口;具备高效灵便的css选择器,并且可对CSS选择器进行扩大;领有便捷的插件扩大机制和丰盛的插件。jQuery兼容各种支流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等。 1.1 劣势(1) 能够极大的简化JS代码 JavaScript形式: var ele = document.getElementsByTagName("p"); //标签var ele = document.getElementsByClassName("info"); //款式var ele = document.getElementById("name"); //id属性jQuery选择器的三种形式: var ele = $("p"); //拜访标签var ele = $(".info"); //拜访css的class款式var ele = $("#name"); //拜访id属性(2) 能够像CSS选择器一样获取html元素css中获取所有的div,给div增加款式: div{css属性。。。}jQuery中获取所有div,给div增加边框款式: $("div").css("border", "2px solid red");(3) 能够通过批改css属性管制页面的成果(4) 能够兼容罕用的浏览器比方: JS中的innerText属性、removeNode()函数、replaceNode( )函数 这些函数 在某些浏览器中是无奈应用的。jQuery中提供了相应的函数( text函数、remove函数、replaceWith函数 )罕用浏览器:谷歌浏览器、火狐浏览器、苹果浏览器、欧朋浏览器~~~~ 1.2 html引入jQuery<script type="text/javascript" src="jquery.min.js"></script>请留神,<script> 标签应该位于页面的 <head> 局部。 2 事件Query提供的文档就绪事件函数(简写模式): <script> $(function(){ //在浏览器加载残缺个html网页后立刻执行 }); </script>其残缺写法为: <script>$(document).ready(function(){ //在浏览器加载残缺个html网页后立刻执行 });</script>按钮的点击事件被触发时: ...

November 23, 2020 · 2 min · jiezi

关于jquery:JQuery

JQuery次要内容 Jquery对象 jQuery 是一套兼容多浏览器的 javascript 脚本库. 核心理念是写得更少,做得更多,应用 jQuery 将极大的进步编写 javascript 代码的效率,帮忙开发者节俭了大量的工作,让写进去的代码更加优雅,更加强壮,“锦上添花”。同时网络上丰盛的 jQuery 插件也让咱们的工作变成了"有了 jQuery,所有 so easy。" --因为咱们曾经站在伟人的肩膀上了。 jQuery 在 2006 年 1 月由美国人 John Resig 在纽约的 barcamp 公布,吸引了来自世界各地的泛滥 JavaScript 高手退出,由 Dave Methvin 带领团队进行开发。现在,jQuery曾经成为最风行的 javascript 框架,在世界前 10000 个拜访最多的网站中,有超过 55%在应用 jQuery。 Jquery的下载与装置下载 http://jquery.com/ 下载 版本 jQuery 2.x has the same API as jQuery 1.x, but does not support Internet Explorer 6, 7,or 8. (不反对 ie6 7 8,如果须要下载 1.X) ...

November 23, 2020 · 8 min · jiezi

关于jquery:jQuery-UI组件库使用技巧小分享让移动Web界面开发更简单

点击获取工具>>Kendo UI目前最新提供Kendo UI for jQuery、Kendo UI for Angular、Kendo UI Support for React和Kendo UI Support for Vue四个控件。Kendo UI for jQuery是创立古代Web应用程序的最残缺UI库。 增加自定义删除确认对话框 上面的示例演示如何向ListView小部件增加自定义Delete确认对话框。 `<div id="example"> <div class="demo-section k-content wide"><div id="confirmation"></div><span class="k-icon k-add"></span>Add new record<div id="listView"></div><div id="pager" class="k-pager-wrap"></div></div> <script type="text/x-kendo-tmpl" id="template"><div class="product-view k-widget"><dl><dt>Product Name</dt><dd>#:ProductName#</dd><dt>Unit Price</dt><dd>#:kendo.toString(UnitPrice, "c")#</dd><dt>Units In Stock</dt><dd>#:UnitsInStock#</dd><dt>Discontinued</dt><dd>#:Discontinued#</dd></dl><div class="edit-buttons">Edit<span class="k-icon k-i-edit"></span>Built-in delete<span class="k-icon k-i-close"></span>Custom delete<span class="k-icon k-i-close"></span></div></div></script> <script type="text/x-kendo-template" id="confirmTemplate">Delete #= ProductName # ? </p>We have #= UnitsInStock # units in stock. </p><button class="k-button" id="yesButton">Yes</button><button class="k-button" id="noButton"> No</button></script><script type="text/x-kendo-tmpl" id="editTemplate"><div class="product-view k-widget"><dl><dt>Product Name</dt><dd><input type="text" class="k-textbox" data-bind="value:ProductName" name="ProductName" required="required" validationMessage="required" /><span data-for="ProductName" class="k-invalid-msg"></span></dd><dt>Unit Price</dt><dd><input type="text" data-bind="value:UnitPrice" data-role="numerictextbox" data-type="number" name="UnitPrice" required="required" min="1" validationMessage="required" /><span data-for="UnitPrice" class="k-invalid-msg"></span></dd><dt>Units In Stock</dt><dd><input type="text" data-bind="value:UnitsInStock" data-role="numerictextbox" name="UnitsInStock" required="required" data-type="number" min="0" validationMessage="required" /><span data-for="UnitsInStock" class="k-invalid-msg"></span></dd><dt>Discontinued</dt><dd><input type="checkbox" name="Discontinued" data-bind="checked:Discontinued"></dd></dl><div class="edit-buttons"><span class="k-icon k-i-check"></span><span class="k-icon k-i-cancel"></span></div></div></script> ...

November 23, 2020 · 4 min · jiezi

关于jquery:申通完美支撑双11亿级包裹背后的云基础设施

简介: 亿级包裹洪峰过境,千万级订单毫秒级响应,零碎稳如泰山。往年双11,申通的零碎前所未有的晦涩与安稳。 往年双11,申通的零碎前所未有的晦涩与安稳 “双11全站跑在阿里云上,亿级包裹洪峰过境,千万级订单毫秒级响应,零碎稳如泰山。” 申通上云的技术负责人方遥难掩骄傲地说。 “11月1日凌晨第一波订单顶峰到来,整个零碎的响应很快,面对超过日常数倍的接单量,零碎的响应工夫没有变动;在接单、自动化分拣、巴枪扫描、快件跟踪等外围指标上体现稳固;相应的中间件、数据库资源的负载也在正当的区间范畴内稳定。”方遥在承受媒体采访时示意。 这让他对第二波订单顶峰信念满满,上云后的申通零碎没有让他悲观。 11月6日,方遥盯着屏幕上稳固运行的后盾零碎,像看本人的孩子。从8月进入双11备战,将近三个月的工夫,经验了无数次压测,双11第一波完结,才算轻松下来。作为申通上云负责人,他短暂的致力,也在此刻失去了最大的回报。 上云前,申通应用线下机房作为计算及数据存储平台,一到双11资源需要就收缩,大促之后则闲置节约;上云后,简直全副的资源都是按量购买,用完双11就开释,真正做到了开箱即用,不产生一天节约。与去年双11当天相比,往年11月1到3日,相比此前传统IDC架构计划,在业务量大幅晋升的状况下,IT投入反而升高了30%。上云的成效显著。 全站利用容器化,弹性调度稳固高效在设计全站上云计划之初,方遥就果决决定拥抱云原生并将所有利用100%容器化,技术转型的决策,是来自其强烈的危机感,2019年快递行业业务量达到600亿件,申通业务量达到73亿件,开始向百亿件规模挺进。 选用阿里云容器服务ACK和容器镜像服务ACR,能够为申通带来两大重要益处:业务疾速上线、开箱即用的牢靠弹性。 在这个疾速多变的时代,企业业务“唯快不破”。通过云原生技术能够做到疾速上线部署,为团队造就出利用开发与运维的规范化操作,造成了将利用代码打包成容器镜像再到K8s标准化部署的流程,不再须要消耗大量工夫人肉公布、也防止了因集群配置不统一而产生故障等问题,胜利转型DevOps驱动公司。 其次,快递的业务是十分典型的周期性业务,在业务爆发式增长的时候,资源如何做到开箱即用?而业务突发增长,哪有比双11更具代表的期间呢,往年双11就是申通是弹性调度的绝佳试验场。 当然容器与Kubernetes技术带来的还有更多:依赖Kubernetes为外围的数据中心通过利用编排、业务故障自愈的能力让整个零碎更稳;通过监控埋点、业务日志收集、链路监控等伎俩保障了在疾速迭代过程中业务零碎的稳定性;通过对计算资源的水位监测,联合业务的峰值状况,弹性扩缩容或升高配规格数量,能够升高整个资源的费用等等。 这个云原生化全站迁云的战斗,一场耗时一年无余。 通过不可胜数的需要沟通与技术改造,在申通与阿里云同学们的一直致力下,申通最终胜利实现采纳云原生技术和架构实现外围业务搬迁上阿里云。 这个决策,为往年双11技术创新埋下了伏笔:比方,利用弹性伸缩大大降低计算成本,一年节俭数百万;又比方,疾速上线更多翻新业务,往年双11的预售商品提前下沉到用户左近,楼上下单楼下发货,晋升顾客体验。 “上云只是一个开始,云只是基础设施。”方遥说,“申通的技术架构会朝着下一代微服务架构Mesh演进,晋升简单零碎的可治理性。” 阿里云神龙裸金属计划,撑持申通平滑度过双11申通外围业务零碎原架构基于 VMware+Oracle 数据库进行搭建。随着搬迁上阿里云,架构全面转型为基于 Kubernetes 的云原生架构体系。其中,引入云原生数据库并实现利用基于容器的微服务革新是整个应用服务架构重构的关键点。 综合思考申通理论业务需要与技术特色,最终抉择了「阿里云 ACK+ 神龙裸金属 + 云数据库」的云原生解决方案,实现外围利用迁徙上阿里云。 阿里云ACK+神龙裸金属计划,于2020年609云峰会上重磅公布。申通云原生上云的基础设施,就全副应用了阿里云的神龙裸金属服务器。相较于个别云服务器(ECS),Kubernetes 搭配神龙服务器可能取得更优性能及更正当的资源利用率且云上资源按需取量,对于领有大促流动等短期大流量业务场景的申通而言极为重要。 首先,云原生裸金属计划,能够满足业务疾速发放和弹性的要求。神龙裸金属服务器可分钟级实现实例创立和启动,并利用Kubernetes的调度和编排能力,通过阿里云容器K8S服务与阿里云基础设施的严密协同(SLB, VPC, NAS, SLS等等),在十分短的工夫内,反对业务极速部署,轻松应答刹时峰值场景对系统敏捷性的要求。 第二, 神龙裸金属的性能,加上容器的弹性,造成了天作之合。“容器+神龙裸金属”的解决方案十分符合像双11这种大流量、高并发的场景。 神龙裸金属是云原生的最佳载体,它规格较高,能够实现高密度容器部署。同时,神龙服务器的性能劣势显著, 它齐全打消了虚拟化损耗,晋升8%的计算性能,其类物理机个性,可进行二次虚拟化。新一代容器服务 ACK,能够将最新神龙弹性裸金属实例的弱小性能施展得酣畅淋漓。 数据显示,容器运行在云上神龙反而比非云物理机的性能要好10%-15%。因为神龙云服务器不仅无虚拟化开销,而且运行在神龙上的每个容器都能够独享弹性网卡ENI,能晋升13%的网络吞吐量。 结语如果说,快递行业上半场的竞争拼的是规模、服务乃至价格,进入下半场,快递企业们还须要比拼硬核的技术实力。 阿里云基础设施首次撑持申通全站业务零碎,申通的双11安稳顺滑,展示了有限后劲。 原文链接本文为阿里云原创内容,未经容许不得转载。

November 23, 2020 · 1 min · jiezi

关于jquery:鹰角网络全球海量数据一键轻松统一存储与处理

简介: 对于鹰角网络遇到的数据激增以及数据对立收治方面的问题,阿里云对象存储 OSS 为其提供了对立的数据存储 池,不便鹰角网络将寰球收集到的海量不同数据进行对立存储,同时阿里云对象存储 OSS 可无缝对接 云原生数据湖 剖析 DLA,DLA 提供扫描量版与 CU 版的 SQL 服务,能够针对 Kudu 与 OSS 做开箱即用的数据分析。帮忙鹰角网 络疾速产出数据报表,让 IT 人员能投入到更多的精力在技术上,推动业务倒退。 公司介绍上海鹰角网络科技有限公司是一家网络游戏研发经营公司, 为了制作出充斥挑战乐趣与领有艺术价值的游戏而诞生,它以开发和经营了手机游戏《明日方舟》在业界闻名。 业务介绍《明日方舟》是一款策略手游,联合二次元、塔防、养成、抽卡等元素,于 2019 年 5 月 1 日公测。一经上线,就引爆国内游戏市场,成为景象级手游,5 月流水高达 6 亿+,某利用商店2次登顶。通过半年筹备,2020 年 1 月《明日方舟》开始在日韩欧美发行,迅速抢占国外手游市场,成为寰球最火爆的手游之一。 《明日方舟》作为一款收费游戏,游戏厂商的主营收来自于游戏内的道具生产,因而如何做到精细化经营,依据用户的沉闷数据、充值数据、偏好数据等为用户推送不同的流动以及玩法。同时因为游戏业务出海以及各地区游戏用户激增减少,因而鹰角网络就须要一个稳固、弹性且高性能的存储与计算平台,来撑持其业务的倒退。 业务难点用户激增,原有架构难以撑持海量数据处理作为一款景象级的手游,《明日方舟》自 2019 年 5 月 1 日上线公测起,便开始抢占各大利用市场下载量和营收金额的头部榜单。因为用户量激增,数据量井喷,十天能生成 5000 亿条数据,原有架构难已撑持现有业务的需要,呈现了利落数据报表速度慢、报表刷新速度长以及计算能力不够的景象。 游戏出海业务火爆,但数据收归成难题2020 年 1 月,《明日方舟》开始启动出海策略,别离进入日本、韩国、欧洲以及美国市场,以 16 天的支出空降“出海游戏 1 月支出榜单”第 18 名,2 月份更是超过泛滥出海明星产品,一举拿下第三名的佳绩。 但战绩辉煌的业绩背地,如何将四个国家海量数据进行对立收归、治理以及计算却成为了不得不面临问题。在日常业务中,为了保障游戏的流畅性和方面数据的收集,须要实现不同区域的本地化部署。但随着本地化部署的欠缺,原生数据生成时会散布在各个不同的国家。如果要实现对立的数据治理,就须要实现跨国数据的对立采集和收归,这就对网络、存储等多个方面提出了更高的要求。 经营策略变动,突发型流量顶峰期间如何应答因为游戏行业本身流量属性以及经营策略,常常会呈现玩家在同个工夫内个体上线或是同时加入某个流动。因而,鹰角网络就须要一个高弹性的存储与计算平台来撑持业务,帮忙其在流量波峰、波谷期轻松实现资源的扩容与缩容。 数据湖解决方案 针对鹰角网络面临的数据量爆炸、数据收归治理、以及数据计算方面遇到的问题,阿里云为其量身订制了一体化 的数据湖解决方案。 对于鹰角网络遇到的数据激增以及数据对立收治方面的问题,阿里云对象存储 OSS 为其提供了对立的数据存储 池,不便鹰角网络将寰球收集到的海量不同数据进行对立存储,同时阿里云对象存储 OSS 可无缝对接 云原生数据湖 剖析 DLA,DLA 提供扫描量版与 CU 版的 SQL 服务,能够针对 Kudu 与 OSS 做开箱即用的数据分析。帮忙鹰角网 络疾速产出数据报表,让 IT 人员能投入到更多的精力在技术上,推动业务倒退。 ...

November 23, 2020 · 1 min · jiezi

关于jquery:KubeVela-正式开源一个高可扩展的云原生应用平台与核心引擎

美国西部工夫 2020 年 11 月 18 日,在云原生技术“最高盛宴”的 KubeCon 北美峰会 2020 上,CNCF 利用交付畛域小组(CNCF SIG App Delivery) 与 Open Application Model (OAM) 社区,以及来自阿里云、微软云的 OAM 我的项目维护者们在演讲中独特发表了 KubeVela 开源我的项目的正式公布。 从 11 月 18 号到 20 号,在为期三天的 KubeCon 北美峰会上有间断 3 场技术演讲,会从不同维度介绍对于 KubeVela 我的项目的具体细节,其中还包含一个长达 1 个半小时的 KubeVela 互动教学环节。多个重量级组织以如此规模和密度在 KubeCon 北美峰会演讲中介绍一个首次公布的社区开源我的项目,在 KubeCon 诞生以来并不多见。 什么是 KubeVela ?一言以蔽之,KubeVela 是一个简略易用且高度可扩大的利用治理平台与外围引擎。KubeVela 是基于 Kubernetes 与 OAM 技术构建的。 具体的说,对于利用开发人员来讲,KubeVela 是一个非常低心智累赘的云原生利用治理平台,外围性能是让开发人员方便快捷地在 Kubernetes 上定义与交付古代微服务利用,无需理解任何 Kubernetes 自身相干的细节。在这一点上,KubeVela 能够被认为是云原生社区的 Heroku。 另一方面,对于平台团队来讲,KubeVela 是一个弱小并且高可扩大的云原生利用平台外围引擎。基于这样一个引擎,平台团队能够疾速、高效地以 Kubernetes 原生的形式在 KubeVela 中植入任何来自云原生社区的利用治理能力,从而基于 KubeVela 打造出本人须要的云原生平台,比方:云原生数据库 PaaS、云原生 AI 平台、甚至 Serverless 服务。在这一点上,KubeVela 能够被认为是一个“以利用为核心”的 Kubernetes 发行版,以 OAM 为外围,让平台团队能够基于 KubeVela 疾速打造出属于本人的 PaaS、Serverless 乃至任何面向用户的云原生平台我的项目。 ...

November 23, 2020 · 3 min · jiezi

关于jquery:权限子系统六Shiro安全框架

Shiro平安框架简介Shiro概述Shiro是apache旗下一个开源平安框架(http://shiro.apache.org/),它将软件系统的平安认证相干的性能抽取进去,实现用户身份认证,权限受权、加密、会话治理等性能,组成了一个通用的平安认证框架。应用shiro就能够十分疾速的实现认证、受权等性能的开发,升高零碎老本。用户在进行资源拜访时,要求零碎要对用户进行权限管制,其具体流程如图所示: Shiro概要架构在概念层面,Shiro 架构蕴含三个次要的理念,如图所示:其中: Subject :主体对象,负责提交用户认证和受权信息。SecurityManager:平安管理器,负责认证,受权等业务实现。Realm:畛域对象,负责从数据层获取业务数据。Shiro具体架构Shiro框架进行权限治理时,要波及到的一些外围对象,次要包含:认证治理对象,受权治理对象,会话治理对象,缓存治理对象,加密治理对象以及Realm治理对象(畛域对象:负责解决认证和受权畛域的数据访问题)等,其具体架构如图所示:其中: Subject(主体):与软件交互的一个特定的实体(用户、第三方服务等)。SecurityManager(平安管理器) :Shiro 的外围,用来协调治理组件工作。Authenticator(认证管理器):负责执行认证操作。Authorizer(受权管理器):负责受权检测。SessionManager(会话治理):负责创立并治理用户 Session 生命周期,提供一个强有力的 Session 体验。SessionDAO:代表 SessionManager 执行 Session 长久(CRUD)动作,它容许任何存储的数据挂接到 session 治理根底上。CacheManager(缓存管理器):提供创立缓存实例和治理缓存生命周期的性能。Cryptography(加密管理器):提供了加密形式的设计及治理。Realms(畛域对象):是shiro和你的应用程序平安数据之间的桥梁。Shiro框架认证拦挡实现(filter)Shiro根本环境配置增加shiro依赖应用spring整合shiro时,须要在pom.xml中增加如下依赖: <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.5.3</version></dependency>Shiro外围对象配置基于SpringBoot 实现的我的项目中,咱们的shiro利用根本配置如下:。 第一步:创立SpringShiroConfig类。要害代码如下: package com.cy.pj.common.config;@Configuration//注解形容的类为一个配置对象,此对象也会交给spring治理(一个非凡的bean对象)public class SpringShiroConfig {}第二步:在Shiro配置类中增加SecurityManager配置(这里肯定要应用org.apache.shiro.mgt.SecurityManager这个接口对象),要害代码如下: @Bean//此注解形容的办法,其返回值(对象)会交给spring治理public SecurityManager securityManager(){//此对象为shiro框架的外围 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); return securityManager;}第三步: 在Shiro配置类中增加ShiroFilterFactoryBean对象的配置。通过此对象设置资源匿名拜访、认证拜访。要害代码如下: //配置ShiroFilterFactoryBean(通过此对象设置资源匿名拜访、认证拜访的资源)@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager);//securityManager对象负责去检测这个申请是否曾经认证 Map<String,String> map=new LinkedHashMap<>(); //动态资源容许匿名拜访:"anon" map.put("/bower_components/**","anon"); map.put("/build/**","anon"); map.put("/dist/**","anon"); map.put("/plugins/**","anon"); //除了匿名拜访的资源,其它都要认证("authc")后拜访 //map.put("/**","authc");//加了记住我性能,批改了认证级别 shiroFilterFactoryBean.setFilterChainDefinitionMap(map);//过滤链的定义 return shiroFilterFactoryBean;}其配置过程中,对象关系如下图所示: Shiro登陆页面出现服务端Controller实现业务形容及设计实现当服务端拦挡到用户申请当前,断定此申请是否曾经被认证,如果没有认证应该先跳转到登录页面。 要害代码剖析及实现.第一步:在PageController中增加一个出现登录页面的办法,要害代码如下: @RequestMapping("doLoginUI")public String doLoginUI(){ return "login";}第二步:批改SpringShiroConfig类中shiroFilterFactorybean的配置,增加登陆url的设置。要害代码见sfBean.setLoginUrl("/doLoginUI")局部。 ...

November 21, 2020 · 4 min · jiezi

关于jquery:深度干货-如何借助云原生搞定Oracle备份快速恢复

简介: DBS Oracle备份产品是阿里云自研的,联合阿里团体之前多年Oracle数据库的生产应用教训打造的云备份产品。它不仅提供了传统备份所提供的Oracle备份能力外,还实现了无入侵流式备份能力,同时和云以及泛滥云产品深度联合,在备份数据上提供数据湖剖析,并通过正本数据管理(CDM)技术提供Oracle秒级复原及devops能力。 Oracle备份面临的挑战在传统企业里,常常会用Oracle数据库去承载业务重要外围数据,同时Oracle针对不同的复原场景提供了灵活多样的复原操作方法,灵便的设计给备份和复原带来了更多的复杂性,因而Oracle的备份治理相比于MySQL而言,对DBA在专业性上有更高的要求。 比如说,Oracle环境有多种:Standalone,Standalone+DataGuard,RAC,RAC+DataGuard,双机Oracle等,其中DataGuard还有多种运行模式,不同的Oracle环境的备份有一些细微差别,一个备份脚本很难同时满足这些场景,如果业务零碎有多套Oracle环境,备份将会非常复杂,例如如何确保全量备份集总是无效的(可复原的)等等。咱们当初以一个具体的案例来阐明这个问题:一致性全量备份。 一致性全量备份何为一致性全量备份 在咱们这篇文章里"一致性全量备份"的定义如下: 条件1:备份集中存在一个间断残缺的归档日志序列,其开始SCN和完结SCN可能笼罩备份开始时的最小的数据文件checkpoint SCN和备份完结时最大数据文件SCN(只读和离线数据文件除外)。 条件2:备份集中蕴含复原所用的全副数据文件,管制文件和参数文件。 条件3:备份集中蕴含尽可能新的归档日志。 条件1和2确保全量备份集的完整性,使得备份集能够独立的被复原(复原出统一的状态)。条件3能够确保全量备份集始终是最新的,不会呈现“丢数据”的场景。满足上述条件的备份集叫做一致性全量备份集。 一致性全量备份的益处一致性全量备份集有哪些益处呢? 不便转储:通常一个备份集是一个存储目录,简略的打包就能够转储到磁带,异地转储。简化复原:复原时不依赖其余备份集,例如定时归档日志备份产生的备份集生效了不会影响全量备份集的有效性,一致性全量备份集总是能够独立的复原。一致性全量备份的难点 图1 一致性全量备份 上面咱们看一下在哪些场景中,咱们有可能得不到一致性全量备份集,图1 中的case2-case5就是典型的非一致性全量备份。 在【case2】中缺失了局部的归档日志,违反了【条件1】中间断残缺的归档日志序列这个条件。如 图2 所示,如果Primary和Standby之间网络呈现了异样,此时主库能够失常地生成新的归档日志,然而Standby上将无奈生成新的归档日志,当网络复原后,DataGuard会从Primary上主动同步最新的归档日志,同时也会同步这部分缺失的归档日志,然而如果在执行全量备份期间,缺失的归档日志还没有被同步到Standby上,那么此时的全量备份集中的归档日志将会蕴含空洞,导致无奈复原。 在【case3】中归档日志的的最小SCN和数据文件最小SCN之间存在gap。图2 中的所有运行模式都有可能呈现这个问题,例如用户在清理Standby上的归档日志时执行了delete force就会导致RMAN将那些还没有被利用的归档日志删除掉。 在【case4】中最新的归档日志SCN和最大的数据文件SCN存在gap。图2 中的【模式三】有可能呈现这个问题,因为它是先同步redo到Standby的redo log file中,当主库执行Switch log之后,Standby上才会将redo log file归档到归档日志。如果Primary和Standby之间网络呈现了问题,那么Primary仍然可能失常生成归档日志,然而备库却不能执行redo log file的切换,不能生成新的归档日志,导致归档日志的SCN小于数据文件的最大SCN。相同,【模式一】和【模式二】则肯定不会呈现这种case,因为他们是先产生归档日志,而后再利用归档日志到数据文件,因而其归档日志最大SCN肯定是大于等于数据文件最大SCN的。 在【case5】中备份集中失落了局部的数据文件,例如,用户开启了(backup optimization)配置,此时RMAN会开启备份优化性能,如果某些文件或者归档日志被其他人备份过了,那么将不会再次备份。 在【条件2】中, 如果Primary上的归档日志或者Redo长时间无奈同步到Standby上,此时可能可能失去满足【case1】的全量备份,既此时的备份是胜利的,也可能独立的复原,然而该全量备份没有蕴含主库最新的归档日志,导致咱们的备份不是最新无效的全量备份。 图2 DataGuard运行模式 因为Primary和Standby的运行原理不一样,在理论业务实现时,会遇到更多的稳定性问题,实现一致性全量备份须要解决如下几个问题: 如何避免Standby上的备份获取不到最新的Primary的Redo日志。当Primary和Standby之间网络提早较大或者呈现网络分区,导致Redo传输太慢或者长时间无奈传输时,备份如何解决。如何发现Primary或者Standby上的归档日志呈现了gap,以及如何解决gap。如何防止备份的数据文件或者归档日志呈现损坏的数据块。此外,在备份的过程中,您可能还要思考如下一些问题:定时的清理曾经备份过的归档日志。避免备份数据中毒/歹意删除,确保任何时候都至多有一个可用的备份集用来做复原。为了满足监管要求,实现备份数据的多地区存储。DBS Oracle 备份上述的两个举例展现了Oracle备份的复杂性和较高的技术难度。而对于以上提出的问题,DBS联合阿里巴巴之前多年的Oracle生产和运维教训通过齐全自主研发,打造了DBS Oracle备份产品,帮忙阿里云客户不便低成本地备份和爱护Oracle数据资产。 图3 DBS Oracle备份示意图 如图3,DBS Oracle 备份与复原采纳 Oracle 内置的 RMAN 技术,实现 Oracle 数据库的热备份和复原。备份管理员在 DBS控制台 简略配置备份策略,零碎会依据用户配置的备份策略主动地创立数据备份工作,DBS零碎向Oracle宿主机DBS备份客户端发送备份命令,DBS备份客户端执行RMAN备份脚本,流式无入侵地读取备份数据,并对数据执行压缩/加密等解决,最初将备份数据写入到云上加密的备份存储。整个备份过程不强占用户本地磁盘空间和IO,对数据库齐全无入侵。而对于数据恢复工作,备份管理员在 DBS控制台 点击发动复原工作,此时DBS调度会向在Oracle宿主机上的 DBS备份客户端 发送复原命令,DBS备份客户端 执行对应的RMAN脚本进行数据恢复。 根底能力它在以后版本具备的技术特点如下: 齐全自研:阿里巴巴之前是Oracle的应用小户,联合之前阿里团体对Oracle生产运维的教训齐全自研打造Oracle备份复原产品,以帮忙用户实现低成本摸索数据库及数据库备份国产化演进门路。兼容的平台:反对Linux平台下的Oracle爱护。反对的数据库版本:10g/11g/12c/18c/19c。反对的备份类型:全量备份和事务日志备份。反对的备份粒度:实例。备份对象:日志文件,管制文件,参数文件,数据文件。加密状况:传输过程反对HTTPS加密,存储反对AES256,BYOK加密反对的复原粒度:Oracle单机复原粒度包含:数据库实例(全库复原)。反对的复原形式:反对原机异实例,异机原地位的指定任意工夫点的复原。RAC 复原到单机:当 Oracle RAC 环境损坏时,反对将 Oracle RAC 复原到单机环境中。归档日志删除策略:基于备份胜利次数,反对主动删除指定时间段内已备份的Oracle 归档日志,防止因归档日志过满影响数据库运行。多通道:开启多通道备份可进步备份效率。用户可为依据数据文件和日志文件的存储量以及业务压力状况别离自定义通道数量,并行读取传输数据,从而充分利用磁盘 I/O。数据库高级压缩:开启数据库高级压缩后,能够在备份过程中对备份数据进行压缩, 节俭磁盘空间,晋升传输效率。无入侵:整个备份复原过程,对源库无入侵,不依赖本地磁盘做直达。它还在继续迭代中,欢送继续关注。差别点为什么要备份上云?DBS Oracle备份是云技术和备份技术的联合,它不仅实现了传统的Oracle备份的能力(如上所述),而且在应用DBS云备份时: ...

November 19, 2020 · 1 min · jiezi

关于jquery:权限子系统四用户模块

用户治理设计说明业务设计说明本模块次要是实现对用户信息的治理,包含用户查问,保留,更新,禁用启用等操作,其业务剖析如下图所示:基于对表的设计,其数据逻辑关系的展现,如图用户表设计的脚本如下: CREATE TABLE `sys_users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) DEFAULT NULL COMMENT '明码', `salt` varchar(50) DEFAULT NULL COMMENT '盐', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `mobile` varchar(100) DEFAULT NULL COMMENT '手机号', `valid` tinyint(4) DEFAULT NULL COMMENT '状态', `deptId` int(11) DEFAULT NULL, `createdTime` datetime DEFAULT NULL COMMENT '创立工夫', `modifiedTime` datetime DEFAULT NULL COMMENT '批改工夫', `createdUser` varchar(20) DEFAULT NULL COMMENT '创立用户', `modifiedUser` varchar(20) DEFAULT NULL COMMENT '批改用户', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='零碎用户';用户与角色的关系表脚本设计如下: ...

November 19, 2020 · 9 min · jiezi

关于jquery:双11还能创造什么新技术

简介: 当下购物峰值不再是最大挑战,下一代技术创新将会呈现在哪里? 诞生12年后,双11依然续写答卷,也留下了问卷:当购物峰值不再是最大挑战,下一代技术创新,将会呈现在哪里? “好的翻新是在低压的场景下产生的,‘双11’发明了一个个低压的场景,让最前沿的技术和最前沿的商业模式,可能产生高速的碰撞。”昨晚,阿里巴巴团体首席技术官程立的双11收官阶段演讲时说,双11的技术挑战将进入新的历史阶段。 往年的双11史上跨度最长,加上新冠疫情背景,有2000多个产业带、30万个外贸工厂和3万多个海内品牌的退出——当有机会将4000万新商品,推向8亿以上消费者时,每一个关键环节,都有诞生新一代技术的可能性。 ▲ 图:阿里巴巴团体CTO程立在双11当晚的演讲 相比程立这样“12年全程参加的工程师”,人们并不能即刻感知技术工程的全副价值,许多我的项目刚开始设计时,说穿了是为消费者和商家节俭几分钟、几块钱;从社会老本上,须要把一个峰值,在工夫或空间上烫平;最终,还是回到如何让每一个订单稳固、高效的达成。 就像程立所说的,往年双11,在新品研发、生产制作、用户触达、供应链、物流配送等环节,技术和商业的共振产生了大量翻新。而它们的最终方向是让“商业因素在线化、数字化,在这个根底上,形成一个真正数字化的商业网络”。 也因为工夫窗口最长,这次双11也让咱们从更长的产业链条上,预测一下将来还会有的新货色: C2M技术会代替“电商”,就像云计算代替传统IT C2M(用户直连制作)兴许还是一个定义不清的词汇,更没有“C2M技术包含什么”的共识。然而,就像云计算公司,代替了IT公司,这届双11让将来的C2M技术集群变得更加清晰。 阿里巴巴至多有三个不同的技术模块,尝试深度买通C2M。 天猫精灵背地的AIoT技术和多模态交互模组,曾经影响了许多家电、家居厂商的智能化设计研发。也带动了一些小家电产业带、外贸工厂的快速增长。整体技术、设计资源的开放度依然是全行业最高的。躺平智造为代表从终端到本地的工业化数字技术,其中3D/AR前端渲染模型,家装设计师的设计软件和建材工厂的生产数据库实现了连贯。双11的10万样板间还只是开始,将来半年还会有2万个门店进入全屋定制业务。犀牛智造在数据智能技术支持下的智能工厂和柔性产线,犀牛智造带给产业带工厂的机会,不仅仅是小样本的测款,更有大数据下的丰盛机会。 家装、家电、家居和服饰都增长显著,这些行业也都存在制作端柔性与消费者共性的强烈趋势,市场规模曾经足够微小。诸如本地化配送组装这类问题,阿里巴巴已有很强技术的末端问题。 加上阿里云在工业大脑畛域多个基础性行业的积攒,兴许不须要太久,淘宝天猫就会从一个电商平台,孵化出一个C2M技术集群,或者智能制作平台。 数字供应链成为大型企业数字化的突破口 如果云是调度线上的资源,供应链则对应企业线下的资源,无疑异样重要。因而,程立在演讲中屡次征引了阿里巴巴一个叫DChain的我的项目。通过这当中的智能预测技术,在双11前,曾经将超过11亿商品提前调配进离潜在消费者最近的物流仓库;让一些批发企业间接省去了仓储物流老本,间接从工厂进行发货;甚至,在主播的直播间开启前夜,也能够去预测千万级规模的订单,可能会散布在哪里。 图:程立演讲中提到社会可共享的服务能力 这套零碎目前应该通过菜鸟数字仓储体系,和阿里云的新批发中台产品等界面,都能够让企业接触应用。能够想见,在淘宝特价版或者批发通这样十分下沉的商品治理中,这种能力会更大幅度晋升过来由人工治理的供应效率。然而,仅此而已吗? 企业的供给打算,是整个经营资源决策的外围,相比过来解决的客户关系问题,过来会被认为因为库存进出频率不高,而没有率先进入数字化。而实际上很可能是因为没有足够多真的能够优化供给的数据和算法。很少有机构的数字供应链能够汇集阿里巴巴当初这么多维度链路。并且曾经将影响供应链的订单音讯,与简直所有这个畛域的140多家服务商有深度的技术对接;一旦大型企业能够参考,则会带动上下游大量生态企业。这个畛域也不须要新的软件,而是须要新的数据处理和算法框架,例如在阿里巴巴商家服务和数据仓库产品中曾经大量存在的流批一体架构。双11积攒的教训,仿佛越来越凑近产品化了。此外,还有淘宝天猫新品平台,这样间接帮忙品牌研发晚期的技术平台。对于一些须要用爆品来决定企业打算的行业,将十分要害。 对消费者和产业的了解,可能催生出新的智能计算框架 11月3日的阿里巴巴双11技术沟通会上,首次详解了认知智能引擎,在商业AI体系中的重要作用。紧接着11月9日,这个团队就受邀在中国科协、中国科学院、中国工程院主办的顶级会议上,公布开源一站式图计算引擎GraphScope。 这个开源框架还没有颁布特地多细节,然而从项目组的介绍看,它间接来自于双11中每天数千亿次调用的智能场景是无疑的: 在阿里巴巴的场景里,因为有产业、地区、经济行为等概念化的图谱存在,对于计算的需要与个别的深度学习场景是不同的。具备这种遍历图的能力后,针对不同行业,更高认知程度的智能技术才有可能产生。图计算性能近年来曾经提高的数10倍,但依然存在三个大规模利用挑战:一是相干畛域问题简单,计算模式多样,大量解决方案碎片化;二是学习难度大,对于非专业编程人士门槛很高;三是跨域数据量大、计算效率依然偏低。GraphScope与TensorFlow等框架,在零碎上会有一个协同关系,行将深度学习和传统的图模型做更严密的联合,获得更好的成果。 图:阿里巴巴认知智能团队介绍的图计算利用场景 外界对平台型公司的察看,往往颗粒度差别很大。尤其对阿里巴巴科技,每个人摸到的部位不同,评估不一。因为涉猎的行业最丰盛,阿里巴巴仿佛始终是最违心向客户展现最新研发产出的大型公司:有的在天上,有的长在地里,有中台这样摸索中的架构理念,也有云栖大会间断抛出达摩院、平头哥这样的爆炸性新闻。 如果回到公司策略之一:云计算与大数据,在历年双11的催化下,阿里巴巴自研云计算、数据库的故事,都最终实现了这种因素级的技术创新。云计算在中国规模与增速同时放弃第一、数据库在中国曾经超过Oracle位列第一;不仅撑持了双11,而且是许多国民利用的基础设施。 与个别关闭集中式的垄断平台不同,高科技倒退,肯定是凋谢和利他的。从一个个门路越来越丰盛的双11订单也能看出,保持大规模的凋谢接口,放弃高频率的社会协同,自身就是最可继续的翻新。 原文链接本文为阿里云原创内容,未经容许不得转载。

November 18, 2020 · 1 min · jiezi

关于jquery:云原生时代微服务的高可用架构设计

简介: 在8月20日“阿里巴巴技术品质精品课”上,来自蚂蚁的经国分享了对云原生时代微服务的高可用架构设计的全面解析,为大家介绍了利用架构演进门路、云原生时代的技术福利、高可用架构的设计准则以及经典案例的设计。 演讲嘉宾简介:经国,蚂蚁金服资深技术专家,毕业于浙江大学。2014年退出蚂蚁金服,先后负责过支付宝的单元化、弹性、去ORACLE等架构降级,负责多年支付宝双十一、双十二、新春红包大型流动等技术保障负责人,现为蚂蚁金服数字金融线负责技术危险架构师,负责高可用架构、技术危险平台、应急快反等技术底盘的建设。 **以下内容依据演讲视频以及PPT整顿而成。本次分享次要围绕以下五个方面:• 利用架构演进门路• 云原生时代的技术福利• 高可用架构的设计准则• 经典案例的设计• 将来思考** 微服务是当下十分热门的一种架构,阿里目前正在从SOA架构体系向微服务架构迁徙。同时整个软件应用研发开始进入云原生时代。在这些技术演进背景下探讨如何更好地实现稳固且高可用的架构计划,保障利用继续可用十分有必要。 一、利用架构演进门路支付宝最开始是一个单体利用。随着业务一直倒退,支付宝拆分成了多个服务,衍生出了若干代架构。微服务是服务化后的进一步演进,服务的粒度比服务化更细,具备很好的流量管控机制,中间件和编程模型。云原生的倒退使Serverless也失去了倒退,FAAS是Serverless的一种典型实现,可能以十分小的老本搭建小程序。另外,低代码和无代码当初也十分风行。 基础设施同样也失去了很好的倒退。最开始,单体架构是托管式的,通常将应用程序托管给电信运营商的某个机房,在物理机上运行单体利用。起初,基础设施开始向虚拟化演进,比方VMware等公司在物理机上构建虚拟化层和虚拟机,在虚拟机上运行操作系统。再起初,云化联合虚拟化技术和基础设施,在虚拟机上运行Docker过程,在Docker过程中运行应用程序。当初,依据云通将来的理念,包含蚂蚁在内的很多公司都在实现上云。蚂蚁的基础设施曾经齐全实现了云化,包含私有云和公有云。从架构角度来看,蚂蚁的基础设施就是在云底座上运行一层K8S,在Pod里运行APP,其下层对应着FAAS、网格化、Service mesh、微服务等应用程序。 作为一个简单的业务利用,如何实现技术撑持对蚂蚁十分要害。蚂蚁目前正在尝试许多FAAS相干的技术选型,但从更大的范畴来看,微服务依然是支流的抉择。蚂蚁所应用的微服务架构自身也在一直演进,比方把和业务无关的性能下沉到Sidecar,将数据库的一些中间件mesh化等。只管从利用研发的角度看,蚂蚁所应用的架构格调相比于原来产生了很大的变动,但从整体趋势来看,最次要的变动仍在于将和业务能力无关并且和基础设施相干的能力下沉。 二、云原生时代的技术红利云原生曾经演化成了一个十分宏大的生态。这张图囊括了云原生里十分多的内容。从设计高可用且稳定性高的利用的角度来看,相干的内容包含数据库技术、云原生存储、Service mesh、可观测性、Serverless等。 数据库技术利用开发不仅须要关注业务逻辑,还须要关注数据,将畛域模型、业务流程、配置等数据以Online模式存储。近几年,数据库技术产生了很大的变动,HBase等分布式数据库提供的强统一保障给云原生利用的设计和开发带来了许多益处。此前,利用设计须要思考读写拆散,须要连贯不同的数据源解决读写拆散的后果,并且这些性能都须要写入利用程序代码。而当初,这些性能能够间接利用数据库的程度扩大能力来实现,数据库技术的倒退极大地防止了咱们间接和数据层交互。 云原生存储蚂蚁的大部分业务曾经实现云盘存储,也就是将日志存储到远方磁盘。此前,单体利用通常将数据存储于本机磁盘,并且不提供其它冗余备份;而云盘则默认提供数据冗余,这在基于日志不牢靠假如进行利用设计时带来了很多变动。 可观测性应用程序存在着许多监控操作。随着Sidecar将很多能力下沉,包含拜访RPC和DB,此前以中间件模式实现的监控操作,当初则以切面模式来实现,二者有很大的区别。 云原生时代的技术红利云原生时代带来的最大变动在于基础设施和业务逻辑的真正解耦。此前,中间件逻辑存在于应用程序的过程中,而当初压测、限流等都能够在Sidecar中实现,从而解耦了基础设施和业务逻辑。然而,这种解耦是一直进行着的,即便在将来也很难做到业务齐全不须要关注基础设施。比方,业务流量应该多大,DB节点应该设置多少个,业务流量和DB的设计是否符合要求。比方,同步的要害业务对应的流量链路和异步化工作可能运行在同一个节点中,那么如何实现二者流量隔离就是一个难题。再比方,如何联合基础设施和业务要求进行部署,保障内存和CPU正当调配。在基础设施对这些内容无感知的前提下,如何自动化地进行混布和限流。从利用研发的视角来看,此前须要写很多代码来实现业务逻辑和基础设施交互;而当初相应的代码量会缩小很多。 三、高可用架构设计的设计准则三个架构设计准则:可观测、可灰度、可回滚高可用设计次要有三个准则,包含可观测、可灰度、可回滚。大部分云研发场景并不需要关注可演变,但在一些非凡场景下可演变依然是一个问题。比方,蚂蚁的金融业务须要和一些机构进行信息替换,因为金融畛域的RPC交互经常应用标准化文件,在文件场景下如何保障可演变也是高可用设计须要关注的内容。典型的用于进步架构可用性的设计准则包含四种:解耦、冗余、异构和异步。 解耦在数据库方面,如何解耦外围和非核心业务的DB。在业务链路方面,因为微服务具备简单的业务场景和节点,这些业务场景和节点间如何混合,业务节点如何撑持业务链路,容量有余时哪些业务场景应优先通过,限流时应优先限流哪些业务等也是解耦须要关注的内容。总体而言,解耦准则要求将最外围的业务链路隔离进去,使其与其它业务间的耦合尽可能小。 冗余应用程序可能有多个机房,如果多个机房间存在数据冗余,那么一个地位的谬误就可能由另一个地位的数据来补救,从而保证系统的继续可用。读写拆散也是一种冗余设计,缓存和DB间存在数据冗余,当缓存宕机时,能够从DB回源到缓存。 异构如果多个DB间是同构的,那么可能存在一些状况使得中心化的内容同时挂掉;但如果DB是异构的,比方应用的数据库版本不同,那么这些数据库同时挂掉的状况则非常少。 异步异步要求将业务流程的外围局部形象进去,使其不与非核心的内容耦合。从实践上看,外围局部越精炼,零碎出谬误的概率越小。比方,支付宝的领取业务背地有一百多个业务解决节点,在微服务时代,其背地可能有几百个甚至上千个业务节点,假如每个节点的可用率都是5个9,把几百个甚至几千个节点的可用率乘起来就会使得整体的可用率十分小。但通过移除和外围业务无关的内容,从而减小节点数量后,零碎的可用率就会大幅增高。上图的左右两边从不同角度对微服务的高可用设计进行了剖析。右边是微服务设计应具备的能力,左边是设计高可用微服务架构时应遵循的准则。另外,有三块内容理论撑持着一个微服务零碎:代码、配置和数据。其中,代码和配置是相辅相成的,代码执行的间歇可能须要批改系统配置;业务数据也十分重要。对这三块内容进行剖析是微服务架构高可用设计的重要方面。比方,配置文件的可回滚和可灰度能力。与代码相比,配置文件的可灰度能力不够标准化,尤其是和业务或者经营相干的配置文件;数据也是如此,因为一些数据有多种起源,这些数据的可观测和可演练能力比代码差。从整体而言,代码的相干体系比配置文件和数据更齐备。 不适度设计架构设计的另一个重要准则是不适度设计,高可用架构设计应基于业务需要进行。这是因为高可用设计通常极为简单。比方,将链路中的一些重要业务解耦进去独自部署,无论其业务流量多大,都为这些业务调配一百个节点,从而升高单节点宕机带来的影响。从实质上来看,这些差异化配置通过付出老本和效率来换取高可用,这就存在着衡量难题。从目前来看,很少有软件系统的高可用能力可能实现5个9,大部分都还停留在实践上达到5个9的状态。 四、经典案例的设计接下来,以具体的业务场景为例剖析典型业务的高可用设计。 手机扫码场景手机扫码场景要求在手机断网时失常显示其二维码。在这个场景里,真正的业务链路从POS链路开始,有的POS链路须要通过商户的解决零碎,有的则间接进入支付宝本身的业务零碎。在支付宝端,该链路将从一个对立的网关接入,携带着订单相干信息,比方商户ID等。尔后,链路进入一个收单零碎,由该零碎解决这些相干信息。再往后,链路开始进入交易系统,通过调用交易系统的外围模块实现该业务领取。此外,为了实现扫码,POS零碎还须要和支付宝签约以建设受权关系,并且同步商户信息。这个微服务零碎所涵盖的高可用需要包含:其一,该零碎次要面向线下场景,商家在未获取现金时不会将商品交给用户。因而,不可用问题对商家的影响很大,比方用户不能失常领取。其二,该零碎的一些节点还须要撑持整个支付宝的业务体系,比方会员信息节点,它须要反对成千盈百个与蚂蚁森林雷同体量的业务性能,对可用性的要求十分高。这意味着,在这个微服务零碎中,不同业务对可用性的要求不同,因而须要不同的伎俩实现该零碎的可用性需要。 灰度设计首先,签约业务是异步的,在设计时不应被纳入零碎的外围链路。另外,签约服务须要与网关和商户服务进行信息同步,仍可能导致网关和商户服务宕机,比方批改商户的鉴权信息可能使签约不胜利。因而,签约服务须要实现灰度设计。 异构设计其次,如果将一个十分重要的业务从链路中隔离进去,那么为了解决隔离后的节点的宕机事件,就须要一个异构设计使得当其宕机时整个零碎还能持续运行,包含数据存储方面和计算能力方面的异构。值得一提的是,当初的分布式数据库可能实现RPO等于0,使得当数据出问题时不产生数据失落,其基本原理就是存储多个数据正本,并且当数据呈现故障时,能够在多个正本间切换,数据恢复速度十分快。然而,这并不意味着高可用设计只需依赖数据库,而不须要额定的容灾能力。事实上,这与零碎所要求的高可用级别相干。比方,假如零碎所要求的高可用能力级别为5个9,那么即便数据库仅产生一次宕机并且数据恢复失败,那么就无奈实现所要求的5个9的高可用能力。高可用设计的一个准则是,外围业务的设计不应信赖其所依赖的基础设施。这样,为了进步零碎高可用能力,就须要实现应用层容灾。应用层的容灾可能会FO到一个数据库中,数据库版本不同,数据存储类型不同,那么二者同时呈现故障的概率就会变得更低。因而,应用层的容灾十分重要。 防热点、读写拆散在service mesh场景下,应用层不再须要关注防热点、读写拆散等。几年前,应用层还须要对缓存热点做非凡解决以建设高可用能力,比方在一个缓存节点挂掉时对其进行预热操作。而当初,大多数分布式架构自身就提供了缓存热点能力。此外,大多数分布式数据库自身就应用了读写拆散架构,只需稍加配置就能够将数据路由到只读节点。这些都是云原生时代带来的红利之一。 近端近端在不同场合下可能有不同的名称。比方,如果将会员信息的全副申请都发给应用层,那么其所须要的集群数量将会十分宏大。因为会员信息的查问遵循了较为固定的范式,因而能够将会员信息的查问性能前置到收单服务,从而使收单服务不须要拜访会员信息,而能够间接拜访会员信息所依赖的服务。这实质上也是通过应用层设计来减小高可用的老本。 总的来说,对于一个给定的业务场景,高可用设计须要剖析它的业务特点,可用性的要求,从而设计对应高可用设计的节点。比方,如何设计以查问性能为主的节点,特地是当其所依赖的数据库不被信赖时。在微服务架构中进行高可用设计时,应该针对每个节点的特色进行有针对的设计。另外,即便在云原生场景下,也须要通过应用层设计实现防抖、业务隔离、配置灰度设计和应用层容灾。比方,应用FASS可能很容易地实现零碎性能,但当零碎的可用性要求、业务体量增大时,任何一个抖动都可能影响到整个软件系统的可用能力。高可用设计并不存在标准配置。实际上,高可用设计须要依据业务重要性、能力和效率的分层等进行分档次的设计,最外围业务须要通过一些高复杂度的设计来进步它们的可用性。 业务隔离线下业务和淘宝业务实际上应用同一个版本进行利用开发和公布,它们的隔离仅仅体现在流量和部署层面。比方,它们所应用的交易服务在开发层面就是完全相同的,仅仅在部署层面将它们的流量拆散到不同的服务中。这样,在以业务维度做跨节点的流量绑定时,就须要将几个服务及其节点圈进去进行分流。首先,须要辨认某流量是否与该业务相干;其次,须要将该流量接入到某个特定区域中;而后,该区域还须要将所有与实现该业务相干的节点都蕴含进来。这种设计须要肯定的先验常识,因而须要定义一些元信息,比方流量入口。在确定流量入口后所有和其相干的后续解决节点都应被打标或者以其它形式圈定起来。门面零碎后对应着外部零碎,包含一系列Http组。在定义好这些后,某个组件会在流量接入后辨认门面零碎,进而找到该门面零碎对应的圈定区域,也就是外部零碎,从而实现一个整体上的流量绑定过程。 值得一提的是,这并不是微服务体系下流量绑定的标准配置,而是阿里的利用开发人员和中间件人员提出的业务隔离设计。随着上云等措施,这种设计逐步内置到基础设施中,成为一个典型的业务隔离设计。 防抖设计图中的业务场景对应着买家向卖家领取。因为理论领取时,领取操作后置一段时间并不会引发大问题,因而大部分零碎在理论运行时,买家向卖家领取的钱都不会即时到账,而须要通过一段时间的累积后再批量到账。实质上,这是一种信息流和业务流的解耦。从业务角度看,钱须要即时从买家流动到卖家,两头还可能有聚合领取等操作。而在理论运行时,零碎无需关注具体的领取细节,而只须要告诉买家领取胜利,告诉卖家钱已到账。在不同解决模式下,资金流和信息流的解决流程可能有很大的不同。 防抖设计架构形象在具体设计时,一个逻辑领取处理单元实际上被拆分成信息处理单元和资金处理单元。两头的T+x示意,信息处理单元和资金处理单元间能够存在一个较大的时间差。在信息受理时,即便不须要进行理论的资金流解决,也须要明确买家和卖家信息,而这些信息来自会员零碎和商家零碎。那么,当会员零碎宕机时,为了使防抖设计机制可用,就须要异构的设计。理论资金流解决所依赖的数据须要异构出一份以供信息流解决,而不是间接用原来的数据。异构设计使得一份数据宕机不影响整个零碎性能的失常运行。除了数据须要进行异构解决外,一些计算规定也须要迁徙到信息流解决中,比方商家的店铺信息处理等。数据和计算规定的异构使咱们可能实现解耦,这种设计对应着一个标准化的范式。简直在所有的业务场景都能看到这种设计。 总的来说,将业务最顶端跟信息流相干的逻辑形象进去,并且将这部分逻辑所依赖的数据异构一部分进去,这就可能使所有的业务实现不依赖于理论的解决逻辑,从而保障底层的任意一个节点产生宕机时整个零碎的可用性。 防抖设计架构延展实践上,这种架构设计是能够扩大的。信息流解决和业务流解决被解耦后就能够被部署在不同的节点中。比方,在国内领取时能够将信息流解决逻辑部署在支付方所在的区域中,这就使得领取操作不须要依赖原来的解决逻辑所部署的机房。须要留神的是,在将数据部署在其它机房时,通常须要一些额定的解决,比方信息安全等内容。 配置灰度设计某节点的配置数据产生变更可能影响其它与之相干的节点,因而这就须要对这些节点做灰度设计,带来了一个链路级的配置灰度设计问题。 分布式事务中通常有一个发起者和多个参与者。发起者发动一个预提交,在所有参与者确认后,该工作才被执行。这对应着一个二阶段确认过程,即先发动、再确认、后执行。配置灰度设计和分布式事务处理十分相似。首先,签约节点发动一个灰度设计,尔后和签约节点相干的节点须要参加进来,一起实现灰度。假如灰度的内容是某仓库信息,此时所有参加节点都须要对本节点下的相干数据进行灰度。在理论进行灰度时,每个节点实现灰度的形式可能不同。比方,商家须要批改DB数据,而会员节点除了须要批改DB数据外,还须要批改对应节点中的缓存。须要留神的是,无论每个节点如何进行具体的灰度操作,各个节点间须要实现灰度的同进同退。 值得注意的是,这是一个最简单的配置灰度设计,实际上的灰度设计比这个场景要简略地多。 容灾设计状态型数据和流水型数据蚂蚁通常依照个性将数据分为状态型数据和流水型数据。所谓流水型数据,即每呈现一条数据都将其存入数据库中。比方,订单数据就是一种流水型数据,每呈现一条新订单都被存入数据库。流水型数据的大部分业务类型是将数据插入到数据库。另一种数据是状态型数据,通常能够被批改,并且具备生命周期特色,比方会员信息。 状态型数据的容灾设计这两种数据在进行应用层容灾设计时须要不同的解决形式,状态型数据的容灾设计通常比拟艰难。比方,会员信息在呈现谬误时通常不能再写该数据,也不能让该用户从新注册一次支付宝。状态型数据的容灾设计须要以数据库不牢靠为前提。数据库通常存在主备库,这两个库通常应用异步复制的形式来保障两个库之间的同步。然而,这种同步通常具备时延特色。当主库宕机时,如果FO库的版本比拟旧,就不能间接将FO库作为主库,因为原来的主库上曾经有用户批改的内容。如果此时将FO库作为主库持续进行批改,那么最终失去的数据必然不是用户所预期的。一个解决形式是将继续往黑名单库里写差别。当主库宕机时,首先将FO库拉起来,此时,这些差别可能使得FO库中某一部分数据是禁写的。对用户信息这样的业务而言,每天只有很少的数据会产生更改,并且用户信息产生宕机的概率很低,因而这种解决带来的禁写对业务的影响十分小。通过这种形式强统一地写黑名单库,可能近似地实现无损的容灾设计。回切数据库时也是如此。因为FO库曾经有很多新的数据内容,因而在回切数据库时须要将这部分数据merge回主库中。 即便在云原生时代,一个业务场景的高可用架构设计也依然须要许多操作来独特实现。将来,这些与业务无关的设计可能被组件化地积淀下来,成为基础设施。 五、将来思考 依据业务场景实现个性化高可用设计高可用设计通常是动态的,它可能被内嵌到架构设计中,被内嵌到基础设施或者中间件中。高可用设计应依据业务场景实现个性化设计。这要求咱们不仅须要关注零碎当下的业务特点,还须要预测其将来的业务特点,通过各种个性来刻画该业务对用户的可用性影响。这就须要联合各种原子伎俩以实现业务在以后阶段所须要的高可用能力。将来,可能存在十分智能的零碎,可能应用最低老本刻画业务的以后特色,而后自动化地组合一些原子高可用能力最大化零碎高可用能力。 5个9的高可用设计将来还可能实现5个9的高可用。首先,假如存在一个和蚂蚁十分相似但又异构的环境,它们之间齐全是去中心化的;其次,这两个环境下的数据规定同步应该是可舍弃的,可能实现FO以及全自动的切换;另外,还须要实现监控,监控也应该是异构的,须要有一个内部零碎来观测本零碎的行为。 原文链接本文为阿里云原创内容,未经容许不得转载。

November 18, 2020 · 1 min · jiezi

关于jquery:推荐一个好用的开源的报表平台JNPF可视化平台

JNPF可视化开发平台是一款集成报表设计和大屏设计的在线报表平台,应用起来简略不便,能够帮忙用户像excel一样设计页面。 应用JNPF报表平台,用户不仅10分钟就能够设计一个炫酷大屏,还能在平台疾速制作各种报表,实现报表的打印等; 弱小性能的报表设计器反对制作各种简单报表,如分组报表、穿插报表、带条件查问统计报表、带表达式报表等; 反对图形剖析的图表设计器领有几十种图表,可应用图表和报表相结合,更清晰的将数据展示给决策者; 炫酷的大屏设计器JNPF报表大屏设计器,采纳word格调,随便拖动组件,想设计成什么样子,设计成什么样子;JNPF大屏设计器,还提供了几十种模板,供你收费实用。 大屏效果图如下: 简略总结一下JNPF报表的性能:操作简略,想怎么设计怎么设计 在制作区域内,元素想怎么放,怎么放; 反对数据源动静加载数据 反对通过SQL、API、静态数据等数据源形式,将数据源与模板绑定,数据实时加载; 反对数据的导入导出; 反对对excel的导入和导出,并且会保留excel的导入、导出款式; 反对快捷打印 设计好你的报表,可疾速打印。

November 17, 2020 · 1 min · jiezi

关于jquery:ejs引入jquery

我用express+Noode.js+ejs+mongodb搭建了一个我的项目,将jquery的代码放到javascripts目录下,然而jquery却引入失败,我在网上搜了很多办法比方npm requirejs jquery引入、script标签引入都失败来了,我很纳闷,因为之前我也用雷同的框架搭建了一个我的项目却引入胜利,于是我想着是不是我没留神把英文单词拼错了,我就复制了之前我的项目的script标签引入,果然胜利了 <script src="/javascripts/jquery.js" type="text/javascript" charset="utf-8" ></script>在我确认我没拼错单词后我发现这个最新的引入就多了一个type="text/javascript"和charset="utf-8"申明,让我一阵无语????,我先去掉type="text/javascript"这个申明之后又报错了。。。。额。。。。好吧,个别这个申明我都懒得写间接是<script src="xxxxx"><script>心愿我这个解决形式能给引入jquery失败的同学一个参考

November 17, 2020 · 1 min · jiezi

关于jquery:动吧日志页面函数分析

因为函数之间盘根错节且代码是随着业务变动,先剖析写好的函数再剖析业务 获取到"日志治理"按钮的id为load-log-id获取到显示区域的id为"mainContentId" starter页面函数写一个函数(可重用)解析 为传入id的按钮注册点击事件在mainContentId中异步加载传入的url(加载对应的页面,这里为log_list页面)写一个自调用函数(页面加载完执行函数)解析 执行doLoadUI函数,传入日志治理按钮的id和日志治理数据页面的urllog_list页面函数 dd

November 13, 2020 · 1 min · jiezi

关于jquery:我对云原生软件架构的观察与思考

简介: 云原生利用架构的指标是构建松耦合、具备弹性、韧性的分布式应用软件架构,能够更好地应答业务需要的变动和倒退,保障系统稳定性,本文将分享一下在这个畛域的察看和思考。 作者 | 易立  阿里云资深技术专家 本系列文章: 第一篇 - 云原生基础设施第二篇 - 云原生软件架构第三篇 - 云原生利用交付与运维体系前言在《解读云原生基础设施》一文中,咱们谈到了云原生计算蕴含三个维度的内容:云原生基础设施,软件架构和交付与运维体系,本文将聚焦于软件架构层面。 “Software architecture refers to the fundamental structures of a software system and the discipline of creating such structures and systems. ” - 维基百科集体了解,软件架构次要指标是解决下列挑战: 管制复杂性:因为业务的复杂性,须要咱们用更好的伎俩帮忙研发组织克服认知障碍,更好的分工协作。分而治之,关注点拆散等伎俩皆是如此。应答不确定性:业务在疾速倒退,需要在一直变动。即便再完满的软件架构,然而随着工夫的推移,团队的变动,软件架构的调整不可避免。读《设计模式》,《微服务设计》等书字里行间写的都是“解耦”两字,让咱们关注架构中确定性和不确定性的拆散,晋升架构的稳定性和应变能力。治理系统性危险:管理系统中的确定性以及不确定性危险,躲避已知陷阱,对未知的危险做好筹备。云原生利用架构的指标是构建松耦合、具备弹性、韧性的分布式应用软件架构,能够更好地应答业务需要的变动和倒退,保障系统稳定性,本文将分享一下在这个畛域的察看和思考。 缘起 - 12 因素利用2012 年,Heroku 创始人 Adam Wiggins 公布十二因素利用宣言。它为构建一个优雅的互联网利用,定义了须要遵循的一些根本准则和方法论,也宽泛影响了泛滥的微服务利用架构。十二因素重点关注:应用程序的健康成长,开发者之间的无效的合作,以及防止软件架构腐化的影响。其内容在明天也值得每个同学认真领会。 图片起源:https://12factor.net/zh_cn/ 12 因素利用为咱们提供了很好的架构领导,帮忙咱们: 构建程度伸缩的弹性利用架构,更好撑持互联网规模利用。晋升研发流程的标准化、自动化程度,晋升研发效率。缩小开发环境和生产环境的差别,并应用继续交付施行麻利开发。晋升利用的可移植性,适宜云化部署,升高资源老本和治理复杂性。松耦合架构设计微服务的核心理念是,零碎中的各个服务可被独立开发、独立部署,独立降级,各个服务之间是松耦合的。云原生利用架构理念是进一步强调架构的松耦合,升高服务之间相互依赖的水平。 API 优先的利用架构设计在面向对象的软件架构中,最重要的是定义对象以及对象的接口契约。SOLID 准则是最被人广为熟知的设计准则: Single responsibility principle - 繁多职责准则Open/closed principle - 凋谢/关闭准则Liskov substitution principle - 里氏替换准则Interface segregation principle - 接口隔离准则Dependency inversion principle - 依赖翻转准则将以上五个准则的英文首字母拼在一起就是 SOLID 准则,这也是帮忙咱们构建高内聚,低耦合、具备柔性的利用架构。在散布式微服务利用架构中,API 优先是契约优先(Contract First)的天然拓展。 ...

November 12, 2020 · 4 min · jiezi

关于jquery:金融云产品部综合运营及mPaaS产品

简介: 源自于阿里巴巴十余年积淀,晋升 App 整体平安程度 无论是 Android app 还是 Jar 利用,代码一旦散发进来,都会以某种模式处于不可信环境中,不免被有心人剖析破解。暗藏在代码中的机密,无论是公有算法,或是公有协定,或者是加解密秘钥,都可能被攻击者破解进去,而后进犯原作者的商业利益或知识产权。所以利用被逆向破解是商业危险源头之一。1:挪动利用平安现状剖析依据工信部的数据显示,截止2019年,中国移动利用数量曾经达到 450万个,其中游戏类、生存服务类、电子商务类 App 排名前三。 细分市场,咱们再看下金融行业,依据信通院的数据,在2019年,针对国内 22777 款金融行业 App进行观测发现,仅 17.08% 金融行业 App 实现加固,而超过 80% 金融行业 App 在利用市场“裸奔”,未进行任何平安加固。通过金融行业这一个细分行业来看全行业,其余行业也有相似的问题。 咱们再看监管政策: 对于金融行业——中国人民银行下发的了挪动金融客户端应用软件平安治理标准,明确标准了挪动 App 的平安加固要求。对于教育行业——教育部下发的《对于疏导标准教育挪动互联网利用有序衰弱倒退的意见》以及《高等院校治理服务类教育挪动互联网利用专项治理口头计划》,发文明确提出教育App该当通过平安评估前方可上线,并及时通过平安加固修复安全隐患。 通过金融、教育行业的监管要求以及国家对于挪动互联网的越来越器重大的背景,后续其余行业也会可能会陆续出台相干的平安政策要求。 2:全新挪动利用平安防护策略上面介绍下阿里外部挪动平安防护策略降级迭代的过程。 在一代和二代的加固计划上,次要针对 APK 的加壳爱护,对 dex 做暗藏,同时加密 dex,在运行时动静加载加密的 dex并做解壳操作。加壳加固的劣势是不会减少利用的体积,同时dex被暗藏,能够反抗dex的动态剖析。 随着攻打伎俩的一直降级,阿里挪动平安加固进行了全新能力的降级。目前已倒退到了第三代加固:Java字节码转换为 Native二进制码。 阿里外部加固的准则和指标秉承着既要充沛进步本身平安能力,减少对手的破解难度和攻打老本,也要尽量升高业务方的接入老本,还要兼顾运行效率与体积。 应答的次要危险点: Java/Smali 字节码被工具反编译为 Java 源码Java/Smali 字节码被间接浏览native 汇编码被工具反编译为 C 源码Java 字节码因为格局和指令限度,平安爱护能力是有下限的。然而,native 二进制码绝对于 Java 字节码破解难度大大提高。于是咱们将字节码转换为 native 二进制码,代码逻辑转移到 so 外面,原来是 Java 函数调用,当初变成了 JNI 调用。攻击者的 Java 逆向相干技能间接生效,被逼去逆向 native 二进制,而这个难度远远高于逆向字节码。 ...

November 11, 2020 · 1 min · jiezi

关于jquery:阿里云高级技术专家白常明边缘云的技术挑战和应用创新

随着5G商用周期的开始与新基建的倒退, 5G+边缘计算带动并赋能数字化行业,逐步造成了预期可观的产业规模。5G周期内,间接和间接带动产业规模就高达万亿级,在如此微小的市场规模下,会有越来越多的行业具备数字化转型的技术撑持,5G+边缘计算如何助力各行业降级?近日,阿里云高级技术专家白常明受邀加入2020WICC通信云大会发表《5G边缘计算:边缘云的技术挑战和利用翻新》主题演讲,分析5G时代边缘云技术演进。 边缘计算的驱动力来自哪里?白常明认为是通过场景的需要来推动。在5G之前的行业利用场景,要么是通过云计算服务承载,要么是单纯的网络服务。而5G网络建设之初,就是面向产业互联网需要而制订的,所以,以后,传统的生产场景降级和数字化转型降级的产业场景,都须要5G网络+云计算的云网交融技术来提供服务,而边缘计算又恰好是云网交融的最佳着力点,这就造成了生产和产业场景,双轮驱动边缘计算的倒退的现状。 边缘计算之所以可能成为5G新场景的着力点,相较于传统的集中式私有云,边缘云计算具备节点数量多、单点规模小、离终端间隔近的分布式云计算的技术特色,而这些技术特色又跟5G网络的低时延、大带宽、大连贯和本地化技术特色很好的对应和交融。只有真正做到云网交融能力满足产业互联网利用场景的新需要。 随着5G和边缘计算的技术交融和倒退,新技术自身也反向的对数据生产生产形式产生了很大的影响,将来,大部分5G业务产生的数据和计算需要都会产生在边缘侧。最典型的需要就是将来物联网的海量终端会产生海量的链接和数据,如果把大规模终端的连贯和数据同时回传至核心云进行解决,对云上的带宽和时延会有很大的挑战。那么,通过散布在间隔终端更近的大规模分布式边缘节点,就能够就近将终端数据和连贯进行解决,仅把长久存储,大规模AI训练等要害计算回传至云核心解决,这样就能够应答新型的大规模高并发数据处理的场景需要了。 边缘云技术与5G云网交融的技术挑战在5G+边缘计算的技术倒退和实际过程中遇到了很多的技术难点和挑战,首先从边缘云技术的角度来看,因为边缘云是一种大规模、分布式、异构资源的云计算模式,相较传统的集中式私有云模式,就会面临“弹性能力差”、“运维难度大”、“平安/可靠性能力有余”和“资产重/老本高”等问题。 如何可能解决上述边缘云技术难点带来的问题呢?通过实际,阿里云总结出一些可行的技术计划。例如,通过在不同边缘节点间将实例进行“动静迁徙”,来减少边缘云上资源的“弹性伸缩”能力,通过“一键公布”可能疾速的将利用实例进行分布式部署和装置,通过在分级管控的计划实现在网络中断等状况下的“边缘自治”,以及通过云原生的技术手段为利用场景提供severless的服务等等,以便能为客户缩小数据和计算上边缘云的开销。最终,还要通过“标准接口”的模式,从边缘云技术架构层面,对内对外造成行业统一的交互体验,缩小边缘计算产业上下游的产业链技术开销。 再从5G网络角度来看一下有哪些挑战。5G网络是寰球对立的规范制式网络,在一张曾经制订好规范的网络之上叠加云计算的能力,这就造成了云网交融的技术,而这也正是网络倒退中,遇到的十分大的技术挑战。网络相较于云,规范制订清晰,地位部署和网络覆盖确定性较强,而边缘云在部署,状态等方面比拟灵便,如何可能将确定性强的网络和灵活性强的云计算交融,这里就有很多技术难点须要解决。比方,如何建设5G网络与云计算间接的网络协同,资源协调,配置和管控协同,甚至到计费,运维,平安等协同问题,都要在云和网间接寻求一些折中,翻新的办法和流程。 边缘云计算的标准化有哪些伎俩是可能解决其中一些问题的呢?白常明认为标准化是一种可行的思路。 在基于规范制式的5G网络之上,对云计算和云网交融做一些技术标准化的制订,能够在架构层面对边缘计算的零碎做些定义和标准,这样,在规范框架下,使用灵便的云计算技术手段,能够绝对容易的施展云网各自的劣势,也为边缘云计算提供了必要且灵便的倒退空间。 阿里云在边缘云规范制订方面始终走在行业引领的前列,从2018年公布《边缘云计算技术及标准化白皮书》,首次明确了边缘云的技术定义和概念,之后又牵头编制了国内首个边缘云通用技术要求的规范,以及边缘云服务信赖能力要求,也是首批通过边缘云规范合乎性测试认证的边缘云服务商。目前,为应答将来云网交融的新技术需要,阿里云正在制订新型边缘云的架构和规范。 5G+边缘计算的翻新利用场景实际接下来,白常明现场分享了阿里云在5G+边缘计算畛域的一些翻新场景实际。 一、城市大脑阿里云是国内城市大脑技术的引领者,也在国内很多城市落地了城市大脑的案例和解决方案。边缘计算在城市大脑中次要能够用来承载城市路网摄像头的视频流解决。 比方,在高速上云场景中,基于ENS实现高速视频上云,具备即开即用、就近取流、快速访问的特点。通过在边缘实现对摄像头数据的汇聚和AI剖析,再将结构化的数据传回核心云进行业务解决,智慧高速会取得更实时、更经济的体验。 二、高清直播高清直播的业务特点是对资源带宽占用比拟高,这类业务对数据回云的带宽压力大,所以,通过广散布的边缘计算节点资源,既能够在边缘解决高清视频,编解码,节俭回云带宽压力,同时也能够在边缘网络内间接进行内容的散发和传输,进步数据传输的效率。 三、智慧交通-车联网以后网约车在出行和乘客乘坐的平安方面都有很高的要求,所以,大量的网约车都配置了车内的摄像头,用来实时监测车内外的状况,以便保障乘客和司机的平安。而车载是个很大的挪动终端,是典型的无线网络传输场景,这就须要通过5G网络对车内的车载数据进行传输,配合ENS边缘云计算节点,进行车辆的属地化经营和数据的本地化解决。能够为交通出行行业缩小不小的老本。 四、边缘AI传统的AI计算,都是在云上进行大数据和模型的训练后,间接进行推理运算,或是将推理运算间接跑在终端设备上。但因为终端设备的体积,算力,功耗,温度等条件的限度,很多AI计算无奈间接在终端上做,另外,软件的更新迭代速度要快于终端硬件的迭代速度,这对AI算法和AI芯片的匹配也提出很大的挑战。边缘节点是典型的云计算节点,这就为AI的训练,推理,模型迭代提供很好的资源。将来,大规模的数据模型训练仍然是由核心云来做,而推理能够由核心下沉到离终端最近的边缘节点进行,既满足了肯定的低时延需要,同时也满足了终端云化后的AI计算需要。 “随着,边缘计算场景的实际,咱们总结发现,以后边缘计算比拟集中的场景和行业都是集中在人流、终端、物联设施比拟密集的城市区域产生,例如路线计算中的车路协同,交通监测。例如家庭计算中的云游戏,AR/VR等。所以,阿里云在往年也提出城市计算和场景计算的概念,通过创新型的行业利用对边缘计算有个更加明确和清晰的定位。从而帮忙行业可能更好、更容易地了解和应用边缘计算这个新技术。” 打造基于场景的云边端协同凋谢的生态阿里云在边缘计算畛域的生态布局,从纵向上看,领有基于IDC,MEC,客户侧节点等大量的异构边缘基础设施,在这一层,通过凋谢单干的模式,构建了遍布寰球的多样化边缘节点。算力资源之上是操作系统层,阿里基于10年积攒的飞天操作系统,自研了面向边缘的边缘云操作系统,再配合AliOS这类端侧操作系统,构建了一层基于体验的分布式协同计算平台。在操作系统层之上是能力凋谢层,5G+边缘的翻新场景不仅仅只是应用边缘的资源,同时也是须要大量的能力中间件来提供服务,面向场景,构建了具备CDN缓存,视频编解码,RTC,IOT,AI算法,5G能开等能力的凋谢层,为场景提供具备边缘属性的中间件能力。最下面是生态应用层,目前阿里云的边缘计算不光为阿里巴巴生态体系内的电商,金融,物流,娱乐等业务提供服务,同时也为全行业的生态利用提供服务。 白常明示意:“阿里云的边缘计算生态,就是打造基于场景的云边端协同凋谢的生态,欢送行业搭档们一起单干共赢,独特打造5G边缘计算新生态。” 原文链接本文为阿里云原创内容,未经容许不得转载。

November 10, 2020 · 1 min · jiezi

关于jquery:阿里云高级技术专家白常明边缘云的技术挑战和应用创新

随着5G商用周期的开始与新基建的倒退, 5G+边缘计算带动并赋能数字化行业,逐步造成了预期可观的产业规模。5G周期内,间接和间接带动产业规模就高达万亿级,在如此微小的市场规模下,会有越来越多的行业具备数字化转型的技术撑持,5G+边缘计算如何助力各行业降级?近日,阿里云高级技术专家白常明受邀加入2020WICC通信云大会发表《5G边缘计算:边缘云的技术挑战和利用翻新》主题演讲,分析5G时代边缘云技术演进。 边缘计算的驱动力来自哪里?白常明认为是通过场景的需要来推动。在5G之前的行业利用场景,要么是通过云计算服务承载,要么是单纯的网络服务。而5G网络建设之初,就是面向产业互联网需要而制订的,所以,以后,传统的生产场景降级和数字化转型降级的产业场景,都须要5G网络+云计算的云网交融技术来提供服务,而边缘计算又恰好是云网交融的最佳着力点,这就造成了生产和产业场景,双轮驱动边缘计算的倒退的现状。 边缘计算之所以可能成为5G新场景的着力点,相较于传统的集中式私有云,边缘云计算具备节点数量多、单点规模小、离终端间隔近的分布式云计算的技术特色,而这些技术特色又跟5G网络的低时延、大带宽、大连贯和本地化技术特色很好的对应和交融。只有真正做到云网交融能力满足产业互联网利用场景的新需要。 随着5G和边缘计算的技术交融和倒退,新技术自身也反向的对数据生产生产形式产生了很大的影响,将来,大部分5G业务产生的数据和计算需要都会产生在边缘侧。最典型的需要就是将来物联网的海量终端会产生海量的链接和数据,如果把大规模终端的连贯和数据同时回传至核心云进行解决,对云上的带宽和时延会有很大的挑战。那么,通过散布在间隔终端更近的大规模分布式边缘节点,就能够就近将终端数据和连贯进行解决,仅把长久存储,大规模AI训练等要害计算回传至云核心解决,这样就能够应答新型的大规模高并发数据处理的场景需要了。 边缘云技术与5G云网交融的技术挑战在5G+边缘计算的技术倒退和实际过程中遇到了很多的技术难点和挑战,首先从边缘云技术的角度来看,因为边缘云是一种大规模、分布式、异构资源的云计算模式,相较传统的集中式私有云模式,就会面临“弹性能力差”、“运维难度大”、“平安/可靠性能力有余”和“资产重/老本高”等问题。 如何可能解决上述边缘云技术难点带来的问题呢?通过实际,阿里云总结出一些可行的技术计划。例如,通过在不同边缘节点间将实例进行“动静迁徙”,来减少边缘云上资源的“弹性伸缩”能力,通过“一键公布”可能疾速的将利用实例进行分布式部署和装置,通过在分级管控的计划实现在网络中断等状况下的“边缘自治”,以及通过云原生的技术手段为利用场景提供severless的服务等等,以便能为客户缩小数据和计算上边缘云的开销。最终,还要通过“标准接口”的模式,从边缘云技术架构层面,对内对外造成行业统一的交互体验,缩小边缘计算产业上下游的产业链技术开销。 再从5G网络角度来看一下有哪些挑战。5G网络是寰球对立的规范制式网络,在一张曾经制订好规范的网络之上叠加云计算的能力,这就造成了云网交融的技术,而这也正是网络倒退中,遇到的十分大的技术挑战。网络相较于云,规范制订清晰,地位部署和网络覆盖确定性较强,而边缘云在部署,状态等方面比拟灵便,如何可能将确定性强的网络和灵活性强的云计算交融,这里就有很多技术难点须要解决。比方,如何建设5G网络与云计算间接的网络协同,资源协调,配置和管控协同,甚至到计费,运维,平安等协同问题,都要在云和网间接寻求一些折中,翻新的办法和流程。 边缘云计算的标准化有哪些伎俩是可能解决其中一些问题的呢?白常明认为标准化是一种可行的思路。 在基于规范制式的5G网络之上,对云计算和云网交融做一些技术标准化的制订,能够在架构层面对边缘计算的零碎做些定义和标准,这样,在规范框架下,使用灵便的云计算技术手段,能够绝对容易的施展云网各自的劣势,也为边缘云计算提供了必要且灵便的倒退空间。 阿里云在边缘云规范制订方面始终走在行业引领的前列,从2018年公布《边缘云计算技术及标准化白皮书》,首次明确了边缘云的技术定义和概念,之后又牵头编制了国内首个边缘云通用技术要求的规范,以及边缘云服务信赖能力要求,也是首批通过边缘云规范合乎性测试认证的边缘云服务商。目前,为应答将来云网交融的新技术需要,阿里云正在制订新型边缘云的架构和规范。 5G+边缘计算的翻新利用场景实际接下来,白常明现场分享了阿里云在5G+边缘计算畛域的一些翻新场景实际。 一、城市大脑阿里云是国内城市大脑技术的引领者,也在国内很多城市落地了城市大脑的案例和解决方案。边缘计算在城市大脑中次要能够用来承载城市路网摄像头的视频流解决。 比方,在高速上云场景中,基于ENS实现高速视频上云,具备即开即用、就近取流、快速访问的特点。通过在边缘实现对摄像头数据的汇聚和AI剖析,再将结构化的数据传回核心云进行业务解决,智慧高速会取得更实时、更经济的体验。 二、高清直播高清直播的业务特点是对资源带宽占用比拟高,这类业务对数据回云的带宽压力大,所以,通过广散布的边缘计算节点资源,既能够在边缘解决高清视频,编解码,节俭回云带宽压力,同时也能够在边缘网络内间接进行内容的散发和传输,进步数据传输的效率。 三、智慧交通-车联网以后网约车在出行和乘客乘坐的平安方面都有很高的要求,所以,大量的网约车都配置了车内的摄像头,用来实时监测车内外的状况,以便保障乘客和司机的平安。而车载是个很大的挪动终端,是典型的无线网络传输场景,这就须要通过5G网络对车内的车载数据进行传输,配合ENS边缘云计算节点,进行车辆的属地化经营和数据的本地化解决。能够为交通出行行业缩小不小的老本。 四、边缘AI传统的AI计算,都是在云上进行大数据和模型的训练后,间接进行推理运算,或是将推理运算间接跑在终端设备上。但因为终端设备的体积,算力,功耗,温度等条件的限度,很多AI计算无奈间接在终端上做,另外,软件的更新迭代速度要快于终端硬件的迭代速度,这对AI算法和AI芯片的匹配也提出很大的挑战。边缘节点是典型的云计算节点,这就为AI的训练,推理,模型迭代提供很好的资源。将来,大规模的数据模型训练仍然是由核心云来做,而推理能够由核心下沉到离终端最近的边缘节点进行,既满足了肯定的低时延需要,同时也满足了终端云化后的AI计算需要。 “随着,边缘计算场景的实际,咱们总结发现,以后边缘计算比拟集中的场景和行业都是集中在人流、终端、物联设施比拟密集的城市区域产生,例如路线计算中的车路协同,交通监测。例如家庭计算中的云游戏,AR/VR等。所以,阿里云在往年也提出城市计算和场景计算的概念,通过创新型的行业利用对边缘计算有个更加明确和清晰的定位。从而帮忙行业可能更好、更容易地了解和应用边缘计算这个新技术。” 打造基于场景的云边端协同凋谢的生态阿里云在边缘计算畛域的生态布局,从纵向上看,领有基于IDC,MEC,客户侧节点等大量的异构边缘基础设施,在这一层,通过凋谢单干的模式,构建了遍布寰球的多样化边缘节点。算力资源之上是操作系统层,阿里基于10年积攒的飞天操作系统,自研了面向边缘的边缘云操作系统,再配合AliOS这类端侧操作系统,构建了一层基于体验的分布式协同计算平台。在操作系统层之上是能力凋谢层,5G+边缘的翻新场景不仅仅只是应用边缘的资源,同时也是须要大量的能力中间件来提供服务,面向场景,构建了具备CDN缓存,视频编解码,RTC,IOT,AI算法,5G能开等能力的凋谢层,为场景提供具备边缘属性的中间件能力。最下面是生态应用层,目前阿里云的边缘计算不光为阿里巴巴生态体系内的电商,金融,物流,娱乐等业务提供服务,同时也为全行业的生态利用提供服务。 白常明示意:“阿里云的边缘计算生态,就是打造基于场景的云边端协同凋谢的生态,欢送行业搭档们一起单干共赢,独特打造5G边缘计算新生态。” 原文链接本文为阿里云原创内容,未经容许不得转载。

November 10, 2020 · 1 min · jiezi

关于jquery:基于-Flink-SQL-CDC-的实时数据同步方案

传统的数据同步计划与 Flink SQL CDC 解决方案业务零碎常常会遇到须要更新数据到多个存储的需要。例如:一个订单零碎刚刚开始只须要写入数据库即可实现业务应用。某天 BI 团队冀望对数据库做全文索引,于是咱们同时要写多一份数据到 ES 中,革新后一段时间,又有需要须要写入到 Redis 缓存中。 很显著这种模式是不可继续倒退的,这种双写到各个数据存储系统中可能导致不可保护和扩大,数据一致性问题等,须要引入分布式事务,老本和复杂度也随之减少。咱们能够通过 CDC(Change Data Capture)工具进行解除耦合,同步到上游须要同步的存储系统。通过这种形式进步零碎的稳健性,也不便后续的保护。 Flink SQL CDC 数据同步与原理解析CDC 全称是 Change Data Capture ,它是一个比拟狭义的概念,只有能捕捉变更的数据,咱们都能够称为 CDC 。业界次要有基于查问的 CDC 和基于日志的 CDC ,能够从上面表格比照他们性能和差别点。 通过以上比照,咱们能够发现基于日志 CDC 有以下这几种劣势: · 可能捕捉所有数据的变动,捕捉残缺的变更记录。在异地容灾,数据备份等场景中失去广泛应用,如果是基于查问的 CDC 有可能导致两次查问的两头一部分数据失落· 每次 DML 操作均有记录无需像查问 CDC 这样发动全表扫描进行过滤,领有更高的效率和性能,具备低提早,不减少数据库负载的劣势· 无需入侵业务,业务解耦,无需更改业务模型· 捕捉删除事件和捕捉旧记录的状态,在查问 CDC 中,周期的查问无奈感知两头数据是否删除 基于日志的 CDC 计划介绍从 ETL 的角度进行剖析,个别采集的都是业务库数据,这里应用 MySQL 作为须要采集的数据库,通过 Debezium 把 MySQL Binlog 进行采集后发送至 Kafka 音讯队列,而后对接一些实时计算引擎或者 APP 进行生产后把数据传输入 OLAP 零碎或者其余存储介质。 ...

November 9, 2020 · 3 min · jiezi

关于jquery:解读云原生基础设施

简介: 云原生是云计算畛域的热点之一。就像 “一千个人眼里有一千个哈姆雷特”,大家对"云原生"的定义也见仁见智。本文将介绍云原生利用架构和生命周期治理的进化方向。 作者 | 易立  阿里云资深技术专家 导读:云原生是云计算畛域的热点之一。就像 “一千个人眼里有一千个哈姆雷特”,大家对"云原生"的定义也见仁见智。本文将介绍云原生利用架构和生命周期治理的进化方向。概述CNCF- 云原生计算基金会对于“云原生”的定义如下 : “云原生技术有利于各组织在私有云、公有云和混合云等新型动静环境中,构建和运行可弹性扩大的利用。云原生的代表技术包含容器、服务网格、微服务、不可变基础设施和申明式 API。 这些技术可能构建容错性好、易于治理和便于察看的松耦合零碎。联合牢靠的自动化伎俩,云原生技术使工程师可能轻松地对系统作出频繁和可预测的重大变更。 云原生计算基金会(CNCF)致力于培养和保护一个厂商中立的开源生态系统,来推广云原生技术。咱们通过将最前沿的模式民主化,让这些翻新为公众所用。” 在咱们的了解中,云原生计算蕴含三个维度的内容: 可编程的、动静的、弹性基础设施:反对公共云、专有云、边缘计算等不同环境。分布式应用架构:具备松耦合、可弹性扩大、高容错性等特点。翻新的利用开发、交付形式:基于自动化、可观测、可治理的软件交付流程,减速翻新效率的同时保障系统稳定性。接下来将以系列文章的模式,和大家分享阿里云容器服务团队在云原生计算畛域的摸索和思考。本文次要聚焦在云原生基础设施。 本系列文章: 第一篇 - 云原生基础设施 第二篇 - 云原生软件架构第三篇 - 云原生利用交付与运维体系云原生基础设施Gartner 将云原生基础设施划分成四大类: 咱们能够看到这几类基础设施,计算单元的粒度越来越细,也越来越多体现的云原生的特质: 模块化水平越来越高 - 自蕴含的利用打包形式,利用与底层物理基础设施解耦。自动化运维水平越来越高 - 自动化的资源调度和弹性伸缩能力,用户将关注点逐步聚焦到利用本身。弹性效率越来越高 - VM 能够实现分钟级扩容;容器能够实现秒级扩容;函数能够做到毫秒级扩容。故障恢复能力越来越高 - 随着零碎自愈性的加强,大大简化了利用架构容错的复杂性。为了更好地了解云原生计算呈现的时代背景,咱们必须要了解云计算的经济学根底与外围竞争力所在。 应“云”而生经济学家亚当·斯密提出:分工是社会倒退的必然,而且分工将极大的进步生产效率。 从经济学的角度来讲,云计算是 IT 产业倒退的必然阶段。互联网和挪动互联网时代的到来,减速了企业的数字化转型。云计算能够提供时刻在线的服务能力,并满足日益增长一直变动的计算需要。此外,云计算将 IT 服务的固定成本投入转化成为了可变老本,极大升高了翻新老本。在咖啡馆中,随处可见守业的青年人围坐在一起构画将来,是互联网和云计算让幻想变得触手可及。 云计算的规模经济云计算的经济学根底来自规模经济。直观上,批量洽购,带来更低的供应链老本;大型数据中心,升高经营老本。更重要的是,因为不同用户不同工夫的工作负载不同,能够利用规模劣势进行削峰填谷。联合自动化、智能化的供应链和经营体系,进一步晋升了硬件资产经营效率。云计算正如电力这样的公共服务基础设施,集中发电比每家每户自建发电机,有更低的老本和更高的效率。 此外,云计算是典型的平台型业务模式。随着规模的增长,会产生网络效应。提供为企业提供产品 / 服务的 ISV 与 SI,会更加青眼于那些领有更多用户的云平台。而用户会更加偏向于可能提供丰盛技术产品和服务撑持生态的云平台。随着云平台的成长,将对用户和生态产生更强的吸引力。 云计算的外围技术创新减速规模效应的造成。比方,计算资源池化与虚拟化技术,让利用和底层硬件资源解耦。一方面晋升资源利用率,升高计算成本;一方面晋升了资源的弹性供应,弹性成为差异化云基础设施和传统 IDC 的要害能力。 此外,在传统 IT 中,软件、硬件和服务由不同厂商拆散交付。而云计算将软件、硬件、服务一体化交付,极大升高了计算成本,晋升了交付效率,提供了翻新的技术能力。这外面有几个关键点: 软硬一体设计,能够针对规模和性能进行全栈优化,极大升高计算成本。而且因为云计算的规模效应,随着产量的减少,边际老本会拉低均匀制作老本。寰球支流云厂商都在 IDC 设计、网络、芯片等方向加大自研投入。以 API 形式交付 IT 能力,一方面可编程的基础设施极大晋升了 IT 的敏捷性,更好地反对业务敏捷性;一方面 API 能够更加不便地被集成到三方服务商的解决方案中,进一步减速规模效应产生。随着 IT 能力的规模化,一些数据化、智能化的翻新技术和业务模式逐步造成。比方 ECS 宕机预测和主动热迁徙,能够将虚拟机的 SLA 晋升到传统须要硬件冗余能力达到的稳定性规范;RDS 对数据库的主动优化和问题诊断,无需 DBA 的人力过多染指。云原生的崛起2013 年春,Docker 技术开源宣告了云原生计算的尾声。Docker 公司翻新地提出了利用打包标准 Docker 镜像,它将利用及其所有依赖项打包,从而使利用能够在不同的计算环境之间疾速、牢靠地运行。容器技术提供了一个优雅的形象,让开发所须要的灵活性、开放性和运维所关注的标准化、自动化达成均衡。容器镜像迅速成为了利用散发的工业规范。随后 Google 开源的 Kubernetes 因为其优良的开放性、可扩展性和沉闷的社区,在容器编排之战中怀才不遇,成为分布式资源调度和自动化运维的事实标准。Kubernetes 屏蔽了底层基础架构的差别,提供了良好的可移植性,能够帮忙利用统一地运行在不同的环境,包含数据中心、云、边缘计算等。 ...

November 5, 2020 · 3 min · jiezi

关于jquery:浅析云控平台画面传输的视频流方案

简介: 本文将小结本次云控平台画面传输的视频流计划。 背景ARC(高德车机云控平台)是一个基于车载设施业务深度定制的云控平台,通过该平台咱们可能实现近程应用不同类型的车载设施。为了让近程使用者像在本地一样应用车载设施,须要将车载设施的画面及时的传回给使用者。因而,画面传输能力是ARC平台的一个外围组件。 起初咱们采纳行业内广泛在用的画面传输开源计划(minicap)。该计划获取到屏幕数据后压缩生成JPG图像,逐帧传输到Web端进行展现。因为车机性能比手机差很多,压缩图片耗费CPU性能大,在局部低端车机设备上压缩图片能耗费80%左右的CPU,容易使设施应用呈现卡顿。同时图像压缩率不算很高,传输耗费带宽大,在低带宽下造成用户看到的画面适度提早。 因而,咱们须要一个解决方案可能均衡传回的画面质量和车机端的CPU资源耗费。本文将小结本次云控平台画面传输的视频流计划。 思路办法 基于图像数据的根本传输链路,为了可能不耗费设施端CPU资源,首先想到了图像不进行压缩,先传输到服务端进行解决。然而通过调研,车机的USB带宽传输根本无法满足高清图像不压缩进行传输,高清原始数据十分大,根本1秒只能传输三帧左右的数据。 另一个思路是采纳设施端的硬件编码器缩小CPU资源的耗费。通过调研Android 4.1开始根本都自带了H264视频编码器。因而,决定尝试采纳视频流的计划,在设施端通过硬件编码器编码成视频流,通过服务端转发到Web端进行解码展现。 实现计划 整个实现计划能够分为以下三个局部: 设施端:负责画面的获取和编码。服务端:解决视频流的传输和管制。Web端:视频流的解码和展现。 画面的获取和编码图像画面的获取间接采纳的是Android的Virtual Display。编码方式有多种实现办法: 因为Java计划只能反对Android 5.0以上机器, 而目前车载市场Android 4.x的占比还比拟大,无奈疏忽。因而只能应用cpp的计划,最低可兼容Android 4.3版本。 视频流的传输和管制Web端最常见的直播计划是rtmp/hls/flvjs等。然而这些计划最低都有1-3s的提早。对于个别直播平台没有影响,然而对于有实时交互场景的云控平台,要求达到毫秒级提早。所以,最终决定采纳H264裸流通过Socket传输的计划,设施端编码H264视频流间接传输到Web端进行播放。 同时,为了进步应用体验,对视频流的传输减少了弹性控制。通过在服务端退出缓存队列用来监控前端带宽负载状况,依据带宽情况主动调节帧率和码率,优先保障使用者的晦涩感。 Web端展现和解码Web端展现应用media source extensiton(MSE) + fragment mp4的计划, 把H264裸流封装成fragment mp4后,通过MSE api进行解码播放, 具体实现是参考了开源的Jmuxer计划。**丢帧和补帧**默认状况下Android Virtual Display产生的最大帧率是60fps,而咱们肉眼30fps就能感觉晦涩。为了可能节俭带宽,咱们定义了视频流最大输入帧率是30fps。在网络带宽较差的状况下,咱们还可能升高帧率来最大限度的防止提早。同时,Android MediaCodec不反对管制帧率,帧率是由每秒送入的帧数量决定的。因而,咱们须要通过实现丢帧来进行帧率控制。 Win7硬件解码器没有低提早模式,须要大略10帧左右数据能力开始播放,而VirtualDisplay是画面有变动才会产生图像帧,因而须要实现补帧来打消解码提早。 咱们通过创立一个EglSurface对丢帧补帧进行解决,通过工夫距离管制eglTexture绘入EglSurface的频度进行丢帧,通过反复绘入最初一帧数据进行补帧。 总结该计划在ARC平台上的应用,在保障传输品质的同时,无效的晋升了使用者操作的晦涩感。该计划实践上也能够利用于其余相似的云控平台上,如果不须要反对Android 4.x设施,采纳Java层API来获取视频流数据,则能够升高开发和适配老本。 原文链接本文为阿里云原创内容,未经容许不得转载。

November 5, 2020 · 1 min · jiezi

关于jquery:Flink-State-误用之痛你中招了吗

简介: 本文次要探讨一个问题:ValueState 中存 Map 与 MapState 有什么区别?如果不懂这两者的区别,而且应用 ValueState 中存大对象,生产环境很可能会呈现以下问题:CPU 被打满、吞吐上不去。 本文次要探讨一个问题:ValueState 中存 Map 与 MapState 有什么区别?如果不懂这两者的区别,而且应用 ValueState 中存大对象,生产环境很可能会呈现以下问题: · CPU 被打满· 吞吐上不去 1、 论断从性能和 TTL 两个维度来形容区别。 性能· RocksDB 场景,MapState 比 ValueState 中存 Map 性能高很多。· 生产环境强烈推荐应用 MapState,不举荐 ValueState 中存大对象· ValueState 中存大对象很容易使 CPU 打满· Heap State 场景,两者性能相似。 TTLFlink 中 State 反对设置 TTL: · MapState 的 TTL 是基于 UK 级别的· ValueState 的 TTL 是基于整个 key 的 触类旁通能应用 ListState 的场景,不要应用 ValueState 中存 List。大佬们曾经把 MapState 和 ListState 性能都做了很多优化,高性能不香吗?下文会详细分析 ValueState 和 MapState 底层的实现原理,通过剖析原理得出上述论断。 ...

November 5, 2020 · 4 min · jiezi

关于jquery:云原生时代应用架构将如何演进

简介: 如何借助云原生技术来晋升交付速度?云原生时代背景下,研发的关注点又会有哪些转变?阿里云高级技术专家许晓斌通过本文分享从 IaaS 上云时代到 PaaS 上云时代的利用架构演进方向,以及云原生技术与利用架构演进的关系。 作者 | 许晓斌  阿里云高级技术专家 导读:如何借助云原生技术来晋升交付速度?云原生时代背景下,研发的关注点又会有哪些转变?阿里云高级技术专家许晓斌通过本文分享从 IaaS 上云时代到 PaaS 上云时代的利用架构演进方向,以及云原生技术与利用架构演进的关系。云原生曾经进入了 PaaS 上云为主的阶段阿里巴巴曾经经验了 IaaS 上云的阶段,迈进到了 PaaS 上云的时代。在去年的“双11”,阿里巴巴就曾经实现了电商外围零碎的全面上云,这里的上云次要是在 IaaS 层。所谓 IaaS 次要就是对计算、网络、存储的虚拟化,通过了这个阶段,阿里巴巴就进入了 PaaS 上云的阶段。在 PaaS 上云这个阶段就须要应用更多的云产品,包含中间件、存储、缓存甚至是利用托管平台等。 IaaS 阶段和 PaaS 阶段其实存在很大的差异。在 IaaS 阶段,对于利用研发来说,所关怀的往往就是基础设施和资源,艰深来讲就是虚拟机或者容器等,这些对利用架构简直没有任何侵入。然而在 PaaS 上云阶段,当你应用云产品,比方云 Redis、云 RDS、云 OSS、云 RabbitMQ 等的时候,都会对于利用架构产生比拟强的侵入。那么,这样的侵入会对利用架构产生什么样的影响,是所有研发架构师所须要思考的一个问题。 云原生技术如果大家尝试去搜寻云原生技术,就会看到 Google Cloud 的定义、CNCF 的定义以及其余很多的云厂商以及开源软件的定义,而这些定义认识都各有不同。简略演绎能够分为如下图所示的几类,纵向来看,分为利用架构、生命周期治理、流量治理,以及基础设施及依赖四个维度;横向来看,又分为微服务、12 Factor Apps、容器、BaaS、GitOps/IaC 以及 Service Mesh 几个维度。 明天,大家都谈判到基于微服务架构做云原生,而不是基于巨石利用架构或者简略的 CS 架构。Quarkus 提出了 12 Factor Apps,意思就是说如果在明天想要让利用跑在 Quarkus 等这些利用托管平台上,对于利用具备肯定的要求,大略是 12 条准则,比方配置和代码拆散等,当然后续还有很多的扩大。这些准则中的很多条目标意思都是说只有你合乎这些准则,那么利用托管平台就可能为你提供更多的能力,比方免运维等。容器的外围是应用一种规范的交互方式让平台可能治理利用的生命周期,包含公布、扩容以及自愈等。 ...

November 2, 2020 · 1 min · jiezi

关于jquery:持续定义Saas模式云数据仓库BI

云数据仓库概述明天和大家一起探讨一下咱们Saas模式下云数据仓库加上商业智能BI能有什么新的货色进去。咱们先来看一下云数据仓库的一些概述。预测到2025年, 寰球数据增长至175ZB, 中国数据量增长至48.6ZB。数据量暴涨这个前提下,咱们看一下BI市场规模的增长。预测到2023年,咱们中国BI软件市场年复合增长率为32%。云计算也同样在增速倒退,2019年第四季中国云数据市场的增长率曾经达到66.9%。 云数据仓库能够让企业几分钟内创立并开始应用数据仓库服务,在更低的老本下,专一业务,通过对大规模数据进行多样化的解决、开掘、剖析,疾速取得业务洞察。它有四大特点:大规模数据分析,高性能,灵便扩容,低成本。 BI应用场景与趋势商业智能(BI,Business Intelligence)是一种以提供决策分析性的经营数据为目标而建设的信息系统。随着咱们社会倒退以及数据量的暴发,在这么大量的数据反对之下,企业心愿能疾速从这些数据里边挖掘出更迷信的一些数据,而后对咱们的企业有一个科学化和数据化决策的帮忙力。同时,BI也会助力企业用到一个精细化经营,客户关系保护,还有老本管制等。咱们看一下商业智能建设一个信息系统它次要的一个流程。首先是数据接入,将扩散于咱们企业内外各种数据集成和进行整合。而后再进入一个数据筹备阶段,就是一个ETL的阶段。而后再到一个数据分析的阶段,最初将这些成绩交给决策层,决策层就能够通过这数据进行一些决策。不论是精细化经营,还是客户保护关系,还是老本管制,都能够从这些数据里边失去一些助力。 随着数据量的暴涨,咱们的业务疾速的增长,产生了各种剖析需要。不仅仅是剖析多样,而且还想要实时的,比如说秒级的即时查问。同时在这么大量的数据根底上,数据的平安合规也越来越受到重视。所以须要疾速的整合多零碎数据和实现信息通明,以及构建一个对立的简略易用的可视化剖析平台,进步制表效率。这曾经成为BI零碎的新的趋势。 基于MaxCompute云数仓+BI的个性MaxCompute(原ODPS)是一项大数据计算服务,它能提供灵便疾速、齐全托管、高性能、低成本、平安的PB级数据仓库解决方案,使您能够经济并高效的剖析解决海量数据。基于MaxCompute云数据仓库的根本架构如下图所示。底层的集群是MaxCompute自身搭建好的,用户无需感知。再往上,有多种的计算引擎。引擎之上提供各种的API,还有深度的集成了一个一站式大数据智能云研发平台DataWorks。在云数据仓库的这么一个体系下,能够做数据筹备,进行各种荡涤、加工、剖析之后,就能够进入一个数据生产的阶段。 总结一下MaxCompute云数仓的个性。第一,是一个开箱即用的在线服务。免平台运维,总体领有成本低。第二,极致弹性能力。弹性扩大,无需容量布局即可应答业务规模的疾速变动。第三,简略易用,多功能计算服务。多种计算模型,多种数据通道,内部数据源联邦计算。第四,企业级平安能力。多租户平安保障机制,细粒度受权,数据加密、脱敏,备份复原。第五,生态交融。反对多样数据源、生态工具和规范。 基于MaxCompute云数据仓库,咱们和BI工具是如何对接的呢。MaxCompute次要是一个存储和计算服务,加上一个数据开发平台DataWorks,组成了一个离线的云数据仓库。在这之上,深度的集成了一个阿里云的Quick BI。它是一个剖析报表工具,间接连贯一MaxCompute的数据表即能够本人对这个表进行剖析。还有第三方的一些工具,帆软,Tableau。同时咱们在生态这一方面,JDBC同样也是反对。还有一些企业、一些客户对于商业智能这一块有更加多样化的一个需要或者共性的需要,现有对接的这些工具有可能不反对,那么它也能够通过SDK的形式来连贯,从而实现基于MaxCompute云数据仓库对接的一个商业智能的信息平台。 咱们看一下MaxCompute离线数仓是怎么实现一个高性能低提早的剖析查问。它能够间接读取离线数仓,反对多样化的查问剖析,包含一些简略的查问、简单的查问、点查问、联邦查问等等。它底层也能够有丰盛的数据源,通过MaxCompute + Hologres组成一个交互式剖析。这么一个大数据生态下,它都能够无缝的对接。比如说Quick BI,Tableau,帆软。所以它能够做到很快的上手,通过这么一个组合咱们能够很疾速的实现一个企业的信息平台。 实际案例接下来咱们看一下几个实际案例。 新批发的一个行业案例,需要背景: 基于Hadoop开源生态打造,软硬件保护老本昂扬,稳定性问题一直,重大影响业务经营剖析;线上业务暴发,需要积压重大,冀望有整体解决方案,可能疾速灵便反对业务倒退所需的技术扩大。通过这么一个大数据解决方案,间接用了阿里云的Quick BI这个产品,实现了疾速数智化转型,拥抱新批发,升高TCO的同时,更好的依靠云上生态,实现数据资产业务化闭环。最终新批发这个案例,基于咱们的MaxCompute + DataWorks,进步了他的数据业务的开发效率。 咱们再看一个新金融的案例。需要背景:金融业务数据,对平安管控有极强要求,须要一个残缺的平安管理体系,同时还要满足个性化平安需要;业务疾速倒退,须要能疾速搭建、成本低、秒级扩大的数据中台体系。咱们给客户发明的价值:基于MaxCompute开箱即用的利用满足其在平安审计过程中的数据安全需要,缩短了需要响应工夫并满足其在数据安全上的个性化需要。 原文链接本文为阿里云原创内容,未经容许不得转载。

November 2, 2020 · 1 min · jiezi

关于jquery:jq-拖动旋转多点缩放

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script type="text/javascript" src="./jquery.js"></script><style> *{ margin: 0; padding: 0; box-sizing: border-box; } #box{ width: 1280px; height: 720px; position: absolute; top: 50%; left: 50%; margin-top: -360px; margin-left: -640px; box-shadow: 0 0 10px rgba(0,0,0,.5); } #boxInner{ width: 100%; height: 100%; position: relative; } #divBox{ width: 200px; height: 200px; position: absolute; top: 64px; left: 128px; background-color: olivedrab; } .inner{ width: 100%; height: 100%; position: relative; } .bot{ width: 14px; height: 14px; background-color: red; position: absolute; } .bot1{ left: -14px; top: -14px; } .bot2{ left: 50%; margin-left: -7px; top: -14px; } .bot3{ top: -14px; right: -14px; } .bot4{ top: 50%; margin-top: -7px; left: -14px; } .bot5{ top: 50%; margin-top: -7px; right: -14px; } .bot6{ left: -14px; bottom: -14px; } .bot7{ left: 50%; margin-left: -7px; bottom: -14px; } .bot8{ right: -14px; bottom: -14px; } .rotate{ width: 14px; height: 14px; background-color: black; position: absolute; top: 50%; margin-top: -7px; right: -30px; }</style></head><body> ...

October 26, 2020 · 4 min · jiezi

关于jquery:基于-Flink-ClickHouse-打造轻量级点击流实时数仓

作者:LittleMagic Flink 和 ClickHouse 别离是实时计算和(近实时)OLAP 畛域的翘楚,也是近些年十分火爆的开源框架,很多大厂都在将两者联合应用来构建各种用处的实时平台,成果很好。对于两者的长处就不再赘述,本文来简略介绍笔者团队在点击流实时数仓方面的一点实践经验。 点击流及其维度建模所谓点击流(click stream),就是指用户拜访网站、App 等 Web 前端时在后端留下的轨迹数据,也是流量剖析(traffic analysis)和用户行为剖析(user behavior analysis)的根底。点击流数据个别以拜访日志和埋点日志的模式存储,其特点是量大、维度丰盛。以咱们一个中等体量的一般电商平台为例,每天产生约 200GB 左右、数十亿条的原始日志,埋点事件 100+ 个,波及 50+ 个维度。 依照 Kimball 的维度建模实践,点击流数仓遵循典型的星形模型,简图如下。 点击流数仓分层设计点击流实时数仓的分层设计依然能够借鉴传统数仓的计划,以扁平为上策,尽量减少数据传输中途的提早。简图如下。 DIM 层:维度层,MySQL 镜像库,存储所有维度数据。ODS 层:贴源层,原始数据由 Flume 间接进入 Kafka 的对应 topic。DWD 层:明细层,通过 Flink 将 Kafka 中数据进行必要的 ETL 与实时维度 join 操作,造成标准的明细数据,并写回 Kafka 以便上游与其余业务应用。再通过 Flink 将明细数据别离写入 ClickHouse 和 Hive 打成大宽表,前者作为查问与剖析的外围,后者作为备份和数据质量保证(对数、补数等)。DWS 层:服务层,局部指标通过 Flink 实时汇总至 Redis,供大屏类业务应用。更多的指标则通过 ClickHouse 物化视图等机制周期性汇总,造成报表与页面热力求。特地地,局部明细数据也在此层凋谢,不便高级 BI 人员进行漏斗、留存、用户门路等灵便的 ad-hoc 查问,这些也是 ClickHouse 远超过其余 OLAP 引擎的弱小之处。要点与注意事项Flink 实时维度关联Flink 框架的异步 I/O 机制为用户在流式作业中拜访内部存储提供了很大的便当。针对咱们的状况,有以下三点须要留神: ...

October 26, 2020 · 1 min · jiezi

关于jquery:WEB前端三jQuery

jQuery简介jQuery: JavaScript Query JS查问jQuery是一门轻量的、收费开源的JS函数库(就是JS的简略框架)jQuery能够极大的简化JS代码jQuery的核心思想:“写的更少,但做的更多” jQuery的劣势能够极大的简化JS代码能够像css选择器一样获取元素能够批改css款式来管制页面的成果能够兼容罕用的浏览器引入jQueryjQuery函数库文件就是一个js文件,要想应用jQuery,须要先引入jQuery的函数库文件 <script src="./js/jquery-1.8.3.js"></script>文档就绪事件函数<head><meta charset="UTF-8"><!-- 在应用jQuery之前,必须先引入jQuery的函数库文件 --><script src="js/jquery-1.8.3.js"></script><script>//1.获取id为demo的h1元素 var h1 = document.getElementById( "demo" );//2.获取h1元素中的内容( innerHTML ) alert( h1.innerHTML );</script></head><body> <h1 id="demo">jQuery的引入示例...</h1></body>下面的代码在执行时,会报一个谬误起因形容:在执行获取id为demo的元素时, h1元素还没有被浏览器加载到,所以获取不到h1元素。解决形式一:将script标签移到body外部,也就是h1元素的前面这样浏览器在加载时,会先加载h1元素,再执行获取h1元素的代码,因为在获取h1元素之前,h1元素曾经被浏览器加载过了,所以前面再获取就可能获取到! <body> <h1 id="demo">jQuery的引入示例...</h1> <script> //1.获取id为demo的h1元素 var h1 = document.getElementById( "demo" ); //2.获取h1元素中的内容( innerHTML ) alert( h1.innerHTML ); </script></body>解决形式二:将获取元素的代码放在文档就绪事件函数中,文档就绪事件函数会在浏览器加载完所有的html元素后(也就是加载完最初一个html元素时)立刻执行。因为以后网页中的所有元素都被加载了,h1元素必定也被加载了,此时再获取h1元素就肯定能获取到。 <head><meta charset="UTF-8"><!-- 在应用jQuery之前,必须先引入jQuery的函数库文件 --><script src="js/jquery-1.8.3.js"></script><script> $(function(){ //1.获取id为demo的h1元素 var h1 = document.getElementById( "demo" ); //2.获取h1元素中的内容( innerHTML ) alert( h1.innerHTML );});</script></head><body> <h1 id="demo">jQuery的引入示例...</h1></body>解决形式三:将获取元素的代码放在一个自定义的函数中,并将该函数绑定在h1元素的点击事件上,当咱们点击h1元素时会执行自定义的函数,函数执行时才获取h1元素,此时就可能获取到h1元素。 <head><meta charset="UTF-8"><!-- 在应用jQuery之前,必须先引入jQuery的函数库文件 --><script src="js/jquery-1.8.3.js"></script><script> function fn1(){ //1.获取id为demo的h1元素 var h1 = document.getElementById( "demo" ); //2.获取h1元素中的内容( innerHTML ) alert( h1.innerHTML );}</script></head><body> <h1 id="demo">jQuery的引入示例...</h1></body>总结:什么时候须要用到文档就绪事件函数:通常是在获取元素时, 如果"获取元素的代码" 执行的工夫, 比 "元素自身加载的工夫" 还要早(也就是说,在获取元素时,元素还没有被浏览器加载), 那么元素必然是获取不到的!能够将获取元素的代码放在文档就绪事件函数中, 因为文档就绪事件函数是在浏览器加载残缺个网页后立刻执行,因而在这个函数中获取任何元素都能够获取到。 ...

October 24, 2020 · 2 min · jiezi

关于jquery:jqueynode跨域

jquey+node跨域1.开发环境 jquery+node2.电脑系统 windows10专业版3.在jquery+node开发的过程中,咱们常常会遇到跨域,解决方案如下:4.node装置 cors,在终端输出命令为: npm i cors --save5.在app.js中增加如下代码: var cors = require('cors');app.use(cors());//在 app=express() //上面增加如下代码:app.all('*', function (req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Content-Type'); res.header('Access-Control-Allow-Methods', '*'); //设置仅承受 application/json 格局申请 res.header('Content-Type', 'application/json;charset=utf-8'); next();});6.在 html中增加如下代码: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://www.jq22.com/jquery/jquery-2.1.1.js"></script></head><body> </body></html><script> $.ajax({ type: 'post', url: 'http://192.168.0.106:3000/feng',}).then(function(data){ console.log(data);});</script>7.在浏览器中成果如下: 8.本期的教程到了这里就完结啦,是不是很nice,让咱们一起致力走向巅峰!

October 23, 2020 · 1 min · jiezi

关于jquery:SpringBoot整合Web资源

创立web我的项目 编辑我的项目目录构造 引入jar包<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.jt</groupId> <artifactId>springboot_demo3_web</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>springboot_demo3_web</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--引入插件lombok 主动的set/get/构造方法插件 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--引入数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--springBoot数据库连贯 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--spring整合mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <!--springBoot整合JSP增加依赖 --> <!--servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!--jstl依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!--使jsp页面失效 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>编辑YML文件server: port: 8090 #定义端口 servlet: context-path: / #定义我的项目的公布门路spring: datasource: #driver-class-name: com.mysql.cj.jdbc.Driver springboot程序采纳默认的配置 url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true username: root password: root mvc: #引入mvn配置 view: prefix: /WEB-INF/ # /默认代表根目录 src/main/webapp suffix: .jspmybatis-plus: #定义别名包 type-aliases-package: com.jt.pojo #加载user标签的mapper文件 mapper-locations: classpath:/mybatis/mappers/*.xml #开启驼峰映射 configuration: map-underscore-to-camel-case: true#引入日志信息.logging: level: com.jt.mapper: debug查问user列表数据【要求】用户通过http://localhost:8090/findAll申请。跳转到userList.jsp页面中,并且展示user表中的所有数据,以MP形式查问 ...

October 23, 2020 · 2 min · jiezi

关于jquery:自然语言处理在开放搜索中的应用

自然语言智能(NLP)自然语言智能钻研实现人与计算机之间用语言进行无效通信。它是交融语言学、心理学、计算机科学、数学、统计学于一体的迷信。它波及到自然语言和形式化语言的剖析、抽取、了解、转换和产生等多个课题。 人工智能能够分为几个阶段• 计算智能,指依附计算弱小的算力和海量数据的存储能力,能够在局部畛域超过人类的体现。代表例子就是谷歌的alphago,凭借谷歌TPU的弱小算力以及联合相似蒙特卡洛树搜寻、强化学习等算法,可能在围棋的微小搜寻空间中计算出好的决策门路,战败人类,这是计算智能;• 感知智能,是指从无结构化数据中辨认出重要的因素。比方给一个query,剖析出蕴含的人民、地名、机构名等;• 认知智能,是在感知之上,可能了解其中因素的含意以及进行一些推理。比方“谢霆锋是谁的儿子 谁是谢霆锋的儿子”两句话。词和实体都差不多,但语义差异很多。这是认知智能要解决的问题;• 发明智能,比方计算机指可能了解语义的根底上,发明出合乎常识、语义、逻辑的句子。比方主动写出行云流水的小说、发明娓娓动听的音乐 可能无违和跟人天然聊天等自然语言解决钻研笼罩了感知智能,认知智能,发明智能这样的学科,是实现残缺人工智能的必要技术 自然语言智能发展趋势深度语言模型冲破式倒退, 引领重要自然语言技术获得停顿;私有云NLP技术服务从通用性能走向定制化服务;自然语言技术逐渐与行业/场景紧密结合, 产生更大价值;阿里团体NLP平台能力从下到上分为了NLP数据、NLP根底能力、NLP利用技术和下层利用。NLP数据是很多算法的原料,累了包含语言词典、实体常识词典、句法词典、情感剖析等词典等。阿里NLP根底技术蕴含了词法剖析、句法分析、文本剖析、深度模型。在这之上,是NLP垂直的技术 包含问答 对话技术 反垃圾 地址解析等。这些技术的组合,就反对了很多利用。 其中搜寻是NLP能力十分密集的一个利用 凋谢搜寻中NLP利用和典型技术• 基础设施蕴含了阿里云根底产品,以及基于阿里生态搜寻场景打磨出的多个搜寻自研零碎,比方HA3、RTP、Dii等;• 管控根底平台,保障咱们离线数据采集、治理、训练等;• 算法模块,咱们分为两块,一块是查问剖析相干,蕴含多粒度分词、实体辨认、纠错改写等;另一个块是相关性和排序相干,包含文本相关性、CTR CVR预估、LTR 等;(其中橙色背景的示意是跟NLP相干)凋谢搜寻的指标是要打造一站式、开箱即用的智能搜寻服务,所以咱们会把这些算法能力,以行业模板、 场景化、周边服务的模式凋谢给用户。 凋谢搜寻NLP剖析链路搜寻的发动,往往是一个搜寻关键词触发,比方用户搜寻“ aj1北卡兰新款球鞋” 跨畛域分词咱们在凋谢搜寻凋谢了一系列的畛域的分词模型分词挑战 各个领域一直新增的未登录词或者叫新词,往往会大大降低分词成果;为新用户定制分词模型,从标注到训练的整个过程,老本都比拟高;解决思路联合统计特色,比方互信息、左右上等构建一个成词模型,能够基于用户数据疾速构建一份畛域词典;联合源畛域分词模型和指标畛域的词典,咱们基于近程监督技术能够疾速构建一个指标畛域分词器;(上图为主动跨畛域分词框架)用户只须要提供给咱们一些本人业务的语料数据,咱们就能够主动的失去一个定制化的分词模型,这不仅大大晋升了效率,同时也更快满足客户的需要。通过这个技术,咱们能够在各个领域取得比开源通用分词,更好的成果 命名实体辨认命名实体辨认(NER),例如从query中提取人名 地名 工夫等。挑战与艰难NER在NLP畛域钻研十分多同时也面临很多的挑战,尤其在中文上因为不足人造分隔符,面临边界歧义、语义歧义、嵌套歧义等艰难。**解决思路**• 下图右上角是咱们在凋谢搜寻中应用的模型架构图;• 在凋谢搜寻中,很多用户都积攒了大量词典实体库。为了充分利用这些词典,咱们提出了一种在bert之上,有机交融常识的graphNer框架。从右下角的表格能够看出,在中文上能获得最好的成果; 拼写纠错凋谢搜寻分为4个纠错步骤蕴含了开掘、训练、评估和在线预测。次要的模型依据统计翻译模型和神经网络翻译模型两套零碎,同时在性能、展现款式和干涉上有一套齐备办法。 语义匹配深度语言模型的呈现给很多NLP工作带来了跨越式的晋升,尤其是在语义匹配等工作上。达摩院在bert上也提出了很多翻新,提出了自研的StructBert。次要翻新点在于在深度语言模型训练中,减少了字序/词序的指标函数 和更多样的句子构造预测指标函数,进行多任务学习。然而这样的通用的structbert是无奈试用给凋谢搜寻里成千上万个客户,成千上万个畛域的。咱们须要做畛域适配。所以咱们提出了语义匹配3阶段范式。 能够疾速的为客户定制适宜于本人业务的语义匹配模型。 (具体的流程如图) NLP算法产品化算法模块产品化的零碎架构,蕴含了离线计算、在线引擎以及产品控制台。图中浅蓝色的局部是NLP在凋谢搜寻上凋谢的算法相干性能,用户能够间接在控制台体验和应用。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 20, 2020 · 1 min · jiezi

关于jquery:平台式可复用的应用集成能力助您敏捷高效的完成企业数字化转型

简介: 企业数字化转型往往是一个长期继续的过程,产品改革和技术迭代也在减速演进,连接性是数字化转型的要害推动因素,甚至将决定成败。为了应答广泛的集成要求,企业须要新一代更麻利的集成能力框架,基于高效的连贯,盘活企业的数据和业务资产,实现业务数据化,并进一步引领到智能化的进阶演进。 戳这里进入直播间,理解更多详情,内含Demo演示哦~ 云服务总线(Cloud Service Bus简称CSB)从2016年在阿里云上实现商业化之后,服务了一系列的大客户,包含中国邮政,国家税务总局等国计民生的客户。 作为一个服务总线型产品,在服务协定转换,服务治理,企业级权限管制等畛域积攒了大量的能力和场景,帮忙用户把微服务平安,可控的裸露进去被其余利用所集成或调用。近几年利用集成畛域也产生了比拟大的变动,从传统的基于SOA理念,基于ESB的计划实现,开始转化成基于API的以iPaaS为次要产品状态的计划。CSB也适时的推出了基于iPaaS理念的新的能力组件“利用集成”明天就让咱们一起来深度看看这个畛域,看下利用集成是在什么场景帮忙用户解决什么问题的。 首先咱们理解一下什么是iPaaS,iPaaS全称Integration PaaS,Gartner把它定义为“促成开发、执行和集成流治理同任何本地(on-premises)以及基于云的流程、服务、利用和数据连贯的一套云服务,能够在独立的或者多个穿插的组织中进行”简言之,一个企业的业务零碎通过多年的积攒,整个it零碎中存在的数据,利用,协定,流程会变得越来越简单。当须要上线一个新的业务的时候,如何疾速的与原有的零碎,以及云上的新型的服务疾速连通,并且疾速上线变成了一个越来越常见的挑战。 在明天企业数字化转型的过程中,利用集成也变成了一个必不可缺的能力。在明天的企业数字化转型中,企业往往面临两大问题:一个是简单的集成场景,二是动静的集成关系。 企业数字化转型对接传统利用与数字化技术, 须要连贯和标准化各种利用和数据,呈现出高度的多样化和复杂度。复合场景的集成是数字化转型迈出的要害但日益简单的一步。 而企业要生存和继续倒退,直接参与客户体验与反馈的零碎会一直由客户价值驱动变动,与其它零碎造成动静的集成关系,要求十分高的施行效率和灵活性。而企业数字化转型往往是一个长期继续的过程,产品改革和技术迭代也在减速演进,连接性是数字化转型的要害推动因素,甚至将决定成败。为了应答广泛的集成要求,企业须要新一代更麻利的集成能力框架,基于高效的连贯,盘活企业的数据和业务资产,实现业务数据化,并进一步引领到智能化的进阶演进。 这也是CSB 利用集成旨在解决的问题和可能提供的外围价值。它可能提供平台式可复用的利用集成能力,以低代码可视化形式连贯编排各种类型的利用端点,疾速部署公布,实现麻利、高效、对立管控的零碎对接。次要来说由以下5大能力模块形成。这五大模块形成了明天在利用集成中的外围流程。首先产品内置了大量的规范连接器,让用户能够不须要编写代码疾速连贯存量或者第三方的零碎中,以后反对的协定如下表所示:其次为了满足不同业务场景的逻辑须要,产品内置了通用的逻辑组件,让用户能够自在管制业务逻辑的数据流走向,设计出丰盛的集成利用。另外利用集成反对用户自定义连接器,对于客户本人的非凡零碎,用户能够一次编写连接器后分享给整个公司应用。 基于上述的连接器和逻辑步骤,利用集成提供了一个图形化的集成流开发界面,用户能够通过拖拽的模式疾速开发业务流程,而且这种图形化的业务流也十分便于了解和保护。同时还内置了丰盛的数据映射能力,当业务流须要数据的时候,通过连接器能够从各种数据源中拉取数据,同时能够图形化的对拉取出的数据进行简略解决。如下所示:在用户开发完了集成流之后,在下一步就是部署和运维这个集成流。CSB利用集成提供了集成流的部署和运维能力。提供了轻量的运行引擎,用户能够一键部署,并且能够通过超产品的管制进行监控以及运维,包含容量扩缩,启停等惯例操作。因为执行环境为产品提供,用户齐全不必关怀底层资源的运维,只须要聚焦到集成流自身的执行状况。 如上所述,CSB利用集成通过丰盛的组件,灵便简洁,图形化的集成流开发平台帮忙用户疾速开发业务流。同时通过一键部署,免运维等个性帮忙用户疾速而高效稳固的运行集成流。帮忙用户疾速的开发新的业务。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 16, 2020 · 1 min · jiezi

关于jquery:Spark-On-MaxCompute如何访问Phonix数据

简介: 如何应用Spark On MaxCompute连贯Phonix,将Hbase的数据写入到MaxCompute的对应表中,目前没有对应的案例,为了满足用户的需要。本文次要解说应用Spark连贯Phonix拜访Hbase的数据再写入到MaxCompute计划实际。该计划的验证是应用hbase1.1对应Phonix为4.12.0。本文从阿里云Hbase版本的抉择、确认VPC、vswitchID、设置白名单和拜访形式,Phonix4.12.0的客户端装置,在客户端实现Phonix表的创立和写入,Spark代码在本地IDEA的编写以及pom文件以及vpcList的配置,打包上传jar包并进行冒烟测试。 一、购买Hbase1.1并设置对应资源1.1购买hbasehbase次要版本为2.0与1.1,这边抉择对应hbase对应的版本为1.1Hbase与Hbase2.0版本的区别HBase1.1版本1.1版本基于HBase社区1.1.2版本开发。HBase2.0版本2.0版本是基于社区2018年公布的HBase2.0.0版本开发的全新版本。同样,在此基础上,做了大量的改良和优化,排汇了泛滥阿里外部成功经验,比社区HBase版本具备更好的稳定性和性能。 1.2确认VPC,vsWitchID确保测试联通性的能够不便可行,该hbase的VPCId,vsWitchID尽量与购买的独享集成资源组的为统一的,独享集成资源的文档能够参考https://help.aliyun.com/document_detail/137838.html 1.3设置hbase白名单,其中DataWorks白名单如下,集体ECS也可增加依据文档链接抉择对应的DataWorks的region下的白名单进行增加https://help.aliyun.com/document_detail/137792.html 1.4查看hbase对应的版本和拜访地址关上数据库链接的按钮,能够查看到Hbase的主版本以及Hbase的专有网络拜访地址,以及是否开明公网拜访的形式进行连贯。 二、装置Phonix客户端,并创立表和插入数据2.1装置客户端依据hbase的版本为1.1抉择Phonix的版本为4.12.0依据文档https://help.aliyun.com/document_detail/53600.html 下载对应的客户端文件ali-phoenix-4.12.0-AliHBase-1.1-0.9.tar.gz登陆客户端执行命令 ./bin/sqlline.py 172.16.0.13,172.16.0.15,172.16.0.12:2181创立表: CREATE TABLE IF NOT EXISTS users_phonix( id INT , username STRING, password STRING) ;插入数据: UPSERT INTO users (id, username, password) VALUES (1, 'admin', 'Letmein');2.2查看是否创立和插入胜利在客户端执行命令,查看以后表与数据是否上传胜利 select * from users; 三、编写对应代码逻辑3.1编写代码逻辑在IDEA依照对应得Pom文件进行配置本地得开发环境,将代码波及到得配置信息填写残缺,进行编写测试,这里能够先应用Hbase得公网拜访链接进行测试,代码逻辑验证胜利后可调整配置参数,具体代码如下 package com.git.phoniximport org.apache.hadoop.conf.Configurationimport org.apache.spark.sql.SparkSessionimport org.apache.phoenix.spark._/** * 本实例实用于Phoenix 4.x版本 */object SparkOnPhoenix4xSparkSession { def main(args: Array[String]): Unit = { //HBase集群的ZK链接地址。 //格局为:xxx-002.hbase.rds.aliyuncs.com,xxx-001.hbase.rds.aliyuncs.com,xxx-003.hbase.rds.aliyuncs.com:2181 val zkAddress = args(0) //Phoenix侧的表名,须要在Phoenix侧提前创立。Phoenix表创立能够参考:https://help.aliyun.com/document_detail/53716.html?spm=a2c4g.11186623.4.2.4e961ff0lRqHUW val phoenixTableName = args(1) //Spark侧的表名。 val ODPSTableName = args(2) val sparkSession = SparkSession .builder() .appName("SparkSQL-on-MaxCompute") .config("spark.sql.broadcastTimeout", 20 * 60) .config("spark.sql.crossJoin.enabled", true) .config("odps.exec.dynamic.partition.mode", "nonstrict") //.config("spark.master", "local[4]") // 需设置spark.master为local[N]能力间接运行,N为并发数 .config("spark.hadoop.odps.project.name", "***") .config("spark.hadoop.odps.access.id", "***") .config("spark.hadoop.odps.access.key", "***") //.config("spark.hadoop.odps.end.point", "http://service.cn.maxcompute.aliyun.com/api") .config("spark.hadoop.odps.end.point", "http://service.cn-beijing.maxcompute.aliyun-inc.com/api") .config("spark.sql.catalogImplementation", "odps") .getOrCreate() //第一种插入方式 var df = sparkSession.read.format("org.apache.phoenix.spark").option("table", phoenixTableName).option("zkUrl",zkAddress).load() df.show() df.write.mode("overwrite").insertInto(ODPSTableName) }}3.2对应Pom文件pom文件中分为Spark依赖,与ali-phoenix-spark相干的依赖,因为波及到ODPS的jar包,会在集群中引起jar抵触,所以要将ODPS的包排除掉 ...

October 14, 2020 · 3 min · jiezi

关于jquery:MaxCompute-full-outer-join改写left-anti-join实践

简介: ods层数据同步时常常会遇到增全量合并的模型,即T-1天增量表 + T-2全量表 = T-1全量表。能够通过full outer join脚本来实现合并,然而数据量很大时十分耗费资源。本文将为您介绍在做增量数据的减少、更新时如何通过full outer join改写left anti join来实现的最佳实际。 背景ods层数据同步时常常会遇到增全量合并的模型,即T-1天增量表 + T-2全量表 = T-1全量表。能够通过full outer join脚本来实现合并,然而数据量很大时十分耗费资源。 insert overwrite table tb_test partition(ds='${bizdate}')select case when a.id is not null then a.id esle b.id end as id ,if(a.name is not null, a.name, b.name) as name ,coalesce(a.age, b.age) as age _--这3种写法一样,都是优先取delta表的字段_from( select * from tb_test_delta where ds='${bizdate}') afull outer join( select * from tb_test where ds='${bizdate-1}') bon a.id =b.id;这种写法可实现新增和更新操作: ...

October 13, 2020 · 2 min · jiezi

关于jquery:数据湖-VS-数据仓库之争阿里提出大数据架构新概念湖仓一体

作者 |关涛、李睿博、孙莉莉、张良模、贾扬清(from 阿里云智能计算平台) 黄波、金玉梅、于茜、刘子正(from 新浪微博机器学习研发部) 编者按 随着近几年数据湖概念的衰亡,业界对于数据仓库和数据湖的比照甚至争执就始终一直。有人说数据湖是下一代大数据平台,各大云厂商也在纷纷的提出本人的数据湖解决方案,一些云数仓产品也减少了和数据湖联动的个性。然而数据仓库和数据湖的区别到底是什么,是技术路线之争?是数据管理形式之争?二者是水火不容还是其实能够谐和共存,甚至互为补充?本文作者来自阿里巴巴计算平台部门,深度参加阿里巴巴大数据/数据中台畛域建设,将从历史的角度对数据湖和数据仓库的前因后果进行深刻分析,来论述两者交融演进的新方向——湖仓一体,并就基于阿里云MaxCompute/EMR DataLake的湖仓一体计划做一介绍。 大数据畛域倒退20年的变与不变1.1 概述 大数据畛域从本世纪初倒退到当初,已经验20年。从宏观层面察看其中的倒退法则,能够高度概括成如下五个方面: 1、数据保持高速增长- 从5V外围因素看,大数据畛域保持高速增长。阿里巴巴经济体,作为一个重度应用并着力倒退大数据畛域的公司,过来5年数据规模保持高速增长(年化60%-80%),增速在可见的将来持续放弃。对于新兴企业,大数据畛域增长超过年200%。 2、 大数据作为新的生产因素,失去宽泛认可- 大数据畛域价值定位的迁徙,从“摸索”到“普惠”,成为各个企业/政府的外围部门,并承当要害工作。还是以阿里巴巴为例,30%的员工间接提交大数据作业。随大数据普惠进入生产环境,可靠性、安全性、管控能力、易用性等企业级产品力加强。 3、数据管理能力成为新的关注点- 数仓(中台)能力流行起来,如何用好数据成为企业的外围竞争力。 4、引擎技术进入收敛期 - 随着Spark(通用计算)、Flink(流计算)、Hbase(KV)、Presto(交互剖析)、ElasticSearch(搜寻)、Kafka(数据总线)自从2010-2015年逐渐霸占开源生态,最近5年新引擎开源越来越少,但各引擎技术开始向纵深倒退(更好的性能、生产级别的稳定性等)。 5、平台技术演进出两个趋势,数据湖 VS 数据仓库- 两者均关注数据存储和治理(平台技术),但方向不同。 图1. 阿里巴巴双十一单日解决数据量增长 1.2 从大数据技术倒退看湖和仓 首先,数据仓库的概念呈现的要比数据湖早的多,能够追溯到数据库为王的上世纪 90 年代。因而,咱们有必要从历史的脉络来梳理这些名词呈现的大略工夫、来由以及更重要的背地起因。大体上,计算机科学畛域的数据处理技术的倒退,次要分为四个阶段: 1、阶段一:数据库时代。数据库最早诞生于 20 世纪的 60 年代,明天人们所熟知的关系型数据库则呈现在 20 世纪 70 年代,并在后续的 30 年左右工夫里大放异彩,诞生了很多优良的关系型数据库,如 Oracle、SQL Server、MySQL、PostgresSQL 等,成为过后支流计算机系统不可或缺的组成部分。到 20 世纪 90 年代,数据仓库的概念诞生。此时的数据仓库概念更多表白的是如何治理企业中多个数据库实例的方法论,但受限于单机数据库的解决能力以及多机数据库(分库分表)长期以来的昂扬价格,此时的数据仓库间隔一般企业和用户都还很边远。人们甚至还在争执数据仓库(对立集中管理)和数据集市(按部门、畛域的集中管理)哪个更具可行性。 2、阶段二:大数据技术的「探索期」。工夫进入到 2000 年左近,随着互联网的暴发,动辄几十亿、上百亿的页面以及海量的用户点击行为,开启了寰球的数据量急剧减少的新时代。传统的数据库计划再也有力以可承受的老本提供计算力,微小的数据处理需要开始寻找突破口,大数据时代开始萌芽。2003、2004、2006 年 Google 先后 3 篇经典论文(GFS、MapReduce、BigTable)奠基了这个大数据时代的根本技术框架,即分布式存储、散布式调度以及分布式计算模型。随后,简直是在同一期间,诞生了包含 Google,微软 Cosmos 以及开源 Hadoop 为代表的优良分布式技术体系,当然,这其中也包含阿里巴巴的飞天零碎。此时人们兴奋于谋求数据的解决规模,即『大』数据,没有空闲争执是数据仓库还是数据湖。 3、阶段三:大数据技术的「发展期」。来到 21 世纪的第二个 10 年,随着越来越多的资源投入到大数据计算畛域,大数据技术进入一个蓬勃发展的阶段,整体开始从能用转向好用。代替低廉的手写 MapReduce 作业的,则是如雨后春笋般呈现的各种以 SQL 为表白的计算引擎。这些计算引擎针对不同的场景进行针对性优化,但都采纳门槛极低的 SQL 语言,极大升高了大数据技术的应用老本,数据库时代人们幻想的大一统的数据仓库终于成为事实,各种数据库时代的方法论开始低头。这个期间技术路线开始呈现细分。云厂商主推的如 AWS Redshift、Google BigQuery、Snowflake,包含 MaxCompute 这样的集成系统称为大数据时代的数据仓库。而以开源 Hadoop 体系为代表的的开放式 HDFS 存储、凋谢的文件格式、凋谢的元数据服务以及多种引擎(Hive、Presto、Spark、Flink 等)协同工作的模式,则造成了数据湖的雏形。 ...

October 12, 2020 · 3 min · jiezi

关于jquery:Net-Core快速开发框架PC移动一体化开发PaaS平台

.net core疾速开发框架,支流的软件系统开发框架,开发人员用的最多的一款商务办公管理软件和业务流程信息系统开发框架。然而,它作为一个开发框架,它又不仅仅是如此,其实它还更是一个性能残缺齐全的PaaS开发平台。它有齐备的开发零碎和开发环境,有各种兼容并蓄的弱小开发权限和开发接口,有很多令人眼前一亮闷闷不乐的性能特点: 1.PaaS开发平台是低代码二次开发治理平台、易于上手,一次受权永恒应用; 2.平台架构稳固、安全可靠、开放源码,可轻松疾速开发出各类PaaS使用; 3.平台同时领有.net core和java两大语言,可实现PC+手机联手管控办公; 4.平台领有挪动端开发框架,可实现业务平台的小程序、APP等挪动端开发; 5.平台提供欠缺的接口函数及独立部署、凋谢数据库设计,可实现万物互联; 6.平台紧跟时代倒退潮流,继续一直地迭代更新,满足企业一直变动的需要; 此外,这个.net core疾速开发框架、PaaS平台还领有很多丰盛的使用场景: 1.智能商业:PaaS开发平台提供数据分析解决性能的开发,从而打造出企业经营的疾速决策治理平台和数字化管理体系; 2.我的项目研发:借助PaaS开发平台的性能开发,从而打造出从我的项目启动、设计、测试、试运行等各个环节的精细化治理研发体系; 3.代码生成器:PaaS开发平台有弱小的代码生成器,让开发者从反复繁冗的代码编辑工作中释放出来,让开发更简略、更省力; 4.工作流引擎:PaaS开发平台能够开发出合乎本身个性化需要的工作流引擎,以便企业打造出高效快捷的协同交互办公管理体系; 5.业务流程监控:PaaS开发平台能够打造出企业生产经营的业务流程监控零碎,随时随地实现业务流程的高效智能管控和优化; 6.搭建SaaS服务:以PaaS开发平台为根底,开发者能够轻松疾速地开发出一体化集成的SaaS零碎,实现企业的信息化治理翻新; 因而,作为一款弱小的PaaS开发平台,它不仅领有支流的.net core开发框架,更领有多语言的开发技术,更便捷于平台零碎和软件的开发。它能够实现各种个性化开发,能够开发出各类业务零碎以满足企事业单位各式各样的智能化业务倒退治理需要,助力企业增效降本,实现企业的飞速运行腾飞。

October 10, 2020 · 1 min · jiezi

关于jquery:奥哲孟凡俊低代码平台对当代企业智能管理的支撑

简介: 导读:在数字化时代,业务拓展快,迭变快将成为常态和支流,企业数字化转型除了企业外部协同提效之外,基于多项底层技术框架的低代码平台更是智能合作不可或缺的底层反对,奥哲高级副总裁兼奥哲云枢业务负责人将介绍低代码平台对于当代企业智能治理的撑持。 导读:在数字化时代,业务拓展快,迭变快将成为常态和支流,企业数字化转型除了企业外部协同提效之外,基于多项底层技术框架的低代码平台更是智能合作不可或缺的底层反对,奥哲高级副总裁兼奥哲云枢业务负责人将介绍低代码平台对于当代企业智能治理的撑持。 十分荣幸能在杭州有这个机会跟大家做智能治理方面的分享,我的职场经验次要是做企业级信息化。 明天的主题十分好,为什么呢?因为明天讲的治理跟我十年前讲的有了很大差异,产生这些差异的外围起因就是变动,这个世界惟一不变的就是变动,大概在十年前咱们就发现挪动互联网到来将对中国企业及企业治理是一个颠覆性的变动。那个时候我能曾经看到在线利用将成为趋势,果不其然在明天应成为事实,而咱们明天所在的地的阿里和钉钉成了挪动办公畛域的佼佼者。 前两三年咱们发现咱们赖以为傲的制造业生存环境恶劣,咱们发现一个很显著的趋势—每个国家都在强调制造业回归,包含欧美发达国家,原来产业链残缺的劣势才是一个国家真正的生存之道。这个时候咱们才晓得这个世界上又产生了变动,企业竞争曾经变成了产业链的竞争。到了去年年底的时候,大概是元旦前几天,疫情来了,刚开始大家感觉咱们就是被封在家里而已,起初才意识到不是这个样子了,因为咱们上不了班了,如果没有在后面意识到挪动办公曾经成为必然且曾经做好布局的话,那咱们的企业在春节前后大多数就是停摆,人能够停摆,企业停不了,真正的危机终于暴发,幸好咱们国家公布了大量的搀扶政策。 这个世界始终在减速变动! 挪动互联时代的治理新特点?通过这次疫情让咱们意识到一个情理,合作、智能化决定您企业的生死,挪动应变合作的时代其实曾经降临。在这个时代外面的治理产生了变动,这个变动可能有些领导感触到了,但不明确,从我这个角度分享给大家,仅供参考: 一、企业合作冲破了组织围墙。 刚刚好几位企业CIO们讲到了,当初人与人的合作不再是企业外部大家玩来玩去,而是产业级的,特地是像越秀地产的领导提到,他们的钉钉用的是专属钉钉,把生态同样在一个IM里进行业务协同。如果还像以前那样靠人买通,那么合作效率将极其低下。于此同时,咱们很分明外贸行业受到疫情和贸易战影响微小,而当初还能持续增长的或者说还衰弱活着的外贸企业都是走线上通道的。这个时代,业务合作早已冲破企业组织围墙。 二、企业治理旨在“用户至上” 当初的企业治理,大家留神一个词,也是主旨,是用户第一。不论做什么,有些人说做贸易的,你是用户第一,做餐饮的也是用户第一,那如果是做设施的呢?答案还是用户第一,因为你的企业客户最终交付的是终端消费者,终端消费者的感触决定您的终局。刚刚咱们说以后企业竞争是什么格局?是产业链竞争,用户的感触决定整个产业的命运。所以当初的治理旨在用户至上,要深度的触达并思考用户的感触,包含用户的需要、沟通以及他的价值最大化,方能胜利。 三、业务多变,合作引擎化 当初的治理跟以前不一样,以前印象最深的就是先固化、再优化。当初基本来不及,因为这个世界变动太快了,咱们必须撑持这个变动,它的变动体现在很多方面,第一个就是业务状态变动太快,原来咱们认为把线下拉到天猫卖一卖就能够了,然而发现天猫还有很多玩法,起初发现直播也能卖,这期间变动节奏太快;第二个人员的流动快;第三组织调整快;第四角色调整快,新岗位、新人员、新领导及大家的新思维都在发生变化;第五工作平台多样,最现实的后果就是超级APP,一个货色把大家平台都搞定了。然而事实却是大量的非凡工作场景和工作环境使得咱们企业不得不面临既有用电脑、又用手机以及一些物联设施、甚至其余不同沟通平台或工具的场面,这些咱们都须要做撑持,这个个性就决定了合作要引擎化,疾速的把这些货色凝聚在一起,拉通起来。一般而言咱们会用流程引擎拉通,有这么一个货色在,怎么变都没关系。一句话讲,在这个世界上,你曾经找不到截然不同的企业了,更何况企业的业务? 四、治理在线,人不见人 企业治理曾经不须要人见人了,这个不仅仅是企业,政务单位也是如此,人不见人的协同曾经成为趋势。咱们这么大的国家为什么在关闭那么久的工夫外面仍然井井有序,包含应急的各种事件解决,中国人的力量大就大在这里。数字化的时代,通信曾经不是靠吼了,这个吼包含电话吼和当面吼。疫情下让咱们动摇的意识到一个情理,好的合作不是人找人,是人看不到人,事件能力做到极致。 五、数据能谈话,业务导向化 以前咱们讲大数据,很多人都在讲,实际上光有数据是不够的,数据只有业务导向化才有价值,已经咱们一谈数据都搞各种货色收集各种数据,存起来说将来有价值,然而到目前为止这只是老本,毫无价值。肯定要把数据通过智能模型构建出决策支撑体系,数据才可能进行业务赋能,数据也才有价值。这外面如果你模型搞错了,数据还会说实话,那不是赋能,就是拖后腿。 后面的这些特点总结进去都会发现就一句话,数字化是古代智能治理的惟一解。后面所有的特点归根结底都是要用数字化去解决。我没有用数智化,因为这个偏差于解决方案,数字化自身是企业走向智能化的通道。 数字化有3个的外围关注点: 1、灵动利用:数字化时代有疾速灵动响应需要; 2、生态连贯:上下左右生态连贯的需要 3、数据资产:能把数据变成资产; 这三个特点是咱们讲数字化的外围关注点,也是后面新时代特点积淀的形象关键点。要想满足它,肯定要有一个优良数字化引擎平台去撑,否则不能应变,无奈连贯。 再回首咱们再回过来看,十年前到大概两三年前,谈企业信息化大多数专家上来就是讲要做顶层设计,要把架构搭好能力搞,所以他们会讲组织不能自己建数字化,因为会数据孤岛,不能做烟囱式构建,因为数据不共享且容易反复建设,不能靠人硬编码去构建,因为老本高。因而最好的做法就是要做好顶层设计,想分明再干。 然而十年后的明天,时代变了,这个世界变动太快,每个部门的业务变动太快,咱们在座的扪心自问,十年前有想到明天这样的IT场面吗。到了明天咱们才发现每个组织本人做本人的数字化才是最快最高效的,方才越秀领导展示了很多业务都是组织级的,如人事部的、党支部的、宣传口的,他们有他们本人的业务逻辑,等着顶层设计怎么来不及。同时,明天的技术架构又有了大的倒退,架构微服务化曾经成为常态,只有咱们解决好服务一致性就具备充沛可集成性与可复用性,而不须要放心零碎间抵触、关闭曾经不可复用。而后,下面两点要想施展价值就肯定要有一个优良的数字化引擎,让这些业务人员疾速的基于引擎进行利用构建(留神不是硬写代码),让这些利用与业务在各自组织外面疾速的迭代,这才是外围。所以明天咱们从新来看企业数字化的要害,首先是企业数字化底层撑持能力,这才是古代企业数字化的趋势。咱们并不是说做顶层设计是谬误的,然而如果没有底层撑持,顶层设计即难以落地,也无从谈起。 企业数字化中的引擎位置底层撑持肯定要有方才咱们说的平台,这个平台咱们把他定位成企业数字化的引擎。它会承接企业后盾级的比如说ERP的集成,又能够对前端To B、To C利用之间的连贯与疾速构建。比方,明天来了一场疫情,须要大家实时报告各自的地位,你就能够用这个引擎五分钟内搭出一个表单,所有在钉钉上的人都能够看到和填写上报。大家看咱们视频中的页面,作为数字化引擎,它的右边能够跟咱们大量的第三方、行政事业、平台方服务与能力接口进行对接,左边能够跟大数据、人工智能等新兴技术平台进行耦合与集成,疾速复用他们能力,比方云原生,咱们不须要什么都本人去做底层开发,但咱们都须要用,也仅仅须要用。所以说将来数字化引擎的位置在企业数字化板块中处于两头外围地位,每个企业其余都能够有所抉择,但这个引擎不要不行。 企业数字化引擎必备个性 企业数字化的引擎须要有四个个性:构建麻利,在线连贯,流程驱动,数字智能。 他能够撑持这五种场景:以业务为核心的麻利式经营,以流程为核心的协同式治理,以服务为核心的中台连贯,和以连贯为核心的产业链协同,以数据为核心的智能化转型。 而一个优良的数字化引擎这必须具备这些外围能力:跨零碎业务集成能力、所见即所得业务设计能力、拖拽式流程设计能力、图形化业务规定配置能力、跨组织业务协同能力、配置化的视图设计能力、智能化报表设计能力、可视化页面设计能力。八个疾速构建能力对立在一起的外围就是“快”,只有残缺具备这八个特点才是优良的数字化引擎。 说到这里,咱们略微做个广告,咱们举荐大家应用奥哲云枢。奥哲云枢除了产品自身具备上述优良的数字化引擎的个性外,咱们还在多个行业领有了大量客户实际与资产积淀,咱们有多个行业的解决方案和利用案例,于此同时咱们具备全国各地本地化交付能力。 最初,有图有假相,这是咱们广州的客户-佛吉亚,他们用云枢实现了“智慧工厂+无人治理”;这个是云丁,他们通过咱们的低代码平台实现了本人企业内外部生态线上一体化经营;这最初一个则是有真正机器的机器人公司-上海擎朗,对于他们如何构建本人企业的智能治理,留给咱们前面可恶而智慧的万总给大家介绍,谢谢大家。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 9, 2020 · 1 min · jiezi

关于jquery:数据湖架构为什么需要湖加速

简介: 湖减速即为数据湖减速,是指在数据湖架构中,为了对立反对各种计算,对数据湖存储提供适配反对,进行优化和缓存减速的中间层技术。那么为什么须要湖减速?数据湖如何实现“减速”?本文将从三个方面来介绍湖减速背地的起因,分享阿里云在湖减速上的实践经验和技术计划。 在开源大数据畛域,存储/计算拆散曾经成为共识和规范做法,数据湖架构成为大数据平台的首要抉择。基于这一范式,大数据架构师须要思考三件事件: 第一,抉择什么样的存储系统做数据湖(湖存储)?第二,计算和存储拆散后,呈现了性能瓶颈,计算如何减速和优化(湖减速)?第三,针对须要的计算场景,抉择什么样的计算引擎(湖计算)? 湖存储能够基于咱们相熟的HDFS,在公共云上也能够选择对象存储,例如阿里云OSS。在公共云上,基于对象存储构建数据湖是目前业界最支流的做法,咱们这里重点探讨第二个问题,联合阿里云上的EMR JindoFS优化和实际,看看数据湖怎么玩“减速”。 湖减速在数据湖架构里,湖存储(HDFS,阿里云OSS)和湖计算(Spark,Presto)都比较清楚。那么什么是湖减速?大家无妨搜寻一下…(根本没有间接的答案)。湖减速是阿里云EMR同学在外部提出来的,顾名思义,湖减速即为数据湖减速,是指在数据湖架构中,为了对立反对各种计算,对数据湖存储提供适配反对,进行优化和缓存减速的中间层技术。这外面呈现较早的社区计划应该是Alluxio,Hadoop社区有S3A Guard,AWS有EMRFS,都适配和反对AWS S3,Snowflake在计算侧有SSD缓存,Databricks有DBIO/DBFS,阿里云有EMR JindoFS,大体都能够归为此类技术。 那么为什么须要湖减速呢?这和数据湖架构分层,以及相干技术演进具备很大关系。接下来,咱们从三个方面的介绍来寻找答案。别离是:根底版,要适配;标配版,做缓存;高配版,深度定制。JindoFS同时涵盖这三个档次,实现数据湖减速场景全笼罩。 根底版:适配对象存储以Hadoop为根底的大数据和在AWS上以EC2/S3为代表的云计算,在它们倒退的晚期,更像是在平行的两个世界。等到EMR产品呈现后,怎么让大数据计算(最后次要是MapReduce)对接S3,才成为一个实在的技术命题。对接S3、OSS对象存储,大数据首先就要适配对象接口。Hadoop生态的开源大数据引擎,比方Hive和Spark,过来次要是反对HDFS,以Hadoop Compatible File System(HCFS)接口适配、并反对其余存储系统。机器学习生态(Python)以POSIX接口和本地文件系统为主,像TensorFlow这种深度学习框架当然也反对间接应用HDFS 接口。对象存储产品提供REST API,在次要开发语言上提供封装好的SDK,但都是对象存储语义的,因而上述这些风行的计算框架要用,必须加以适配,转换成HCFS接口或者反对POSIX。这也是为什么随着云计算的风行,适配和反对云上对象存储产品成为Hadoop社区开发的一个热点,比方S3A FileSytem。阿里云EMR团队则鼎力打造JindoFS,全面反对阿里云OSS并提供减速优化。如何高效地适配,并不是设计模式上减少一层接口转换那么简略,做好的话须要了解两种零碎(对象存储和文件系统)背地的重要差别。咱们略微开展一下: 第一,海量规模。 对象存储提供海量低成本存储,相比文件系统(比方HDFS),阿里云OSS更被用户认为可有限扩大。同时随着各种BI技术和AI技术的风行和遍及,开掘数据的价值变得切实可行,用户便偏向于往数据湖(阿里云OSS)贮存越来越多不同类型的数据,如图像、语音、日志等等。这在适配层面带来的挑战就是,须要解决比传统文件系统要大许多的数据量和文件数量。千万级文件数的超大目录不足为奇,甚至蕴含大量的小文件,面对这种目录,个别的适配操作就失灵了,不是OOM就是hang在那儿,基本就不可用。JindoFS一路走来积攒了很多教训,咱们对大目录的listing操作和du/count这种统计操作从内存应用和充沛并发进行了深度优化,目前达到的成果是,千万文件数超大目录,listing操作比社区版本快1倍,du/count快21%,整体体现更为稳固牢靠。 第二,文件和对象的映射关系。 对象存储提供key到blob对象的映射,这个key的名字空间是扁平的,自身并不具备文件系统那样的层次性,因而只能在适配层模仿文件/目录这种层次结构。正是因为要靠模仿,而不是原生反对,一些要害的文件/目录操作代价低廉,这外面最为出名的就是rename了。文件rename或者mv操作,在文件系统外面只是须要把该文件的inode在目录树上移动下地位即可,一个原子操作;然而在对象存储上,往往受限于外部的实现形式和提供进去的标准接口,适配器个别须要先copy该对象到新地位,而后再把老对象delete掉,用两个独立的步骤和API调用。对目录进行rename操作则更为简单,波及到该目录下的所有文件的rename,而每一个都是上述的copy+delete;如果目录档次很深,这个rename操作还须要递归嵌套,波及到数量微小的客户端调用次数。对象的copy通常跟它的size相干,在很多产品上还是个慢活,能够说是雪上加霜。阿里云OSS在这方面做了很多优化,提供Fast Copy能力,JindoFS充分利用这些优化反对,联合客户端并发,在百万级大目录rename操作上,性能比社区版本靠近快3X。 第三,一致性。 为了谋求超大并发,不少对象存储产品提供的是最终一致性(S3),而不是文件系统常见的强一致性语义。这带来的影响就是,举个栗子,程序明明往一个目录外面刚刚写好了10个文件,后果随后去list,可能只是局部文件可见。这个不是性能问题,而是正确性了,因而在适配层为了满足大数据计算的需要,Hadoop社区在S3A适配上花了很大力量解决应答这种问题,AWS本人也相似提供了EMRFS,反对ConsistentView。阿里云OSS提供了强一致性,JindoFS基于这一个性大大简化,用户和计算框架应用起来也毋庸放心相似的一致性和正确性问题。 第四,原子性。 对象存储本身没有目录概念,目录是通过适配层模仿进去的。对一个目录的操作就转化为对该目录下所有子目录和文件的客户端屡次调用操作,因而即便是每次对象调用操作是原子的,但对于用户来说,对这个目录的操作并不能真正做到原子性。举个例子,删除目录,对其中任何一个子目录或文件的删除操作失败(蕴含重试),哪怕其余文件删除都胜利了,这个目录删除操作整体上还是失败。这种状况下该怎么办?通常只能留下一个处于两头失败状态的目录。JindoFS在适配这些目录操作(rename,copy,delete and etc)的时候,联合阿里云 OSS 的扩大和优化反对,在客户端尽可能重试或者回滚,可能很好地连接数据湖各种计算,在pipeline 上下游之间保障正确处理。 第五,冲破限度。 对象存储产品是独立演变倒退的,少不了会有本人的一些独门秘籍,这种个性要充分利用起来可能就得冲破HCFS形象接口的限度。这里重点谈下对象存储的高级个性Concurrent MultiPartUpload (CMPU),该个性容许程序依照分片并发上传part的形式高效写入一个大对象,应用起来有两个益处,一个是能够依照并发甚至是分布式的形式写入一个大对象,实现高吞吐,充分发挥对象存储的劣势;另外一个是,所有parts都是先写入到一个staging区域的,直到complete的时候整个对象才在指标地位呈现。利用阿里云OSS这个高级个性,JindoFS开发了一个针对MapReduce模型的Job Committer,用于Hadoop,Spark 和相似框架,其实现机制是各个工作先将计算结果依照part写入到长期地位,而后作业commit的时候再complete这些后果对象到最终地位,实现毋庸rename的成果。咱们在Flinkfile sink connector反对上也同样往计算层透出这方面的额定接口,利用这个个性反对了Exactly-Once的语义。 标配版:缓存减速数据湖架构对大数据计算的另外一个影响是存/算拆散。存储和计算拆散,使得存储和计算在架构上解耦,存储朝着大容量低成本规模化供给,计算则向着弹性伸缩,丰富性和多样化向前倒退,在整体上有利于专业化分工和大家把技术做深,客户价值也能够实现最大化。然而这种拆散架构带来一个重要问题就是,存储带宽的供给在一些状况下可能会跟计算对存储带宽的需要不相适应。计算要跨网络拜访存储,数据本地性隐没,拜访带宽整体上会受限于这个网络;更重要的是,在数据湖理念下,多种计算,越来越多的计算要同时拜访数据,会竞争这个带宽,最终使得带宽供需失衡。咱们在大量的实际中发现,同一个OSS bucket,Hive/Spark数仓要进行ETL,Presto要交互式剖析,机器学习也要抽取训练数据,这个在数据湖时代之前不可设想,那个时候兴许最多的就是MapReduce作业了。这些多样化的计算,对数据拜访性能和吞吐的需要却不遑多让甚至是变本加厉。常驻的集群心愿实现更多的计算;弹性伸缩的集群则心愿尽快实现作业,把大量节点给开释掉节省成本;像Presto这种交互式剖析业务方心愿是越快越好,稳固亚秒级返回不受任何其余计算影响;而GPU训练程序则是冀望数据齐全本地化一样的极大吞吐。像这种场面该如何破呢?有限地减少存储侧的吞吐是不事实的,因为整体上受限于和计算集群之间的网络。无效地保障丰盛的计算对存储带宽的需要,业界早已给出的答案是计算侧的缓存。Alluxio始终在做这方面的事件,JindoFS外围定位是数据湖减速层,其思路也同出一辙。上面是它在缓存场景上的架构图。 JindoFS在对阿里云OSS适配优化的同时,提供分布式缓存和计算减速,刚刚写出去的和反复拜访的数据能够缓存在本地设施上,包含HDD,SSD和内存,咱们都别离专门优化过。这种缓存减速是对用户通明的,自身并不需要计算额定的感知和作业批改,在应用上只须要在OSS适配的根底上关上一个配置开关,开启数据缓存。叠加咱们在适配上的优化,跟业界某开源缓存计划相比,咱们在多个计算场景上都具备显著的性能当先劣势。基于磁盘缓存,受害于咱们可能更好地balance多块磁盘负载和高效精细化的缓存块治理,咱们用TPC-DS 1TB进行比照测试,SparkSQL性能快27%;Presto大幅当先93%;在HiveETL场景上,性能当先42%。JindoFS 的 FUSE反对齐全采纳 native 代码开发而没有 JVM 的累赘,基于SSD缓存,咱们用TensorFlow程序通过JindoFuse来读取JindoFS上缓存的OSS数据来做训练,相较该开源计划性能快40%。 在数据湖架构下在计算侧部署缓存设施引入缓存,能够实现计算减速的益处,计算效率的晋升则意味着更少的弹性计算资源应用和老本收入,但另一方面毋庸讳言也会给用户带来额定的缓存老本和累赘。如何掂量这个老本和收益,确定是否引入缓存,须要结合实际的计算场景进行测试评估,不能一概而论。 高配版:深度定制,本人管理文件元数据咱们在JindoFS上优化好OSS适配,把Jindo分布式缓存性能做到效力最大化,能满足绝大多数大规模剖析和机器学习训练这些计算。现有的JindoFS大量部署和应用表明,无论Hive/Spark/Impala这种数仓作业,Presto交互式剖析,还是TensorFlow训练,咱们都能够在计算侧通过应用阿里云缓存定制机型,来达到多种计算高效拜访OSS数据湖的吞吐要求。可是故事并没有完,数据湖的架构决定了计算上的开放性和更加多样性,下面这些计算可能是最次要的,但并不是全副,JindoFS在设计之初就心愿实现一套部署,即能笼罩各种次要场景。一个典型状况是,有不少用户心愿JindoFS可能齐全代替HDFS,而不只是Hive/Spark够用就能够了,用户也不心愿在数据湖架构下还要混合应用其余存储系统。整顿一下大略有上面几种状况须要咱们进一步思考。 第一、下面探讨对象存储适配的时候咱们提到,一些文件/目录操作的原子性需求在实质上是解决不了的,比方文件的rename,目录的copy,rename和delete。彻底解决这些问题,齐全满足文件系统语义,基本上须要本人实现文件元数据管理,像HDFS NameNode那样。 第二、HDFS有不少比拟高级的个性和接口,比方反对truncate,append,concat,hsync,snapshot和Xattributes。像HBase依赖hsync/snapshot,Flink依赖truncate。数据湖架构的开放性也决定了还会有更多的引擎要对接上来,对这些高级接口有更多需要。 第三、HDFS重度用户心愿可能平迁上云,或者在存储计划抉择上进行微调,原有基于HDFS的利用,运维和治理依然可能持续应用。在性能上提供Xattributes反对,文件权限反对,Ranger集成反对,甚至是auditlog反对;在性能上心愿不低于HDFS,最好比HDFS还好,还不须要对NameNode调优。为了也可能享受到数据湖架构带来的各种益处,该如何帮忙这类用户基于OSS进行架构降级呢? 第四、为了冲破S3这类对象存储产品的局限,大数据业界也在针对数据湖深度定制新的数据存储格局,比方Delta,Hudi,和Iceberg。如何兼容反对和无力优化这类格局,也须要进一步思考。 基于这些因素,咱们进一步开发和推出JindoFS block模式,在OSS对象存储的根底上针对大数据计算进行深度定制,依然提供规范的HCFS接口,因为咱们深信,即便同样走深度定制路线,遵循现有规范与应用习惯对用户和计算引擎来说更加容易推广和应用,也更加合乎湖减速的定位和使命。JindoFS block模式对标HDFS,不同的是采取云原生的架构,依靠云平台咱们做了大量简化,使得整个零碎具备弹性,轻量和易于运维的特点和劣势。 如上图示,是JindoFS在block模式下的零碎架构,整体上重用了JindoFS缓存零碎。在这种模式下,文件数据是分块寄存在OSS上,保障牢靠和可用;同时借助于本地集群上的缓存备份,能够实现缓存减速。文件元数据异步写入到阿里云OTS数据库避免本地误操作,同时不便JindoFS集群重建复原;元数据在失常读写时走本地RocksDB,内存做LRU缓存,因而撑持的文件数在亿级;联合元数据服务的文件/目录级别细粒度锁实现,JindoFS在大规模高并发作业顶峰的时候体现比HDFS更稳固,吞吐也更高。咱们用HDFS NNBench做并发测试,对于最要害的open和create操作,JindoFS的IOPS比HDFS高60%。在千万级超大目录测试上,文件listing操作比HDFS快130%;文件统计du/count操作比HDFS快1X。借助于分布式Raft协定,JindoFS反对HA和多namespaces,整体上部署和保护比HDFS简化太多。在IO吞吐上,因为除了本地磁盘,还能够同时应用OSS带宽来读,因而在同样的集群配置下用DFSIO实测下来,读吞吐JindoFS比HDFS快33%。 JindoFS在湖减速整体解决方案上进一步反对block模式,为咱们拓宽数据湖应用场景和反对更多的引擎带来更大的设想空间。目前咱们曾经反对不少客户应用HBase,为了受害于这种存/算拆散的架构同时借助于本地治理的存储设备进行缓存减速,咱们也在摸索将更多的开源引擎对接上来。比方像Kafka,Kudu甚至OLAP新贵ClickHouse,能不能让这些引擎专一在它们的场景上,将它们从坏盘解决和如何伸缩这类事件上彻底解放出来。本来一些保持应用HDFS的客户也被block模式这种轻运维,有弹性,低成本和高性能的劣势吸引,通过这种形式也转到数据湖架构上来。如同对OSS的适配反对和缓存模式,JindoFS这种新模式依然提供齐全兼容的HCFS和FUSE反对,大量的数据湖引擎在应用上并不需要减少额定的累赘。 总结行文至此,咱们做个回顾和总结。基于数据湖对大数据平台进行架构降级是业界显著趋势,数据湖架构包含湖存储、湖减速和湖剖析,在阿里云上咱们通过 JindoFS 针对各种场景提供多种数据湖减速解决方案。阿里云推出的专门反对数据湖治理的Data Lake Formation,可全面反对数据湖。 ...

September 23, 2020 · 1 min · jiezi

关于jquery:戏说云栖如果这些名人参加云栖大会

导语:加入云栖大会是怎么一种体验?当人们在谈云栖大会时,到底在聊什么?如果这些名人加入云栖大会,他们是不是这样想? 看你脑洞清奇,是万中无一的创意奇才~你就是评论区最皮的仔! 上云栖大会,助你关上数字世界的科技想象力: https://yunqi.aliyun.com/?utm_content=m_1000181612

September 15, 2020 · 1 min · jiezi

关于jquery:jqyert中操作属性的函数

jqyert中操作属性的函数 prop() attr()1.prop()用于获取dom对象属性值或赋值,只能拿到规范属性,不能拿到某些自定义属性,根本语法prop(属性名,[属性值])属性值可写可不写2attr()能够拿到规范属性,也能拿到自定义属性 jquery中的data函数用于在指定dom对象上存储数据,取数据根本语法data(key[,value]);如果只有key则示意取值,有key value示意赋值,只有先赋了值能力取到值。

September 15, 2020 · 1 min · jiezi

关于jquery:如何实现一个跨库连表SQL生成器

简介: 用户只需在前端简略配置下指标,零碎即可主动生成大宽表,让用户查问到他所须要的实时数据,数据源反对跨库并反对多种指标介质。这样的数据全局实时可视化如何实现?本文从需要剖析开始,分享主动生成SQL性能开发中使用到的设计模式和数据结构算法设计。 一 概述ADC(Alibaba DChain Data Converger)我的项目的次要目标是做一套工具,用户在前端简略配置下指标后,就能在零碎主动生成的大宽表外面查问到他所须要的实时数据,数据源反对跨库并反对多种指标介质。说的更高层次一点, 数据的全局实时可视化这个事件自身就是解决供应链数据“神龙效应”的无效措施(参考施云老师的《供应链架构师》[1]一书)。做ADC也是为了这个指标,整个ADC零碎架构如下图所示: 架构解析: 初始数据来自于元数据中心。通过元数据适配层后转换为外部格局数据。调度核心把外部格局的数据传到打算核心,打算核心剖析数据需要并建模,通过SQL生成器生成资源和SQL,别离通过告警核心、对账核心设定监控规范和对账规范。对账核心定时对账,查看数据的对齐状况。告警核心能够针对工作谬误、提早低等状况发送报警。资源的生命周期管控在资源管理核心下,view删除时资源管理核心负责回收资源。根底资源适配层次要借助团体根底资源管理能力串联阿里各类数据服务, 比方阿里云MaxComputer、Flink、阿里云AnalyticDB等。其中,SQL生成器的上游和上游次要波及: 上游打算核心配置指标:用户在前端配置他想看的数据有哪些。生产原始数据:依据用户输出失去哪些表作为数据源, 以及它们之间的连贯关系。上游根底资源适配层适配器把SQL公布到Flink, 依据建表数据建物理表。本文次要从技术角度介绍下SQL生成器相干的内容。 二 技术实现在我的项目施行阶段,须要从需要剖析、技术方案设计、测试联调几个步骤开展工作。本文重点不放在软件开发流程上, 而是就设计模式抉择和数据结构算法设计做下重点解说。 需要剖析在需要分析阶段, 咱们明确了主动生成SQL模块所须要思考的需要点, 次要蕴含如下几点: 须要反对多个事实表(流表)、多个维度表连表,其中一个事实表是主表,其余的均为辅助表。维表变动也该当引起最终数据库更新。主表对辅助表为1:1或N1,也就是说主表的粒度是最细的, 辅表通过惟一键来和主表连贯。流表中可能存在惟一键统一的多张流表, 须要通过全连贯关联。惟一键不同的表之间通过左连贯关联。只有连表和UDF,没有groupby操作。要求同步延时较小,反对多种源和指标介质。因为查问压力在指标介质,所以查问qps没有要求。零碎流程图明确需要后, 咱们把SQL生成器总体性能分为两块: 同步生成SQL和建表数据异步公布SQL和建表之所以把生成SQL阶段做成同步是因为同步阶段内存操作为主,如果发现数据有问题无奈生成SQL能做到疾速失败。公布阶段调用根底资源适配层须要同步期待较长时间, 每个公布步骤要做到有状态记录, 可回滚或者重试。所以异步实现。SQL生成器同步阶段的整体性能细化到小模块,如下图所示: 查看阶段 查看原始数据是否有问题, 无奈生成SQL则疾速失败。 参数查看:查看上游是否提供了根本的参数, 比方事实表信息(能够没有维表, 然而必须有事实表)。表类型查看:检查数据起源类型是否反对。分区字段查看:是否提供了大宽表分区字段。连贯束缚:查看流表,维表连贯信息是否正确。主表唯一性束缚:查看主表是否含连贯信息,惟一键是否有ETL信息。元数据查看:查看是否蕴含HBase配置信息。主键修改:修改维表连贯键, 必须是维表的惟一键。数据同步 同步所有原始表和原始表的连贯数据(比方源表同步进来, 生成1:1的HBase表)。生成优先级队列:生成连贯和公布等工作的执行优先级。同步填充:填充源表对应的同步阶段HBase表数据,和对应的配置项, 类型转换(比方源表是MySQL表,字段类型要转换为HBase的类型), ETL填充, 增加音讯队列(通过发送音讯的形式告诉上游节点运行)。反复列修剪:删除反复的列。空白列打标:对于满足肯定条件(比方不须要在大宽表展现, 不是惟一键列, 连贯键列, 保序列)的列打上空白列标识。保序字段填充:如果上游提供了示意数据创立工夫的字段, 则用该字段作为数据保序字段, 没有则填充零碎接管到数据的工夫作为保序字段。计算阶段 生成大宽表,填充SQL。 两头表填充:填充全连贯产生的两头表。连贯关系降级:会在本文前面阐明。反向索引填充:填充“反向索引”信息。音讯填充:两头表增加音讯队列(两头表更新能够触发上游节点)。大宽表填充:填充大宽表数据。连贯链对齐:两头表和大宽表连贯键对齐。ETL填充:填充大宽表列的ETL信息。分区字段填充:填充大宽表分区字段。SQL填充:填充Flink同步表映射SQL语句, Flink计算SQL语句, Flink后果表映射SQL语句。保留:把SQL和建表数据存入数据库, 之后的申请能够复用已有的数据, 防止反复建表。异步公布阶段会把SQL语句公布到Flink。 增加反向索引的起因 如果有A、B两表连贯,那么连贯形式为A表的非主键连贯B表主键。从时序上来说可能有以下三种状况: B表数据先于A表数据多天产生B表数据后于A表数据多天产生B表数据和A表数据同时产生上面咱们就这三种状况逐个剖析。 场景1:B表数据先于A表数据多天产生 咱们如果B表数据存储于某个反对高qps的数据库内,咱们能够间接让A表数据到来时间接连贯此表(维表)来实现连表。 场景2:B表数据后于A表数据多天产生 这种场景比拟麻烦。A表数据后行产生,因而过早的落库,导致B表数据到来时即便连贯B维表也拿不到数据。这种场景还有一个相似的场景:如果AB连贯实现后B产生了更新,如何让B的更新体现在宽表中? 为了解决这种问题,咱们减少了一个“反向索引表”。如果A的主键是id,连贯键是ext_id,那么咱们能够将ext_id和id的值存储在一张表内,当B的数据更新时,用B的主键连贯这种表的ext_id字段,拉取到所有的A表id字段,并将A表id字段从新流入Flink。 三 设计模式对系统整体流程有理解当前, 咱们再来看看零碎的设计模式抉择,抉择设计模式时,咱们思考到数据处理相干的开发工作存在一些共性: 拆解后小性能多小性能存在复用状况小性能执行有严格的先后顺序须要记录小性能运行状态, 流程执行可回滚或者中断可复原执行因为数据处理工作的步奏比拟简短,而且因为每个阶段的后果与下阶段的执行有关系,又不能离开。 参考 PipeLine(流水线)设计模式[2],综合思考后咱们零碎的整体设计如下图所示: ...

September 14, 2020 · 1 min · jiezi

关于jquery:JQuery3

JQuery事件处理JQuery为咱们提供方便的事件注册机制,但有以下优缺点。1.长处:操作简略,且不必放心事件笼罩等问题2.毛病:不能解绑事件,且不能实现事件委托<body> <div></div> <script> $(function() { // 1. 单个事件注册 $("div").click(function() { $(this).css("background", "purple"); }); $("div").mouseenter(function() { $(this).css("background", "skyblue"); }); }) </script></body>事件处理程序on()绑定事件on():用于事件绑定,是目前最好用的事件绑定办法off()事件解绑trigger()/triggerHandler():事件触发 <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>on()事件处理程序</title> <script src="jquery-3.5.1.js"></script> <style> * { margin: 0; padding: 0; } .box,.container { width: 200px; height: 200px; background-color: #0000FF; margin: 200px auto; } .curent { background-color: #008000; } </style> </head> <body> <div class="box"></div> <div class="container"></div> <script> // on()办法能够增加多个事件处理程序 $(function(){ $('.box').on({ mouseenter:function(){ $(this).css('background','red') }, mouseleave:function(){ $(this).css('background','purple') }, click:function(){ $(this).css('background','yellow') } }) //事件处理程序雷同的状况下 $('.container').on('mouseenter mouseleave',function(){ $(this).toggleClass('curent') }) }) </script> </body></html> ...

September 13, 2020 · 11 min · jiezi

关于jquery:JQuery2

JQuery属性操作元素固定属性值prop()所谓的元素的固定属性就是元素自带的属性,如a链接中的href属性语法 元素自定义属性值attr()用户本人给元素设置的属性,称为自定义属性留神:该办法也能够间接获取自定义属性 数据缓存data()data()办法能够指定元素上设置属性,但不会批改DOM构造,一旦页面被从新刷新,之前寄存的数据都会被移除<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>JQuery属性操作</title> <script src="./jquery-3.5.1.js"></script> </head> <body> <a href="https://www.baidu.com/" title="百度">百度</a> <input type="checkbox" name="" id="" checked> <div index='2' date-index='2'>DIV</div> <span>SPAN</span> <script> $(function () { // 1.获取元素固有属性值 console.log($('a').prop('href')) $('a').prop('title', 'baidu') $('input').change(function () { console.log($('input').prop('checked')) }) //2. 获取元素自定义的属性 console.log($('div').attr('index')) console.log($('div').attr('index', "4")); console.log($('div').attr('date-index')) // 3.数据缓存 外面的数据是寄存在内存外面 $('span').data('name', "尧子陌"); console.log($('span').data('name')) }) </script> </body> </html> JQuery获取文本值<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JQuery获取文本值</title> <script src="jquery-3.5.1.js"></script> </head> <body> <div> <span>hello word</span> </div> <input type="text" value="请输出内容"> </body> <script> console.log($('div').html()) //获取div外面的内容; $('div').html('Zero'); console.log($('input').val());//打印表单外面的内容 $('input').val('520') </script> </html> ...

September 11, 2020 · 2 min · jiezi

关于jquery:JQuery1

JQuery的介绍JQuery:即javascript库。对原生的js代码进行封装,咱们能够间接疾速而高效的应用封装好的性能常见的JavaScript 库:jQuery、Prototype、YUI、Dojo、Ext JS、挪动端的zepto等,这些库都是对原生 JavaScript 的封装,外部都是用 JavaScript 实现的,咱们次要学习的是 jQuery。 官网地址:https://jquery.com/, JQuery的长处1. 轻量级。外围文件才几十kb,不会影响页面加载速度。 2. 跨浏览器兼容,根本兼容了当初支流的浏览器 3. 链式编程、隐式迭代。 4. 对事件、款式、动画反对,大大简化了DOM操作。 5. 反对插件扩大开发。有着丰盛的第三方的插件,例如:树形菜单、日期控件、轮播图等。 6. 收费、开源。 体验JQuery步骤 引入jQuery文件。在文档最开端插入 script 标签,书写体验代码。JQuery入口函数// 第一种: 简略易用。$(function () { ... // 此处是页面 DOM 加载实现的入口}) ; // 第二种: 繁琐,然而也能够实现$(document).ready(function(){ ... // 此处是页面DOM加载实现的入口});JQuery中的顶级对象$是jQuery的顶级对象,相当于原生JavaScript中的 window。$是 jQuery 的别称,在代码中能够应用 jQuery 代替 <script> //第一种办法 $(function() { alert('hello JQuery') }) //第二种办法 jQuery(function () { alert('hello JQuery') }) </script>DOM对象与JQuery对象原生js获取的对象称为DOM对象用JQuery获取到的对象称为Jquery对象 Jquery对象的实质其实是$对DOM对象包装后产生的对象(以伪数组的形式存储) DOM对象只能应用javascript原生的办法,而JQuery对象只能应用Jquery中的办法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>DOM对象和JQuery对象</title> <script src="./jquery-3.5.1.js"></script> </head> <body> <div>DOM对象</div> <header>JQuery对象</header> </body> <script> //应用DON获取元素 var div = document.querySelector('div'); console.dir(div); //应用jQuery获取元素 console.log($('header')) </script> </html> ...

September 11, 2020 · 6 min · jiezi

关于jquery:Uncaught-ErrorBootstraps-JavaScript-requires-jQuery

谬误形容:Uncaught Error: Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4谬误截图: 起因剖析:解决形式:在引入js文件时,我引入的版本是1.8.3的,版本过低,换一个高一点的版本即可。如:从新运行正确。解决形式2:引入bootstrap之前需引入jquery.因为bootstrap依赖于jquery.

September 9, 2020 · 1 min · jiezi

关于jquery:golang调用python实战

简介: # 简介 ## go-python Python提供了丰盛的[C-API](https://docs.python.org/2/c-a...。而C和Go又能够通过cgo无缝集成。所以,间接通过Golang调用libpython,就能够实现Go调Python的性能了。然而过程比较复杂,而[go-python](https://github.com/sbinet/go-... 简介go-pythonPython提供了丰盛的C-API。而C和Go又能够通过cgo无缝集成。所以,间接通过Golang调用libpython,就能够实现Go调Python的性能了。然而过程比较复杂,而go-python提供了针对CPython-2的C-API提供了native-binding能力,不便实现了Go到Python的调用。 然而目前,go-python只反对python2.7。 pkg-configgo-python应用pkg-config来获取python的头文件及库信息。 一般来说,如果库的头文件不在/usr/include目录中,那么在编译的时候须要用-I参数指定其门路。因为同一个库在不同零碎上可能位于不同的目录下,用户装置库的时候也能够将库装置在不同的目录下,所以即便应用同一个库,因为库的门路的不同,造成了用-I参数指定的头文件的门路和在连贯时应用-L参数指定lib库的门路都可能不同,其后果就是造成了编译命令界面的不对立。pkg-config就是用来解决编译连贯界面不对立问题的一个工具。 pkg-config的根本思维是通过库提供的一个.pc文件取得库的各种必要信息的,包含版本信息、编译和连贯须要的参数等。这样,不论库文件装置在哪,通过库对应的.pc文件就能够精确定位,能够应用雷同的编译和连贯命令,使得编译和连贯界面对立。 环境配置(MAC为例)1、本地找到python-2.7.pc文件。如果没有则创立一个。特地留神,prefix要指定为python2.7的library门路。 # See: man pkg-configprefix=/System/Library/Frameworks/Python.framework/Versions/2.7exec_prefix=${prefix}libdir=${exec_prefix}/libincludedir=${prefix}/includeName: PythonDescription: Python libraryRequires:Version: 2.7Libs.private: -ldl -framework CoreFoundationLibs: -L${libdir} -lpython2.7Cflags: -I${includedir}/python2.72、将python-2.7.pc门路增加到环境变量$PKG_CONFIG_PATH中 3、验证后果:pkg-config --cflags -- python-2.7 -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 4、执行make VERBOSE=1,第一次执行可能会提醒go-python命令找不到。将gopath的bin门路增加到环境变量$PATH即可。如下图ut通过,阐明配置胜利了。 5、独自执行test。须要增加下PYTHONPATH环境变量,否则将导入不了python包。 export PYTHONPATH=.:$PYTHONPATHcd go-python/tests/kw-argsgo run main.goimporting kwargs...args=() kwds={}args=() kwds={'a': 3}样例应用python的cPickle模块,通过 dumps将python对象序列化保留到一个字符串变量中,通过loads从字符串变量中载入python对象。 package mainimport ( "fmt" "github.com/sbinet/go-python")// 初始化go-pythonfunc init() { err := python.Initialize() if err != nil { panic(err.Error()) }}func main() { gostr := "foo" //定义goloang字符串 pystr := python.PyString_FromString(gostr) //将golang字符串专程python字符串 str := python.PyString_AsString(pystr) //将python字符串,再转为golang字符串。 fmt.Println("hello [", str, "]") pickle := python.PyImport_ImportModule("cPickle") //导入cPickle模块 if pickle == nil { panic("could not import 'cPickle'") } dumps := pickle.GetAttrString("dumps") //获取dumps函数 if dumps == nil { panic("could not retrieve 'cPickle.dumps'") } defer dumps.DecRef() //缩小援用计数,开释资源。 out := dumps.CallFunctionObjArgs("O", pystr) //针对python字符串进行dumps操作。 if out == nil { panic("could not dump pystr") } defer out.DecRef() fmt.Printf("cPickle.dumps(%s) = %q\n", gostr, python.PyString_AsString(out), ) loads := pickle.GetAttrString("loads") //获取loads函数 if loads == nil { panic("could not retrieve 'cPickle.loads'") } defer loads.DecRef() out2 := loads.CallFunctionObjArgs("O", out) //将dumps后果从新loads if out2 == nil { panic("could not load back out") } defer out2.DecRef() fmt.Printf("cPickle.loads(%q) = %q\n", python.PyString_AsString(out), python.PyString_AsString(out2), )}机制简介整个go-python的外围在于解决PyObject跟golang类型的关系。在Python外部,PyObject构造体用来保留全副对象独特的数据成员,以及实现GC机制所须要的一些辅助字段等,所以说PyObjectPython对象机制的根底。 ...

September 2, 2020 · 1 min · jiezi

关于jquery:JQuery总结1

JQuery总结1`1.什么是JQuery2.JQ的引入3.文档就绪事件4.JQ选择器(重点)` 1.什么是JQueryJQ就是一个轻型的JS函数库(JS简略框架)要在html中应用jq,就必须先引入jq函数库文件。2.JQ的引入//在应用JQ之前,先引入JQ文件<script src="JQ文件门路">3.文档就绪事件下列代码运行出错,因为在运行alert的时候,浏览器还没有加载到body中的div,浏览器的内存中还没有div,所以会出错。<head> <script> var div_1 = document.getElmentById("d1"); alert(div_1.innerHTML); </script></head><body> <div id=d1>滴滴滴滴</div></body>解决方案: (1)将<script>移到<body>中的<div>之后,浏览器就会先加载<div>(2)将获取的标签放在文档就绪函数当中,浏览器在加载完所有html元素后,执行文档就绪函数,因而就能加载要加载的元素。<head>// 应用JQ之前,需先引入jQ文件 <script src="JQ文件门路"/> <script> $(function(){ var div_1 = document.getElmentById("d1"); alert(div_1.innerHTML); }); </script></head><body> <div id=d1>滴滴滴滴</div></body>(3)将事件放在一个点击事件中,点击再触发<head> <script> var DD = function(){ var div_1 = document.getElmentById("d1"); alert(div_1.innerHTML); } </script></head><body> <div id=d1 onclick="DD()">滴滴滴滴</div> </body>那么什么时候要应用就绪函数? *如果在元素还没加载之前,就获取元素时,就须要应用就绪函数。 *JQ的文档就绪函数 $(function(){ //浏览器加载实现HTML后,会执行这的代码 })*JS的文档就绪函数 window.onload = function(){ //浏览器加载实现HTML后,会执行这的代码}4.JQ选择器(重点)*(1)根本选择器 //1.元素选择器$("div")选中所有的div $("sapan")//2.id选择器$("#one")选中id为one的元素//3.class选择器$(".two")选中class为two的元素//4.多元素选择器$("div,span,.s1.#one")选中所有的div元素,span元素,class为s1的元素,id为one的元素*(2)层级选择器 $("div span") //选中div下的所有span元素$(".s1 div") //选中class为s1的所有div元素$("#two+div") //选中id为two的元素前面紧邻的div元素$("#two").next("span") //选中id为two的元素的前面紧邻的span元素$("#two").prev("span") //选中id为two的元素的后面紧邻的span元素$("#two~span") //选中id为two的元素前面的所有span元素$("#two").nextAll("span") //选中id为two的元素前面的所有span元素$("#two").prevAll("span") //选中id为two的元素后面的所有span元素$("#two").slibings("span") //选中id为two的元素前后所有的span元素*(3)根本过滤选择器 //抉择第一个div$("div:firsht")$("div:eq(0)")$("div").eq(0)//抉择最初一个div$("div:last")$("div:eq(-1)")$("div").eq(-1)//抉择第n+1个div$("div:eq(n)") $("div").eq(n)

August 27, 2020 · 1 min · jiezi

关于jquery:基于jQuery的前端开发框架在企业级开发领域里已经凉了吗

On 2017-03-28 I visited a local customer who have been using our CRM on-Premise since 2010. The reason for this visit is that they have finished some reorganization and there are some new business process to implement after it. As the current 10 CRM Fiori application could not 100% fit with their business scenario, they are considering the possibility to build some custom application using Fiori, and would like to refer to suggestions from SAP. ...

August 26, 2020 · 5 min · jiezi

关于jquery:KubeCon-2020-演讲集锦|阿里巴巴云原生技术与实践-13-讲开放下载

2020 年 7 月 30 日至 8 月 1 日,由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 Cloud Native + Open Source Virtual Summit China 2020 首次于线上召开。 阿里巴巴在大会上为寰球企业和开发者分享了 27 场实践经验、行业趋势和技术演讲,咱们筛选了其中 13 场有代表性的演讲从新编排成书,旨在将阿里巴巴云原生之路上贵重的教训、理念和思维,提供给宽广正在或筹备踏上云原生之旅的开发者一些切实有用的参考。 如何下载此书?关注阿里巴巴云原生,后盾回复 “蓝皮书” 即可下载,或点击链接下载电子书:https://developer.aliyun.com/topic/download?id=835 你为什么要读这本书?本书整合自阿里巴巴在 KubeCon 2020 峰会上经典演讲,剖析实在的技术案例,发现问题,理清思路,解决问题,总结办法,把自我成长和业余精进的技术养料,回馈给宽广云原生开发者。本书蕴含 3 个系列,阿里云原生实际,阿里新技术计划及阿里开源奉献,共 13 篇文章。每篇文章都凝固着阿里巴巴云原生落地实际的贵重教训和面对困惑的解决办法,置信可能在最短的工夫内,帮忙你全面理解阿里巴巴云原生实践经验,踏上最适宜本人的云原生之路。 (本书目录一览) 书中精彩干货集锦1. 云原生 - 数字经济技术创新基石【作者】 阿里云容器服务负责人 易立 【简介】 2020 年疫情席卷寰球,云原生计算在各个领域帮忙企业与政府组织和疫情赛跑。阿里云通过弹性算力和数据服务助力疫情防控和停工复产,也帮忙企业通过数字经济共克时艰。能够见到,实体经济与数字经济的交融倒退曾经成大势所趋。本文将介绍阿里云提供通过开源云原生技术与凋谢云原生产品,帮忙企业晋升应变能力,拥抱数字经济倒退的新机遇。 2. Kubernetes + OAM :让开发者更简略【作者】 阿里云容器平台资深技术专家 李响 【简介】 如何晋升 Kubernetes 的用户体验、升高 Kubernetes 的应用门槛和复杂度,曾经成为了云原生社区最亟待解决的一道难题。本文将基于阿里巴巴大规模的 Kubernetes 集群中的实在案例,分享咱们如何应用凋谢应用程序模型(OAM)构建出了具备互操作性和可重用性的标准化利用治理平台,最终无效的突破了利用管理层中的“孤岛”,在大大节约了人力老本的同时,为用户带来更好的应用体验。 ...

August 24, 2020 · 2 min · jiezi

关于jquery:它可在近似OlogN-时间复杂度下完成插入删除查找等操作

一、前言红黑树,是一种高效的自均衡二叉查找树 Rudolf Bayer 于1978年创造红黑树,在过后被称为对称二叉 B 树(symmetric binary B-trees)。起初,在1978年被 Leo J. Guibas 和 Robert Sedgewick 批改为现在的红黑树。 红黑树具备良好的效率,它可在近似O(logN) 工夫复杂度下实现插入、删除、查找等操作,因而红黑树在业界也被广泛应用,比方 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基于红黑树结构实现的。 死记硬背,很难学会 红黑树的构造和设计都十分优良,也同样在实现上有着简单的解决逻辑,包含插入或者删除节点时;色彩变动、旋转操作等操作。但如果只把这些知识点硬背下来,什么时候染色、什么时候旋转,是没有多大意义的,用不了多久也就遗记了。所以这部分的学习,理解其基本更重要。

August 22, 2020 · 1 min · jiezi

关于jquery:阿里巴巴大数据实践实时技术

起源:数智化转型俱乐部 数据价值是具备时效性的,在一条数据产生的时候,如果不能及时处理并在业务零碎中应用,就不能让数据放弃最高的“新鲜度”和价值最大化。 绝对于离线批处理技术,流式实时处理技术作为一个十分重要的技术补充,在阿里巴巴团体内被宽泛应用。 在大数据业界中,流计算技术的钻研是近年来十分热门的课题。 业务诉求是心愿能在第一工夫拿到通过加工后的数据,以便实时监控以后业务状态并做出经营决策,疏导业务往好的方向倒退。比方网站上一个访问量很高的广告位,须要实时监控广告位的引流成果,如果转化率非常低的话,经营人员就须要及时更换为其余广告,以防止流量资源的节约。在这个例子中,就须要实时统计广告位的曝光和点击等指标作为经营决策的参考。 依照数据的提早状况,数据时效性个别分为三种(离线、准实时、实时): 离线:在明天(T)解决N天前(T-N,N≥1)的数据,延迟时间粒度为天。准实时:在以后小时(H)解决N小时前(H-N,N>0,如0.5小时、1小时等)的数据,延迟时间粒度为小时。实时:在以后时刻解决以后的数据,延迟时间粒度为秒;离线和准实时都能够在批处理零碎中实现(比方Hadoop、MaxCompute、Spark等零碎),只是调度周期不一样而已,而实时数据则须要在流式解决零碎中实现。简略来说,流式数据处理技术是指业务零碎每产生一条数据,就会立即被采集并实时发送到流式工作中进行解决,不须要定时调度工作来解决数据。 整体来看,流式数据处理个别具备以下特色。 1.时效性高 数据实时采集、实时处理,延时粒度在秒级甚至毫秒级,业务方可能在第一工夫拿到通过加工解决后的数据。 2.常驻工作 区别于离线工作的周期调度,流式工作属于常驻过程工作,一旦启动后就会始终运行,直到人为地终止,因而计算成本会绝对比拟高。这一特点也预示着流式工作的数据源是无界的,而离线工作的数据源是有界的。这也是实时处理和离线解决最次要的差异,这个个性会导致实时工作在数据处理上有肯定的局限性。 3.性能要求高 实时计算对数据处理的性能要求十分严格,如果解决吞吐量跟不上采集吞吐量,计算出来的数据就失去了实时的个性。比方实时工作1分钟只能解决30秒采集的数据,那么产出的数据的延时会越来越长,不能代表以后时刻的业务状态,有可能导致业务方做出谬误的经营决策。在互联网行业中,须要解决的数据是海量的,如何在数据量疾速收缩的状况下也能放弃高吞吐量和低延时,是以后面临的重要挑战。因而,实时处理的性能优化占了工作开发的很大一部分工作。 4.利用局限性 实时数据处理不能代替离线解决,除了计算成本较大这个因素外,对于业务逻辑简单的场景(比方双流关联或者须要数据回滚的状况),其局限性导致反对有余。另外,因为数据源是流式的,在数据具备上下文关系的状况下,数据达到工夫的不确定性导致实时处理跟离线解决得进去的后果会有肯定的差别。 流式技术架构在流式计算技术中,须要各个子系统之间相互依赖造成一条数据处理链路,能力产出后果最终对外提供实时数据服务。在理论技术选型时,可选的开源技术计划十分多,然而各个计划的整体架构是相似的,只是各个子系统的实现原理不太一样。另外,流式技术架构中的零碎跟离线解决是有穿插的,两套技术计划并不是齐全独立的,并且在业界中有合并的趋势。 各个子系统按性能划分的话,次要分为以下几局部: 1.数据采集 数据的源头,个别来自于各个业务的日志服务器(例如网站的浏览行为日志、订单的批改日志等),这些数据被实时采集到数据中间件中,供上游实时订阅应用。 2.数据处理 数据被采集到中间件中后,须要上游实时订阅数据,并拉取到流式计算零碎的工作中进行加工解决。这里须要提供流计算引擎以反对流式工作的执行。 **3.数据存储 ** 数据被实时加工解决(比方聚合、荡涤等)后,会写到某个在线服务的存储系统中,供上游调用方应用。这里的写操作是增量操作,并且是源源不断的。 4.数据服务 在存储系统上会架设一层对立的数据服务层(比方提供HSF接口、HTTP服务等),用于获取实时计算结果。 整体技术架构如图所示: 从图能够看出,在数据采集和数据服务局部实时和离线是专用的,因为在这两层中都不须要关怀数据的时效性。这样能力做到数据源的对立,防止流式解决和离线解决的不统一。 流式数据模型在流式计算技术中,须要各个子系统之间相互依赖造成一条数据处理链路,能力产出后果最终对外提供实时数据服务。在理论技术选型时,可选的开源技术计划十分多,然而各个计划的整体架构是相似的,只是各个子系统的实现原理不太一样。另外,流式技术架构中的零碎跟离线解决是有穿插的,两套技术计划并不是齐全独立的,并且在业界中有合并的趋势。 各个子系统按性能划分的话,次要分为以下几局部: 数据模型设计是贯通数据处理过程的,流式数据处理也一样,须要对数据流建模分层。实时建模跟离线建模十分相似,数据模型整体上分为五层(ODS、DWD、DWS、ADS、DIM)。 因为实时计算的局限性,每一层中并没有像离线做得那么宽,维度和指标也没有那么多,特地是波及回溯状态的指标,在实时数据模型中简直没有。 整体来看,实时数据模型是离线数据模型的一个子集,在实时数据处理过程中,很多模型设计就是参考离线数据模型实现的。 1.数据分层 在流式数据模型中,数据模型整体上分为五层。 ODS层:跟离线零碎的定义一样,ODS层属于操作数据层,是间接从业务零碎采集过去的最原始数据,蕴含了所有业务的变更过程,数据粒度也是最细的。在这一层,实时和离线在源头上是对立的,这样的益处是用同一份数据加工进去的指标,口径根本是对立的,能够更不便进行实时和离线间数据比对。例如:原始的订单变更记录数据、服务器引擎的拜访日志。 DWD层:DWD层是在ODS层根底上,依据业务过程建模进去的实时事实明细层,对于拜访日志这种数据(没有上下文关系,并且不须要期待过程的记录),会回流到离线零碎供上游应用,最大水平地保障实时和离线数据在ODS层和DWD层是统一的。例如:订单的领取明细表、退款明细表、用户的拜访日志明细表。 DWS层:订阅明细层的数据后,会在实时工作中计算各个维度的汇总指标。如果维度是各个垂直业务线通用的,则会放在实时通用汇总层,作为通用的数据模型应用。比方电商网站的卖家粒度,只有波及交易过程,就会跟这个维度相干,所以卖家维度是各个垂直业务的通用维度,其中的汇总指标也是各个业务线共用的。例如:电商数据的几大维度的汇总表(卖家、商品、买家)。 ADS层:个性化维度汇总层,对于不是特地通用的统计维度数据会放在这一层中,这里计算只有本身业务才会关注的维度和指标,跟其余业务线个别没有交加,罕用于一些垂直翻新业务中。例如:手机淘宝上面的某个爱逛街、微淘等垂直业务。 DIM层:实时维表层的数据基本上都是从离线维表层导出来的,抽取到在线零碎中供实时利用调用。这一层对实时利用来说是动态的,所有的ETL解决工作会在离线零碎中实现。维表在实时利用的应用中跟离线稍有区别,前面章节中会具体阐明。例如:商品维表、卖家维表、买家维表、类目维表。 2.多流关联 在流式计算中经常须要把两个实时流进行主键关联,以失去对应的实时明细表。在离线零碎中两个表关联是非常简单的,因为离线计算在工作启动时曾经能够取得两张表的全量数据,只有依据关联键进行分桶关联就能够了。但流式计算不一样,数据的达到是一个增量的过程,并且数据达到的工夫是不确定的和无序的,因而在数据处理过程中会波及中间状态的保留和复原机制等细节问题。 比方A表和B表应用ID进行实时关联,因为无奈晓得两个表的达到程序,因而在两个数据流的每条新数据到来时,都须要到另外一张表中进行查找。如A表的某条数据达到,到B表的全量数据中查找,如果能查找到,阐明能够关联上,拼接成一条记录间接输入到上游;然而如果关联不上,则须要放在内存或内部存储中期待,直到B表的记录也达到。多流关联的一个关键点就是须要互相期待,只有单方都达到了,能力关联胜利。 上面通过例子(订单信息表和领取信息表关联)来阐明,如图示。 在下面的例子中,实时采集两张表的数据,每到来一条新数据时都在内存中的对方表截至以后的全量数据中查找,如果能查找到,则阐明关联胜利,间接输入;如果没查找到,则把数据放在内存中的本人表数据汇合中期待。另外,不论是否关联胜利,内存中的数据都须要备份到内部存储系统中,在工作重启时,能够从内部存储系统中复原内存数据,这样能力保证数据不失落。因为在重启时,工作是续跑的,不会从新跑之前的数据。 另外,订单记录的变更有可能产生屡次(比方订单的多个字段屡次更新),在这种状况下,须要依据订单ID去重,防止A表和B表屡次关联胜利;否则输入到上游就会有多条记录,这样失去的数据是有反复的。 以上是整体的双流关联流程,在理论解决时,思考到查找数据的性能,实时关联这个步骤个别会把数据依照关联主键进行分桶解决,并且在故障复原时也依据分桶来进行,以升高查找数据量和进步吞吐量。 3.维表应用 在离线零碎中,个别是依据业务分区来关联事实表和维表的,因为在关联之前维表的数据就曾经就绪了。而在实时计算中,关联维表个别会应用以后的实时数据(T)去关联T-2的维表数据,相当于在T的数据达到之前须要把维表数据筹备好,并且个别是一份动态的数据。 为什么在实时计算中这么做呢?次要基于以下几点的思考。 数据无奈及时筹备好:当达到零点时,实时流数据必须去关联维表(因为不能期待,如果等就失去了实时的个性),而这个时候T-1的维表数据个别不能在零点马上准备就绪(因为T-1的数据须要在T这一天加工生成),因而去关联T-2维表,相当于在T-1的一天工夫里加工好T-2的维表数据。 无奈精确获取全量的最新数据:维表个别是全量的数据,如果须要实时获取到当天的最新维表数据,则须要T-1的数据+当天变更能力获取到残缺的维表数据。也就是说,维表也作为一个实时流输出,这就须要应用多流实时关联来实现。然而因为实时数据是无序的并且达到工夫不确定,因而在维表关联上有歧义。 数据的无序性:如果维表作为实时流输出的话,获取维表数据将存在艰难。比方10:00点的业务数据胜利关联维表,失去了相干的维表字段信息,这个时候是否就曾经拿到最新的维表数据了呢?其实这只代表拿到截至10:00点的最新状态数据(实时利用永远也不晓得什么时候才是最新状态,因为不晓得维表前面是否会产生变更)。 因而在实时计算中维表关联个别都对立应用T-2的数据,这样对于业务来说,起码关联到的维表数据是确定的(尽管维表数据有肯定的延时,然而许多业务的维表在两天之间变动是很少的)。 在有些业务场景下,能够关联T-1的数据,但T-1的数据是不全的。比方在T-1的早晨22:00点开始对维表进行加工解决,在零点达到之前,有两个小时能够把数据筹备好,这样就能够在T的时候关联T-1的数据了,然而会缺失两个小时的维表变更过程。 另外,因为实时工作是常驻过程的,因而维表的应用分为两种模式。 全量加载:在维表数据较少的状况下,能够一次性加载到内存中,在内存中间接和实时流数据进行关联,效率十分高。但毛病是内存始终占用着,并且须要定时更新。例如:类目维表,每天只有几万条记录,在每天零点时全量加载到内存中。 增量加载:维表数据很多,没方法全副加载到内存中,能够应用增量查找和LRU过期的模式,让最热门的数据留在内存中。其长处是能够管制内存的使用量;毛病是须要查找内部存储系统,运行效率会升高。例如:会员维表,有上亿条记录,每次实时数据达到时,去内部数据库中查问,并且把查问后果放在内存中,而后每隔一段时间清理一次最近起码应用的数据,以防止内存溢出。 在理论利用中,这两种模式依据维表数据量和实时性能要求综合思考来抉择应用。注:本书中呈现的局部专有名词、专业术语、产品名称、软件项目名称、工具名称等,是淘宝(中国)软件有限公司外部我的项目的习用词语,如与第三方名称雷同,实属偶合。 原文链接 本文为阿里云原创内容,未经容许不得转载。

August 20, 2020 · 1 min · jiezi

关于jquery:开放下载AliOS-Things快速开发指南

简介: 《AliOS Things疾速开发指南》手把手教你从环境筹备到线上、线下开发调试,更有两大典型场景实际等你参加。你的物联网开发从这里开始!快来get新技能吧~ AliOS Things致力于搭建云端一体化IoT基础设施,具备极致性能、极简开发、云端一体、丰盛组件、平安防护等要害能力。AliOS Things反对多种多样的设施连贯到阿里云IoT平台,可广泛应用在智能家居、智慧城市、工业,新出行等畛域。 《AliOS Things疾速开发指南》帮忙您意识AliOS Things零碎,并实现从零开始的一个入门操作。更有两大典型实际场景教你物联网开发从入门到精通。 [点击收费下载 >>《AliOS Things疾速开发指南》<<](https://developer.aliyun.com/... 或者复制该链接到浏览器实现下载或分享:https://developer.aliyun.com/topic/download?id=812 精彩导读初识AliOS ThingsAliOS Things公布于2017年杭州云栖大会,是AliOS家族旗下,面向IoT畛域的高可伸缩物联网操作系统。 >>点击查看更多 开发前筹备在运行AliOS Things零碎之前,您须要做好一系列筹备工作,包含搭建环境、装置驱动设施、下载AliOS Things零碎源码、装置开发工具AliOS Studio等。本节具体介绍如何实现这些筹备工作。>>点击查看具体装置步骤 应用线下开发板进行开发调试本节次要介绍如何应用VSCode进行我的项目编译、固件烧录及串口监控。>>点击查看具体步骤 应用线上的开发板做开发调试当您手上没有现成可用的开发板时,也能够应用线上的开发板来调试验证您的程序。本节次要介绍线上开发板的应用流程。 应用限度 应用线上开发板有以下限度: 不能外接额定的器件。不能与设施做物理交互,例如:按键交互。不能察看物理的设施状态,例如:LED灯的闪动状况。不反对GDB调试。>>点击查看具体步骤 应用AliOS Things疾速构建温度计利用本节是基于AliOS Things 3.1疾速构建温度计的利用场景。波及AliOS Things组件开发,构建AliOS Things用户我的项目,AliOS Things HAL API应用,向AliOS Things中增加并应用组件。用到的硬件设施有半导体开发板、温度传感器、数码管显示器。>>点击查看详情 应用AliOS Things疾速构建RGB灯利用本节将基于AliOS Things 3.1零碎搭建利用,此利用通过支付宝小程序控制RGB灯的色彩。>>点击查看实现详情 原文链接 本文为阿里云原创内容,未经容许不得转载。

August 18, 2020 · 1 min · jiezi

关于jquery:开放下载AliOS-Things快速开发指南

简介: 《AliOS Things疾速开发指南》手把手教你从环境筹备到线上、线下开发调试,更有两大典型场景实际等你参加。你的物联网开发从这里开始!快来get新技能吧~ AliOS Things致力于搭建云端一体化IoT基础设施,具备极致性能、极简开发、云端一体、丰盛组件、平安防护等要害能力。AliOS Things反对多种多样的设施连贯到阿里云IoT平台,可广泛应用在智能家居、智慧城市、工业,新出行等畛域。 《AliOS Things疾速开发指南》帮忙您意识AliOS Things零碎,并实现从零开始的一个入门操作。更有两大典型实际场景教你物联网开发从入门到精通。 [点击收费下载 >>《AliOS Things疾速开发指南》<<](https://developer.aliyun.com/... 或者复制该链接到浏览器实现下载或分享:https://developer.aliyun.com/topic/download?id=812 精彩导读初识AliOS ThingsAliOS Things公布于2017年杭州云栖大会,是AliOS家族旗下,面向IoT畛域的高可伸缩物联网操作系统。 >>点击查看更多 开发前筹备在运行AliOS Things零碎之前,您须要做好一系列筹备工作,包含搭建环境、装置驱动设施、下载AliOS Things零碎源码、装置开发工具AliOS Studio等。本节具体介绍如何实现这些筹备工作。>>点击查看具体装置步骤 应用线下开发板进行开发调试本节次要介绍如何应用VSCode进行我的项目编译、固件烧录及串口监控。>>点击查看具体步骤 应用线上的开发板做开发调试当您手上没有现成可用的开发板时,也能够应用线上的开发板来调试验证您的程序。本节次要介绍线上开发板的应用流程。 应用限度 应用线上开发板有以下限度: 不能外接额定的器件。不能与设施做物理交互,例如:按键交互。不能察看物理的设施状态,例如:LED灯的闪动状况。不反对GDB调试。>>点击查看具体步骤 应用AliOS Things疾速构建温度计利用本节是基于AliOS Things 3.1疾速构建温度计的利用场景。波及AliOS Things组件开发,构建AliOS Things用户我的项目,AliOS Things HAL API应用,向AliOS Things中增加并应用组件。用到的硬件设施有半导体开发板、温度传感器、数码管显示器。>>点击查看详情 应用AliOS Things疾速构建RGB灯利用本节将基于AliOS Things 3.1零碎搭建利用,此利用通过支付宝小程序控制RGB灯的色彩。>>点击查看实现详情 原文链接 本文为阿里云原创内容,未经容许不得转载。

August 18, 2020 · 1 min · jiezi

关于jquery:JS常用函数

这里次要说一些Jquery或是JS中罕用到的函数: 1.loadjquery中ajax的load函数:用于将url地址的资源加载到指定地位: $("选择器").click(function(){ $("指定地位").load(url);});上述代码,在选择器抉择的元素被点击时,就会把url的资源加载到指定地位上. 2.``/${}在较新版本的JS中,能够通过反引号"``"以及${}EL表达式来代替字符串拼接. 3.=>箭头函数=>称为箭头函数,配合forEach函数应用,实现数组的遍历 var array=[1,2,3];array.forEach(item=>console.log(item));4.onon函数用于在指定的html元素上注册事件$("选择器").on("事件","子元素选择器",处理函数)留神:调用处理函数时不能在函数后加(). 5.propprop函数用于获取属性的值,传入一个参数为用key取值,两个参数为赋值 $(this).prop("class");6.datadata函数能够将参数存在指定地位中,传入一个参数为用key取值,两个参数为赋值 $("指定地位").data("key",value);7.if在JS中if判断语句能够间接用参数判断,因为JS中非0数字/非undefined/非空串默认为true. 8.push/pop在JS中数组的长度是可变的,能够通过: var arr=[];//申明数组arr.push(1);//存入数据arr.pop(1);//拿走数据

August 16, 2020 · 1 min · jiezi

关于jquery:JS常用函数

这里次要说一些Jquery或是JS中罕用到的函数: 1.loadjquery中ajax的load函数:用于将url地址的资源加载到指定地位: $("选择器").click(function(){ $("指定地位").load(url);});上述代码,在选择器抉择的元素被点击时,就会把url的资源加载到指定地位上. 2.``/${}在较新版本的JS中,能够通过反引号"``"以及${}EL表达式来代替字符串拼接. 3.=>箭头函数=>称为箭头函数,配合forEach函数应用,实现数组的遍历 var array=[1,2,3];array.forEach(item=>console.log(item));4.onon函数用于在指定的html元素上注册事件$("选择器").on("事件","子元素选择器",处理函数)留神:调用处理函数时不能在函数后加(). 5.propprop函数用于获取属性的值,传入一个参数为用key取值,两个参数为赋值 $(this).prop("class");6.datadata函数能够将参数存在指定地位中,传入一个参数为用key取值,两个参数为赋值 $("指定地位").data("key",value);7.if在JS中if判断语句能够间接用参数判断,因为JS中非0数字/非undefined/非空串默认为true. 8.push/pop在JS中数组的长度是可变的,能够通过: var arr=[];//申明数组arr.push(1);//存入数据arr.pop(1);//拿走数据

August 16, 2020 · 1 min · jiezi

关于jquery:实时计算-Flink-版-最佳实践

简介: 实时计算 Flink 版 最佳实际目录 金融行业行业背景金融是古代经济的外围。我国金融业在市场化改革和对外开放中一直倒退,金融总量大幅增长。金融稳固间接关系到国家经济倒退的前途和命运,金融业是国民经济倒退的晴雨表。对我国金融业倒退现状进行主观剖析,对金融业发展趋势进行摸索,有助于打消金融隐患,使金融业朝着衰弱、有序方向倒退。 解决方案金融行业的实时数仓建设实际 IoT行业行业背景物联网(Internet of Things,以下简写为 IoT)是互联网、传统电信网等资讯的承载体,让所有具备独立性能的一般物体实现互联互通的网络。物联网广泛应用于运输和物流、衰弱医疗、智慧环境(家庭、办公、工厂)等畛域, 具备非常广大的市场和利用前景。物联网将智能感知、辨认技术、网络通信与普适计算等技术交融起来,被认为是继计算机、互联网、智能手机之后世界信息产业倒退的下一个风口。 据 IDC 预计,到 2020 年物联网将在寰球范畴内产生 1.46 万亿美元的价值。据预测,届时中国的物联网市场规模将超过 1.8 万亿人民币。得益于宏大的人口基数和低廉的芯片制作老本,中国将成为物联网行业的次要参与者,并在推动寰球物联网市场增长上施展重要的作用。 解决方案IoT行业的实时数仓建设实际 广告行业行业背景广告依然是互联网公司的次要变现伎俩,2019年,中国广告市场总体规模达到8674.28亿元,较2018年增长了8.54%,据统计寰球互联网市值前十的公司广告支出占比高达40%,可见其重要性。AI、大数据、智能投放等翻新技术的遍及利用,不仅创生了一批独角兽营销平台,而且大幅拉低了广告投放门槛,拓宽了广告市场空间。 解决方案广告行业的实时数仓建设实际 在线教育行业行业背景在线教育是使用互联网、人工智能等古代信息技术进行教与学互动的新型教育形式,是教育服务的重要组成部分。倒退在线教育,有利于构建网络化、数字化、个性化、终身化的教育体系,有利于建设“人人皆学、处处能学、时时可学”的学习型社会。 解决方案在线教育行业的实时数仓建设实际 游戏行业行业背景随着互联网和挪动互联网的相互促进与交融,以及PC终端和各类挪动终端在智能化和便携性上的趋同,游戏产品跨平台运行于各类终端的需要逐渐浮现,特地是互联网页面游戏中的社交类游戏等产品跨平台运行于各类挪动终端曾经呈现,随着版权价值意识的加强,游戏开发商和运营商在获得版权后,增强了对文化内容的开发利用,力求以多模式多媒介的产品实现版权价值的最大化。 解决方案游戏行业的实时数仓建设实际 原文链接 本文为阿里云原创内容,未经容许不得转载。

August 13, 2020 · 1 min · jiezi

关于jquery:实时计算-Flink-版-最佳实践

简介: 实时计算 Flink 版 最佳实际目录 金融行业行业背景金融是古代经济的外围。我国金融业在市场化改革和对外开放中一直倒退,金融总量大幅增长。金融稳固间接关系到国家经济倒退的前途和命运,金融业是国民经济倒退的晴雨表。对我国金融业倒退现状进行主观剖析,对金融业发展趋势进行摸索,有助于打消金融隐患,使金融业朝着衰弱、有序方向倒退。 解决方案金融行业的实时数仓建设实际 IoT行业行业背景物联网(Internet of Things,以下简写为 IoT)是互联网、传统电信网等资讯的承载体,让所有具备独立性能的一般物体实现互联互通的网络。物联网广泛应用于运输和物流、衰弱医疗、智慧环境(家庭、办公、工厂)等畛域, 具备非常广大的市场和利用前景。物联网将智能感知、辨认技术、网络通信与普适计算等技术交融起来,被认为是继计算机、互联网、智能手机之后世界信息产业倒退的下一个风口。 据 IDC 预计,到 2020 年物联网将在寰球范畴内产生 1.46 万亿美元的价值。据预测,届时中国的物联网市场规模将超过 1.8 万亿人民币。得益于宏大的人口基数和低廉的芯片制作老本,中国将成为物联网行业的次要参与者,并在推动寰球物联网市场增长上施展重要的作用。 解决方案IoT行业的实时数仓建设实际 广告行业行业背景广告依然是互联网公司的次要变现伎俩,2019年,中国广告市场总体规模达到8674.28亿元,较2018年增长了8.54%,据统计寰球互联网市值前十的公司广告支出占比高达40%,可见其重要性。AI、大数据、智能投放等翻新技术的遍及利用,不仅创生了一批独角兽营销平台,而且大幅拉低了广告投放门槛,拓宽了广告市场空间。 解决方案广告行业的实时数仓建设实际 在线教育行业行业背景在线教育是使用互联网、人工智能等古代信息技术进行教与学互动的新型教育形式,是教育服务的重要组成部分。倒退在线教育,有利于构建网络化、数字化、个性化、终身化的教育体系,有利于建设“人人皆学、处处能学、时时可学”的学习型社会。 解决方案在线教育行业的实时数仓建设实际 游戏行业行业背景随着互联网和挪动互联网的相互促进与交融,以及PC终端和各类挪动终端在智能化和便携性上的趋同,游戏产品跨平台运行于各类终端的需要逐渐浮现,特地是互联网页面游戏中的社交类游戏等产品跨平台运行于各类挪动终端曾经呈现,随着版权价值意识的加强,游戏开发商和运营商在获得版权后,增强了对文化内容的开发利用,力求以多模式多媒介的产品实现版权价值的最大化。 解决方案游戏行业的实时数仓建设实际 原文链接 本文为阿里云原创内容,未经容许不得转载。

August 13, 2020 · 1 min · jiezi

关于jquery:jquery总结一

jquqry总结一电脑系统:windows10 专业版在开发的过程中,咱们依据需要会常常应用到 jquery,当初我简略的做了以下总结,心愿对大家有所帮忙。jQuery 是一个基于 JavaScript 的面向对象封装. 在 jQuery中 通过选择器获取到的是一个对象, 该对象中存在一个数组属性, 该数组中存储着所有通过抉择获取到的元素. jQuery 1.x: 兼容 IE6, 7, 8 jQuery 2.x: 不兼容 IE6, 7, 8 jQuery 3.x: 不兼容 IE6, 7, 81, 元素绑定事件 on(参数一, 参数二): 绑定事件 参数一: 要绑定的事件类型 参数二: 要绑定的事件(能够是匿名函数, 也能够是函数名) off(参数一, 参数二): 解除绑定 参数一: 事件类型 参数二: 事件名 注: 如果省略参数二不写, 将勾销所有参数一类型事件的绑定; 如果通过参数二指定了要解除绑定的事件, 则只解除对应的一个事件. 2, DOM 操作 创立标签: $('<div>')创立DOMA.apppendTo(B):将A元素增加到B元素里 A.append(B): 将 B元素 增加到 A元素外部的前面 A.prepend(B): 将 B元素 增加到 A元素外部的后面 A.after(B): 将 B元素 增加到 A元素内部的前面 A.after(B): 将 B元素 增加到 A元素内部的后面 A.replaceWith(B): 用 B元素替换 A元素 B.replaceAll(Sel): 用 B元素替换所有通过 Sel 选择器匹配到的元素 A.empty(): 革除 A元素中的所有内容 A.remove(Sel): 革除 满足 Sel选择器 的A元素 获取指定标签的子级标签和父级标签 parent(): 获取指定元素的间接父级标签 parents(): 获取指定元素的所有父级标签 children(): 获取指定元素的所有子级标签 find(Sel): 获取指定元素中满足 Sel选择器的 子级标签 3, 元素款式操作 形式一: 一次性设置多个款式   $(".out p").css({     background: "red",     fontSize: '30px'   }); 形式二: 一次只设置一个款式   $(".out p").css('textAlign', 'center'); 4, 操作元素属性   // 设置的单个属性   $('div').attr("id", "one"); //设置多个属性 $('img').attr({   src: "./img/timg.jpeg",   width: '300' });   // 获取: 也是获取的第一个匹配胜利的元素的属性值   console.log($('div').attr("id")); // 删除属性 $("img").removeAttr("width");   属性值能够是一个函数, 函数携带两个参数   参数一(i): 匹配到的元素在数组中的下标   参数二(v): 以后正在操作的这个元素原来的属性值 $('img').attr('width', function(i, v) {   return (i + 1) \* 200; }); // 200, 400, 600 // 400, 800, 1200 // 练习: 设置img的width为之前的二倍 $('img').attr('width', function(i, v) {   return v * 2; }); 操作元素属性办法二: prop() prop()办法 的应用形式简直与 attr()办法 雷同. 区别: prop() 往往用于操作元素的固有属性, attr() 往往用于操作自定义属性 当属性值为 布尔类型 时, 应用 prop() 办法操作该属性 ...

August 7, 2020 · 2 min · jiezi

关于jquery:登录页强制浏览器不记住密码

<input type="text" name="password" id="LAY-user-login-password" placeholder="明码" class="layui-input no-ime" autocomplete="off" onpaste="return false" ondragenter="return false" oncontextmenu="return false;" style="ime-mode:disabled;font-weight: 800"><input class="password" type="hidden" name="password" id="">$('#LAY-user-login-password').bind('input', function (e) { var that = $(this); var ind = this.selectionStart * 1; var val = that.val(); function keydel() { window.onkeydown = function (e) { if (e.keyCode == 8 && ind == 1 && val.length == 1) { str = str[0] } else { str = val } } } // 不容许输出中文 for (var i = 0; i < val.length; i++) { if (val.charCodeAt(i) > 0 && val.charCodeAt(i) < 255) { $(this).val('') } } if (val.replace(/[\u4e00-\u9fa5]/img, '')) { $(this).val(val.replace(/[\u4e00-\u9fa5]/img, '')) } if (val.length == 0) { str = "" } if (ind == val.lenth) { str += val[ind - 1] } else { if (str.length == val.length) { str = str } else if (str.length > val.length) { if (val.slice(0, ind) != 'undefined' && val.slice(ind + 1) != 'undefined') { // 如果是从两头删除(两头字母) // window.onkeydown = function (e) { if (keyCode == 8 && ind == 1 && val.length == 1) { // 一次性删除所有 str = str[0] } else if (ind == 1 && val.length == 1) { // 一次性抉择所有不按删除键,间接填写 str = val } else if (str.length - val.length != 1) { // 删除某一段明码 str = str.slice(0, ind) + str.slice(ind + str.length - val.length) } else { // 只删除两头的某一个 str = str.slice(0, ind) + str.slice(ind + 1) } } else if (val.slice(0, ind - 1) == 'undefined' && val.slice(ind - 1) != 'undefined') { // 如果是删除第一个字母 str = str.slice(ind - 1) } else if (val.slice(0, ind - 1) != 'undefined' && val.slice(ind - 1) == 'undefined') { // 如果是删除最初一个字母 str = str.slice(0, ind - 1) } else if (val.slice(0, ind - 1) == 'undefined' && val.slice(ind - 1) == 'undefined') { // 如果删除所有字母 str = "" } } else { // 加 if (val.slice(0, ind - 1) != 'undefined' && val.slice(ind - 1) != 'undefined') { // 如果是从两头输出(两头字母) if (val.length - str.length != 1) { // 加多位明码 str = str.slice(0, ind - 1) + val.slice(ind - (val.length - str.length)) } else { // 如果是从两头输出(两头字母) str = str.slice(0, ind - 1) + val[ind - 1] + str.slice(ind - 1); } } else if (val.slice(0, ind - 1) == 'undefined' && val.slice(ind - 1) != 'undefined') { // 如果是第一个字母后面输出(第一个字母) str = val[ind - 1] + str.slice(ind - 1); } else if (val.slice(0, ind - 1) != 'undefined' && val.slice(ind - 1) == 'undefined') { // 如果是最初输出(最初一个字母) str = str.slice(0, ind - 1) + val[ind - 1]; } else if (val.slice(0, ind - 1) == 'undefined' && val.slice(ind - 1) == 'undefined') { // 如果是第一次输出(第一个字母) str = val[0] } } } $('.password').val(str) //input的value值转化为· $(this).val($(this).val().replace(/./g, '.')) })

August 2, 2020 · 3 min · jiezi

关于jquery:云原生时代谁是容器的最终归宿

前言“云原生技术有利于各组织在私有云、公有云和混合云等新型动静环境中,构建和运行可弹性扩大的利用。云原生的代表技术包含容器、服务网格、微服务、不可变基础设施和申明式 API。这些技术可能构建容错性好、易于治理和便于察看的松耦合零碎。联合牢靠的自动化伎俩,云原生技术使工程师可能轻松地对系统作出频繁和可预测的重大变更。”来自CNCF。 K8S对网络,存储,计算进行了编排,曾经成为了云原生的操作系统,给用户展示了一个新的界面,极大的简化了用户的运维,晋升了资源的弹性,真正的做到了按需应用,升高了用户的老本。云原生疾速被企业和开发者承受。Forrester 预测到2022年, 寰球组织/公司在生成环境运行容器化利用,从明天有余30%的比例将大幅度晋升到超过75%,企业应用容器化的趋势势不可挡。 容器在生产环境的利用的比例疾速上涨,从2016年首次考察的23%,到2018年上涨到73%,理论到2020年曾经上涨到84% 云原生利用正在引领各个应用领域实现云原生化,同时也在粗浅扭转着应用服务的方方面面。存储作为利用运行的基石,也在服务云原生化过程中提出了更多的需要。云原生存储为了满足云原生个性的要求,可用性、稳定性、扩展性、性能等外围能力都有大幅的优化。作为国内最大的云产商,阿里云提供了丰盛的云原生服务。和网络,计算的编排不同的是,存储须要思考如何无缝的接入到K8S中进行编排和调度。K8S推出了CSI,通过对立的规范将存储和K8S进行了无缝的对接。本文探讨云原生容器对存储的挑战,面向云原生和容器等畛域的倒退,阿里云文件存储一直进行云原生适配和演进,完满应答云原生存储挑战,阿里云NAS是容器存储的自然选择。 云原生带来的存储挑战新型工作负载容器化、迁云在存储方面遇到的性能、弹性、高可用、平安及生命周期等方面的问题,岂但须要存储产品档次的改良,还须要在云原生的管制和数据档次的改良,推动云原生存储的技术演进。1、存储性能挑战:云原生利用在大数据分析、AI 等场景失去广泛应用,这些场景对存储吞吐和IOPS的需要也十分高。在容器集群集中处理海量数据,同时启动数千Pod,弹出海量Pod对共享文件系统进行读写的场景下,重负载导致时延减少,高提早毛刺增多,读写稳定性有余,同时云原生利用的疾速扩容、极致伸缩等个性也会考验存储服务在短时间内迎接峰值流量的能力。 集中式高吞吐对共享存储池冲击:高性能计算场景中,集中处理批量数据,同一个存储集群中带宽挤占,造成拜访品质降落。峰值吞吐有余:大规模数据处理,文件数目少,峰值吞吐高,申请密集,靠近独占集群的极限带宽。时延减少导致 GPU 期待:多机多卡 GPU 训练,读密集型的场景下,时延减少导致 IOwait 和 GPU wait。 2、存储弹性挑战:云原生的极致弹性,给存储在弹性方面带来了新的挑战。随着云原生多元业务倒退,在数据库和元数据管理利用在线扩容的场景下,本地盘存储容量无奈弹性扩容。3、存储高可用挑战:在利用运维、零碎运维的场景下,存储随容器迁徙的稳定性和高可用挑战。4、存储的平安挑战:面向的容器隔离性要求场景,次要是多利用共享,文件系统多租户环境的容量配合,集群级文件系统共享拜访的权限管制,用户利用的全链路数据加密等平安挑战。5、存储的生命周期治理挑战:海量容器集群长久化数据存储面临数据冷热分级和老本挑战。 阿里云文件存储如何来应答这些挑战针对以上在新的计算模式下,存储方面遇到的性能,弹性,高可用,平安,生命周期等方面的问题,不然而须要存储产品档次的改良,在云原生的管制和数据档次的改良,更须要在云原生应用层、存储云产品层、底层存储适配和存储核心层都须要做相应的改良和晋升才有可能提供更加稳固,平安和高效的面向利用的云原生存储。 随着云原生技术的倒退,各个私有云厂商都开始对其云服务进行云原生化革新或适配,提供更加麻利、高效的服务来适应云原生利用的需要。阿里云存储服务也在云原生利用适配做了很多优化,阿里云文件存储反对 CSI 、Flexvolume存储驱动无缝的连接了云原生利用和存储服务之间的数据接口。实现了用户应用存储资源时对底层存储无感知,而专一于本人的业务开发。 阿里云文件存储为云原生提供了一个齐全弹性和共享的文件系统,按需应用,满足云原生极致的弹性。阿里云文件存储从性能,弹性,高可用,平安,生命周期治理等方面对云原生存储进行了打造和演进。 1、性能方面,AI,大数据分析,高性能计算畛域,阿里云文件系统扩散工作负载多文件系统和多个存储集群、多个可用区通过容器编排扩散IO到多文件系统。反对客户端本地只读缓存技术、分布式存储,升高网络提早和IO、GPU等待时间。能够反对刚性交付数十GB吞吐的能力,晋升算力。2、弹性方面,阿里云文件存储反对自在扩缩容,按量付费,是齐全托管的文件系统。极速型NAS提供了百us的延时,在金融,互联网等典型的突发弹性场景中,可能在几分钟内启动数千个容器,并实现数据的极速加载、卸载。3、高可用方面,阿里云文件存储反对容器疾速Failover,同时反对存储快照、备份等企业级个性。4、在平安方面,阿里云文件存储反对全面的AD/ACL权限治理,反对配额,打造了对立命名空间,反对对海量pod间的IO进行隔离和对立治理;文件存储产品反对传输加密、落盘加密等性能。5、面对海量数据,阿里云文件存储提供了数据生命周期治理,主动归档冷数据,能够升高90%的用户老本。 为什么抉择阿里云文件存储作为容器存储?阿里云文件存储NAS为非结构化数据提供存储服务。随着云原生的疾速倒退,许多公司的容器化应用程序应用NAS存储数据,有些甚至存储PB级数据。阿里云在云原生布局上提供容器K8s服务(ACK)和弹性容器实例(ECI),容器实例应用NAS文件系统作为长久化存储。容器存储离不开共享文件存储。 阿里云文件存储是云原生、高可用、老本优化的齐全托管的文件系统。阿里云文件存储有三款产品,通用型NAS,极速型NAS和并行文件系统CPFS。 阿里云NAS是容器存储的自然选择,因为它是一种齐全托管的服务,配置简略,增加或删除数据时主动扩大,和容器基础架构一样灵便便捷。 通常,彼此共享数据的容器天然须要共享文件存储,长期运行的容器也可应用共享文件存储应答故障。阿里云文件存储同时满足容器利用场景对长久化存储弹性伸缩、灵便挂载、高性能的需要。此外,容器镜像的配置文件或初始加载数据存储能够在 NAS 文件存储上实现共享,在容器批量加载时实时读取,多 POD 间通过 NAS 共享长久化数据,在 POD 故障时能够进行故障切换。 随着新技术的倒退,机器学习AI和基因解决等大量应用共享文件存储。咱们通常看到如下一些示例: •Web服务:WordPress之类的内容管理应用程序受害于扩大到多个实例以实现性能和冗余,并且须要在多个实例之间共享上载、插件和模板。•软件开发工具:JIRA和Git之类的开发人员工具须要在实例之间共享数据以实现高可用性,而代码则保留在多个阿里云可用区中以实现持久性。•大数据分析和解决:诸如基因数据处理、Tensorflow机器学习框架须要通过文件系统接口拜访数据,并且具备长久的共享存储,能够使多个用户和作业在同一组数据上并行运行。•企业应用程序:共享Notebook(如Jupyter Jupyterhub)须要为notebook和user workplace提供长久存储,领有共享存储能够使数据科学家轻松合作。 总结以容器和云原生计算被企业疾速接收,Kubernetes 逐步成为云原生时代的基础设施,容器服务成为云原生时代基础设施。新的工作负载推动云原生存储和云存储的演进,云原生管制立体实现效率方面能力,从数据面晋升存储稳固和减小安全隐患,云存储持续夯实性能,容量,弹性,密度等根底能力,共建云原生环境下的存储生态。 阿里云文件存储是容器存储的自然选择,完满应答云原生存储在性能,弹性,高可用,平安,生命周期等方面的数据挑战。阿里云基于云原生文件存储技术的疾速演进将一直赋能云原生和容器畛域的疾速倒退。 原文作者:孟威 本文为阿里云原创内容,未经容许不得转载。

July 30, 2020 · 1 min · jiezi

越来越少人用JQuery但你就不学了吗5

如需要跟多资料请点击下方图片⬇(扫码加好友→备注66) Jquery Ajax$.ajax jquery调用ajax方法: 格式:$.ajax({}); 参数: type:请求方式GET/POST url:请求地址url async:是否异步,默认是true表示异步 data:发送到服务器的数据 dataType:预期服务器返回的数据类型 contentType:设置请求头 success:请求成功时调用此函数 error:请求失败时调用此函数 get请求 $.ajax({ type:"get", url:"js/cuisine_area.json", async:true, success : function (msg) { var str = msg; console.log(str); $('div').append("<ul></ul>"); for(var i=0; i<msg.prices.length;i++){ $('ul').append("<li></li>"); $('li').eq(i).text(msg.prices[i]); } }, error : function (errMsg) { console.log(errMsg); $('div').html(errMsg.responseText); }});post请求 $.ajax({ type:"post", data:"name=tom", url:"js/cuisine_area.json", contentType: "application/x-www-form-urlencoded", async:true, success : function (msg) { var str = msg; console.log(str); $('div').append("<ul></ul>"); for(var i=0; i<msg.prices.length;i++){ $('ul').append("<li></li>"); $('li').eq(i).text(msg.prices[i]); } }, error : function (errMsg) { console.log(errMsg); $('div').html(errMsg.responseText) }});$.get 这是一个简单的 GET 请求功能以取代复杂 $.ajax 。 ...

July 6, 2020 · 1 min · jiezi

越来越少人用JQuery但你就不学了吗4

如需要跟多资料请点击下方图片⬇(扫码加好友→备注66) Jquery事件ready加载事件 ready()类似于 onLoad()事件 ready()可以写多个,按顺序执行 $(document).ready(function(){})等价于$(function(){}) <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>ready事件</title> <script src="js/jquery-3.4.1.js" type="text/javascript"></script> <script type="text/javascript"> // 文档载入完便触发ready方法 $(document).ready(function(){ $("div").html("ready go..."); }) // $(document).ready(function(){}) == $(function(){}) $(function(){ $("p").click( function () { $(this).hide(); }); }); $(function(){ $("#btntest").bind("click",function(){ $("div").html("剁吧..."); }); }); </script> </head> <body> <h3>页面载入时触发ready()事件</h3> <div></div> <input id="btntest" type="button" value="剁手" /> <p>aaa</p> <p>bbbb</p> <p>ccc</p> <p>dddd</p> </body></html>bind()绑定事件 为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数。 $(selector).bind( eventType [, eventData], handler(eventObject)); eventType :是一个字符串类型的事件类型,就是你所需要绑定的事件。 这类类型可以包括如下: blur, focus, focusin, focusout, load, resize, scroll, unload, click, dblclick ...

July 4, 2020 · 1 min · jiezi

越来越少人用JQuery但你就不学了吗3

如需要跟多资料请点击下方图片⬇(扫码加好友→备注66) Jquery Dom操作 jQuery也提供了对HTML节点的操作,而且在原生js的基础之上进行了优化,使用起来更加方便。 常用的从几个方面来操作,查找元素(选择器已经实现);创建节点对象;访问和设置节点对象的值,以及属性;添加节点;删除节点;删除、添加、修改、设定节点的CSS样式等。<font color="red">注意:以下的操作方式只适用于jQuery对象。</font> 操作元素的属性获取属性方法说明举例attr(属性名称)获取指定的属性值,操作 checkbox 时,选中返回 checked,没有选中返回 undefined。attr('checked')attr('name')prop(属性名称)获取具有true和false两个属性的属性值prop('checked')<form action="" id="myform"> <input type="checkbox" name="ch" checked="checked"/> aa <input type="checkbox" name="ch" /> bb</form> <script type="text/javascript"> var ch = $("input[type='checkbox']") console.log(ch) ch.each(function(idx, em){ console.log(idx + "-" + $(em) + "=" + this) console.log($(em).attr('checked') + "==" + $(em).prop('checked')) console.log('--------------') })</script>设置属性方法说明举例attr(属性名称,属性值)设置指定的属性值,操作 checkbox 时,选中返回 checked,没有选中返回 undefined。attr('checked',’checked’)attr('name',’zs’)prop(属性名称,属性值)设置具有true和false的属性值prop('checked',’true’)移除属性方法说明举例removeAttr(属性名)移除指定的属性removeAttr('checked')<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>属性操作</title> <script src="js/jquery-3.4.1.js" type="text/javascript"></script> </head> <body> <pre> <h5>1.attr()</h5> 设置或者返回元素的属性 ; <h5>2.prop()</h5> 设置 具有 true 和 false 两个属性的属性,如 checked, selected 或者 disabled。 </pre> <hr /> <a href="http://www.baidu.com" id="a1">百度</a> <a href="http://www.sina.com" id="a2">新浪</a> <input type="checkbox" name="all" checked="checked"/>全选 </body> <script type="text/javascript"> // 获取属性值:attr console.log($('#a1').attr('href')); console.log($(':checkbox').attr('name')); // 若未选中显示undefined,选中显示 checked console.log($(':checkbox').attr('checked')); // 获取属性值:prop // 若未选中显示false,选中显示 true console.log($(":checkbox").prop('checked')); console.log($('#a2').prop('href')) // 设置属性值 $('#a1').attr('href','https://jquery.com'); $(":checkbox").prop("checked",false); // 移除属性 $('#a2').removeAttr('href'); </script></html>操作元素的样式 对于元素的样式,也是一种属性,由于样式用得特别多,所以对于样式除了当做属性处理外还可以有专门的方法进行处理。 ...

July 3, 2020 · 3 min · jiezi

越来越少人用JQuery但你就不学了吗2

如需要跟多资料请点击下方图片⬇(扫码加好友→备注66) Jquery选择器 和使用js操作Dom一样,获取文档中的节点对象是很频繁的一个操作,在jQuery中提供了简便的方式供我们查找|定位元素,称为jQuery选择器,选择器可以说是最考验一个人 jQuery 功力的地方,通俗的讲, Selector 选择器就是"一个表示特殊语意的字符串"。 只要把选择器字符串传入上面的方法中就能够选择不同的Dom 对象并且以 jQuery 包装集的形式返回。 jQuery 选择器按照功能主要分为"选择"和"过滤"。 并且是配合使用的,具体分类如下。基础选择器掌握即可 ,其他用到再查阅。 基础选择器选择器名称举例id选择器#id$("#testDiv")选择id为testDiv的元素元素名称选择器element$("div")选择所有div元素类选择器.class$(".blue")选择所有class=blue的元素选择所有元素*$("*")选择页面所有元素组合选择器selector1,selector2,selectorN$("#testDiv,span,.blue")同时选中多个选择器匹配的元素<style type="text/css"> .blue{ background: blue; }</style><body> <div id="mydiv1">id选择器1<span>span中的内容</span></div> <div id="mydiv2" class="blue">元素选择器</div> <span class="blue">样式选择器</span></body><script src="js/jquery-3.4.1.js" type="text/javascript" charset="utf-8"></script><script type="text/javascript"> // id选择器 console.log("======id===="); var idSelecter = $('#mydiv1'); console.log(idSelecter.html()); console.log(idSelecter.text()); // 元素选择器 console.log("======name===="); var nameSe = $('div'); // 有多个div元素 nameSe.each(function(){ // this是dom对象,$(this)是jquery对象 console.log($(this).text()); }); // 类选择器,class console.log("======class===="); var classSe = $('.blue'); // 有多个class=blue的元素 classSe.each(function(){ console.log($(this).text()); }); // 通用选择器:* console.log("======所有元素===="); var all = $("*"); console.log(all.length); // 组合选择器 console.log("======组合===="); var unionSe = $('span, .blue,div'); unionSe.each(function(){ console.log($(this).text()); });</script>层次选择器选择器名称举例后代选择器ancestor descendant$("#parent div")选择id为parent的元素的所有div元素子代选择器parent > child$("#parent>div")选择id为parent的直接div子元素相邻选择器prev + next$(".blue + img")选择css类为blue的下一个img元素同辈选择器prev ~ sibling$(".blue ~ img")选择css类为blue的之后的img元素<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>层次选择器</title> <script src="js/jquery-3.4.1.js" type="text/javascript"></script> <style type="text/css"> .testColor{ background: green; } .gray{ background: gray; } </style> </head> <body> <div id="parent">层次择器 <div id="child" class="testColor">父选择器 <div class="gray">子选择器</div> <img src="http://www.baidu.com/img/bd_logo1.png" width="270" height="129" /> <img src="http://www.baidu.com/img/bd_logo1.png" width="270" height="129" /> </div> <div> 选择器2<div>选择器2中的div</div> </div> </div> </body> <script type="text/javascript"> console.log("=========后代选择器-选择所有后代====="); var ancestorS = $('#parent div'); ancestorS.each(function(){ console.log($(this).text()); }); console.log("=========子代选择器-选择儿子辈====="); var child = $('#parent>div'); child.each(function(){ console.log($(this).text()); }); console.log("=========相邻选择器====="); var pre_next = $(".gray + img"); console.log(pre_next.length); console.log("=========同辈选择器,其后,(弟弟)====="); var pre_siblings = $(".gray ~ img"); console.log(pre_siblings.length); </script></html>表单选择器Forms名称举例表单选择器:input查找所有的input元素:$(":input");注意:会匹配所有的input、textarea、select和button元素。文本框选择器:text查找所有文本框:$(":text")密码框选择器:password查找所有密码框:$(":password")单选按钮选择器:radio查找所有单选按钮:$(":radio")复选框选择器:checkbox查找所有复选框:$(":checkbox")提交按钮选择器:submit查找所有提交按钮:$(":submit")图像域选择器:image查找所有图像域:$(":image")重置按钮选择器:reset查找所有重置按钮:$(":reset")按钮选择器:button查找所有按钮:$(":button")文件域选择器:file查找所有文件域:$(":file")<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>表单验证</title> <script src="js/jquery-3.4.1.js" type="text/javascript"></script> </head> <body> <form id='myform' name="myform" method="post"> <input type="hidden" name="uno" value="9999" disabled="disabled"/> 姓名:<input type="text" id="uname" name="uname" /><br /> 密码:<input type="password" id="upwd" name="upwd" value="123456" /><br /> 年龄:<input type="radio" name="uage" value="0" checked="checked"/>小屁孩 <input type="radio" name="uage" value="1"/>你懂得 <br /> 爱好:<input type="checkbox" name="ufav" value="篮球"/>篮球 <input type="checkbox" name="ufav" value="爬床"/>爬床 <input type="checkbox" name="ufav" value="代码"/>代码<br /> 来自:<select id="ufrom" name="ufrom"> <option value="-1" selected="selected">请选择</option> <option value="0">北京</option> <option value="1">上海</option> </select><br /> 简介:<textarea rows="10" cols="30" name="uintro"></textarea><br /> 头像:<input type="file" /><br /> <input type="image" src="http://www.baidu.com/img/bd_logo1.png" width="20" height="20"/> <button type="submit" onclick="return checkForm();">提交</button> <button type="reset" >重置</button> </form> </body></html><script type="text/javascript"> function checkForm(){ // 获取 所有的表单元素 $(":input").each(function(){ // console.log($(this)[0]); console.log($(this)[0].tagName); }) console.log("------+++++++++++++++++++++--------") // 获取 text console.log("text-->" + $(":text").length); // 1 // 获取 password console.log("password-->" + $(":password").length); // 1 // 获取radio console.log("radio-->" + $(":radio").length); // 2 // 获取checkbox console.log("checkbox-->" + $(":checkbox").length); // 3 // 获取file console.log("file-->" + $(":file").length); // 1 // 获取按钮 console.log("button-->" + $(":button").length); // 2 // 获取submit按钮 console.log("submit-->" + $(":submit").length); // 1 // 获取image按钮 console.log("image-->" + $(":image").length); // 1 // 获取reset按钮 console.log("reset-->" + $(":reset").length); // 1 return false; }</script>文章持续更新,可以微信搜索「 云璈公子 」阅读,回复【资料】【面试】【简历】有我准备的一线大厂面试资料和简历模板,同时我的GitHub https://github.com/1170300826... 有互联网一线大厂面试指南。

July 2, 2020 · 2 min · jiezi

HR绩效统计太慢不用那么复杂这样可轻松搞定

如果没有HR软件,采取传统的手工算法,人事管理将把几乎全部的精力都要用于员工的考勤、档案和发放薪酬等事务处理,一套完善的适用的白码绩效管理系统,将大大提高人力资源管理效率,灵活的报表生成功能和分析功能使得管理人员可以从繁琐的日常工作中解脱出来,将精力放到更富有挑战性和创造性的分析、规划、员工激励和战略等工作中去。 当企业的部门比较多,如果企业是以KPI的管理模式,各部门的经理需要对下属进行评分,最后再由人事部对各部门的绩效进行核算,最后才反馈提交给老板,这导致工作效率低下,过程还有可能会出错,所以选择一款绩效管理系统可以轻松帮助企业完成绩效管理。 绩效管理系统 人事部根据上级要求发起考核的主题,KPI拟定功能可分配给任意人员,分工处理绩效问题,层层递进,提高绩效管理效率。 根据上级自定义的考核标准,系统自动统计绩效信息,得出考核结果。 通过绩效管理系统,在线上即可对绩效进行审核管理,不用各部门辗转。 从这套白码的绩效管理系统模板对数据可视化管理,提高管理人审核各部门的绩效的效率,还可以及时了解员工的工作绩效,对绩效差的员工及时给予培训,自动统计汇总员工历史绩效数据,减少人为操作统计出错。 这套模板只能符合部分企业,如果还有更多业务流程需求,可在这个模板的基础上进行修改。

June 8, 2020 · 1 min · jiezi

win8系统硬盘模式改成ahci模式的详细教程win10专业版

最近用用户向我反映win8系统硬盘模式改成ahci模式的问题,据小编了解,不是所有的用户都会解决win8系统硬盘模式改成ahci模式的问题,那么今天我就给大家整理了win8系统硬盘模式改成ahci模式的具体解决步骤,你只用依照1、重启电脑或者开启电脑,然后在出现开机画面的时候按下对应的快捷键进入到bios设置窗口,在bios设置窗口中利用键盘上的方向键选择“Config”选项,然后选择“Serial ATA(SATA)”,按下回车键确认; 2、打开Serial ATA(SATA)后,会看到“SATA comtroller mode option [compatibility]”,按下回车键选择它;的步骤就ok了下面我们就一起来看看win8系统硬盘模式改成ahci模式完整的解决步骤吧! 1、重启电脑或者开启电脑,然后在出现开机画面的时候按下对应的快捷键进入到bios设置窗口,在bios设置窗口中利用键盘上的方向键选择“Config”选项,然后选择“Serial ATA(SATA)”,按下回车键确认; 2、打开Serial ATA(SATA)后,会看到“SATA comtroller mode option [compatibility]”,按下回车键选择它; 3、此时会弹出选择窗口,我们将其模式切换为“AHCI”,按下回车键确认; 4、模式切换后我们可以看到“SATA comtroller mode option”后面的括号就变更为“ahci”; 5、操作到这我们就将硬盘模式修改成ahci模式了,最后按下F10键保存刚才的设置并且退出bios设置,这个时候我们就可以安装win8系统。 以上就是关于win8系统硬盘模式改成ahci模式的操作方法,不会的小伙伴们来跟着小编一起学习吧!希望这个小小的经验能够帮助大家不再烦恼! 本文来源于win10专业版,转载请注明来源与出处。

June 3, 2020 · 1 min · jiezi

xp系统关闭网络共享功能的设置win10专业版

目前,计算机的安全性越来越受到重视。共享虽然方便了我们的使用,但也给计算机文件的安全带来了许多隐患。如果我们不在局域网,那么网络共享功能就根本没用了。网络共享功能在默认情况下是打开的,所以今天小编将教您如何关闭网络共享功能的操作步骤,一起来学习一下吧! 关闭xp系统局域网共享设置: 1、单击左下角的“开始”按钮,在弹出的窗口单击“控制面板”。 2、然后双击“网络连接”。 3、右击“本地连接”,弹出的快捷菜单点击“属性”命令。 4、选择“常规”选项卡,取消“microsoft网络的文件和打印机共享”的勾选,点击“确定”按钮保存退出。 XP系统关闭网络共享功能的方法就为大家介绍到这里了。是不是非常简单呢?有同样需求的朋友们,不妨也动手操作看看吧 本文来源于win10专业版,转载请注明来源与出处。

June 1, 2020 · 1 min · jiezi

00014layui-打开多页签tabs-弹窗layer

showRec:function () { var checkStatus = table.checkStatus('egressionListTable') var recs = checkStatus.data; if(!recs || recs.length!=1){ layer.msg('请选择一条记录'); return; } var rec = recs[0]; window.formData = rec; var dialog = layer.tab({ tab: [ { title: '外出信息', content: '<iframe src="egressionShow.jsp" style="width:100%;height:100%;" frameborder="0" scrolling="auto" name="iframe0"></iframe>' },{ title: '审核信息', content: '<iframe src="../order/auditOrderFlowTab.jsp" style="width:100%;height:97%;" frameborder="0" scrolling="auto" name="iframe1"></iframe>' }] ,btn: ['关闭'] ,btnAlign: 'c' }); layer.full(dialog)},

May 28, 2020 · 1 min · jiezi

jquery在hover时showhide增加speed造成快速移入移出的抖动问题

问题在开发中经常有需要鼠标hover时对内容隐藏显示的需求,常用的方式是通过jquery的hover事件,配合show/hide进行实现,具体代码如下:html: <ul> <li> <p>标题1</p> </li> <li> <p>标题2</p> </li> <li> <p>标题3</p> </li></ul>js: $(function () { $('ul li').hover(function () { $(this).children().show() }, function () { $('p').hide() })})这样实现起来是没有问题的,但是过于生硬,只是通过 display: block|none 的方式进行隐藏显示,毫无体验可言,所以改进一下,js如下: $(function () { $('ul li').hover(function () { $(this).children().show(500) // 增加speed 500ms }, function () { $('p').hide(300) //增加speed 300ms })})嗯嗯,可以了,显示的时候增加了动画,不再生硬,但是,问题来了,当鼠标快速的移入移出的时候,即使鼠标已经停止运动,但是动画还没有停止,依然会按照鼠标移入移出的次数执行完成才会停止,这略微有点尴尬,需要解决一下。 解决办法原本想到的是,既然移入移出有时间延迟,那可以加个延时,在移入的时候判断时候在执行,如果已经在执行动画过程,那么就不执行show,hide同理,但是失败了。那么再看看其他的吧,hover不行,那使用mouseenter/mouseout事件呢,然而,效果是一样的。仔细想了下,应该是因为增加了speed之后,相当于每次移入移出,都把隐藏/显示的动画增加到了动画的队列中,所以当快速的进行时,即使鼠标停止了,但是队列中的事件还没有执行完,所以依然会按照当前的次数继续执行,直到完成为止。那么既然这样,jq一定有自己的方式处理吧,要不然不可能就这样大家都忍受着或者都自己去想各种办法解决,果然,又搜了一下,原来jq已经提供了stop方法。stop这个方法的用途就是用于停止动画或效果,在它们完成之前。它接受两个参数:stopAll:规定是否应该清除动画队列。默认是 false,即仅停止活动的动画,允许任何排入队列的动画向后执行;goToEnd:规定是否立即完成当前动画,默认是 false。默认地,stop() 会清除在被选元素上指定的当前动画。修改js如下: $(function () { $('ul li').hover(function () { $(this).children().stop(false, true).show(500) }, function () { $('p').stop(false, true).hide(300) })})嗯嗯,问题解决了,可以愉快的进进出出了。看来jq用的太少了,对api也不够熟练啊,以后还是加强一下吧,嘻嘻。 ...

October 17, 2019 · 1 min · jiezi

jQuery制作仿京东商城商品列表商品筛选功能

这次使用jquery来实现一个仿京东商城-商品列表商品筛选的功能一、html代码 <!DOCTYPE html><html><head> <title></title> <link rel="stylesheet" type="text/css" href="css/style.css"></head><body><div class='container'> <div class='filter'> <span>已选条件:</span> <div class='itme'> <!-- <a> × <span>惠普</span> </a> --> </div> </div> <div class='store'> <dl> <dt>品牌:</dt> <dd><div><a>全部</a></div></dd> <dd><div><a>惠普(hp)</a></div></dd> <dd><div><a>联想(Lenovo)</a></div></dd> <dd><div><a>联想(ThinkPad)</a></div></dd> <dd><div><a>宏基(acer)</a></div></dd> <dd><div><a>华硕</a></div></dd> <dd><div><a>戴尔</a></div></dd> <dd><div><a>三星</a></div></dd> <dd><div><a>索尼</a></div></dd> <dd><div><a>东芝</a></div></dd> <dd><div><a>Gateway</a></div></dd> <dd><div><a>微星</a></div></dd> <dd><div><a>海尔</a></div></dd> <dd><div><a>清华同方</a></div></dd> <dd><div><a>富士通</a></div></dd> <dd><div><a>苹果(Apple)</a></div></dd> <dd><div><a>神舟</a></div></dd> <dd><div><a>方正</a></div></dd> <dd><div><a>优雅</a></div></dd> </dl> <dl> <dt>价格:</dt> <dd><div><a>全部</a></div></dd> <dd><div><a>1000-2999</a></div></dd> <dd><div><a>3000-3499</a></div></dd> <dd><div><a>3500-3999</a></div></dd> <dd><div><a>4000-4499</a></div></dd> <dd><div><a>4500-4999</a></div></dd> <dd><div><a>5000-5999</a></div></dd> <dd><div><a>6000-6999</a></div></dd> <dd><div><a>7000-9999</a></div></dd> <dd><div><a>10000以上</a></div></dd> </dl> <dl> <dt>尺寸:</dt> <dd><div><a>全部</a></div></dd> <dd><div><a>8.9英寸及以下</a></div></dd> <dd><div><a>11英寸</a></div></dd> <dd><div><a>12英寸</a></div></dd> <dd><div><a>13英寸</a></div></dd> <dd><div><a>14英寸</a></div></dd> <dd><div><a>15英寸</a></div></dd> <dd><div><a>16英寸-17英寸</a></div></dd> </dl> <dl> <dt>平台:</dt> <dd><div><a>全部</a></div></dd> <dd><div><a>AMD Brazos APU平台</a></div></dd> <dd><div><a>Intel Sandy Bridge平台</a></div></dd> <dd><div><a>Intel平台</a></div></dd> <dd><div><a>AMD平台</a></div></dd> </dl> <dl> <dt>显卡:</dt> <dd><div><a>全部</a></div></dd> <dd><div><a>独立显卡</a></div></dd> <dd><div><a>集成显卡</a></div></dd> <dd><div><a>核芯显卡</a></div></dd> </dl> </div></div><script type="text/javascript" src='js/jquery-1.10.2.min.js'></script><script type="text/javascript">var arr = [];$(function(){ $(".store dt+dd a").attr("class",'all-color'); $(".store a").click(function(){ $(this).parents("dl").children('dd').each(function(){ $(this).children('div').children('a').removeClass("all-color") }) $(this).attr("class",'all-color'); $(this).parentsUntil("dl").parent().hide(); arr.push($(this)); var val = $(this).html(); var domItem = `<a onclick=deletes('${val}') rel='${val}' > × <span>${val}</span> </a>`; $(".itme").append(domItem); })})function deletes(val){ $(".filter").find("a[rel='"+val+"']").remove(); for(var i=0;i<arr.length;i++){ if(arr[i].html() == val ){ arr[i].parentsUntil("dl").parent().show(); arr.splice(i,1); i--; }else{ arr[i].parentsUntil("dl").parent().hide(); } }}</script></body></html>二、css代码 ...

October 8, 2019 · 2 min · jiezi

jquery图片放大插件鼠标悬停图片放大效果

都知道jquery都插件是非常强大的,最近分享点jquery插件效果,方便效果开发使用。一、HTML代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>jquery图片放大插件鼠标滑过图片放大效果</title><meta name="description" content="jquery图片放大插件制作一个当鼠标滑过图片,图片按等比例缩放放大效果。动画图片放大展示特效。jQuery插件。" /></head><body><script type="text/javascript" src="js/jquery-1.4.2.min.js"></script><script type="text/javascript" src="js/jquery.zoomImgRollover.js"></script><script type="text/javascript">$(document).ready(function() { $("#testimg").zoomImgRollover();});</script><style type="text/css">*{margin:0;padding:0;list-style-type:none;}a,img{border:0;}.demo{width:544px;margin:20px auto;}</style><div class="demo"> <a href='http://www.3mooc.com/' style="border:1px solid #000;"> <img id="testimg" width="400" height="564" src="images/132ad.jpg" alt="" border="0"> </a></div></body></html>二、插件代码(插件名称:jquery.zoomImgRollover.js) (function(jQuery){ jQuery.fn.zoomImgRollover = function(options) { var defaults = { percent:30, duration:600 }; var opts = jQuery.extend(defaults, options); // static zoom function function imageZoomStep(jZoomImage, x, origWidth, origHeight) { var width = Math.round(origWidth * (.5 + ((x * opts.percent) / 200))) * 2; var height = Math.round(origHeight * (.5 + ((x * opts.percent) / 200))) * 2; var left = (width - origWidth) / 2; var top = (height - origHeight) / 2; jZoomImage.css({width:width, height:height, top:-top, left:-left}); } return this.each(function() { var jZoomImage = jQuery(this); var origWidth = jZoomImage.width(); var origHeight = jZoomImage.height(); // add css ness. to allow zoom jZoomImage.css({position: "relative"}); jZoomImage.parent().css({overflow: "hidden", display:"block", position: "relative", width: origWidth, height: origHeight}); jZoomImage.mouseover(function() { jZoomImage.stop().animate({dummy:1},{duration:opts.duration, step:function(x) { imageZoomStep(jZoomImage, x, origWidth, origHeight) }}); }); jZoomImage.mouseout(function() { jZoomImage.stop().animate({dummy:0},{duration:opts.duration, step:function(x) { imageZoomStep(jZoomImage, x, origWidth, origHeight) }}); }); }); };})(jQuery);

October 6, 2019 · 1 min · jiezi

jQuery鼠标滑过横向时间轴效果

jQuery鼠标滑过横向时间轴效果---效果图:jQuery鼠标滑过横向时间轴效果---全部代码: <!DOCTYPE html><html><head> <title></title> <link rel="stylesheet" type="text/css" href="css/style.css"></head><body><div class='container'> <ul> <li> 1993 <div class='time'> <h1>1993</h1> <p>内容介绍</p> </div> </li> <li> 1999 <div class='time'> <h1>1999</h1> <p>内容介绍</p> </div> </li> <li> 2006 <div class='time'> <h1>2006</h1> <p>内容介绍</p> </div> </li> <li> 2019 <div class='time'> <h1>2019</h1> <p>内容介绍</p> </div> </li> </ul> </div><script type="text/javascript" src='js/jquery1.10.2.js'></script><script type="text/javascript">$(function(){ $("ul li").hover(function(){ $(this).find('.time').slideDown(500); },function(){ $(this).find('.time').slideUp(500); })})</script></body></html>jQuery鼠标滑过横向时间轴效果---css部分: *{margin:0;padding:0;}ul{ list-style: none;}.container{ height: 162px; background: url('../images/ico9.gif') repeat-x center;}.container li{ float:left; background: url('../images/ico10.gif') no-repeat center top; width:140px; text-align: center; margin-top: 65px; position: relative; padding-top:30px; font-size:12px;}.time{ position: absolute; width:100%; left:0; top:-20px; display: none;}.time h1{ background: url('../images/ico11.gif') no-repeat center top; height: 67px; line-height: 67px; font-size:16px;}.time p{ color:#999; font-size:14px;}每日分享效果附带视频:https://www.3mooc.com/front/c... ...

October 4, 2019 · 1 min · jiezi

jQuery-效果方法大全

jQuery 效果方法下表列出了用于创建动画效果的所有jQuery方法。 方法描述animate()在所选元素上运行自定义动画。clearQueue()从所选元素中删除所有剩余的排队函数。delay()为所选元素上的所有排队函数设置延迟。dequeue()从队列中删除下一个函数,然后执行该函数。fadeIn()淡入选定的元素。fadeOut()淡出选定的元素。fadeTo()将所选元素淡入/淡出给定的不透明度。fadeToggle()在fadeIn()和fadeOut()方法之间切换finish()停止,删除并完成所选元素的所有排队动画。stop()停止所选元素的当前运行动画。hide()隐藏选定的元素。show()显示所选元素。queue()显示所选元素上的排队函数。toggle()在hide()和show()方法之间切换slideDown()向下滑动(显示)所选元素。slideUp()向上滑动(隐藏)所选元素。slideToggle()在slideUp()和slideDown()方法之间切换。

September 20, 2019 · 1 min · jiezi

jquery源码分析一

最近开始阅读jquery的源码,首先先提炼出jquery的核心结构。 自执行函数(function(window,undefined){ //...})(window);为什么传入window?1.代码压缩 首先从代码压缩混淆的角度考虑,用线上工具来压缩混淆下面这段示例代码: function test(){ var name="hello"; window.description="hi "+name;}压完混完后瘦了一点: function say(){var a="hello";window.description="hi "+a}用a代替了name,但是window既不是声明的局部变量也不是参数,是不会被压缩混淆的。所以将window作为参数传入可解决这个问题。将window作为参数传入,可以在压缩代码时进行优化,即参数名可以压缩变短。也可以在函数内另起个简短的变量名代替。 2.作用域 访问当前作用域下的变量比访问全局变量要快如果不传入,每个语句都要去找一次window。如果将window作为参数传递过去,不要每个语句都去找window,提高了效率。 为什么要传入undefined?undefined并不是作为JavaScript的保留关键字;undefined在IE8及以下中是可以对其重新赋值的 var undefined="new value";alert(undefined);//alert “new value"执行匿名函数的时候,只传递一个参数window,而不传递undefined,那么函数体中的undefined局部变量的值,刚好就是undefined var undefined = 8; (function( window ) { alert(window.undefined); // 8 alert(undefined); // 8 })(window); 加了undefined后 var undefined = 8; (function( window, undefined ) { alert(window.undefined); // 8 alert(undefined); // 此处undefined参数为局部的名称为undefined变量,值为undefined })(window); 在 自调用匿名函数 的作用域内,确保undefined是真的未定义。因为undefined能够被重写,赋予新的值. new jQuery.fn.init( selector, context );jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context );//=>创建了init这个类的实例,也相当于创建了jQuery这个类的实例(因为在后面的时候,让init.prototype=jQuery.prototype)};jQuery.fn = jQuery.prototype = {}要理解这段代码,首先要理解jquery的两种调用 ...

September 7, 2019 · 1 min · jiezi

前端vuejquery后台java实现生成二维码

最近项目中需要开发生成二维码的功能,便于宣传和使用产品,于是便去研究一番,以下是研究的成果 1.使用jquery生成二维码<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>二维码测试</title> </head> <body> <div id="qrcode" style="display: flex;justify-content: center;margin-top: 100px;"></div> <script type="text/javascript" src="js/jquery/jquery-2.1.4.min.js"></script> <script type="text/javascript" src="js/jquery.qrcode.min.js"></script> <script type="text/javascript"> $('#qrcode').qrcode({ text: "https://www.baidu.com/",//内容 height: 369, width: 369, render: "canvas", //渲染方式有table方式(IE兼容)和canvas方式 typeNumber:-1,//计算模式 background: "#ffffff",//背景颜色 foreground: "#000000",//二维码颜色 correctLevel: QRCode.correctLevel,//二维码纠错级别 L: 1,M: 0,Q: 3,H: 2(默认) src: 'img/icon/r-VY-hpinrya9109218.jpg'//logo }) </script> </body> </html>查看jquery.qrcode.min.js源码可以看出生成的二维码 2.使用vue生成二维码1)使用npm安装vue-qr,成功后引入vue-qr npm install vue-qr --saveimport VueQr from 'vue-qr'2)实现代码 <template> <div class="qr-code-box"> <vue-qr :logoSrc="config.logo" :text="config.value" class="qr-code-pic" :correctLevel="3" :margin="0" :dotScale="0.5"></vue-qr> </div></template><script> import VueQr from 'vue-qr'; export default { data() { return { config: { value: '', logo: require('./r-VY-hpinrya9109218.jpg') } } }, mounted() { this.config.value = "https://www.baidu.com/"; }, components: { VueQr } }</script><style scoped> .qr-code-box{ display: flex; justify-content: center; margin-top: 100px; } .qr-code-pic{ width: 300px; height: 300px; }</style>3)参数配置Correct Level 0-3 容错级别 0-3logoSrc 嵌入至二维码中心的 LOGO 地址dotScale 数据区域点缩小比例,默认为0.35.......可以看https://www.npmjs.com/package... ...

August 21, 2019 · 3 min · jiezi

用原生-JavaScript-实现十大-jQuery-函数

作者:Omar Duarte翻译:疯狂的技术宅 原文:https://devkisslist.com/2019/... 未经允许严禁转载 在本文中我将把自己最常用的 jQuery 函数转换为原生 JavaScript。 有时我需要创建一个简单的静态 HTML 或登录页面,而且不想引入任何库或其它依赖。对这种情况,我只使用普通的 JavaScript 来完成工作,老实说,知道它们是怎样工作的感觉真的很好。 现在我把它们分享给你。请访问GitHub页面,随时为你提供帮助: https://github.com/omarld/jqu... 在你开始之前,首先要知道标题是要转换为原生 JavaScript 的 jQuery 函数。接下来将简要介绍它做什么,然后是转换后的 JavaScript 代码和一些附加说明。 1) $(document).ready(..)检查文档是否已加载并准备好执行脚本。 let isLoaded = false;let myOnLoadCallBack = function(){ isLoaded = true; //my stuff here}document.addEventListener("DOMContentLoaded", myOnLoadCallBack());document.addEventListener('readystatechange', (event) => { if (document.readyState === 'complete' && !isLoaded) { myOnLoadCallBack(); });使用了 DOMContentLoaded 事件侦听器,这是在构建 DOM 树但尚未加载任何其他资源(即样式表、图像等)时触发的。 如果在 HTML 文档中找到任何 script 标记,DOMContentLoaded 也会等待加载这些脚本。 如果样式后面有脚本标记,在加载样式时就会出现问题。出现这种情况时,如果脚本需要修改样式,则在脚本之前加载样式。 IE 8 及更低版本不支持 DOMContentLoaded。如果你不得不支持 IE 8,应该用 document.readyState。 ...

July 12, 2019 · 2 min · jiezi

前端培训中级阶段8-jQuery元素属性样式操作20190801期

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 好久没有更文,有没有人想我呀。我没有摸鱼,最近调研了一下 vue-element-admin,用来做了个小项目。发现自己需要学习的地方还有很多啊。 今日份内容attr()、prop()addClass()、removeClass()、toggleClass()html()、text()、val()offset()、position()css()animate()、stop()、delay()attr() 与 prop()差异性,在之前的文章中就已经讲过了。这里说一下重点。attr() 对应 attribute ,是标签的属性。如 href,src,id,classprop() 对应 properties ,是标签的状态(基本是Boolean类型)。如 checked、disabled addClass()、removeClass()、toggleClass()用于操作标签的 class 属性,封装的一系列方法(对应原生 classList)。 $('p').addClass('wrap') 会给所有的p标签增加一个 warp 的 class。如果已经有了,就不会重复操作。$('p').removeClass('wrap') 会给所有的p标签移除 warp 的 class。如果没有,就不会操作。$('p').toggleClass('wrap') 会给所有的p标签切换 warp 这个class。如果有,就删除。如果没有,就添加。html()、text()、val()也在之前讲过了。 html() 对应 innerHTMLtext() 对应 innerTextval() 对应 value其实也可以用做 xss 防护。先用 text 写内容,然后用 html 读内容。当然,还是建议,不要相信用户的输入。都用 text() 来写入内容。offset()、position()offset获取匹配元素在当前视口的相对偏移。返回的对象包含两个整型属性:top 和 left,以像素计。此方法只对可见元素有效。offset获取匹配元素相对父元素的偏移。返回的对象包含两个整型属性:top 和 left。为精确计算结果,请在补白、边框和填充属性上使用像素单位。此方法只对可见元素有效。css()获取css值支持多种写法。 $("p").css("color");$("p").css(["color","font-size"]);设置css值也支持多种写法 $("p").css("color",'#0ff');$("p").css({"color":'#c0c','font-size': '18px',backgroundColor: '#0c0'});推荐使用键值对的方法。如果是有斜杠的,可以加引号,或者改成大写。$("p").css('font-size',()=>50*Math.random()+'px'); 随机字体大小。 其实也可以根据index来做渐进色彩等等。。animate()、stop()、delay()animate支持两种入参方式 (params,[speed],[easing],[fn] )params: 一组包含作为动画属性和终值的样式属性和及其值的集合speed: 三种预定速度之一的字符串("slow","normal", or "fast")或表示动画时长的毫秒数值(如:1000)easing: 要使用的进度效果的名称(需要插件支持).默认jQuery提供"linear" 和 "swing".fn: 在动画完成时执行的函数,每个元素执行一次。(params,options)params: 一组包含作为动画属性和终值的样式属性和及其值的集合options: 动画的额外选项。如: ...

July 9, 2019 · 1 min · jiezi

jQuery源码解析系列一目录

起初选择先看jQuery源码而不是react的原因也简单:jQuery作为每个前端会用的第一个框架,虽然过时,但却又如此普及,所以想看看它是咋设计的。 从 2019.3.22 到 2019.07.01,前前后后写了 27 篇文章,但由于jQuery作为大而全的框架,一来 全部看掉太费时间和精力(你可以从下面的目录看到,Sizzle引擎、Deferred还没有看),二来 时间拖得挺久的了,有些厌倦。 所以jQuery的源码解析系列,暂且告一段落了,27 篇文章目录如下: jQurey-3.3.1源码解析(天啦噜,它出3.4.1了) 节点遍历 jQuery的遍历结构设计之遍历祖先 jQuery之documentFragment 当我调用了$().append()后,jQuery内部发生了什么? jQuery内部对<script>标签的处理 jQuery的遍历结构设计之遍历同胞 文档处理 jQuery之html()的实现 jQuery之text()的实现 jQuery源码解析之after()/insertAfter()/before()/prepend()的实现 jQuery源码解析之replaceWith()/unwrap() jQuery源码解析之detach()/empty()/remove()/unwrap() jQuery之getAll()和cleanData() jQuery源码解析之clone() 元素操作 jQuery源码解析之offset() jQuery源码解析之position() 样式操作 jQuery源码解析之width() jQuery源码解析之addClass(),removeClass(),toggleClass()和hasClass() 事件体系 jQuery源码解析之click()的事件绑定 jQuery源码解析之trigger() addEvent.js源码解析 jQuery源码解析之你并不真的懂事件委托及target和currenttarget的区别 jQuery源码解析之jQuery.event.dispatch() jQuery之事件绑定到触发全过程及知识点补充 模拟实现jQuery的$().on()和$().trigger() 动画引擎 jQuery源码解析之$.queue()、$.dequeue()和jQuery.Callbacks() jQuery源码解析之$().animate()(上) jQuery源码解析之$().animate()(下) jQuery之模拟实现$().animate()(上) jQuery之模拟实现$().animate()(下) github:https://github.com/AttackXiaoJinJin/jQueryExplain 希望对你有些帮助! (完)

July 4, 2019 · 1 min · jiezi

如何防止按钮重复点击jquery

因为兼容性的问题,我们项目没有使用input和button按钮,用的是a和div的按钮;出于安全的考虑要做一个防止重复点击。跳转的按钮使用one注册事件,重复点击的按钮如何做? <a id="update_button" class="btn_w" href="javascript:void(0);">修改</a><div id="update_button" class="btn_w"">修改</div>点击的时候移除绑定事件不就可以吗? $("button").bind("click",function(){ alert(2) $(this).unbind("click"); });按钮点击后解除绑定的事件,在回调里再重新绑定事件。

July 2, 2019 · 1 min · jiezi

jquery中prop和attr的区别

最近开发过程中,遇到处理复选框的值,留意下attr,props的区别 1、用于设置的属性值类型不同由于attr()函数操作的是文档节点的属性,因此设置的属性值只能是字符串类型,如果不是字符串类型,也会调用其toString()方法,将其转为字符串类型。 prop()函数操作的是JS对象的属性,因此设置的属性值可以为包括数组和对象在内的任意类型 2、其他细节问题在jQuery 1.6之前,只有attr()函数可用,该函数不仅承担了attribute的设置和获取工作,还同时承担了property的设置和获取工作。例如:在jQuery 1.6之前,attr()也可以设置或获取tagName、className、nodeName、nodeType等DOM元素的property。 直到jQuery 1.6新增prop()函数,并用来承担property的设置或获取工作之后,attr()才只用来负责attribute的设置和获取工作。 此外,对于表单元素的checked、selected、disabled等属性,在jQuery 1.6之前,attr()获取这些属性的返回值为Boolean类型:如果被选中(或禁用)就返回true,否则返回false。 但是从1.6开始,使用attr()获取这些属性的返回值为String类型,如果被选中(或禁用)就返回checked、selected或disabled,否则(即元素节点没有该属性)返回undefined。并且,在某些版本中,这些属性值表示文档加载时的初始状态值,即使之后更改了这些元素的选中(或禁用)状态,对应的属性值也不会发生改变。 因为jQuery认为:attribute的checked、selected、disabled就是表示该属性初始状态的值,property的checked、selected、disabled才表示该属性实时状态的值(值为true或false)。 因此,在jQuery 1.6及以后版本中,请使用prop()函数来设置或获取checked、selected、disabled等属性。对于其它能够用prop()实现的操作,也尽量使用prop()函数。 <input id="uid" type="checkbox" checked="checked" value="1"><script type="text/javascript">// 当前jQuery版本为1.11.1var uid = document.getElementById("uid");var $uid = $(uid);document.writeln( $uid.attr("checked") ); // checkeddocument.writeln( $uid.prop("checked") ); // true// 取消复选框uid的选中(将其设为false即可)// 相当于 uid.checked = false;$uid.prop("checked", false);// attr()获取的是初始状态的值,即使取消了选中,也不会改变document.writeln( $uid.attr("checked") ); // checked// prop()获取的值已经发生变化document.writeln( $uid.prop("checked") ); // false</script>

July 2, 2019 · 1 min · jiezi

jQuery删除清空指定元素下的所有子节点的方法

我们知道可以利有jQuery中的detach()方法和jQuery中的remove()方法删除指定的或是匹配的元素,也可以使用removeClass()方法以及removeAttr()方法删除指定或是匹配元素的类或是属性。那么我们今天说一说利用jQuery如果删除指定或匹配的元素内的子元素和节点! jQuery中empty()方法的解释jQuery中的empty()方法:些方法可以清空/删除指定元素下的所以子节点或是内容 语法: $(selector).empty()举个大大的“例”字 利用jQuery中的empty()方法移去DIV中的所有内容HTML代码 <div id="mochu"> <p>这里是P标签内容</p> <p>这里是第二个P标签的内容</p></div>JQ代码 $('#button').click(function(){ $("#mochu").empty();})结果图示 审核源码如下图所示通过上图我们可以发现,ID为mochu的div标签,里面的P标签和内容都已被删除! 作者有话说 写这篇文章的时候,查阅了三个文档,其中一个文档这样说的,empty()函数应理解为清空指定元素下的子节点,并不是删除指定元素下的子节点。关于这一点,大家看着理解吧。我个人认为,还是清空比较恰当一些!

July 2, 2019 · 1 min · jiezi

前端培训中级阶段6-jQuery的事件绑定链式操作及原理20190725期

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 主要内容jQuery 事件(绑定,解绑,委托,触发)jQuery 链式操作jQuery 事件绑定事件 on(events,[selector],[data],fn)我比较习惯直接使用$('div').on(events,fn)来实现绑定事件。on()方法绑定事件处理程序到当前选定的jQuery对象中的元素。在jQuery 1.7中,.on()方法提供绑定事件处理程序所需的所有功能。帮助从旧的jQuery事件方法转换,.bind(), .delegate(), 和 .live()。 events 可以用写多个事件,比如常见的input的兼容写法$('input').on('input propertychange', fn)。对应原生addEventListener和ie等低版本的兼容。 jQuery 解绑事件 off(events,[selector],[fn])我比较习惯直接使用$('div').off(events)来实现解绑事件。off() 方法移除用.on()绑定的事件处理程序。特定的事件处理程序可以被移除元素上提供事件名称,命名空间,处理函数。当有多个过滤参数,所提供的参数都必须匹配的事件处理程序才会被删除。 $('.btn').off('click') 会把所有的click事件都移除。还记得我们原生的移除条件吗?removeEventListener必须把fn也传入进去才可以。那么jQuery怎么实现的呢?他把所有的事件都保存了起来,删除的时候使用保存的引用去删除。 jQuery 事件委托 on(events,selector,[data],fn)原生的方法为判断event.target来实现。jQuery 封装之后通过传入selector来操作。selector:用于过滤器的触发事件的选择器元素的后代。如果省略,当事件触发到达选定的元素,事件总是触发。 jQuery 事件触发、模拟触发 trigger(type,[data])原生使用dispatchEvent触发。例子:$("form:first").trigger("submit") 其他事件类支持one() 绑定只触发一次的事件hover([over,]out) 绑定鼠标hover效果。封装好的mouseover和mouseout事件封装,我基本都不用。只用on offjQuery 链式操作链式操作真的爽。比如ES6的 new Array(10).fill(1).map((v,i)=>i*2) 我们可以让我的数据经过好几个方法处理一下。原理其实也比较简单,因为jQuery重点就是封装了DOM,所有的都伪装成数组。让我们很方便的遍历。然后他在每次操作完之后把this又return了出来 例子:jsrun地址 //实现了一个,单击打开,移走变透明的效果。$('#wrap').on('click', function(){ window.open('https://www.lilnong.top')}).on('mouseout', function(){ $('#wrap').animate('opacity', .7)}).on('mouseover', function(){ $('#wrap').css('opacity', 1)})我们尝试自己来写一个可以链式操作的对象 obj={ num: 0, clear: function(num){ this.num= 0 return this; }, add: function(num){ this.num+=num return this; }} 微信公众号:前端linong 初级阶段文章目录前端培训-初级阶段(17) - 数据存储(cookie、session、stroage)前端培训-初级阶段(13) - 正则表达式前端培训-初级阶段(13) - 类、模块、继承前端培训-初级阶段(13) - ECMAScript (内置对象、函数)前端培训-初级阶段(13) - ECMAScript (语法、变量、值、类型、运算符、语句)前端培训-初级阶段(13、18)前端培训-初级阶段(9 -12)前端培训-初级阶段(5 - 8)前端培训-初级阶段(1 - 4)中级阶段文章目录前端培训-中级阶段(2) - 事件(event) 事件冒泡、捕获 - (2019-06-20期)前端培训-中级阶段(3) - DOM 文档对象模型(2019-06-27期)前端培训-中级阶段(4)- BOM 浏览器对象模型(2019-07-04期)前端培训-中级阶段(5)- jQuery的概念与基本使用(2019-07-11期)前端培训-中级阶段(6)- jQuery元素节点操作(2019-07-18期)资料前端培训目录、前端培训规划、前端培训计划jQuery 速查地址

July 2, 2019 · 1 min · jiezi

jQuery之模拟实现animate下

前言:在上篇的基础上,接入doAnimation() 逻辑图: 实现: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>jQuery之$().animate()的实现</title></head><body><!--<script src="jQuery.js"></script>--><div id="A" style="width:100px;height:50px;background-color: deeppink">这是A</div><script> // (function(a){ // console.log(a) //name // })('name') // // (function (b) { // console.log(b) //function(){console.log('name')} // })(function () { // console.log('name') // }) //匿名函数自调用,下面好长好长的function就是$ //也就是说$是一个function(){xxx} (function($) { window.$ = $; })( //这里也是匿名函数自调用 //本质就是经过一系列操作得到chenQuery并作为参数$,赋值给window.$ function() { //匹配ID let rquickExpr = /^(?:#([\w-]*))$/; //jQuery初始化 function chenQuery(selector) { return new chenQuery.fn.init(selector); } function getStyles(elem) { return elem.ownerDocument.defaultView.getComputedStyle(elem, null); } //模仿swing动画效果 //两头慢,中间快 function swing(p) { return 0.5 - Math.cos(p * Math.PI) / 2; } //创建动画缓动对象// function Tween(value, prop, animation) { this.elem=animation.elem; this.prop=prop; this.easing= "swing"; //动画缓动算法 this.options=animation.options; //获取初始值 this.start=this.now = this.get(); //动画最终值 this.end= value; //单位 this.unit="px" } Tween.prototype = { //获取元素的当前属性 get: function() { let computed = getStyles(this.elem); let ret = computed.getPropertyValue(this.prop) || computed[this.prop]; return parseFloat(ret); }, //运行动画 run:function(percent){ let eased //根据缓动算法改变percent this.pos = eased = swing(percent); //获取具体的改变坐标值 this.now = (this.end - this.start) * eased + this.start; //最终改变坐标 this.elem.style[this.prop] = this.now + "px"; return this; } } //创建开始时间 function createFxNow() { setTimeout(function() { Animation.fxNow = undefined; }); return (Animation.fxNow = Date.now()); } let inProgress function schedule() { //inProgress是判断整个动画流程是否结束的标志 //当inProgress=null时,整个动画结束 if ( inProgress ) { //走这边 //使用requestAnimationFrame来完成动画 //递归 window.requestAnimationFrame( schedule ); /*执行动画帧*/ Animation.fx.tick(); } } // 动画核心函数 function Animation(elem, options, optall,func,){ //动画对象 let animation = { elem:elem, props:options, originalOptions:optall, options:optall, //动画开始时间 startTime:Animation.fxNow || createFxNow(), //存放每个属性的缓动对象,用于动画 tweens:[] } //生成属性对应的动画算法对象 for (let k in options) { // tweens保存每一个属性对应的缓动控制对象 animation.tweens.push( new Tween(options[k], k, animation) ) } //动画状态 let stopped; //动画的定时器调用包装器 //单帧循环执行 let tick = function() { if (stopped) { return false; } //动画时间算法 let currentTime = Animation.fxNow || createFxNow, //动画运动时间递减 remaining = Math.max(0, animation.startTime + animation.options.duration - currentTime), //百分比 temp = remaining / animation.options.duration || 0, percent = 1 - temp; let index = 0, length = animation.tweens.length; //执行动画改变 for (; index < length; index++) { //percent改变值 animation.tweens[index].run(percent); } //当进度不到100%时,继续绘制动画帧 if (percent < 1 && length) { return remaining; } //当结束时通知单个动画结束 tick.complete() return false } tick.elem = elem; tick.anim = animation //这个是自定义的属性,也就是单个动画结束的标志 tick.complete = func //开始执行下个动画 Animation.fx.timer(tick) } //用于requestAnimationFrame调用 Animation.timers =[] Animation.fx = { //开始动画队列,不是帧队列 //Animation.tick() timer: function(timer,) { Animation.timers.push(timer); if (timer()) { //开始执行动画 Animation.fx.start(); // func() } // else { // Animation.timers.pop(); // } }, //开始循环 start: function(func) { if ( inProgress ) { return; } //动画开始即为运行中,加上锁 inProgress = true; //运行 schedule(); // func() }, //停止循环 stop:function(){ inProgress = null; }, //动画帧循环的的检测 tick: function() { var timer, i = 0, timers = Animation.timers; Animation.fxNow = Date.now(); for (; i < timers.length; i++) { timer = timers[i]; if (!timer() && timers[i] === timer) { //如果完成了就删除这个动画 timers.splice(i--, 1); } } if (!timers.length) { Animation.fx.stop(); } Animation.fxNow = undefined; } } //假设是在数据缓存中存取队列 const Queue=[] //数据缓存 const dataPriv={ get:function (type) { if(type==='queue') return Queue }, } const dequeue=function() { const Queue=dataPriv.get("queue") let fn = Queue.shift() //当单个动画结束后,执行下个动画 const next = function() { dequeue(); } if ( fn === "inprogress" ) { fn = Queue.shift(); } if (fn) { Queue.unshift( "inprogress" ); /*执行doAnimation方法,doAnimation(element, options,function() {firing = false;_fire();})*/ /*fn的参数就是形参func*/ /*func方法是用来通知上个动画结束,下个动画运行的重要function*/ //func的作用是用来通知动画执行结束,并继续执行下一个动画 const func=function() { next(); } fn(func); } } //省略type const queue=function(element, options, callback, ) { //模仿从数据缓存中得到的队列,直接写Queue.push也行 const Queue=dataPriv.get("queue") //向动画队列中添加doAnimation触发器 Queue.push(function(func) { //doAnimation callback(element, options, func); }); //如果没有动画在运行,运行动画 //动画锁inprogress if(Queue[0]!=='inprogress'){ dequeue() } } /*动画*/ const animation = function(element,options) { const doAnimation = function(element, options, func) { // const width = options.width /*===这里面定义了动画的算法,也就是Animation实现的地方===*/ // 默认动画时长2s // element.style.transitionDuration = '400ms'; // element.style.width = width + 'px'; /*监听单个动画完结*/ //transitionend 事件在 CSS 完成过渡后触发 // element.addEventListener('transitionend', function() { // func() // }); //动画的默认属性 let optall={ complete:function(){}, old:false, duration: 400, easing: undefined, queue:"fx", } let anim=Animation(element, options, optall,func) } //每调用一次animation,就入一次队 return queue(element, options,doAnimation,); } //为chenQuery的fn和prototype原型属性 赋 animate属性 chenQuery.fn = chenQuery.prototype = { //也可以直接把animation里的代码放这里来,但这样就太长了,降低了可读性 animate: function(options) { animation(this.element, options); //注意返回的是this,也就是$("#A"),这样就能继续调用animate方法 // 也就是链式调用 return this; } } //为chenQuery的fn属性添加init方法 const init = chenQuery.fn.init = function(selector) { // ["#A", "A",groups: undefined,index: 0,input: "#A"] const match = rquickExpr.exec(selector); //这边默认是只找id的元素 const element = document.getElementById(match[1]) //this指chenQuery.fn.init方法 //为该方法添加element属性 this.element = element; //返回chenQuery.fn.init return this; } //挺绕的,再将init的原型等于chenQuery.fn方法 init.prototype = chenQuery.fn; //chenQuery本身是一个function(){} // chenQuery{ //init能调用fn,fn能调用init // fn:{ // animate:function(){}, // init:function(){}, // // init.prototype=fn // }, // prototype:{ // animate:function(){}, // } // } return chenQuery; }()); const A = document.querySelector('#A'); //在异步调用中,进行同步调用 //动画是异步的 A.onclick = function() { //就是连续调用animation.add() $('#A').animate({ 'width': '500' }).animate({ 'width': '300' }).animate({ 'width': '1000' }); };</script></body></html>运行结果: ...

July 1, 2019 · 4 min · jiezi

jQuery之模拟实现animate上

根据上图实现除doAnimation外的逻辑: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>jQuery之$().animate()的实现</title></head><body><script src="jQuery.js"></script> <div id="A" style="width:100px;height:50px;background-color: deeppink">这是A</div><script> //匿名函数自调用,下面好长好长的function就是$ //也就是说$是一个function(){xxx} (function($) { window.$ = $; })( //这里也是匿名函数自调用 //本质就是经过一系列操作得到chenQuery并作为参数$,赋值给window.$ function() { //匹配ID let rquickExpr = /^(?:#([\w-]*))$/; //jQuery初始化 function chenQuery(selector) { return new chenQuery.fn.init(selector); } //假设是在数据缓存中存取队列 const Queue=[] //数据缓存 const dataPriv={ get:function (type) { if(type==='queue') return Queue }, } const dequeue=function() { const Queue=dataPriv.get("queue") let fn = Queue.shift() //当单个动画结束后,执行下个动画 const next = function() { dequeue(); } if ( fn === "inprogress" ) { fn = Queue.shift(); } if (fn) { Queue.unshift( "inprogress" ); /*执行doAnimation方法,doAnimation(element, options,function() {firing = false;_fire();})*/ /*fn的参数就是形参func*/ /*func方法是用来通知上个动画结束,下个动画运行的重要function*/ //func的作用是用来通知动画执行结束,并继续执行下一个动画 const func=function() { next(); } fn(func); } } //省略type const queue=function(element, options, callback, ) { //模仿从数据缓存中得到的队列,直接写Queue.push也行 const Queue=dataPriv.get("queue") //向动画队列中添加doAnimation触发器 Queue.push(function(func) { //doAnimation callback(element, options, func); }); //如果没有动画在运行,运行动画 //动画锁inprogress if(Queue[0]!=='inprogress'){ dequeue() } } /*动画*/ const animation = function(element,options) { const doAnimation = function(element, options, func) { const width = options.width /*===这里面定义了动画的算法,也就是Animation实现的地方===*/ // 默认动画时长2s element.style.transitionDuration = '400ms'; element.style.width = width + 'px'; /*监听单个动画完结*/ //transitionend 事件在 CSS 完成过渡后触发 element.addEventListener('transitionend', function() { func() }); } //每调用一次animation,就入一次队 return queue(element, options,doAnimation,); } //为chenQuery的fn和prototype原型属性 赋 animate属性 chenQuery.fn = chenQuery.prototype = { //也可以直接把animation里的代码放这里来,但这样就太长了,降低了可读性 animate: function(options) { animation(this.element, options); //注意返回的是this,也就是$("#A"),这样就能继续调用animate方法 // 也就是链式调用 return this; } } //为chenQuery的fn属性添加init方法 const init = chenQuery.fn.init = function(selector) { // ["#A", "A",groups: undefined,index: 0,input: "#A"] const match = rquickExpr.exec(selector); //这边默认是只找id的元素 const element = document.getElementById(match[1]) //this指chenQuery.fn.init方法 //为该方法添加element属性 this.element = element; //返回chenQuery.fn.init return this; } //挺绕的,再将init的原型等于chenQuery.fn方法 init.prototype = chenQuery.fn; //chenQuery本身是一个function(){} // chenQuery{ //init能调用fn,fn能调用init // fn:{ // animate:function(){}, // init:function(){}, // // init.prototype=fn // }, // prototype:{ // animate:function(){}, // } // } return chenQuery; }()); const A = document.querySelector('#A'); //在异步调用中,进行同步调用 //动画是异步的 A.onclick = function() { //就是连续调用animation.add() $('#A').animate({ 'width': '500' }).animate({ 'width': '300' }).animate({ 'width': '1000' }); };</script></body></html> ...

June 29, 2019 · 2 min · jiezi

模板字符串

模板字符串用途取变量 var name = "liyang"; var age = 23; console.log(`I am ${name},I ${age} years old`) 如果想用到反引号,用斜杠转义 var name = "liyang"; var age = 23; console.log(`I \`\`am ${name},I ${age} years old`) 展示多行字符串 $('#root').html(` <ul> <li>一</li> <li>二</li> <li>三</li> </ul> `) <ul>标签前面会有一个换行。如果想把行首和行尾的换行、空格等去掉,则使用trim方法。 $('#root').html(` <ul> <li>一</li> <li>二</li> <li>三</li> </ul> `.trim())嵌入变量的多种使用方式 var x= 1, y = 2;console.log(`${x} + ${y} = ${x + y}`) var x= 1, y = 2; console.log(${x} + ${y * 2} = ${x + y * 2}) ...

June 28, 2019 · 1 min · jiezi

前端培训中级阶段6-jQuery元素节点操作20190718期

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 上一节我们讲了 jQuery 的基本使用。这节我们讲元素节点相关的内容。 内容目录选择器文档处理筛选选择器选择器在初级的时候就讲过了。上节也简单的列了一下。这节就找一点骚东西说一说吧。 Sizzle 选择器引擎先问问DOM的API查找性能,有不知道的吗?由快到慢 ID > Class > Name > Tag。CSS 选择器匹配的顺序,有不知道的吗?从左往右jQuery的选择器匹配的顺序,有没有不知道的?Sizzle 选择器引擎从左往右,当然,既然人家优秀肯定有道理。如果支持更快querySelector会选择更快的方法。如果有id选择器,他会先进行id选择,缩小范围。感兴趣可以去看看Sizzle选择器引擎介绍,有能力读源码当然更好了。 举个栗子 查询语句:$('div span')代码结构: div div div span div span先查div的话,我们需要遍历多少次?两次可以吗?但是如果先查span,那我们parent去找直到找到头就完事了。再说另一个,子节点只有一个父节点。但是父节点会有很多子节点。文档处理append、appendTo 和 prepend、prependTo操作的是父子节点,效果也等同于原生的api。已存在节点是移动,新节点是新增。 parent.append(child) 是将child添加到parent的最后面。链式操作对象为parent。对应原生appendChildchild.appendTo(parent) 是将child添加到parent的最后面。链式操作对象为child。parent.prepend(child) 是将child添加到parent的最前面。链式操作对象为parent。child.prependTo(parent) 是将child添加到parent的最前面。链式操作对象为child。insertAfter、after 和 insertBefore、before操作的是兄弟节点,效果同上。 A.after(B) 是在A后面增加B。链式操作对象为AB.insertAfter(A) 是把B增加到A后面。链式操作对象为BA.before(B) 是在A前面增加B。链式操作对象为AB.insertBefore(A) 是把B增加到A前面。链式操作对象为Bwrap、unwrap、wrapall、wrapInner、replaceWith、replaceAll说实话这几个我用都没用过。 $("a").wrap("<div class='wrap'></div>") 是指,将所有a标签,用后面的节点包起来。$('li').unwrap()将他们的父节点移除。也就是说所有子节点占据了原来父级的位置。$("a").wrapAll("<div class='wrap'></div>") 是指,将所有到标签都合并到第一个位置,并且包裹起来。$("a").wrapInner("<b></b>")是指,讲a标签的内容,用b标签包裹起来。$("a").replaceWith('<a href="//www.lilnong.top">lilnong.top</a>') 将所有的a标签,用新标签替换。那么链式操作对象是谁?$('<a href="//www.lilnong.top">lilnong.top</a>').replaceAll("a") 用新标签替换,把所有的a标签替换。那么链式操作对象是谁?empty、remove、detach$("a").empty() 删除匹配的元素集合中所有的子节点。$("a").remove() 从DOM中删除所有匹配的元素。这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。但除了这个元素本身得以保留之外,其他的比如绑定的事件,附加的数据等都会被移除。$("a").detach() 从DOM中删除所有匹配的元素。这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。与remove()不同的是,所有绑定的事件、附加的数据等都会保留下来。clone([Event[,deepEven]])克隆一个副本出来。我们知道,如果这个元素是文档内的,那么上面的方法会变成移动。当我们不想移动的时候,就需要clone。 event: 一个布尔值(true 或者 false)指示事件处理函数是否会被复制。V1.5以上版本默认值是:falsedeepEven: 一个布尔值,指示是否对事件处理程序和克隆的元素的所有子元素的数据应该被复制。筛选hasClass(class) 判断当前元素有没有对应class。比如我们在模拟复选框,我们需要判断当前的状态。$(this).hasClass('checked')filter(class) 比如我们现有一个所有复选框的合集,我们要过滤出所有选中状态的。next() 获取下一个元素nextAll() 获取后面所有元素nextUntil() 获取后面所有元素,可以设置终止条件。parent()、prev() 基本有next()相识的方法siblings() 获取所有兄弟元素end() 我觉得这个方法就很厉害,把当前的链式操作对象移交给上次。$("p").find("span").end()目前操作对象是$("p")等等…… 我就列举这些常用的吧。微信公众号:前端linong 初级阶段文章目录前端培训-初级阶段(17) - 数据存储(cookie、session、stroage)前端培训-初级阶段(13) - 正则表达式前端培训-初级阶段(13) - 类、模块、继承前端培训-初级阶段(13) - ECMAScript (内置对象、函数)前端培训-初级阶段(13) - ECMAScript (语法、变量、值、类型、运算符、语句)前端培训-初级阶段(13、18)前端培训-初级阶段(9 -12)前端培训-初级阶段(5 - 8)前端培训-初级阶段(1 - 4)中级阶段文章目录前端培训-中级阶段(2) - 事件(event) 事件冒泡、捕获 - (2019-06-20期)前端培训-中级阶段(3) - DOM 文档对象模型(2019-06-27期)前端培训-中级阶段(4)- BOM 浏览器对象模型(2019-07-04期)前端培训-中级阶段(5)- jQuery的概念与基本使用(2019-07-11期)资料前端培训目录、前端培训规划、前端培训计划jQuery 速查地址

June 28, 2019 · 1 min · jiezi

前端培训中级阶段5-jQuery的概念与基本使用20190711期

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 前面我们已经基本掌握常规的语法语义,以及基本的使用方法。接下来我们讲深入进去了解其中内在的原理。也了解 DOM、BOM,但是因为规范是一在变的,有没有什么类库可以方便操作这些呢?进入我们今天的主题jQuery jQuery这东西出来很久了,一般来说都用过。提供一个速查地址 jQuery 简介jQuery 设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。jQuery 是一个跨浏览器(兼容所有常见浏览器,包括IE6)的工具库。提供了元素选取、元素操作、CSS操作、事件处理、动画、AJAX等功能。 jQuery 的特点链式操作(很优秀)高效、灵活的选择器(id、class、tag、伪元素、attr、层级)插件机制兼容主浏览器,提供了统一的功能接口jQuery 插件机制jQuery.fn.extend(object) 对应 $('div'). 的操作。 jQuery.fn.extend({ check: function() { return this.each(function() { this.checked = true; }); }, uncheck: function() { return this.each(function() { this.checked = false; }); }});$("input[type=checkbox]").check();$("input[type=radio]").uncheck();jQuery.extend(object) 对应 $. 的操作。 jQuery.extend({ min: function(a, b) { return a < b ? a : b; }, max: function(a, b) { return a > b ? a : b; }});jQuery.min(2,3); // => 2jQuery.max(4,5); // => 5jQuery.extend([deep], target, object1, [objectN])用一个或多个其他对象来扩展一个对象,返回被扩展的对象。如果不指定target,则给jQuery命名空间本身进行扩展。这有助于插件作者为jQuery增加新方法。 如果第一个参数设置为true,则jQuery返回一个深层次的副本,递归地复制找到的任何对象。否则的话,副本会与原对象共享结构。 未定义的属性将不会被复制,然而从对象的原型继承的属性将会被复制。 ...

June 27, 2019 · 1 min · jiezi

jQuery源码解析之animate上

前言:需要先看 jQuery源码解析之$.queue()、$.dequeue()和jQuery.Callbacks() 一、举例divA 的宽度先变成 500px,再变成 300px,最后变成 1000px: <script src="jQuery.js"></script> <div id="A" style="width:100px;height:50px;background-color: deeppink">这是A</div><script> let A = document.querySelector('#A'); //在异步调用中,进行同步调用 //动画是异步的 A.onclick = function() { //就是连续调用animation.add() $('#A').animate({ 'width': '500' }).animate({ 'width': '300' }).animate({ 'width': '1000' }); };</script>二、$().animate()作用:通过 CSS 样式将元素从一个状态改变为另一个状态 源码: //之前有说过: jQuery.fn.extend() 是$()的方法 jQuery.fn.extend( { //源码8062行 //{'width': '500'} animate: function( prop, speed, easing, callback ) { //是否是空对象,false var empty = jQuery.isEmptyObject( prop ), // optall={ // complete:function(){jQuery.dequeue()}, // old:false, // duration: 400, // easing: undefined, // queue:"fx", // } //undefined undefined undefined optall = jQuery.speed( speed, easing, callback ), doAnimation = function() { // Operate on a copy of prop so per-property easing won't be lost //Animation 方法执行单个动画的封装 //doAnimation的本质是执行Animation方法 //this:目标元素 //{'width': '500'} //optall={xxx} var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // Empty animations, or finishing resolves immediately //finish是数据缓存的一个全局变量 //如果为true,立即终止动画 if ( empty || dataPriv.get( this, "finish" ) ) { anim.stop( true ); } }; //注意这个 //自身的.finish=自身 doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : //一般走这里 //通过 queue 调度动画之间的衔接 //optall.queue:"fx" //doAnimation:function(){} this.queue( optall.queue, doAnimation ); }, })解析:(1)jQuery.speed()作用:初始化动画对象的属性 ...

June 27, 2019 · 3 min · jiezi

软工二大作业总结

NJU-SE电影院系统【我又来占坑了】【考完来写】

June 25, 2019 · 1 min · jiezi

jQuery源码解析之queuedequeue和jQueryCallbacks

前言:queue()方法和dequeue()方法是为 jQuery 的动画服务的,目的是为了允许一系列动画函数被异步调用,但不会阻塞程序。 所以这篇是为jQuery的动画解析做准备的。 一、$.queue()、$.dequeue() 和 $().queue()、$().dequeue() 的区别(1)$().queue()和$().dequeue()这俩是jQuery.fn.extend()中的方法,也就是供开发者使用的方法,其内部会分别调用 $.queue()和$.dequeue()方法。 //源码4686行jQuery.fn.extend( { queue: function( type, data ) { xxx return jQuery.queue( this[ 0 ], type ) }, dequeue: function( type, data ) { return jQuery.dequeue( this, type ) },})(2)$.queue()和$.dequeue()这俩是jQuery.extend()中的方法,也就是 jQuery 内部使用的方法。 //源码4594行 jQuery.extend( { queue: function( elem, type, data ) {}, dequeue: function( elem, type ) {}, })二、$().queue()作用1:作为setter,将function(){}存进特定队列中。 <div id="A" style="background-color: deeppink">这是A</div><script> function a() { console.log('a','a34') } function b() { console.log('b','b37') } //将a、b方法存在类型为type的队列里 //jQuery.fn.queue 给jQuery对象$("A") /*setter*/ $("#A").queue('type', a) $("#A").queue('type', b)</script>作用2:作为getter,取出特定队列中function(){}的数组。 ...

June 23, 2019 · 8 min · jiezi

模拟实现jQuery的on和trigger

前言:仅仅是简单模拟了$().on()和$().trigger(),仅支持id选择器,事件冒泡与事件委托。 代码: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>模拟jQuery的事件绑定到触发过程</title></head><body><div id="A" style="background-color: deeppink"> 这是A <div id="B" style="background-color: aqua"> 这是B </div></div><script> //数据缓存 let events={} function $(elemId){ //只考虑理想情况 const element=document.querySelector(elemId) // console.log(element,'element27') function returnTrue(){ return true } function returnFalse(){ return false } $.event={ //不考虑用户的自定义事件 add:function (elemId,type,selectorReal,callbackReal) { let elemData=events[elemId] if(!elemData){ events[elemId]=elemData={} } elemData.handle=function(nativeEvent){ //锁定this return $.event.dispatch.call(this,nativeEvent) } if(!elemData[type]){ elemData[type]=[] elemData[type].delegateCount=0 //addEventListener只绑定一次 document.querySelector(elemId).addEventListener(type,elemData.handle) } let handlersCount=elemData[type].length let handlerObj={ type:type, handler:callbackReal, guid:++handlersCount, selector:selectorReal, } if ( selectorReal ) { //在下标为handlers.delegateCount++的位置插入委托事件 elemData[type].splice( elemData[type].delegateCount++, 0, handlerObj); } else { elemData[type].push(handlerObj) } }, dispatch:function (nativeEvent,) { let event=$.event.fix(nativeEvent) let handlers=events['#'+this.id][event.type] //继续锁定this let handlerQueue=$.event.handlers.call(this, event, handlers ) //为什么要用变量代替,因为循环的时候,需要保留该值 let matched,handleObj let i=0 while((matched=handlerQueue[i++])&&!event.isPropagationStopped()){ let j=0 while((handleObj=matched.handlers[j++])){ event.handleObj=handleObj handleObj.handler(event) } } // return event }, fix:function (nativeEvent,) { let $event={} //就是MouseEvent $event.originalEvent=nativeEvent $event.target=nativeEvent.target $event.type=nativeEvent.type // delegateTarget: div#A, // currentTarget: div#A, $event.timeStamp=Date.now() $event.stopPropagation=function() { this.isPropagationStopped = returnTrue; nativeEvent.stopPropagation() } $event.isPropagationStopped=returnFalse //fix 的标志 $event['chen'+(new Date()).valueOf()]=true return $event }, handlers:function (event,handlers) { let delegateCount = handlers.delegateCount let cur=event.target let handlerQueue=[] for(;cur!==this;cur=cur.parentNode||this){ let matchedHandlers = [] for(let i=0;i<delegateCount;i++){ let handleObj=handlers[i] matchedHandlers.push( handleObj ) handlerQueue.push( { elem: cur, handlers: matchedHandlers } ) } } cur=this if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ) } return handlerQueue }, trigger:function (elemId,type) { let element=document.querySelector(elemId) let eventPath=[] let cur=element let event={} event.target=cur event.type=type for(;cur;cur=cur.parentNode){ eventPath.push( cur ); } let i=0 //不考虑阻止冒泡的情况 while((cur=eventPath[i++])){ let handle=events['#'+cur.id]&&events['#'+cur.id].handle if(handle){ handle.call(cur,event) } } }, } return { on:function (type,selector,callback) { let callbackReal,selectorReal if(!type){ return } //如果selector是funcion的话,就没有委托元素了 if(typeof selector==='function'&&!callback){ selectorReal=undefined callbackReal=selector }else if(typeof selector==='string'&&callback){ selectorReal=selector callbackReal=callback } return $.event.add(elemId,type,selectorReal,callbackReal) }, trigger:function (type) { return $.event.trigger(elemId,type) }, } } //仅支持id选择器,事件冒泡与事件委托 //=========test1=============== $("#A").on("click" ,function (event) { console.log(event,"A被点击了") }) $("#A").on("click" ,function (event) { console.log(event,"A又被点击了") }) //=========test2=============== // $("#A").on("click" ,function (event) { // console.log(event,"A被点击了") // }) // $("#A").on("click" ,"#B",function (event) { // event.stopPropagation() // console.log(event,"B委托A被点击了") // }) //=========test3=============== // $("#A").on("click" ,function (event) { // console.log(event,"A被点击了") // }) // $("#B").on("click",function (event) { // // event.stopPropagation() // console.log(event,"B被点击了") // }) //==========test4============== // $("#A").on("click" ,function (event) { // console.log(event,"A被点击了") // }) // $("#A").on("click" ,function (event) { // console.log(event,"A又被点击了") // }) // $("#A").trigger("click")</script></body></html>根据上篇的流程图写出即可。 ...

June 19, 2019 · 2 min · jiezi

jQuery之事件绑定到触发全过程及知识点补充

前言:最重要的还是最后的流程图,可以试着根据流程图手写实现$().on(),下篇文章会放出模拟实现的代码。 一、举例 <div id="A" style="background-color: deeppink"> 这是A <div id="C" style="background-color: aqua"> 这是C </div></div> $("#A").on("click" ,function (event) { console.log(event,"A被点击了") }) $("#A").on("click" ,"#C",function (event) { console.log(event,"点击了C,即C委托A的click事件被点击了") })二、$().on()(1)进行参数的调整(2)调用jQuery.event.add()方法 三、jQuery.event.add()最终调用elem.addEventListener()来绑定事件注意:(1)绑定常用的事件(如:click、focus),使用handleObj保存 handleObj = jQuery.extend( { //click,mouseout... type: type, //click,mouseout... origType: origType, data: data, //事件处理函数,如 function(){console.log('aaaa')} handler: handler, //索引,用于关联元素和事件 guid: handler.guid, //事件委托的标志,也是委托的对象选择器 selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), //命名空间,同一click事件有两个事件处理程序handler的话, //用这个标识,方便删除或添加handler namespace: namespaces.join( "." ) }, handleObjIn );(2)如果绑定的是自定义事件(如:windowResize),则使用handleObjIn保存 if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector;}(1)、(2)都会初始化事件处理器(addEventListener): ...

June 17, 2019 · 2 min · jiezi

NOTE-JQ

文档就绪事件$(document).ready(function(){ // JQ})$(function() { // JQ})

June 17, 2019 · 1 min · jiezi

jQuery源码解析之jQueryeventdispatch

一、起源jQuery.event.add()方法最终是用addEventListener绑定事件的: elem.addEventListener( type, eventHandle )而eventHandle方法正是等于jQuery.event.dispatch(): if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; }二、$.event.dispatch()作用:触发绑定的事件的处理程序 源码: //源码5472行 //nativeEvent即原生MouseEvent //触发事件的处理程序 dispatch: function( nativeEvent ) { //修正event对象 // Make a writable jQuery.Event from the native event object var event = jQuery.event.fix( nativeEvent ); console.log(event,'event5479') var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), //获取click事件的处理程序集合,结构如下: //[ // {type: "click", origType: "click", data: undefined, handler: ƒ, guid: 1}, // {type: "click", origType: "click", data: undefined, handler: ƒ, guid: 2}, // delegateCount:0, //] //从数据缓存中获取事件处理集合 handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], //click:{ // trigger:{}, // _default:{} //} special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; for ( i = 1; i < arguments.length; i++ ) { args[ i ] = arguments[ i ]; } //this即目标元素 //delegateTarget:委托目标 event.delegateTarget = this; //这段代码压根不会执行,因为全局搜索没找到preDispatch // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers //结构如下 //[{ // elem:xx, // handlers:[ // {type: "click", origType: "click", data: undefined, handler: ƒ, guid: 1}, // {type: "click", origType: "click", data: undefined, handler: ƒ, guid: 2}, // ] //}] //获取handler队列 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; //没有执行stopPropagation()的话 console.log(handlerQueue,'handlerQueue5525') //先判断有没有冒泡 //再判断有没有阻止剩下的handler执行 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { console.log(matched,'matched5542') event.currentTarget = matched.elem; j = 0; //handleObj即单个事件处理程序 //没有执行stopImmediatePropagation()的话 //依次执行每一个handler while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or 2) have namespace(s) // a subset or equal to those in the bound event (both can have no namespace). if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { //通过循环将为event添加handleObj和handleObj.data event.handleObj = handleObj; event.data = handleObj.data; //关键代码,执行事件处理程序handler ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { //event.result赋值ret if ( ( event.result = ret ) === false ) { //阻止默认行为 event.preventDefault(); //阻止冒泡 event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } console.log(handlers,'event5587') //undefined return event.result; },解析: ...

June 13, 2019 · 6 min · jiezi