关于bootstrap:深入浅出ThreadLocal

ThreadLocal置信大家都有用过的,个别用作存取一些全局的信息。比方用户信息,流程信息,甚至在Spring框架外面通过事务注解Transactional去获取数据库连贯的实现上,也有它的一份功绩。ThreadLocal作为一个进阶必会知识点,而且还是面试高频考点。网上博客对它的解读也必然不会少,然而网上博客解读程度参差不齐,看多了难免会绕。不如本人亲自再梳理一遍,顺便记录下本人的解读。ThreadLocal的线程隔离性Demo先来看一个小的demostatic ThreadLocal<Student> threadLocal = new ThreadLocal<Student>(); public static void main(String[] args) { threadLocalTest1();} private static void threadLocalTest1() { new Thread(new Runnable() { public void run() { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(threadLocal.get()); }}).start();new Thread(new Runnable() { public void run() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } threadLocal.set(new Student("zhangsan")); }}).start();}复制代码如代码所示,开启两个线程。第一个线程3秒之后去取在动态变量threadLocal里的变量。第二个线程1秒之后去设置threadLocal里的变量。这段代码运行的后果就是,第一个线程永远获取不到第二个线程给动态变量threadLocal里设置的变量。论断:不同的线程操作同一个threadLocal对象,能够实现线程信息之间的隔离。猜测:看到set办法和get办法,大胆猜测threadLocal对象外面有个Map,key为以后线程,value为ThreadLocal泛型里的对象,这样就实现了在空间上的线程安全性。但事实并不是这样,答案不在猜测中,而在源码中。ThreadLocal.set()办法源码解读public void set(T value) { // 获取以后线程Thread t = Thread.currentThread();// 获取以后线程的ThreadLocalMapThreadLocalMap map = getMap(t);if (map != null) // 把以后ThreadLocal对象作为key,调用set办法的入参对象作为value,放入以后线程的ThreadLocalMap map.set(this, value);else // 通过以后线程和调用set办法的入参对象去结构Map createMap(t, value);}复制代码ThreadLocal.get()办法源码解读public T get() { ...

March 13, 2023 · 2 min · jiezi

关于bootstrap:高性能网关基石OpenResty

什么是 OpenRestyOpenResty 一个基于 Nginx 的高性能 Web 平台,可能不便地搭建解决超高并发的动静 Web 利用、 Web 服务和动静网关。例如有名的 Kong 网关和国产新秀 ApiSIX 网关都是基于 OpenResty 来进行打造的。 OpenResty 通过实现 ngx_lua 和 stream_lua 等 Nginx 模块,把 Lua/LuaJIT 完满地整合进了 Nginx,从而让咱们可能在 Nginx 外部里嵌入 Lua 脚本,用 Lua 语言来实现简单的 HTTP/TCP/UDP 业务逻辑,同时仍然放弃着高度的并发服务能力。 解决阶段一个失常的 Web 服务的生命周期能够分成三个阶段: initing:服务启动,读取配置文件,初始化外部数据结构running:服务运行,承受客户端的申请,返回响应后果exiting:服务进行,做一些必要的清理工作,如敞开监听端口OpenResty 次要关注的是 initing 和 running 这两个阶段,并做了更粗疏的划分 OpenResty 的 initing 阶段configuration:读取配置文件,解析配置指令,设置运行参数master-initing:配置文件解析结束,master 过程初始化专用的数据worker-initing:worker 过程初始化本人专用的数据OpenResty 的 running 阶段在 running 阶段,收到客户端的申请后,OpenResty 对每个申请都会应用上面这条流水线进行解决: ssl:SSL/TLS 平安通信和验证preread: 在正式解决之前预读数据,接管 HTTP 申请头rewrite:查看、改写 URI ,实现跳转重定向access:拜访权限管制content:产生响应内容filter:对 content 阶段产生的内容进行过滤加工解决log: 申请处理完毕,记录日志,或者其余的收尾工作。openresty-phase.png OpenResty 执行程序OpenResty 依据下面的解决阶段提供了一些指令,在开发时应用它们就能够在这些阶段外面插入 Lua 代码,执行业务逻辑: ...

December 30, 2022 · 2 min · jiezi

关于bootstrap:CSS美化一个Bootstrap4下拉菜单dropdown

Bootstrap4的下拉菜单我感觉不难看,然而挺好用,所以我拿来丑化了一下用在了我的项目中。 丑化前 https://www.runoob.com/try/tr... 丑化后 代码<!DOCTYPE html><html><head> <title>Bootstrap dropdown</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css"> <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script> <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script> <style type="text/css"> body{ background: #eee; } #app{ width: 200px; margin:100px auto; } #app .dropdown .dropdown-btn{ border:none; outline: none; border-radius: 5px; font-size: 15px; background: #fff; color: #666; } #app .dropdown .dropdown-menu{ background: #fff; border: none; min-width:100px; } #app .dropdown .dropdown-menu .dropdown-item:hover{ background: #f8f9fa; color: #666; } #app .dropdown .dropdown-menu .dropdown-item:active{ background: #f8f9fa; color: #666; } </style></head><body><div id="app"> <div class="dropdown"> <button type="button" class="dropdown-btn" data-toggle="dropdown">•••</button> <div class="dropdown-menu"> <a class="dropdown-item" href="#">Link 1</a> <a class="dropdown-item" href="#">Link 2</a> <a class="dropdown-item" href="#">Link 3</a> </div> </div></div></body></html>作者TANKING ...

September 17, 2022 · 1 min · jiezi

关于bootstrap:WallysQualcomm-IPQ4019-80211ac-Wave-2-WiFi

Qualcomm IPQ4019 802.11ac Wave 2 WiFi system-on-module comes with Dual Gigabit Ethernet baseboard IPQ4019 openWRT 2.4/5G dual bands 802.11ac IPQ4019 openWRT 2.4/5G dual bands DR4019S https://www.wallystech.com/Ro... Wallys Communications (SuZhou) Co., Ltd., http://www.wallystech.com,which is a professional supplier specializing in product design, manufacturing and offering superior OEM/ODM/JDM services in wireless communications. As a specialized manufacturer and exporter for these products in China,We sincerely hope to establish business relations with your esteemed corporation.  MT7915/MT7975/IPQ6000/IPQ6018/IPQ6010/IPQ4019/IPQ4029/ipq4018/IPQ4028/IPQ8072/IPQ8072A/IPQ8074/IPQ8074A/IPQ9074/QCN9074/QCN9072/QCN9024/IPQ5018/AR9223/QCA9880/QCA9882 /AR9582/AR9531/AR9344 BY:Wallys Communications (Suzhou ) Co., LTDEMAIL:sales3@wallystech.com Wallys Communication has introduced their lowest cost networking platform with the DR4019S board equipped with two Gigabit Ethernet ports, as well as a Qualcomm IPQ4019 802.11ac Wave 2 WiFi system-on-module. The module comes with 32MB NOR flash, and 256MB DDR memory and targets applications ranging from security surveillance to commercial radio coverage to hotel wireless applications, or even forest fire protection engineering. ...

July 11, 2022 · 3 min · jiezi

关于bootstrap:DjangoBootstrap封装页码组件

成果展现,依据以后页码显示前后各5页,有首页和尾页,上一页和下一页 pytho代码新建py文件:pageination.py """自定义分页组件"""from django.utils.safestring import mark_safeclass Pageination(object): """ :param request: 申请的对象 :param queryset: 符合条件的数据(依据这个数据给他进行分页解决) :param page_size: 每页显示多少条数据 :param page_param: 在URL中传递的获取分页的参数,例如:/etty/list/?page=12 :param plus: 显示当前页的 前或后几页(页码) """ def __init__(self, request, queryset, page_size=10, page_param='page', plus=5): page = request.GET.get('page', 1) # 判断是否为字符串十足 if page.isdecimal(): page = int(page) else: page = 1 # 获取当前页 self.page = page # 每页显示条数 self.page_size = page_size # 起始页 self.start = (page - 1) * page_size # 完结页 self.end = page * page_size self.page_queryset = queryset[self.start:self.end] # 总条数 total_count = queryset.count() total_page_count, div = divmod(total_count, page_size) # 获取整除数 与 余数 if div: total_page_count += 1 # 总页码 self.total_page_count = total_page_count # 显示页码数 self.plus = plus def html(self): # 计算出当前页前5页,和后5页 if self.total_page_count <= 2 * self.plus + 1: start_page = 1 end_page = self.total_page_count else: # 数据地面的数据表较多 >11 if self.page <= self.plus: start_page = 1 end_page = 2 * self.plus + 1 else: if (self.page + self.plus) > self.total_page_count: start_page = self.total_page_count - 2 * self.plus end_page = self.total_page_count else: start_page = self.page - self.plus end_page = self.page + self.plus + 1 # 生成页码 page_str_list = [] # 首页 page_str_list.append('<li><a href="?page=1">首页</a></li>') # 上一页 if self.page > 1: prev = f'<li><a href="?page={self.page - 1}">上一页</a></li>' else: prev = f'<li><a href="?page={1}">上一页</a></li>' page_str_list.append(prev) for i in range(start_page, end_page + 1): if i == self.page: ele = f'<li class="active"><a href="?page={i}">{i}</a></li>' else: ele = f'<li><a href="?page={i}">{i}</a></li>' page_str_list.append(ele) # 下一页 if self.page < self.total_page_count: prev = f'<li><a href="?page={self.page + 1}">下一页</a></li>' else: prev = f'<li><a href="?page={self.total_page_count}">下一页</a></li>' page_str_list.append(prev) # 尾页 page_str_list.append(f'<li><a href="?page={self.total_page_count}">尾页</a></li>') # 输出页码跳转 search_string = """ <form method="get"> <div class="input-group"> <input type="text" name="page" class="form-control" placeholder="Search for..."> <span class="input-group-btn"> <button class="btn btn-default" type="submit">跳转</button> </span> </div> </form> """ page_str_list.append(search_string) # 转换为HTML元素 page_string = mark_safe(''.join(page_str_list)) return page_string调用页码: ...

July 10, 2022 · 2 min · jiezi

关于bootstrap:Bootstrap实战-单页面网站

一、介绍单页面构造简略、布局清晰,经常用来做手机 App 或者某个产品的下载介绍页面。当初,展现型网页整体趋向于单页网站设计,这样一次性把外围信息展示进去,对于用户来说更加直观和简略,可能疾速理解一个产品。 二、知识点2.1 滚动监听滚动监听应用了 Bootstrap 的 JavaScript 插件,依据滚动条所处的地位自动更新选中导航栏。 滚动监听个别与导航栏配合应用,这里先援用了带有二级导航的导航栏。并且给导航栏增加款式 navbar-fixed-top 使其固定在顶部不随滚动条挪动而挪动,但这样的话会遮住 body 下面的一部分内容,所以同时给 body 增加款式 padding-top: 60px。 <!--代码局部--><nav class="navbar navbar-default navbar-fixed-top" role="navigation" id="nav-menu"> <div class="container"> <div class="navbar-header"> <!--以下为固定写法,用到的时候复制粘贴即可--> <button class="navbar-toggle" type="button" data-toggle="collapse" data-target="#navigation-collapse"> <span class="sr-only">Toggle Navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a href="#" class="navbar-brand">LOGO</a> </div> <div class="collapse navbar-collapse" id="navigation-collapse"> <ul class="nav navbar-nav"> <li><a href="#first">Navigation First</a></li> <li><a href="#second">Navigation Second</a></li> <li><a href="#third">Navigation Third</a></li> <li><a href="#fourth">Navigation Fourth</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> Navigation Fifth <span class="caret"></span> <ul class="dropdown-menu"> <li><a href="#sub-first">Sub-Navigation First</a></li> <li><a href="#sub-second">Sub-Navigation Second</a></li> <li><a href="#sub-third">Sub-Navigation Third</a></li> </ul> </a> </li> </ul> </div> </div></nav>因为有五个导航,所以上面也要相应的给出五个内容载体。这里惟一须要留神的是每个载体的 id 属性,都要在下面导航的 href="#?" 绝对应,不然会看不到成果。 ...

March 3, 2022 · 2 min · jiezi

关于bootstrap:Bootstrap-5都有什么新功能

Bootstrap 是最风行的 CSS 库之一。它容许开发人员轻松应用丑陋的款式和组件并创立响应式网站。应用 Bootstrap 能够节俭开发人员的工夫,尤其是对于简直每个我的项目中都应用的组件。 Bootstrap 5(以后的次要版本,于 2021 年 5 月公布)带来了大量的变动和改良,包含增加新组件、新类、旧组件的新款式、更新的浏览器反对、删除一些旧组件,以及更多。 在本文中,咱们将介绍 Bootstrap 5 中的更改、删除的内容,以及最令人兴奋的新内容。 何时应用 Bootstrap(何时不应用)Bootstrap 将本人标榜为“世界上最风行的用于构建响应式、挪动优先站点的框架”,并且在 GitHub 上领有 152k 颗星,我认为这种说法并不过分。特地是对于初学者来说,Bootstrap 是开始创立古代和洁净网站的好办法。它能够轻松实现简单的、挪动优先的设计,并提供您在多个我的项目中可能须要的许多组件。 Bootstrap的学习曲线很低,很适宜不须要构建步骤的动态网站,因为你能够间接从Bootstrap的CDN援用库。这与其余一些风行的CSS框架造成鲜明对比,这些框架可能为应用捆绑器或工作运行器进行优化。 不过,你也应该晓得,Bootstrap并不是一颗银弹。对于没有教训的人来说,Bootstrap很容易产生凌乱和简单的标记。就千字节而言,它也是一个绝对较重的库(只管每次公布都在改良),所以如果你只应用它的一两个性能,它可能不是最佳抉择。就像任何形象一样,如果你对底层技术有很好的把握,并能对何时应用它做出理智的决定,那将会有很大的帮忙。 从 Bootstrap 4 降级到 5从Bootstrap 4降级到5一般来说是很容易的。Bootstrap 4中的大部分组件、它们的类和实用类在Bootstrap 5中依然可用。在迁徙时,您应该关注的次要事件是您正在应用的类或组件是否曾经被删除。如果它们被删除了,那么能够应用实用工具类替换它们,或者应用其余办法来实现雷同的后果。你应该关注的第二件事是在组件中从 data- 属性转换到 data-bs-,这些组件须要JavaScript作为其性能的一部分。(咱们将在下一节中具体介绍这一点。) 如果你应用Bootstrap的Sass文件,有一些变量和mixin被重命名。Bootstrap 5有一个宽泛和具体的局部,所有对于定制,以及对于每个组件的Sass变量和mixin的详细信息,在他们各自的文档页面。 变动的内容Bootstrap 5 为作为库的 Bootstrap 带来了外围更改,包含所需依赖项、浏览器反对等方面的更改。它还对咱们在以前版本中始终应用的组件和类进行了更改。 jQuery不再是一个依赖项与之前的版本相比,jQuery 不再是 Bootstrap 的依赖项。当初,你能够在没有它的状况下充分利用 Bootstrap,但你依然须要 Popper.js。这一变动使得在不须要或应用 jQuery 的我的项目中应用 Bootstrap 变得更容易——例如在将 Bootstrap 与 React 联合应用时。 如果Bootstrap是你网站的一部分,你依然能够应用jQuery。如果Bootstrap在 window 对象中检测到jQuery,它会主动将所有组件增加到jQuery的插件零碎中。因而,如果您从v4迁徙到v5,就不须要放心这个更改,并且依然能够在必要时应用jQuery和Bootstrap。 但如果你在网站中应用jQuery,但你不心愿Bootstrap应用jQuery呢?你能够通过在文档的body元素中增加属性 data-bs-no-jquery 来实现: <body data-bs-no-jquery="true"></body>没有jQuery,Bootstrap是如何工作的?例如,在v4中,你能够在JavaScript中应用以下代码来创立一个Toast元素。 $('.toast').toast()在Bootstrap 5中,如果你的网站曾经应用了jQuery,你能够应用同样的代码来创立一个Toast元素。如果没有jQuery,你须要应用相似上面的代码来创立一个Toast元素: ...

January 20, 2022 · 3 min · jiezi

关于bootstrap:Bootstrap实战-响应式布局

一、介绍响应式布局就是一个网站可能兼容多个终端,而不是为每个终端做一个特定的版本。这个概念是为解决挪动互联网浏览而诞生的。 导航栏与轮播在大部分网站的头部占很高的比重,特地是导航栏,扮演着网站地图的角色。 在响应式布局中,要求导航栏可能依据终端屏幕大小显示不同的款式。 二、知识点2.1 导航栏官网解释:导航条是在您的利用或网站中作为导航页头的响应式根底组件。它们在挪动设施上能够折叠(并且可开可关),且在视口(viewport)宽度减少时逐步变为程度开展模式。 2.1.1 根底导航栏应用 Bootstrap 之前,习惯用 <ul> + <li> 来结构一个导航栏。 <!--代码局部--><style>.navigation-past{ list-style: none;}.navigation-past>li{ float: left; padding: 8px;}.navigation-past>li>a{ text-decoration: none; color: #000;}.active-past{ background: #E7E7E7;}</style><ul class="navigation-past"> <!--选中--> <li class="active-past"><a href="#">Navigation First</a></li> <li><a href="#">Navigation Second</a></li> <li><a href="#">Navigation Third</a></li> <li><a href="#">Navigation Fourth</a></li> <li><a href="#">Navigation Fifth</a></li></ul>效果图: 应用 Bootstrap 的话,便是在相熟的这个结构上加上一些润饰即可。首先在 <ul> 里面套一层 <div>,并加上款式 navbar navbar-default;而后给外面的 <ul> 加上款式 nav navbar-nav;最初,给选中的局部加上款式 active。一个最根本的 Bootstrap 导航便实现了。 <!--代码局部--><div class="navbar navbar-default" role="navigation"> <ul class="nav navbar-nav"> <li class="active"><a href="#">Navigation First</a></li> <li><a href="#">Navigation Second</a></li> <li><a href="#">Navigation Third</a></li> <li><a href="#">Navigation Fourth</a></li> <li><a href="#">Navigation Fifth</a></li> </ul></div>效果图: ...

January 11, 2022 · 3 min · jiezi

关于bootstrap:什么是-bootstrap-中的-break-point

断点是 Bootstrap 中的触发器,用于触发布局响应依照设施或视口大小的变动而变动。 断点是响应式设计的基石。 应用它们来管制您的布局何时能够适应特定的视口或设施大小。 应用 media query 通过断点来构建你的 CSS。 媒体查问是 CSS 的一项性能,它容许您依据一组浏览器和操作系统参数有条件地利用款式。 咱们最常在媒体查问中应用 min-width。 挪动优先,响应式设计是咱们须要达到的指标。 Bootstrap 的 CSS 旨在利用起码的款式来使布局在最小的断点处工作,而后对款式进行分层以针对更大的设施调整该设计。 这能够优化您的 CSS,缩短渲染工夫,并为您的访问者提供杰出的体验。 Bootstrap 包含六个默认断点,有时称为 grid layers,用于响应式构建。 如果您应用咱们的源 Sass 文件,能够自定义这些断点。 bootstrap 里默认的 media query: 每个断点大小被抉择为 12 的倍数,并代表常见设施大小和视口尺寸的子集。 它们并不专门针对每个用例或设施,但提供范畴为构建响应式利用提供了弱小且统一的根底。 Media queries因为 Bootstrap 是采取了 modile first 的设计方针,因而咱们应用一些媒体查问来为咱们的布局和界面创立正当的断点。 这些断点次要基于最小视口(minimum viewport)宽度,并容许咱们随着视口的变动放大元素。 上面这段代码的语义是: // Source mixins// No media query necessary for xs breakpoint as it's effectively `@media (min-width: 0) { ... }`@include media-breakpoint-up(sm) { ... }@include media-breakpoint-up(md) { ... }@include media-breakpoint-up(lg) { ... }@include media-breakpoint-up(xl) { ... }@include media-breakpoint-up(xxl) { ... }// Usage// Example: Hide starting at `min-width: 0`, and then show at the `sm` breakpoint.custom-class { display: none;}@include media-breakpoint-up(sm) { .custom-class { display: block; }}在默认的屏幕尺寸即 x-small,min-width: 0 的状况下,暗藏具备 custom-class 的 DOM 元素。然而,在 sm 以及更大尺寸的屏幕上,应用 display:block 来显示。 ...

January 9, 2022 · 1 min · jiezi

关于bootstrap:前端面试每日-31-第997天

明天的知识点 (2022.01.07) —— 第997天 (我也要出题)[html] 应用canvas画一个流程图[css] 说说你对css的line-height-step属性的了解[js] 为什么在js中不容许应用保留字作为标识符?[软技能] 作为管理者看到共事在上班时间睡觉,该如何解决?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

January 8, 2022 · 1 min · jiezi

关于bootstrap:前端面试每日-31-第994天

明天的知识点 (2022.01.04) —— 第994天 (我也要出题)[html] 应用canvas制作一个迷宫[css] 你应用过css中的text-rendering吗?说说它的用处[js] 在js中如何做Error 统计?[软技能] 你上家公司是做什么业务的?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

January 8, 2022 · 1 min · jiezi

关于bootstrap:前端面试每日-31-第978天

明天的知识点 (2021.12.19) —— 第978天 (我也要出题)[html] 应用canvas制作一个心跳的画特效[css] 如何应用CSS设置动画的填充模式?[js] 请说说DOMContentLoaded的触发机会[软技能] 你本人有画个思维导图吗?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

December 22, 2021 · 1 min · jiezi

关于bootstrap:实现的方法的函数签名与接口

接口是一个纯正的设计对象,它们只是定义了一组行为(即办法),而没有给出这些行为的任何实现。接口是一种类型,遴选公务员它定义了一组办法而不实现它们“实现” = “编写办法的代码”,这是一个示例接口类型(来自规范包 io) 的接口类型,它指定了一种名为 Read 的办法。该办法没有具体实现,惟一指定的是办法名称及其签名(参数类型和后果类型)。http://lx.gongxuanwang.com/ss... 咱们有两种新类型。为了让他们恪守咱们的接口 DomesticAnimal 的契约,at 实现的办法的函数签名与接口定义统一就能够,不强制要求完全相同变量名和返回名。所以咱们将函数 func (c Cat) ReceiveAffection(from Human) {...} 遴选公务员改成 func (c Cat) ReceiveAffection(f Human) {...} 也是能够的咱们必须为每种类型定义接口指定的办法。 主函数中,咱们创立了一个新的 Snake 类型的变量而后咱们用这个变量作为第一个参数调用 Pet 函数 http://lx.gongxuanwang.com/lx...

November 29, 2021 · 1 min · jiezi

关于bootstrap:httplxgongxuanwangcomsszt7htm

尽管Spring的组件代码是轻量级的,然而它的配置却是重量级的,Spring 每集成一个开源软件,就须要减少一些根底配置,缓缓的随着咱们开发的我的项目越来越宏大,遴选真题往往须要集成很多开源软件,因而前期应用 Spirng 开发大型项目须要引入很多配置文件,太多的配置十分难以了解,并容易配置出错,这个给开发人员带来了不少的累赘。 大家设想一个场景,就是如果你须要用spring开发一个简略的Hello World Web应用程序,应该要做哪些动作呢?则能够大大简化Spring的Web应用程序体系结构。在通过简略main()办法疏导的Spring容器中嵌入和对立那些通用Web容器服务的配置。http://lx.gongxuanwang.com/ss... 而且Spring 开发团队也意识到了这些问题,急须要一套软件来解决这个问题,而这个时候微服务的概念也缓缓的起来,遴选真题疾速开发渺小独立的利用也变得很急切。 思考和总结# 咱们再回到最开始Spring Boot的定义局部,Spring Boot可能帮忙应用Spring Framework生态的开发者疾速高效的构建一个基于Spring以及spring 生态体系的利用。http://lx.gongxuanwang.com/lx... 再比照两种构建过程,仿佛也可能了解Spring Boot的作用了吧。当然它的作用不仅于此,后续会逐渐揭开它的实在面目。

November 25, 2021 · 1 min · jiezi

关于bootstrap:MySQL各存储引擎中最大颗粒度的锁定机制

间隙锁 是 Innodb 在 RR(可反复读) 隔离级别 下为了解决幻读问题时引入的锁机制。间隙锁是innodb中行锁的一种。 请务必牢记:应用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据。举例来说,如果emp表中只有101条记录,其empid的值别离是1,2,...,100,101,上面的SQL: SELECT *http://lx.gongxuanwang.com/ss... FROM emp WHERE empid > 100 FOR UPDATE 当咱们用条件检索数据,并申请共享或排他锁时,InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的“间隙”加锁。 这个时候如果你插入empid等于102的数据的,如果那边事物还没有提交,那你就会处于期待状态,无奈插入数据。 无关间隙锁所需讲的货色还是蛮多的,我会独自写一篇文章来剖析间隙锁,并在文章中附上残缺的示例。-- 依据非惟一索引列 UPDATE 某条记录 UPDATE table SET name = Vladimir WHERE age = 24; -- 或依据非惟一索引列 锁住某条记录 SELECT * FROM table WHERE age = 24 FOR UPDATE; http://lx.gongxuanwang.com/ss... 五、临键锁1、临键锁(Next-Key Locks) Next-key锁是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录后面间隙上的锁。 也能够了解为一种非凡的间隙锁。通过临建锁能够解决幻读的问题。 每个数据行上的非惟一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。须要强调的一点是, InnoDB 中行级锁是基于索引实现的。

November 23, 2021 · 1 min · jiezi

关于bootstrap:bootstrapTable-固定最右侧列重复且掉下来

如上图所示,而后不停地搜寻,找到的根本无法解决问题。所以,本人又看看了源码,查看他人例子,终于找到了解决办法;只须要加点css款式即可。所以以防大家遇到一样的问题,记录一下。 .fixed-columns,.fixed-columns-right { position: absolute; top: 0; height: 100%; min-height: 41px; background-color: #fff; box-sizing: border-box; z-index: 2; box-shadow: 0 -1px 8px rgba(0, 0, 0, 0.08);}.fixed-columns .fixed-table-body,.fixed-columns-right .fixed-table-body { min-height: 41px; overflow-x: hidden !important;}.fixed-columns { left: 0;}.fixed-columns-right { right: 0; box-shadow: -1px 0 8px rgba(0, 0, 0, 0.08);}

October 15, 2021 · 1 min · jiezi

关于bootstrap:前端面试每日-31-第908天

明天的知识点 (2021.10.10) —— 第908天 (我也要出题)[html] 你有应用过html的strike标签吗?[css] 说下@supports有什么用处?[js] 如何解决js加载中文内容的乱码问题?[软技能] 你平时有关注互联网行业的动静吗?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

October 11, 2021 · 1 min · jiezi

关于bootstrap:Bootstrap-发布十周年Bootstrap-5都有什么新功能

近日,出名前端工具包 Bootstrap 官博发表十周年,其创始人 Mark Otto 回顾了这十年里获得的一些成就与里程碑数据: 文档浏览量超过 25 亿次,每天超过 685,000 次;自 2015 年以来,npm 下载量为3.94 亿,仅 2020 年就有超过 1.31 亿次下载。在过来的六年中,每天有 180,000 次。5000 万次 RubyGems 下载5700 万次 NuGet 下载750 万次 Packagist 装置被超过 22% 的网站应用被 GitHub 上的 270 万个我的项目应用在 GitHub 上超过 21,100 次提交,其中蕴含近 35,000 个问题和拉取申请 Bootstrap 是最风行的 CSS 库之一。它容许开发人员轻松应用丑陋的款式和组件并创立响应式网站。应用 Bootstrap 能够节俭开发人员的工夫,尤其是对于简直每个我的项目中都应用的组件。 Bootstrap 5(以后的次要版本,于 2021 年 5 月公布)带来了大量的变动和改良,包含增加新组件、新类、旧组件的新款式、更新的浏览器反对、删除一些旧组件,以及更多。 在本文中,咱们将介绍 Bootstrap 5 中的更改、删除的内容,以及最令人兴奋的新内容。 何时应用 Bootstrap(何时不应用)Bootstrap 将本人标榜为“世界上最风行的用于构建响应式、挪动优先站点的框架”,并且在 GitHub 上领有 152k 颗星,我认为这种说法并不过分。特地是对于初学者来说,Bootstrap 是开始创立古代和洁净网站的好办法。它能够轻松实现简单的、挪动优先的设计,并提供您在多个我的项目中可能须要的许多组件。 Bootstrap的学习曲线很低,很适宜不须要构建步骤的动态网站,因为你能够间接从Bootstrap的CDN援用库。这与其余一些风行的CSS框架造成鲜明对比,这些框架可能为应用捆绑器或工作运行器进行优化。 不过,你也应该晓得,Bootstrap并不是一颗银弹。对于没有教训的人来说,Bootstrap很容易产生凌乱和简单的标记。就千字节而言,它也是一个绝对较重的库(只管每次公布都在改良),所以如果你只应用它的一两个性能,它可能不是最佳抉择。就像任何形象一样,如果你对底层技术有很好的把握,并能对何时应用它做出理智的决定,那将会有很大的帮忙。 从 Bootstrap 4 降级到 5从Bootstrap 4降级到5一般来说是很容易的。Bootstrap 4中的大部分组件、它们的类和实用类在Bootstrap 5中依然可用。在迁徙时,您应该关注的次要事件是您正在应用的类或组件是否曾经被删除。如果它们被删除了,那么能够应用实用工具类替换它们,或者应用其余办法来实现雷同的后果。你应该关注的第二件事是在组件中从 data- 属性转换到 data-bs-,这些组件须要JavaScript作为其性能的一部分。(咱们将在下一节中具体介绍这一点。) ...

August 25, 2021 · 3 min · jiezi

关于bootstrap:Bootstrap-迎来十周年生日盘点其开源路上的重要里程碑

2011 年 8 月 19 日,Bootstrap 第一个版本正式公布,并发表其在 GitHub 开源,过后它的定位是“一个用于疾速开发 Web 利用的前端工具包”,汇合了 CSS 和 HTML 的常见用法,并应用一些最新的浏览器技术,为开发者提供时尚的排版、表单、按钮、表格、网格、导航和其余须要的组件。 而当初,Bootstrap 曾经是网络上应用最宽泛的开源我的项目和前端工具包之一。 通过十年的保持和致力,Bootstrap 才达成了明天的成就,Bootstrap 团队也整顿出了过来十年里一些令人难以置信的里程碑: Bootstrap 的文档浏览量超过 25 亿次。每天超过 685,000 次。自 2015 年以来,Bootstrap 的 npm 下载量为 394,000,000,其中仅 2020 年就有超过 1.31 亿次下载。在过来的六年中,每天的均匀下载量为 180,000 次。在 RubyGems 的下载量为 5000 万次在 NuGet 的下载量为 5700 万次在 Packagist 进行装置的数量为 750 万次 Packagist 装置被全网超过 22% 的网站应用被 GitHub 上的 270 万个我的项目应用在 GitHub 上进行了超过 21,100 次的 commit,其中蕴含近 35,000 个问题和拉取申请Bootstrap 的创始人在博客中笑称本人和另一位创始人 Jacob 在 2011 年初只是就任于 Twitter 的书呆子(nerd),Jacob 是从事外部工具的工程师,而他本人是负责广告工作的产品设计师。 ...

August 25, 2021 · 1 min · jiezi

关于bootstrap:bootstrap布局-vue

想要开发一个响应式布局的页面 1,装置bootstrap-vuenpm install bootstrap-vue bootstrap 1.1,在main.js 里导入 import 'bootstrap/dist/css/bootstrap.css'import 'bootstrap-vue/dist/bootstrap-vue.css'import BootstrapVue from 'bootstrap-vue'Vue.use(BootstrapVue)2,应用// home.vue<b-container> <b-row> <div v-for="(item,index) in imgSrc" :key="index" class="gameBlock" > <b-col> <div class="gameName"> <span >{{item.name}}</span> </div> </b-col> </div> </b-row></b-container>2.1,row 和col 要在container 外面应用。2.2,循环进去的后果没有横向排列,如下图2.3,批改row 增加属性 align-h="start" class="row" cols="2" cols-md="6",cols 示意,最小容器宽度 一行排两个, md 示意中等宽度2.4,批改 col ,将循环放到col 里。集体通过查看之后:循环div ,col 只有一个值,他就会占据一行,如果循环div下有两个col ,这两个就会放一行。最初批改为: <b-container> <b-row align-h="start" class="row" cols="2" cols-md="6"> <b-col v-for="(item,index) in imgSrc" :key="index" class="gameBlock" @click="handleShow(item)"> <div class="gameName"> <span >{{item.name}}</span> </div> </b-col> </b-row></b-container>成果如图: 以上就是 bootstrap-v 布局的根本应用。应用 bootstrap 的益处是,他能够自适应不同宽度的屏幕,不便开发自适应页面。针对不同的宽度也能够不便批改。 bootstrap-vue 的中文文档:https://code.z01.com/bootstra...

August 18, 2021 · 1 min · jiezi

关于bootstrap:前端面试每日-31-第796天

明天的知识点 (2021.06.20) —— 第796天 (我也要出题)[html] 应用canvas画一个气冲冲的图案[css] 应用CSS3实现模仿雷达波向外发散的动画成果[js] 什么是负无穷大?[软技能] 说说你对家庭谐和的了解《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

June 20, 2021 · 1 min · jiezi

关于vue.js:查看-Bootstrap-5-UI套件

MDB 5 Vue是第一个与之集成最新VUE的UI套件 第五个版本的疏导. 下载Bootstrap 5 Vue的资料设计 这里. 什么MDB 5 Vue蕴含?最新疏导5和材质设计2.0500+资料UI组件超级简略,装置1分钟具体文档和多个理论例子很多教程大量的免费模板微小和沉闷的社区麻省理工学院许可 - 收费提供集体和商业用途疾速开始观看疾速教程并立刻开始。 应用MDB.装置更改兴路线图收费设计工具用于规范疏导的UI套件5Anigular Bootstrap 5的UI套件vue bootstrap 5的ui套件有用的资源应用咱们学习Web开发 学习路线图: 开始学习 退出咱们的邮件列表并收到 独家资源 对于开发人员 获取礼物 退出咱们的私人FB团体 灵感和社区体验 A退出 反对创立开源包 与github上的明星

April 20, 2021 · 1 min · jiezi

关于bootstrap:hexo-Wechat-Mini-Program打造博客小程序

前言    在上一次的文章中,介绍了如何应用 vercel+hexo 打造本人的线上博客,如果有跟着一步一步实际了的敌人,应该曾经搭建了本人的博客了,今儿个咱们再玩儿点新的花色,那就是在 hexo 中写了博客,怎么让他在小程序中也能够间接预览。 起因    做这个的起因在于,目前小程序在微信关上极其不便,比方在简历外面你间接扔个二维码比扔个链接,让面试官手机一扫看着也更不便,并且因为我自身还没有做过小程序相干的货色,所以也想玩一玩。 为什么不必 Taro 或 uniapp?Taro 试了试我的项目也搭建好了,然而写的有点累,所以起初就有点好受,整好之前买了一本掘金的小册,小程序开发入门与实际,就我集体而言,还是挺举荐这个小册的,用来入门妥妥的,不打广告,实在感触! 至于 uniapp 的话,也是齐全没接触过,临时可能也不会接触,所以就抉择了微信小程序 介绍    因为本文波及两个方面的货色,一个是博客中的数据怎么转成接口模式供小程序调用,另一个是小程序开发的所须要具备的条件。那么接下来就带着这两个问题开始吧!! hexo 插件在 hexo 泛滥插件中,又一个叫hexo-generator-restful的插件,顾名思义就是将 hexo 中的某些货色能够转换生成 restful 接口供其余中央调用,GitHub 地址:https://github.com/yscoder/hexo-generator-restful,然而呢这个插件只是获取到了一些简略的数据,包含文章列表、分类列表、标签列表以及自定义页面的货色,如果不满足需要你也能够 fork 下来本人进行二次开发一下! 微信小程序微信小程序的话,须要申请,在微信公众平台注册并欠缺相干的信息即可,过程也比较简单这里不再赘述,如有问题能够留言通知我哈,尽我所能!所须要的工具,因为比拟环境和语法都比拟非凡,微信有专门的开发者工具,Vscode 外面也有一些能够开发的插件,然而说实话着实不太好用,时不时就卡死了,如果有敌人晓得更好用的工具,麻烦通知我一声,非常感激!!! hexo-generator-restful 配置1、关上咱们之前建好的博客我的项目,在 package.json 中装置插件, 装置命令: npm install hexo-generator-restful 2、关上\_config.yaml 文件,粘贴以下代码,当然配置信息具体形容能够在Github上查看获取。留神配置信息的代码缩进 # 对外APIrestful: # site 可配置为数组选择性生成某些属性 # site: ['title', 'subtitle', 'description', 'author', 'since', email', 'favicon', 'avatar'] site: true # hexo.config mix theme.config posts_size: 10 # 文章列表分页,0 示意不分页 posts_props: # 文章列表项的须要生成的属性 title: true slug: true date: true updated: true comments: true path: true excerpt: false cover: true # 封面图,取文章第一张图片 content: true keywords: true categories: true tags: true categories: true # 分类数据 use_category_slug: true # Use slug for filename of category data tags: true # 标签数据 use_tag_slug: true # Use slug for filename of tag data post: true # 文章数据 pages: true3、配置好当前,push 代码,vercel 主动部署后即可拜访。拜访地址是你的域名+/api/***,你也能够间接拜访域名+/api,查看残缺的数据类目。举个 ????,看看我的就行,哈哈哈。因为我的域名是https://blog.wangboweb.site,所以只须要在前面加上/api即可。 ...

March 5, 2021 · 1 min · jiezi

关于bootstrap:Bootstrap-学习-网格系统

1、实现原理网格零碎的实现原理非常简单,仅仅是通过定义容器大小,平分 12 份(也有平分成 24 份或 32 份,但 12 份是最常见的),再调整内外边距,最初联合媒体查问,就制作出了弱小的响应式网格零碎。Bootstrap 框架中的网格零碎就是将容器平分成 12 份。 <div class="row"> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div></div>2、工作原理数据行(.row)必须蕴含在容器(.container)中,以便为其赋予适合的对齐形式和内距(padding)。在行(.row)中能够增加列(.column),但列数之和不能超过平分的总列数,比方 12。具体内容该当搁置在列容器(.column)之内,而且只有列(.column)才能够作为行容器(.row)的间接子元素。通过设置内距(padding)从而创立列与列之间的间距。而后通过为第一列和最初一列设置负值的外距(margin)来对消内距(padding)的影响。 简略对图解释一下:最外边框,带有一大片红色区域,就是相当于浏览器的可视区域。在 Bootstrap 框架的网格零碎中带有响应式成果,其带有四种类型的浏览器(超小屏,小屏,中屏和大屏),其断点(像素的分界点)是 768px、992px 和 1220px。第二个边框(1)相当于容器(.container)。针对不同的浏览器分辨率,其宽度也不一样:主动、750px、970px 和 1170px。2 号横条论述的是,将容器的行(.row)平分了 12 等份,也就是列。每个列都有一个 padding-left: 15px(图中粉红色局部)和一个 padding-right: 15px(图中紫色局部)。这样也导致了第一个列的 padding-left 和最初一列的 padding-right 占据了总宽度的 30px,从而以致页面不美观,当然,如果你须要留有肯定的间距,这个做法是不错的。3 号横条就是行容器(.row),其定义了 margin-left 和 margin-right 值为 -15px,用来对消第一个列的左内距和最初一列的右内距。将行与列给合在一起就能看到横条 4 的成果。也就是咱们冀望看到的成果,第一列和最初一列与容器(.container)之间没有间距。横条5只是想向大家展现,你能够依据须要,任意组合列与列,只是他们的组合数之和不要超过总列数。 官网解释:通过为 “列(.column)” 设置 padding 属性,从而创立列与列之间的距离(gutter)。通过为 .row 元素设置负值 margin 从而对消掉为 .container 元素设置的 padding,也就间接为 “行(.row)” 所蕴含的 “列(.column)” 对消掉了 padding。 ...

February 27, 2021 · 1 min · jiezi

关于bootstrap:推荐一款开源OA办公自动化系统真香

 大家好,我是为宽广程序员兄弟操碎了心的小编,每天举荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节俭开发效率,实现不加班不熬夜不掉头发,是我的指标! 明天小编举荐一款OA自动化办公零碎oasys,oasys应用Maven进行项目管理,基于springboot框架开发的我的项目,mysql底层数据库,前端采纳freemarker模板引擎,Bootstrap作为前端UI框架,集成了jpa、mybatis等框架。作为初学springboot的同学是一个很不错的我的项目,如果想在此基础下面进行OA的加强,也是一个不错的计划。 框架介绍我的项目构造 前端 后端 部署流程 1.下载我的项目、把oasys.sql导入本地数据库 2. 批改application.properties, 3. 批改数据源,oasys——>本人本地的库名,用户名和明码批改成本人的 4. 批改相干门路,配置图片门路、文件门路、附件门路。(static/image/oasys.jpg 拷贝到配置的图片门路下,不然会报 FileNotFoundException ) 5. OasysApplication.java中的main办法运行,控制台没有报错信息,数据启动工夫多久即运行胜利 6. 在浏览器中输出localhost:8088/logins我的项目截图 结尾 本期就分享到这里,我是小编南风吹,专一分享好玩乏味、离奇、实用的开源我的项目及开发者工具、学习资源!心愿能与大家独特学习交换,欢送关注我的公众号【Github导航站】。

February 23, 2021 · 1 min · jiezi

关于bootstrap:Bootstrap-学习-环境安装

1、<meta http-equiv="X-UA-Compatible" content="IE=edge"> 让 IE 运行最新的渲染模式。 2、<meta name="viewport" content="width=device-width, initial-scale=1"> 初始化挪动浏览显示。 width=device-width:让宽度等于设施宽度。initial-scale=1:设置初始缩放比例为 1,即不缩放。3、 <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script><![endif]-->(1)<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> IE 版本低于 IE9,使浏览器反对 HTML5 标签。 (2)<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> 对 CSS3 反对。 4、<script src="http://libs.baidu.com/jquery/1.9.0/jquery.min.js"></script> 引入 jQuery,Bootstrap 不自带 jQuery。 5、<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css"> 引入根底 CSS 款式。 6、<script src="/bootstrap/js/bootstrap.min.js"></script> 引入根底 JS 插件。 附录: 浏览原文:https://blog.mazey.net/1919.html

February 19, 2021 · 1 min · jiezi

关于bootstrap:bootstrap4导航栏自定义

导航栏设置高度 //勾销导航栏内边距 .navbar{ padding:0px 16px; } //设置导航栏背景色及增加暗影 .navbar-setting{ background-color: #40D2D1; /* height: 70px; */如果将这个成果放在navbar上,toggle会出问题 box-shadow: 0px 2px 8px 0px rgba(50, 50, 50, 0.25); } //设置brand款式 .navbar .navbar-brand{ font-size: 25px; height: 60px; line-height: 50px; color:#fff; } 设置toggle款式 /**toggle*/ //设置A链接款式 .navbar-light .navbar-nav .nav-link{ color:#fff; text-align: center; min-width: 120px;//如果这个中央间接写width会在窗口放大时,按钮只显示120px的宽度款式,不是全屏都是 height: 60px; line-height: 50px; } //鼠标通过时款式 .navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { color:#fff; background-color: #0abde3; } //激活的款式~~~~ .navbar-light .navbar-nav .active > .nav-link, .navbar-light .navbar-nav .nav-link.active { color: #fff; background-color: #0abde3; }HTML代码 ...

January 18, 2021 · 1 min · jiezi

关于bootstrap:为了让盲人也能追剧优酷做了哪些努力

简介: 尽管Android和iOS零碎自身就有对无障碍技术的官网反对,然而随着各种技术的迭代和演进,以及页面内容的复杂度的减少,靠零碎本身的反对曾经远远无奈达到现实的无障碍用户体验。优酷客户端针对视障群体理论需要及反馈进行梳理,并进行了全面的深度适配和体验优化。本文分享相干技术细节和实践经验。 一 前言随着智能手机的全面遍及,挪动互联网曾经渗透到咱们生存的方方面面,并且给咱们的生存带来了微小的变动。咱们每天上网看电影、追热剧、看综艺,对智能手机带来的便当观影体验曾经司空见惯。 然而,你可曾想过,在咱们应用眼睛获取大量信息的同时,这些看似触手可及的视频生产体验对于局部人群来说是极其侈靡的: 我始终在哭,始终在哭,哭我没有新鞋子穿。直到有一天,我发现有人没有脚......—— 海伦·凯勒我国目前有1700多万视障者,这个宏大的群体,因为种种原因无奈通过眼睛看清世界,很多人只能感触到微光甚至全盲。 正因为他们不能视物,他们比明眼人更须要借助智能手机来和世界对话,也同样领有对高质量视频内容的娱乐诉求。视频类App就像是架设在视障人士和音视频内容之间的一道桥梁,如果这道桥梁崎岖不平甚至充斥陷阱,咱们很难设想一个视障人士可能顺利的走到对岸。无障碍体验适配就像是在利用界面架设一条盲道,让视障人士可能像明眼人一样顺畅操作App。 2020年是一个不平庸的年份,全国人民响应号召,战疫情,不出门,戴口罩。视障用户也和全国人民一样,经验了漫长的隔离期。在疫情期间,视频类App成为被高频应用的刚需利用。 然而,咱们却从各种反馈渠道听到了视障群体无奈的声音: 图片内容为:盲文,真的是太难了。你们能到处在外交友、露营时,因为基础设施不无障碍,盲人在家;你们跟咱们一样只能在家时,咱们悲痛地发现,咱们连在家追个剧都成了奢望。 优酷作为业内当先的在线视频平台,有责任让每一个人都获得最佳的视频生产体验,感触到优质视频内容带来的高兴。为此,咱们启动了对优酷客户端进行全面无障碍体验优化的工作,心愿帮忙视障用户更靠近于实在地“看到”或者“听到”里面的世界。 视障人士和咱们操作手机办法有一些不同,他们通过读屏软件朗诵App界面元素,依据所听到的内容决定下一步操作。 比方:Android在【设置】中找到【辅助性能】或者【无障碍】关上【TalkBack】;iOS通过【设置】->【辅助性能】,关上【旁白】/【VoiceOver】来开启读屏性能。 在读屏关上后,视障用户可用如下的无障碍操作手势来操作App: 单指触摸:聚焦选中界面上的控件单指右扫:切换下一个焦点单指左扫:切换上一个焦点单点双击:激活以后聚焦的控件两指/三指拖动:滚动/翻页为了适配读屏软件等辅助工具对利用的信息获取、朗诵和操作,优酷App须要在焦点设置、增加控件标签内容等方面进行粗疏的优化。 二 业余单干为了更加实在地收集视障用户在应用优酷客户端时的痛点和问题,为用户提供良好的无障碍体验。咱们和深圳市信息无障碍研究会(http://www.siaa.org.cn/) 进行深度单干,借助无障碍研究会的业余视障测试工程师的教训和畛域常识,收集实在视障用户应用场景中存在的问题,以Bug的模式录入优酷外部QA管理系统,通过对立适配和测试后,交给无障碍研究会的业余视障测试工程师进行测试验收。 三 深度适配和体验优化无论是Android还是iOS,零碎自身就有对无障碍技术的官网反对。比方TextView文本控件、Button按钮控件能够被零碎读屏性能间接聚焦并朗诵控件类型,可能提供给用户根本的无障碍应用体验。 然而,靠零碎本身的反对是无奈达到现实的无障碍用户体验的。随着挪动互联网的疾速倒退,各种新技术栈继续被引入优酷客户端,优酷业务和页面出现的内容的复杂度越来越高。无论是各种新技术栈,还是各种简单的页面,都有不足无障碍反对或者应用体验较差的问题。 例如: 焦点合并问题:视频卡片上的图片+文字内容 是一个整体,但只能离开取到图像和题目并朗诵进去。内容提醒问题:优酷客户端界面上有大量的可点击组件,但因为不足控件类型属性, 是用户不晓得这是一个什么控件,并且是否可进行点击等操作。焦点错乱问题:播放器管制界面上有大量的图形按钮,用户应用读屏操作扫动浏览页面时是线性聚焦控件的。控件未设置焦点程序时,用户的手指扫动切换焦点可能不能听从适合的(界面散布或性能逻辑)程序切换。这些问题,都须要由应用层的研发同学进行专门适配。 通过对信息无障碍研究会测试工程师的业余反馈进行梳理,优酷针对这些问题进行了全面的深度适配和体验优化,次要体现在如下方面: 1 适配范畴通过多年的技术迭代和演进,优酷采纳了多技术栈混合的开发模式,引入了诸如Weex、Flutter等跨平台框架。本次体验优化,不仅对Android Native、iOS Native等原生开发的页面进行了深度适配,对外围场景的Weex、Flutter、H5页面也进行了全面体验优化。 2 业务架构层适配近年来,优酷客户端通过全面的技术重构,将各次要页面的渲染架构对立,也积攒出大量公共渲染控件库和规范业务组件库。优酷的对立技术架构以及对立的标准化组件实现,使得这次无障碍体验优化的适配事倍功半。 比方优酷散发场景大量应用同层渲染组件技术,将业务组件的视图进行图层合并,以进步渲染速度。在这次无障碍适配中,渲染框架层对立依照“视频标签(独播、预报等)+ 视频名称 + 简介 + 评分(更新进度等)”来拼接同层渲染组件的朗诵文案,对这些组件提供通过程序优化的标签内容。 适配后成果如下:https://gw.alicdn.com/mt/LB1gBmStA9l0K4jSZFKXXXFjpXa.mp4 3 适配中的典型问题页面元素【更精确】朗诵 图标类按钮和iconfont,须要额定增加contentDescription属性以及精确、简洁的内容才能够保障朗诵正确。 页面View【按需】获取焦点 嵌套型View或组件,当传播的是同一信息时,在最外容器层设置大焦点对于视障用户更敌对。比方“我的评分”,在图标和文字的容器层设置焦点和朗诵内容,留神,角色名(如∶按钮)不应写入标签内。 图标、自定义View设置角色、状态【更优雅】 能点击的图片型按钮或者自定义View的按钮,明确设定“角色”名称,比方“按钮”、“链接”等角色。 比方页面左上角的“返回”按钮,须要设置按钮角色,最终朗诵内容为“返回,按钮”。 弹窗或弹层主动切换焦点【更人性化】 弹窗或弹层时,主动使下层容器的第一控件(如题目或告诉内容)获取焦点,视障用户毋庸二次切换焦点,更合乎视障用户应用体验,更加体现人性化。 有状态类型的切换,提醒状态表更【更易懂】 切换按钮,减少状态朗诵,并在切换时及时朗诵切换后状态,使用户更易懂。 通过对页面元素设定正当的焦点,优雅的朗诵标签、设置角色等能够解决无障碍适配80%的问题 ,整体的产品出现靠近明眼人的应用体验。 4 深度交互适配然而,为了让视障用户能更不便地应用优酷App,优酷技术核心的开发工程师们通过宽泛收集视障用户的实在反馈,在主链路场景重点靠近阻碍人士的应用痛点,做了深度的交互适配优化。 以下举出几个案例: 播放器交互适配 优酷的播放器在视频起播之后,5秒后自动隐藏管制界面免得遮挡视频,不便用户观赏视频内容。 可是,这个面向明眼人群设计的体验优化却给视障用户带来了困扰: ...

December 23, 2020 · 1 min · jiezi

关于bootstrap:Vue-cli3-中引入-bootstrap

在 vue 我的项目中引入 bootstrap,首先要引入两个依赖:jQuery 和 popper 第一步、装置1、npm装置装置命令如下: cnpm install bootstrap --save-devcnpm install jquery --save-devcnpm install popper.js --save-dev默认装置最新版本,如果想要装置 bootstrap 的 V3 版本(依赖 less),能够: cnpm install bootstrap@3 --save-dev或者,采纳可视化窗口装置 2、可视化窗口装置1、找到:我的项目> 依赖> +装置依赖> 运行依赖搜寻并装置 jquery 和 popper.js 2、找到:我的项目> 依赖> +装置依赖> 开发依赖搜寻并装置 bootstrap 第二步、引入在 mian.js 页面,写以下代码 // 引入jQuery、bootstrapimport $ from 'jquery'import 'bootstrap'// 引入bootstrap款式import 'bootstrap/dist/css/bootstrap.min.css'import 'bootstrap/dist/js/bootstrap.min.js'// 全局注册 $Vue.prototype.$ = $第三步、配置 jQuery在 vue.config.js 中,写如下代码(如果没有 vue.config.js ,则在 package.json 同级目录下手动新建) const webpack = require("webpack")module.exports = { // 配置插件参数 configureWebpack: { plugins: [ // 配置 jQuery 插件的参数 new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.jQuery': 'jquery', Popper: ['popper.js', 'default'] }) ] }}而后,就能够应用了 ...

December 10, 2020 · 1 min · jiezi

关于bootstrap:我在阿里巴巴做-Serverless-云研发平台

简介: Serverless 云研发平台通过这半年多的变质,曾经从简略的解决工程链路的平台演进成一个面向研发、上线、运维的全生命周期研发平台,后续要解决的命题会集中在用户低门槛上。 作者 | 林昱(苏河) 技术的成熟度源自大规模的实际,在 Java 畛域,阿里将本身的实际源源不断的反哺给微服务技术体系;在 Node.js 畛域,阿里正掀起了前所未有的前端反动浪潮,将实际反哺给 Serverless 技术体系,并逐步拓展到其余多语言体系和后端 BaaS上。 Serverless 云研发平台作为阿里巴巴团体前端委员会发动的一体化云研发平台,底层基于函数计算 FC,是整个 Node Serverless 体系中的研发入口,承接了淘宝、飞猪、ICBU、考拉、高德、娱乐等研发、交付和运维工作。目前,团体曾经有上千位前端和客户端的工程师应用 Serverless 云研发平台进行业务的开发工作,包含但不限于营销导购、中后盾、行业前台等规模化场景。 从往年双 11 整体的大盘数据来看, 仅淘系 Node Serverless 的撑持流量就曾经从去年的 2K QPS 峰值减少到往年的 30K QPS 峰值,峰值流量减少了近15倍,团体整体更加是从近 5.8K QPS 达到往年的 50K QPS峰值。 解决方案上,咱们定制了面向更多场景的能力,包含考拉 Dart 解决方案的落地,以及一些面向导购的模型驱动解决方案;运维上,咱们优化了大促态和日常态流程,让开发者在应答更高 QPS 规模时,精力破费升高至多 50%;在研发体验侧,打造解决方案体系,升高研发门槛,反对前端疾速入场,晋升研发效率 39%;在底层 Serverless 基座上,咱们适配了多个 Serverless 平台,反对多平台的实时切换,以应答繁多平台的不确定性。 本文将介绍 Serverless 云研发平台是通过提供哪些能力保障各租户业务的疾速开发和平安交付的。 研发的实质大家可能都在「人员协同、服务可靠性」上领取着高额的人力老本,但研发的实质是交付「业务性能」。 明天,咱们从传统的「前端开发者」缓缓走向「利用研发者」,摸爬滚打不容易,除了须要去思考「什么是真正的按需付费」、「弹性」等底层运维相干的命题之外,还须要去思考「研发效力」相干命题,这也是为什么有更高效的协同模式、组织关系的变动,甚至整个前后端协同的生产关系都在发生变化的起因,明天咱们谈「云端一体」,实质是从用户的视角去思考问题,用更高效的形式去解决业务问题。 现在,软件开发对于老本的管制要求越来越高,单位工夫的产能会缓缓成为掂量一个团队是否高效的规范。 因而从研发的实质,咱们来看看 Serverless 云研发平台要解决的命题: 让业务开发变轻,聚焦业务逻辑;让业务开发变快,晋升产研效率;让基础设施变厚,晋升稳定性。Serverless 计划定制能力来欠缺云端一体研发者市场,提供开发者更多抉择、打造云端一体的研发集成闭环来提供业务更快的交付速度、以及业务低成本的应用根底 BaaS 服务能力以及业务 BaaS 成为研发平台的外围抓手。 ...

December 2, 2020 · 2 min · jiezi

关于bootstrap:数据中台技术及业务发展史与未来趋势展望

作者:陈晓勇、柯根 阿里巴巴数据技术编年 简史2003年淘宝诞生于杭州一间民居。次年,Google发表了三篇大数据论文将计算技术引入大数据时代。 2004年Doug Cutting和Mike Cafarella依据Google的论文实现了Hadoop的HDFS和MR计算框架。 2006年 Hadoop我的项目进入Apache社区。 2008年9月Hive成为Hadoop的子项目,之后成为Apache的顶级我的项目。同年,淘宝开始施行基于Hadoop零碎的数据计算平台搬迁-云梯1。 2009年阿里云诞生,阿里云开始写下Maxcompute第一行代码,中国的各种云端服务开始涌现。 2014年阿里巴巴施行登月打算,实现基于Maxcompute平台的数据平台迁徙-云梯2,汇总全团体的数据业务到一个平台上,实现数据公共层建设,OneData体系和团体的数据中台渐趋成型。 2014年4月Intel投资Cloudera,放弃自主的Hadoop发行版,同年Cloudera进入中国市场。 2017年数据中台产品Dataphin产品问世,同时反对Maxcompute和Hadoop大数据平台,OneData外部的技术体系开始对外实现赋能。 2018年Cloudera和Hortonworks发表了公司合并,Hadoop发行版从多个厂商竞争变成寡头间游戏。 2020年基于Dataphin、品牌数据银行,Quick Audience、Quick Stock数据中台产品的全域营销推出,阿里开始通过自有的数据体系赋能商家,数据中台从纯技术推广到业务价值体现。 数据中台理念应运而生机会传统的数据处理形式,特地是传统的数仓平台,其软硬件洽购老本,运维老本、技术门槛等都颇高。只有银行、运营商等大型企业才有能力和财力实现数据仓库和数据集市的平台建设。随着大数据技术和云上服务的遍及,企业的运维老本和技术开发门槛大幅度降低,特地是具备极高性价比的云端服务,简略的部署,近乎有限的可扩展性和轻松的治理,综合应用老本和便捷性都大大优于传统数据平台。因而,企业开始将其数据仓库从传统的Teradata、Oracle/IBM等平台迁徙到大数据平台或云服务中,时至今日,这一变动还在传统企业中一直的演出。 云计算衰亡之后,数据库和弹性计算(ECS)是最为广泛的产品,但随着用户在云上业务的数据积攒,企业开始对数据分析有了间接的需要。2011年阿里云maxcompute大数据平台上线,阿里云迈入大数据时代。 随着数据指数级的增长,数据处理的形式和模式产生了质的变动。传统面向经营管理人员和少部分业务人员的数据撑持形式不再能满足业务倒退的需要。数据开发周期长、反馈慢、利用面窄的弊病也越来越突出。企业及政府开始寻求应答市场变动和数据及时响应的办法,同时对数据的采集、开发、应用和治理提出了更高的要求。 企业须要进行数智化转型,能力更无效地治理数据,更便捷地应用数据。阿里巴巴数据技术及产品部也意识到了数据处理形式必须有所扭转,能力满足企业对数据开发效率,数据赋能业务产生价值和数据领导企业经营治理的需要,至此数据中台理念孕育而生。它帮忙阿里巴巴团体在之后几年的强烈竞争中怀才不遇,并持续帮忙企业过渡到将来的竞争,这场趋势之战的背地是商业主导权的竞争。 数据中台本质是实现数据价值化与数据资产化要害产品介绍: Dataphin 是阿里云旗下智能数据构建与治理的数据中台建设引擎。旨在基于数据中台实际中积淀的外围方法论和技术体系,提供从数据采,建,管,用的全链路、一站式的大数据能力,以助力企业打造规范对立、死记硬背、资产化、服务化、闭环自优化的智能数据体系。 Dataphin的外围价值在于标准数据定义,用规范化、标准化的形式生产数据,进步数据开发的效率。 数据中台把面向全员凋谢数据,撑持业务的数据化经营作为指标。数据中台便捷的数据构建和业务价值视角的设计思路是与传统数据仓库的最大的不同。阿里巴巴通过数据为人人,基层小二才是数据次要使用者的理念,来进行数据加工和开发,让一线员工有数据可看,有数据反对经营决策,有数据做业务领导。 OneData是基于阿里巴巴数据技术团队多年教训积淀进去的方法论,外围是数据公共层的建设,Dataphin是方法论固化到产品的一个状态,它帮忙阿里巴巴经济体在业务转型的过程中推动业务改革,实现业务价值。企业同样可利用这些成功经验和工具来进步数据效率,反对他们的经营和可持续性策略。 OneData外围是数据公共层的建设。 阿里巴巴正是通过底层服务和麻利开发的翻新来赋能其宏大的客户群,为客户提供成熟的方法论和开箱即用的工具,帮忙企业实现业务翻新。在以发明业务价值为导向的明天,咱们看到数据中台能推动企业数据价值利益链的传导。 在阿里巴巴经济体内,数百种数据应用服务于淘宝、天猫、优酷、飞猪、支付宝等各个业务部门。经济体外,生意顾问、品牌数据银行、全域消费者经营平台Quick Audience等数据利用帮忙内部的商家在阿里巴巴经济体内实现业务价值。数据及数据工具将越来越多的实现人、货、场的连贯和合作。 数据中台概念下,数据资产除了根底的存储容量、计算资源外,还须要依据企业的组织架构或开发状态来构建本人数据资产治理平台,用以洞察企业数据健康状况。在阿里巴巴企业外部也有资产平台提供数据衰弱状态信息,可为下一财年的零碎扩容提供数据根据。Dataphin内置的数据资产治理模块可能体现开发者视角下的数据资产根底情况。 企业须要进行数智化转型,能力更无效地治理数据,更便捷地应用数据。阿里巴巴数据技术及产品部也意识到了数据处理形式必须有所扭转,能力满足企业对数据开发效率,数据赋能业务产生价值和数据领导企业经营治理的需要,至此数据中台理念孕育而生。它帮忙阿里巴巴团体在之后几年的强烈竞争中怀才不遇,并持续帮忙企业过渡到将来的竞争。这场趋势之战的背地是商业主导权的竞争。 数据中台利用现状一、通用行业数据中台建设场景 传统企业对数据中台的期待更多的是在业务经营和治理撑持这两方面。开箱即用的工具能实现企业高效的数据产出和数据资产的治理。在数据中台建设的场景设计阶段,会对传统企业进行深刻的业务调研,抽丝剥茧地提炼业务场景,将用户最为关怀的业务洞察视角通过BI数据分析报表可视化的展示在人们背后,辅助决策者做出迷信判断。 数据中台的业务场景设计阶段衍生出数千个派生指标,这些派生指标具备工夫限定细、指标定义清晰无二义性,指标间组合条件多等特色。Dataphin能疾速实现数据加工和开发,图形化设计升高数据中台开发和设计的门槛,并从数仓布局、数据集成、标准建模、通用开发IDE、运维调度到数据服务一站式疾速达成传统企业数据建模和数据开发的指标。 数据中台内汇聚的数据资产就像一座“金矿”,对企业来讲,数据中台必须要解决数据如何治理,如何应用的问题。通过中心化的数据资产治理能够不便的对资产应用及其价值进行全面的评估,构建数据利用的全链路追踪体系,对数据老本、业务收益做到清晰、通明、可评估。传统企业因为业务零碎多元、设计独立等起因导致造成数据烟囱式开发的场面。通过对数据资产的集中管理能够实现企业全局数据资产情况全把握,纵向部门、横向层级的经营情况通明出现,为迷信的数据化决策打下松软的数据根底。 某传统企业客户,他们在全国领有大量零售商和门店,营销费用居高不下,因为经营数据都在门店和各个子系统中,总部难以发现起因。通过数据中台的建设,将各个系统数据和门店营销数据采集后,通过剖析生产数据、积分积攒和积分耗费数据,发现了异样行为会员,他们在门店的生产集中在早晨10点当前,这段时间恰是门店关门的状态,疑似羊毛党的舞弊行为所导致。通过数据中台的数据集中化治理,可对各事业部上司门店的理论流动销量进行监督。通过数据中台定制化的“资产可视化门户”帮忙企业对自有数据资产进行无效治理。 作为传统企业代表某电信运营商、某航空公司通过10多年的数据仓库建设,曾经领有一套数据分析平台,但传统的数据仓库只偏重数据开发,没有场景设计和资产治理的理念,当有一个新的数据开发工作,往往须要开发人员从贴源数据做层层加工实现,不仅耗时长而且存在定义不清晰的景象。而这些景象能够通过应用Dataphin,引入规范的数据公共模型来解决。 “推动业务和数据中台建设是航空公司往年八场硬仗之一,也是公司智能化转型过程中的关键性改革。过来,须要人工从不同零碎采集、在各自电脑上跑几十小时能力获得的数据,当初几分钟就能实现数据从“云端”上轻松获取,极大地晋升了剖析工作的效率和品质。”航空公司数据中台我的项目负责人表述。 二、批发行业全域数据中台营销场景 新批发行业有着全新的业态销售模式,商家通过门店、线上网店、直播平台、品牌App、微信/支付宝小程序等各种渠道促销商品。针对营销模式多、渠道多的特点阿里巴巴推出了全域营销解决方案,汇合全域数据通过AIPL/RFM数据模型进行深度洞察,通过精准投放,晋升营销效率,实现业务价值。全域营销解决方案是基于阿里巴巴生意顾问、品牌数据银行、数据构建及治理平台Dataphin、全域消费者经营平台Quick Audience等一系列数据产品来实现的。 在全域营销中最为外围的是帮忙用户找到指标人群,通过人群预测模型和营销投放为商家带来业务价值,因而全域营销预测技术施行的前提是汇聚各个业态/渠道产生的数据,并以阿里巴巴OneData方法论去解决以实现全域的数字营销,这一畛域AI和算法平台的计算能力有间接的场景利用和业务价值体现。通过模型建设和数据输入使得商家对业务的经营情况、会员洞察、渠道和销售治理、门店治理等业务数据有全盘的管控。通过数据分析,决策者能够做出业务判断,也能够通过市场预测(predictive Marketing)模型为全域营销提供市场预测。 全域营销解决方案是企业构建数据中台后与阿里巴巴商业生态单干,获得业务价值的一个重要形式。由企业的数据中台积淀的价值数据与阿里巴巴商业生态体系以及其余媒体渠道共建数字营销,并且可回流内部投放的数据,造成全链路数据闭环。 飞鹤乳业、良品铺子、伽蓝等新批发企业通过全域数据中台建设,应用Dataphin对天猫店铺、线下门店、小程序、自有网站等数据进行对立治理,构建对立、规范、高质量的数据,撑持数据决策和全域营销投放,实现业务价值。正如客户们所说: “数据中台可能解放数据根底建设,让咱们有更多的精力来思考如何使用数据来解决业务痛点、晋升公司效率;那么在对组织的能力要求方面,咱们也可能更偏差业务剖析和架构的能力、数据模型算法能力、创新型利用产品设计和布局能力的倒退。”良品铺子副总裁周世雄在承受采访时候如是说道。 伽蓝团体大数据中心总经理钟卫在承受采访中表述”咱们手中有金矿(消费者数据),但不足开发的办法。数据中台体现的数字化技术相当于新的生产力,可能驱动企业通过建设与之相配新生产关系,比方组织降级、生态协同而促成企业经营模式、商业模式上的冲破,这种冲破所带来的扭转是DNA级别的”。 数据中台将来趋势瞻望一、数据中台的实时计算趋势 数据处理向准实时、实时趋势方向倒退。传统的数仓设计限于技术体系无奈实现实时计算。而采纳分布式大数据技术不仅能实现构建PB级别的数据中台(历史上把这类计算场景叫数据仓库)而且还能将实时计算与历史数据联合,实现流批一体开发。满足新一代数据中台强调的数据时效性和剖析能力。 阿里巴巴采纳Blink(Flink开源版本)实时计算框架实现流批一体,Blink具备简单事件处理能力(Complex Event Process),还能为不同需要和能力的开发者提供SQL/Table、实时流批数据处理、状态事件驱动利用API等多种个性,应答不同数据开发的需要。 数据中台的实时计算技术并不是对原有的业务流程进行再造,而是通过实时数据流与数据仓库指标联合的形式来实现更高效的业务剖析。利用实时技术能够疾速进行BI剖析和业务预警,如实时营销策略、实时风控策略、实时反欺诈。这些场景都能够嵌入到理论的业务零碎中。 阿里巴巴的新批发业务、 双11购物狂欢节也使用流批一体,对营销过程实时监控。 Dataphin产品在2018年开始就流批一体投入研发,在2019年底外部流计算产品胜利迁徙到Dataphin产品上。2020年Dataphin 公布v2.7版本,开始反对阿里云实时计算产品Flink,与阿里云大数据计算服务Maxcompute联合,通过流批一体技术满足数据及时性需要。用户能够通过Dataphin产品实现营销成果的实时反馈并与历史数据放在同一维度剖析和比拟,给业务人员提供即时精准的数据用以实时决策。 二、数据中台下层利用的挪动终端化趋势 BI洞察剖析是数据中台数据出现的最重要的形式,现阶段绝大部分的BI出现都是PC端为主,手机端为辅。互联网由PC端向挪动终端倒退的一个必然趋势是数据数据利用也随之挪动终端化。这几年,在数字化剖析畛域,多个BI厂商都公布了挪动终端展示的配套产品,但并未在市场上大规模遍及,究其原因既有屏幕尺寸难对立等主观问题,又有挪动终端受众场景个性化水平高的状况,因而数据中台的利用挪动终端化必须适应终端的要求。 在数字BI畛域,其终端化必然要思考端上适配,更多的以数字指标看板的形式出现,而不是像PC端一样去突出丰盛的出现成果及历史指标。其次是终端App与实时计算相结合,强调实时数据的剖析能力,出现的内容要具备时效性,更多的利用在业务流量、实时订单与历史订单剖析及预测的场景中。 现有的挪动终端化难点除了须要在iOS和Android两个零碎上做App开发外,还面临多个端出现问题,钉钉微利用和微信小程序已是企业除App外在数据BI终端化中的其余抉择,但从技术层面上来说,纯H5页面开发面临下载数据量大,应用体验不佳,不能实现离线数据放弃和浏览等问题,因而大多数挪动终端利用仍旧采纳App形式实现。 因为终端App的开发和运维老本高,PV/UV经营效率问题,所以什么样的数据和利用模式能力进步数据用户的应用频率是摆在企业管理者和产品经理背后一个事实问题。数据中台大部分的剖析数据是T+1的剖析指标,对企业管理者有很重要的借鉴作用,但没有小时和分钟级别的应用频率,因而App上出现的数据应该以企业业务及营销流动数据为主,特地是多端的埋点采集数据、PV/UV数据,再联合数据历史剖析比拟能更好的体现App BI的业务价值。 **三、数据中台的智能化发展趋势** ...

November 26, 2020 · 1 min · jiezi

关于bootstrap:从基础设施到云原生应用全方位解读阿里云原生新锐开源项目

2020 年 11 月 19 日,由 InfoQ 主办的“2020 中国技术力量年度榜单盛典”隆重召开,并正式揭晓了“开源杰出贡献人物”、“开源新锐我的项目”和“云原生行业落地榜样”等重大奖项。在此前的入围赛中,仅“开源新锐我的项目”单项,阿里云原生就入围了 10 多个开源我的项目,在创新能力、社区成就和用户反馈等多项指标中一骑绝尘,占据了参评我的项目整体近五分之一。而在本次揭晓的“2020 中国技术力量年度榜单”决赛后果中,最终阿里云高级技术专家罗毅荣获“十大开源杰出贡献人物”、Open Application Model(OAM)荣登“十大开源新锐我的项目”、由阿里云原生团队撑持的完满日记电商业务案例获评“2020 年度十大云原生行业落地榜样”。 在 2020 年,阿里不仅实现了 双11 外围零碎全面云原生化,一举成为寰球规模最大、实力最硬核的云原生实际,并首次实现自研、开源、商业“三位一体”,以此为根底拉开了极具竞争力的云原生产品家族的尾声。为了让大家有更全面的意识,咱们借此机会整顿了阿里从应用层到中间件到基础设施三层平面构造的云原生新锐开源我的项目和技术能力。 云原生生态价值“聚焦点”:OAM 凋谢利用模型与 KubeVela 凋谢利用平台我的项目现如今,云原生技术的迅猛发展可能让很多人都感觉到目迷五色,但如果咱们去探寻“云原生”的实质,就不难发现这项技术与理念发动的初衷,是为了让云端的开发人员更轻松的、以齐全基础设施无关的形式去交付与治理利用。随同着这个初衷和诉求,才有了 Kubernetes 这样为平台团队屏蔽掉了“虚拟机”、“存储”等底层概念的对立的基础设施层形象我的项目。然而,理论的落地过程通知咱们,仅仅有基础设施层形象,离云原生“丝般顺滑”的云端利用治理与交付体验,还是存在着微小的鸿沟。在 Kubernetes 与用户之间,还存在着一层名叫“应用层”形象亟待填补。 作为本次 2020 年中国技术力量十大开源新锐我的项目的获奖者,Open Application Model(OAM)凋谢利用模型,以及它的 Kubernetes 实现 —— KubeVela 我的项目,正是阿里云联结微软等云原生社区中坚力量,独特推出的云原生应用层外围我的项目。其中,OAM 的设计思维是为包含 Kubernetes 在内的任何云端基础设施提供一个对立、面向最终用户的利用定义模型;而 KubeVela,则是这个对立模型在 Kubernetes 上的残缺实现。所以,对于业务研发人员来讲,KubeVela 能够被认为是云原生社区的 Heroku。而对于平台团队来讲,KubeVela 因为具备极高的可扩展性,能够被认为是一个“以利用为核心”的、高度可扩大的 Kubernetes 发行版。 有了 OAM 和 KubeVela,现今的平台工程师终于领有了一个能够方便快捷地将任何一个 Kubernetes 社区能力封装形象成一个面向最终用户的应用层平台个性的弱小工具。而作为这个平台的使用者,业务研发们不须要理解任何 Kubernetes 相干的常识,只通过极简的应用层语义就能够残缺形容出本人的代码构建和利用部署细节,而后一键交付进来。 云原生中间件实现自研、开源、商用“三位一体”,造成微服务最佳实际中间件是云原生从概念到落地的承接。K8s 屏蔽了底层云基础设施的差别,成为了云原生时代微服务利用的操作系统。在云原生操作系统和云原生利用之间,须要一层形象,向下屏蔽掉底层的复杂性,向上提供便捷、牢靠的能力,让利用低成本、甚至无老本的迁徙到新的云基础设施上部署和运行,并享受到云按需付费、极致扩缩容等能力。阿里云原生中间件承当了这样的职责。 阿里云原生中间件脱胎于阿里团体外部,并通过 双11 这样举世无双的场景造成了微服务畛域最佳实际,从 2011 年 Dubbo 开源开始,阿里云原生中间件就开始尝试在云产品和开源方面进行致力,心愿能让反对阿里外围业务的中间件零碎从关闭走向凋谢,服务更宽泛的用户。在而后几年陆续推出了 Dubbo、RocketMQ、Spring Cloud Alibaba、Nacos、Sentinel、Arthas、Seata、ChaosBlade 等多个为人熟知的开源我的项目,并造成了微服务畛域最佳实际。短短两年工夫,Spring Cloud Alibaba 从 Spring 社区毕业,成为了最受中国开发者欢送的 Spring Cloud 实现。 ...

November 24, 2020 · 1 min · jiezi

关于bootstrap:什么是低代码LowCode

简介: 什么是低代码?咱们为什么须要低代码?低代码会让程序员就业吗?本文总结了低代码畛域的基本概念、外围价值与行业现状,带你全面理解低代码。 一 前言如果抉择用一个关键词来代表行将过来的2020年,我置信所有人都会认同是“新冠”。疫情来得太快就像龙卷风,短短数月就阻断了全世界范畴内有数人与人之间的物理连贯。但好在,咱们曾经全面迈入互联网时代:N95口罩再厚,也阻挡不了信息比特流的顺畅流通(宅男:B站仍然香);居家隔离再久,也障碍不了钉钉音讯的准时送达(社畜:工作仍然苦)。逍遥子在9月份的云栖大会上说:“新技术代表的新生产力,肯定是咱们全速战败疫情、创始将来最好的原动力。” 那么在后疫情时代,到底须要什么样的新技术,能力真正解放IT生产力,减速社会数字化转型,Make The World Great Again?我认为是低代码(Low-Code)。 基于经典的可视化和模型驱动理念,联合最新的云原生与多端体验技术,低代码可能在适合的业务场景下实现大幅度的提效降本,为业余开发者提供了一种全新的高生产力开发范式(Paradigm Shift)。另一方面,低代码还能让不懂代码的业务人员成为所谓的平民开发者(Citizen Developer),补救日益扩充的专业人才缺口,同时促成业务与技术深度合作的终极麻利状态(BizDevOps)。本文将重点介绍低代码相干背景常识,包含低代码的定义与意义、相干概念、行业倒退等,冀望能帮忙大家更好地意识与了解低代码这个新兴畛域。 二 什么是低代码“Low-Code”是什么?如果你是第一次据说,没准也会跟我当年从老板口中听到这个词后的心田戏一样:啥?“Low-Code”?“Code”是指代码我晓得,但这个“Low”字是啥意思?不会是老板发现我最近赶工写的代码很丑很“Low”吧... 想多了,老板怎么可能亲自review代码呢。那难道是指,“Low-level programming”里的“Low”?老板终于发现让我等编程奇才终日堆Java业务代码太节约,要派我去闭关写一个高性能C语言网络库... 显然也不是,老板哪能有这技术情怀呢。那到底是什么意思?作为一名搜商比情商还高的程序员,能问Google的绝不会问老板。于是我一顿操作后,不假思索地点开了第一条搜寻后果。果不其然,这是一条充斥自在芬芳只有翻墙能力闻到的Wikipedia词条:Low-code development platform。 Wikipedia定义 从Wiki的这段定义中,咱们能够提炼出几个要害信息: 低代码开发平台(LCDP)自身也是一种软件,它为开发者提供了一个创立应用软件的开发环境。看到“开发环境”几个字是不是很亲切?对于程序员而言,低代码开发平台的性质与IDEA、VS等代码IDE(集成开发环境)简直一样,都是服务于开发者的生产力工具。与传统代码IDE不同的是,低代码开发平台提供的是更高维和易用的可视化IDE。大多数状况下,开发者并不需要应用传统的手写代码形式进行编程,而是能够通过图形化拖拽、参数配置等更高效的形式实现开发工作。Forrester定义顺着Wiki的形容还能发现,原来“Low-Code”一词早在2014年就由Forrester提出了,它对低代码开发平台的始祖级定义是这样的: 相比Wiki的版本,这个定义更偏差于说明低代码所带来的外围价值: 低代码开发平台可能实现业务利用的疾速交付。也就是说,不只是像传统开发平台一样“能”开发利用而已,低代码开发平台的重点是开发利用更“快”。更重要的是,这个快的水平是颠覆性的:依据Forrester在2016年的调研,大部分公司反馈低代码平台帮忙他们把开发效率晋升了5-10倍。而且咱们有理由置信,随着低代码技术、产品和行业的一直成熟,这个晋升倍数还能持续上涨。低代码开发平台可能升高业务利用的开发成本。一方面,低代码开发在软件全生命周期流程上的投入都要更低(代码编写更少、环境设置和部署老本也更简略);另一方面,低代码开发还显著升高了开发人员的应用门槛,非专业开发者通过简略的IT根底培训就能疾速上岗,既能充分调动和利用企业现有的各方面人力资源,也能大幅升高对低廉业余开发者资源的依赖。低代码外围能力基于上述的定义和剖析,不难总结出如下这3条低代码开发平台的外围能力: 全栈可视化编程:可视化蕴含两层含意,一个是编辑时反对的点选、拖拽和配置操作,另一个是编辑实现后所及即所得(WYSIWYG)的预览成果。传统代码IDE也反对局部可视化能力(如早年Visual Studio的MFC/WPF),但低代码更强调的是全栈、端到端的可视化编程,笼罩一个残缺利用开发所波及的各个技术层面(界面/数据/逻辑)。全生命周期治理:作为一站式的利用开发平台,低代码反对利用的残缺生命周期治理,即从设计阶段开始(有些平台还反对更前置的我的项目与需要治理),历经开发、构建、测试和部署,始终到上线后的各种运维(e.g. 监控报警、利用高低线)和经营(e.g. 数据报表、用户反馈)。低代码扩大能力:应用低代码开发时,大部分状况下仍离不开代码,因而平台必须能反对在必要时通过大量的代码对利用各层次进行灵便扩大,比方增加自定义组件、批改主题CSS款式、定制逻辑流动作等。一些可能的需要场景包含:UI款式定制、遗留代码复用、专用的加密算法、非标系统集成。不只是少写代码回到最后那个直击心灵的小白问题:Low-Code中的“Low”,到底是啥意思?答案曾经不言而喻:既不是指形象水平很低(相同,低代码开发方式的形象水平要比传统编程语言高一个level),也不是指代码很low(也相同,低代码所生成的代码个别都通过精心保护和重复测试,整体品质强于大部分手写代码),而是单纯的“少写代码” —— 只在多数须要的状况下才手写代码,其余大部分时候都能用可视化等非代码形式解决。 再往深一点儿看,低代码不只是少写代码而已:代码写得少,bug也就越少(正所谓“少做少错”),因而开发环节的两大支柱性工作“赶需要”和“修bug”就都少了;要测的代码少了,那么测试用例也能够少写不少;除了开发阶段以外,平台还笼罩了后续的利用构建、部署和治理,因而运维操作也更少了(Low-Code → Low-Ops)。 然而,少并不是最终目标:如果单纯只是想达到少的成果,砍需要减人力、升高品质要求也是一样的。低代码背地的哲学,是少即是多(Less is More),或者更精确说是多快好省(Do More with Less) —— 能力更多、上线更快、品质更好,老本还更省,粗浅践行了阿里“既要,又要,还要”的价值观精华。 平台的职责与挑战下面说的是低代码给开发者提供的能力与吸引力,那么作为服务的提供方与利用的承载者,低代码开发平台本身应该承当怎么的职责,其中又会遇到多大的挑战?是否就肯定要如阿里云所主张的那样,“把简单留给本人,把简略留给他人”?尽管这句话听起来很深明大义,但不晓得大家有没有想过,为什么咱们肯定要抱着简单不放,平白无故给本人找事?就不能间接干掉简单,也给咱阿里云本人的员工留点简略吗?是工作太容易就体现不进去KPI价值了,还是家里的饭菜不如公司的夜宵香? 左思右想许久后,我从热力学第一定律中找到了答案:开发一个利用的总复杂度是恒定的,只能转移而不可能凭空隐没。要想让开发者做的更少,安心享受简略的高兴,那么平台方就得做的更多,默默承当尽可能多的复杂度。就像一个满身腱子肉的杂技男演员,四平八稳地托举着在高处旋转与跳跃的女搭档;下面的人显得越轻捷越毫不费力,上面的人就得越稳重越用尽全力。当然,不是说下面的女演员就很轻松没压力,只是他们各自的分工不同,所承当的复杂度也不一样。 依据《人月神话》作者Fred Brooks的划分,软件开发的复杂度能够划分为实质复杂度(Essential complexity )和偶尔复杂度(Accidental complexity)。前者是解决问题时固有的最小复杂度,跟你用什么样的工具、教训是否丰盛、架构好不好等都无关,而后者就是除此之外在理论开发过程中引入的复杂度。通常来说,实质复杂度与业务要解决的特定问题域强相干,因而这里我把它称为更好了解的“业务复杂度”;这部分复杂度不是任何开发方法或工具能解决的,包含低代码。而偶尔复杂度个别与开发阶段的技术细节强相干,因而我也相应把它称为“技术复杂度”;而这一部分复杂度,恰好就是低代码所善于且适宜解决的。 为开发者尽可能屏蔽底层技术细节、缩小不必要的技术复杂度,并撑持其更好地应答业务复杂度(满足灵便通用的业务场景需要),这是身为一个低代码开发平台所应该尽到的外围职责。 在尽到上述职责的同时,低代码开发平台作为一个面向开发者的产品,还须要致力于为开发者提供简略直观的极致开发体验。这背地除了微小的工作量,还得能在“弱小”和“易用”这两个很难两败俱伤的矛盾点之间,致力找到一个合乎本人产品定位与指标客户需要的平衡点 —— 这兴许是设计一个通用低代码开发平台所面临的最大挑战。 三 低代码相干概念比照纯代码(Pro-Code / Custom-Code)“纯代码”可能算是我杜撰的一个词,更常见的说法是业余代码(Pro-Code)或定制代码(Custom-Code);但意思都一样,就是指传统的以代码为核心(Code-Centric)的开发模式。之所以我抉择用“纯代码”,是因为如果用“业余代码”会显得仿佛低代码就不业余了一样,而用“定制代码”又容易让人误会成低代码无奈反对定制的自定义代码。 当然,更精确的称呼我认为是“高代码”(与低代码恰好对应,只是名字太好听,被我厌弃了...),因为即使是应用传统的代码IDE,有些开发工作也反对(甚至更适宜)以非代码形式实现,比方:iOS端开发时应用的SwiftUI界面设计器、服务端开发数据库利用时应用的PowerDesigner建模工具。不过这部分可视化工作在传统开发模式下只是起辅助作用,最初通常也是生成开发者可间接批改的代码;开发者依然是以代码为核心来发展次要工作。 低代码与纯代码之间的关系,其实跟视频和文章之间很像: 低代码就像是古代的“视频”,大部分内容都由直观易了解、表达能力强的图片组成,因而更容易被公众所承受。但与此同时,视频也不是死板得只能有图片,齐全能够增加大量文字(如字幕、标注)来补救图片表白不够准确的问题。BTW,对于“图”和“文字”之间的辩证关系,能够进一步参考《架构制图:工具与方法论》[1]这篇文章中的相干形容。纯代码则更像是传统的“文章”,尽管很久以来都始终是信息流传的惟一媒介,但自从视频技术诞生以及相应软硬件基础设施的遍及以来,便逐步开始被抢走了风头。现在,视频已成为大部分人获取信息的次要渠道(从电视电影到B站抖音),而常常读书读文章的人却越来越少。但不可否认的是,文章仍然有它存在的意义和受众(不然我也不会费这劲敲这么多字了),即便“市场份额”始终在被挤压,但永远会有它立足的空间。 如果按下面这种类比关系推导,低代码将来也会遵循与视频相似的倒退轨迹,超过纯代码成为支流开发模式。Gartner的预测也表白了雷同的观点:到2024年,所有利用程序开发流动当中的65%将通过低代码的形式实现,同时75%的大型企业将应用至多四种低代码开发工具进行利用开发。 但同样地,就像是视频永远无奈取代文章一样,低代码也永远无奈彻底取代纯代码开发方式。将来低代码和纯代码形式将以互补的状态长期共存,各自在其所适宜的业务场景中发光发热。在前面的“低代码业务场景”章节,会具体列出哪些场景在现阶段更适宜用低代码模式开发。 ...

November 17, 2020 · 1 min · jiezi

关于bootstrap:专访李飞飞-从清华附中高材生到阿里飞刀一口井钻出云原生

简介: 他初三上清华,现在是达摩院数据库首席科学家。李飞飞从学术界走向工业界,率领阿里云技术团队一手打造了云原生分布式数据库,让阿里「全面上云」的战斗再下一城。明天,他用一口水井为咱们道出了云原生! 如果要用一个关键词来定义中国当下的生产时代,“双11”是再贴切不过了。 从2009年11月起,它只花了十年的工夫,就从一个只有27家商户参加的打折日,变成了一个全民狂欢的生产节,2019年曾经有超过18万家品牌加入,累计成交额更是高达2684亿元。 每年的双11,都是互联网的流量洪峰。 面对逐年攀升的成交额数据,到底是什么作为撑持呢?阿里巴巴团体副总裁、阿里云智能事业群数据库产品事业部总裁、达摩院数据库与存储实验室负责人李飞飞在新智元专访中走漏,去年双11交易峰值达到了每秒55万笔,而每笔交易又能拆分成很多个事务,总的下来每秒会有几百万的transaction事务在0:00:01那一刻产生,交易量会暴涨133倍。比如说之前一秒有一个,当初就是一秒有133个。 短时间内如此高的增长,对后端的计算和存储系统的挑战微小。零碎的弹性、可扩展性及高可用性要十分好,不然难以撑持霎时的交易暴涨。 这是对数据迷信的极大挑战,也是每个有抱负的「数据科学家」最好的舞台,李飞飞为这个舞台筹备了20年。 从清华附中腾飞:李飞飞如何走上数据迷信之路?李飞飞从小喜爱深挖钻研,加入了很多数学和物理比赛。 在清华附中的国家教委文科实验班,没有了高考的压力,李飞飞便一头扎进了比赛里。 16岁是个分水岭。那一年,他初三毕业进入了国家教委文科实验班,确定了后续输送进清华的路线。 本科的毕业设计,让他第一次接触到了数据迷信。那个年代,大数据还没有衰亡,但在过后的李飞飞看来,这个工作具备前瞻性的意义。 即便来到了2017年,「数据科学家」这个岗位也仍然很「理性」。 因为过后,数据迷信还不是一门大热学科,「数据科学家」的概念还停留在表层,很少有人能透过干燥和乏味参悟到其中的魅力。 从2001年初到2002年上半年,在这一年多的工夫里,李飞飞都沉迷在本人的毕设我的项目里,每天都和外文网站上的海量数据打交道。 通过对BBC、CNN等网站信息的拆解并剖析Hyperlink资源,胜利将网站的构造拓扑进去,并描绘出一个残缺的后盾,还初步实现了对网站信息的自动化了解。 「当初回头来,咱们过后这个我的项目看其实是十分超前的,以过后的技术的确也也不大可能lead to somewhere」,在谈到本科毕设的我的项目时,李飞飞如是说。 尽管过后只用了一些分词、词频统计等简略的办法,然而曾经有了古代NLP技术的影子。真正有前瞻思考的人总是走在时代的后面。 「01、02年左右,还没有大数据的概念,但实质上,我认为大数据和数据库是同源同本的,也就是对数据的治理和解决。」 「这个我的项目对我的锤炼很大,过后的那个人工智能,包含深度神经网络跟NLP的技术还没有倒退起来,其实过后曾经有神经网络,我本科期间上过这门课,印象还很深,感觉这个成果很好,然而过后因为集群的规模、算力的限度,也没有深度的网络。」 管中窥豹,可见一斑。 通过这个我的项目,李飞飞很早地意识到了数据驱动的力量和永无止境的摸索空间。 「在那个年代,很多的下层利用剖析,很多时候是rule-based,也就是规定驱动,定义规定,而后依据这个来搭建零碎,但过后咱们做那个我的项目就曾经感触到数据驱动的力量。 「数据从生产、解决到存储、生产,这个全链路的了解、开掘和治理,是永远没有止境的,因为数据量在一直地变大。数据类型在一直地这个复杂化。基于这些数据构建的下层利用也在多样性,也在多样化」 数据的开掘和治理如同一个滚滚向前的车轮,随着时代和技术的演进一直向前,激发了李飞飞在这个畛域摸索一直摸索的激情。 在这个具备超前意识我的项目的陶冶下,李飞飞毅然决然地走上了数据迷信的路线,转而到美国波士顿大学攻读数据库系统和大数据。之后又先后在佛罗里达和犹他大学计算机系任教,从助理传授到副教授,一路做到正传授,这一干就是10年。 这所低调的名校在图形处理方面和零碎方向颇有名气,赫赫有名的驰名软件公司Adobe联结创始人John Warnock,就是在犹他大学实现了本科和博士学位。 连驰名动画公司皮克斯也是犹他大学教授和博士生独特创建,还出过三个图形图像方向的图灵奖获得者。 互联网Internet的前身—ARPANET 的诞生通常被认为是网络流传的“创世纪”,由西海岸的4个节点形成:加州大学洛杉矶分校( UCLA)、斯坦福研究院(SRI)、加州大学圣塔芭芭拉分校(UCSB)和犹他大学(UTAH),其中之一就在犹他大学计算机系。 零碎方向的顶级会议OSDI的最佳论文奖Jay Lepreau Award也是以犹他大学计算机系传授Jay Lepreau命名的。 阿里云总裁一席话让他决然退出阿里:技术发明新商业谈到在数据迷信路线上的引路人,李飞飞讲到了驰名的数据库畛域的图灵奖获得者Michael Stonebraker。 提到Stonebraker一般读者可能不相熟,然而在畛域内,他所搭建的支流开源数据库PostgreSQL简直是无人不知无人不晓。 Stonebraker不仅仅research做得好,也能做到真正的system driven research,做传授期间又开了很多家在行业内影响深远的数据库公司。 在数据库畛域,他是学术科研能力和技术产品化能力联合的榜样。在飞刀的印象里,Stonebraker堪称真正的旗帜性人物。 在高校职教的八九年,让李飞飞更深刻地意识到学校和工业界的不同。学校是一个绝对来讲更加自在的气氛,造就的人也更加纯正,科研就是把简单的问题简单化,去找寻最实质的问题,而公司有更强的导向性,以市场、客户需要为导向。公司的短期指标更加明确。 「在公司里你要思考的是,如何将技术变成产品,如何将产品变成商品。而在学校里,你更关注的是在技术层面去翻新冲破,可能还没有到产品,或者远远没有到商品,这两者的能力象限要求是齐全不同的。」李飞飞在采访中提到。 在高校做科研的岁月里,李飞飞获奖有数,获IEEE ICDE 2014 10年最有影响力论文奖、ACM SIGMOD 2016最佳论文奖、ACM SIGMOD 2015最佳零碎展现奖、IEEE ICDE 2004最佳论文奖等,然而走出高校的象牙塔,工程化产品化的吸引力也在感召着他。 回国之前,李飞飞也屡次接触过谷歌Facebook等硅谷大厂,但最终抉择回国退出阿里,还要源于时任阿里巴巴CTO、现任阿里云总裁张建锋的一番话。 面试时, 张建锋的一句话深深感动了他,「技术发明新商业」,让飞刀深刻思考起技术的实质。 「最初我想明确,咱们从技术角度思考的是性能晋升多少,老本升高多少,但最终实质上驱动这个社会倒退演进的是商业的力量。」 从这个意义上讲,阿里云的达摩院和数据库事业部正是科研和商业的有机联合,钻研技术的同时还能够参加产品的商业化过程,正中靶心。 此外,阿里外部包含电商、物流、新批发、金融等在内的多样化业务和海量数据带来的丰盛挑战也给了飞刀小试牛刀的用武之地。 「从一个历史长河的角度来看,可能发明商业价值的技术才是真正有生命力的,我真的是这样感觉。」飞刀总结说。 从清华附中腾飞:「一口井」钻出云原生数据库事实中也有很多相似双十一的场景,都须要一个能够弹性扩容的数据库来撑持。 ...

November 13, 2020 · 1 min · jiezi

关于bootstrap:用-Mars-Remote-API-轻松分布式执行-Python-函数

Mars 是一个并行和分布式 Python 框架,能轻松把单机大家耳熟能详的的 numpy、pandas、scikit-learn 等库,以及 Python 函数利用多核或者多机减速。这其中,并行和分布式 Python 函数次要利用 Mars Remote API。 启动 Mars 分布式环境能够参考: 命令行形式在集群中部署。Kubernetes 中部署。MaxCompute 开箱即用的环境,购买了 MaxCompute 服务的能够间接应用。如何应用 Mars Remote API应用 Mars Remote API 非常简单,只须要对原有的代码做少许改变,就能够分布式执行。 拿用蒙特卡洛办法计算 为例。代码如下,咱们编写了两个函数,calc_chunk 用来计算每个分片内落在圆内的点的个数,calc_pi 用来把多个分片 calc_chunk 计算的后果汇总最初得出 值。 from typing import Listimport numpy as npdef calc_chunk(n: int, i: int): _# 计算n个随机点(x和y轴落在-1到1之间)到原点间隔小于1的点的个数_ rs = np.random.RandomState(i) a = rs.uniform(-1, 1, size=(n, 2)) d = np.linalg.norm(a, axis=1) return (d < 1).sum()def calc_pi(fs: List[int], N: int): _# 将若干次 calc_chunk 计算的后果汇总,计算 pi 的值_ return sum(fs) * 4 / NN = 200_000_000n = 10_000_000fs = [calc_chunk(n, i) for i in range(N // n)]pi = calc_pi(fs, N)print(pi)%%time 下能够看到后果: ...

November 4, 2020 · 5 min · jiezi

关于bootstrap:模拟驾驶能力输出赋能客户提升稳定性信心

简介: 模仿驾驶能力输入,赋能客户晋升稳定性信念 1.背景咱们技术服务团队常常会遇到这样的情况,随时随地收到紧急电话,开始缓和地排查问题,解决故障以及复原服务。硬盘故障、网络不通、大量不到终态、水位高、流量激增等问题举不胜举,兴许因为一个很小的变更,因某种不可预期的场景,引起蝴蝶效应,导致了大面积的零碎凌乱、故障和服务中断,对客户的业务造成重大影响。故障往往带来微小的损失,然而因为分布式系统的个性,各种不可预期的突发事件在劫难逃,单靠人力并不可能百分之百地阻止其产生。与其担惊受怕零碎会呈现什么样的问题,不如化被动为被动,提前模仿线上环境可能呈现的各种状况,来测验咱们的零碎是否能做到容错,是否在呈现问题时依然具备对外提供服务的能力。模仿驾驶的初衷就是通过实验性的办法,被动找出零碎中的软弱环节,让人们建设起简单分布式系统在生产中抵挡突发事件的信念。任何足够简单的零碎都不可避免地带有让人意想不到的暗债,暗债是古代软件系统逐渐复杂化过程中的副产品,它会威逼零碎的失常运行。模仿驾驶的意义就在于,它会帮忙你发现暗债,从而在暗债变成零碎的重大问题之前加以应答,防止造成损失。 2.模仿驾驶模仿驾驶是GTS-SRE混合云团队遵循混沌工程试验原理,并交融团队外部多年高可用体系积淀下来的教训而打造的一款技术服务,提供丰盛的故障场景、异样仿真的实现,可能帮忙分布式系统晋升容错性和可恢复性,以期帮忙更多的政府和企事业单位做好稳定性建设。 2.1根底服务内容 图1:模仿驾驶根底服务内容框架 2.1.1混沌工程课程培训 混沌工程学培训课程波及三个专题,共八章,20大节的内容。课程从混沌工程学的实践登程,交融阿里外部实际,通过由混合云历史故障库和故障能力库中精炼总结得来的经典案例,深入浅出地解释了如何实现混沌工程试验,包含所须要面对的挑战、推动的筹备项、采纳的工具以及模仿驾驶的施行办法,是混沌工程学实际的入门课程。通过课程的学习,能够帮忙用户达到以下的指标: 理解混沌工程学根本的概念、准则、前提、作用以及利用;理解混合云在混沌工程学实际的工具包;理解具体实施混沌工程试验的办法;理解各场景的模仿驾驶演练操作方法;参加混合云混沌工程的社区共建。2.1.2模仿驾驶工具包 试验注入工具-Apsara Chaos PlatformApsara Chaos Platform(简称ACP)是混合云一款遵循混沌工程原理和混沌试验模型的试验注入工具,帮忙企业晋升分布式系统的冗余容错能力、故障隔离能力、可观测性,并且在企业上云或往云原生零碎迁徙过程中提供弹性能力和易用性能力的保障。ACP可反对丰盛的异样仿真场景,包含边界异样仿真(如docker异样等)、应用层仿真(如过程假死、异样退出等)、零碎层仿真(如CPU、内存、磁盘空间等系统资源耗费)、硬件层仿真(如网卡抖动、带外重启等),并且在异样场景编排的异样类型节点,能够对此模拟能力进行实例化。监控告警工具-TAM Alarm CenterTAM Alarm Center(简称TAC)是SRE团队为混合云精心打造的一站式告警运维平台,笼罩混合云所波及的云产品、大数据、云实例以及用户所波及的站点利用等告警,提供告警生命周期治理以及报警外发等解决方案。帮忙混合云疾速发现、定位异样问题。目前,中国区100+我的项目已部署TAC,其中有40%+的我的项目能够通过钉钉、短信或邮件的形式实现告警外发。无效地进步了告警解决效率,缩小因告警未及时处理导致故障的状况,大幅提高我的项目运维品质,缩小我的项目人力投入老本。故障诊断工具-SRE-CLISite Reliability Engineer - Command-Line Interface(简称SRE-CLI)是一款黑屏化控制台的故障诊断工具,可能依据异样场景从场景库中匹配查看项进行主动诊断并确认异样起因,归档异样详细信息,最终给出解决倡议。SRE-CLI可帮忙混合云疾速发现、定位异样问题的起因,提供从问题形容、故障定位及诊断、输入诊断报告、提供解决倡议的全方位“问诊”服务。目前,云平台底座产品天基的40%问题曾经可能通过SRE-CLI工具进行诊断定位,从而缩小了人工手动排查的工夫,无效地进步了故障解决效率,大幅提高我的项目运维品质,缩小我的项目人力投入老本。巡检及问题诊断工具-铜雀铜雀专一于智能化巡检及问题诊断,是TAM和驻场服务团队日常工作中的首要工具。它能让TAM和驻场服务团队从日常繁琐的巡检工作中解放出来,将精力投入到更有价值的客户服务中去,通过买通云平台侧、租户侧及利用侧的信息,辅助利用运维及优化,并通过工具化伎俩晋升现场问题剖析定位的能力和速度。铜雀目前作为混合云企业版的规范输入产品,曾经可能100%笼罩V3平台的局点。目前铜雀的性能次要是以巡检为核心,后续将逐步将故障应急、高频变更、问题诊断能力补充上来,并将铜雀的根底能力凋谢进去,使产品、驻场、TAM等人员的教训一直积淀到零碎中,打造以铜雀为核心的运维生态圈。2.2服务案例2.2.1背景 某电力集团客户想验证云平台的高可用性以及阿里的故障应急能力,在沟通之后理解到SRE-TAM团队有业余欠缺的模仿驾驶能力,遂提出服务申请,邀请技术服务团队至业务现场进行赋能培训及演练服务。 2.2.2指标 技术服务团队心愿通过本次服务晋升客户对混沌工程这一理念的认知和对云平台的理解,同时帮忙现场同学和客户晋升故障的应急解决能力,提振平台稳定性信念。 2.2.3服务概述 技术服务团队调研并收集我的项目现场信息;赋能客户,进行混沌工程培训课程的讲授(包含混沌工程概述、混合云混沌工具包介绍、模仿驾驶三个专题); 图2:客户现场进行赋能培训 进行工具的筹备及部署工作,在业务现场部署了ACP和SRE-CLI工具,对已部署的TAC工具进行了降级工作;客户提供了演练工夫窗口,技术服务团队依照规范流程(后期查看、故障注入、告警查看、故障诊断&复原)进行了五个场景的模仿驾驶演练;领导客户应用工具进行操作演练并答疑; 图3:客户现场领导操作并答疑 2.2.4成绩 通过本次模仿驾驶的服务,增强了客户对混沌工程试验的认知和加深了客户对云平台高可用性的理解: 通过手把手地领导并且协同客户一起从故障注入到故障发现最初到解决故障的试验全流程实际,客户对模仿驾驶的影响范畴和爆炸半径有显著的体感,对混沌工程的准则有了肯定的认知;模仿驾驶演示后,客户对云平台的自愈能力和健壮性示意深度认可,并且对前期进行常态化、机制化的演练动向比拟强烈;客户很乐意参加混合云模仿驾驶的共建。3.总结及思考凡人说“实际是测验真谛的唯一标准”,然而在发展模仿驾驶之旅的过程中,是无奈欲速不达地达到试验的最现实状态的,那咱们能够依照怎么的门路去施行第一次模仿驾驶试验呢?首先,所谓模仿驾驶的实验性是为了摸索“未知”的危险,找到暗债,然而实际中无妨先从“已知”开始。通过对“哪里最可能出问题”的思考和探讨,咱们评估出零碎潜在的弱点和预期后果,这能够让你对演练的优先级有所把握:哪些潜在问题更有可能产生或结果更重大。团队能够通过记录并总结历史故障类型、产生频次以及对应的依赖项等,从而对“哪里最可能出错”有初步的意识。当你感觉某一项可能存在问题时,先从这类场景注入故障会是一个好的开始。其次,在试验施行前咱们需先创立一个假如,这会是一个很好的团队思维练习。通过探讨这个场景,你能够在运行它之前对预期后果进行假如,比方这个失败对客户、企业或对你的依赖项有什么影响?在运行第一个试验之后,你可能会遇到两个后果之一:验证了系统对引入的故障是否具备弹性,或者发现须要修复的问题。这两个后果都很好。如果是第一种状况,你加强了对系统及其行为的信念;如果是后者,你则在零碎导致停机之前发现了问题。最初,模仿驾驶试验主张“在离生产环境越近的中央进行试验越好越实在”,但咱们认为从理论状况的角度来看,这取决于组织对这一理念的接受程度。那么让各方都比拟释怀的一种比拟温和的试验门路是从线下逐步走到生产。不过对于分布式系统而言,部署不同、流量不同都会带来不一样的后果,唯有在生产环境中进行试验能力真正验证,否则会大大地减弱这些实际的价值。就如同人类要打疫苗能力罢黜未知的病痛,零碎的稳定性建设也离不开模仿驾驶,心愿咱们的团队能够更多地将模仿驾驶技术能力输入,赋能更多的客户,来晋升反脆弱性和零碎稳定性的信念! 原文链接本文为阿里云原创内容,未经容许不得转载。

November 3, 2020 · 1 min · jiezi

关于bootstrap:从-Storm-迁移到-Flink美团外卖实时数仓建设实践

简介: 本文次要介绍一种通用的实时数仓构建的办法与实际。实时数仓以端到端低提早、SQL 标准化、疾速响应变动、数据对立为指标。 作者:朱良 本文次要介绍一种通用的实时数仓构建的办法与实际。实时数仓以端到端低提早、SQL 标准化、疾速响应变动、数据对立为指标。 在实践中,咱们总结的最佳实际是:一个通用的实时生产平台 + 一个通用交互式实时剖析引擎相互配合同时满足实时和准实时业务场景。两者正当分工,相互补充,造成易于开发、易于保护、效率最高的流水线,兼顾开发效率与生产成本,以较好的投入产出比满足业务多样需要。 01 实时场景 实时数据在美团外卖的场景是十分多的,次要有以下几点: 经营层面:比方实时业务变动,实时营销成果,当日营业状况以及当日实时业务趋势剖析等。生产层面:比方实时零碎是否牢靠,零碎是否稳固,实时监控零碎的健康状况等。C 端用户:比方搜寻举荐排序,须要实时理解用户的想法,行为、特点,给用户举荐更加关注的内容。风控侧:在外卖以及金融科技用的是十分多的,实时危险辨认,反欺诈,异样交易等,都是大量利用实时数据的场景02 实时技术及架构1. 实时计算技术选型 目前开源的实时技术比拟多,比拟通用的是 Storm、Spark Streaming 以及 Flink,具体要依据不同公司的业务状况进行选型。 美团外卖是依靠美团整体的根底数据体系建设,从技术成熟度来讲,前几年用的是 Storm,Storm 过后在性能稳定性、可靠性以及扩展性上是无可替代的,随着 Flink 越来越成熟,从技术性能上以及框架设计劣势上曾经超过Storm,从趋势来讲就像 Spark 代替 MR 一样,Storm 也会缓缓被 Flink 代替,当然从 Storm 迁徙到 Flink 会有一个过程,咱们目前有一些老的工作依然在 Storm 上,也在一直推动工作迁徙。 具体 Storm 和 Flink 的比照能够参考上图表格。 2. 实时架构① Lambda 架构 Lambda 架构是比拟经典的架构,以前实时的场景不是很多,以离线为主,当附加了实时场景后,因为离线和实时的时效性不同,导致技术生态是不一样的。Lambda 架构相当于附加了一条实时生产链路,在利用层面进行一个整合,双路生产,各自独立。这在业务利用中也是牵强附会采纳的一种形式。 双路生产会存在一些问题,比方加工逻辑 double,开发运维也会 double,资源同样会变成两个资源链路。因为存在以上问题,所以又演进了一个 Kappa 架构。 ② Kappa 架构 Kappa 架构从架构设计来讲比较简单,生产对立,一套逻辑同时生产离线和实时。然而在理论利用场景有比拟大的局限性,在业内间接用 Kappa 架构生产落地的案例不多见,且场景比拟繁多。这些问题在咱们这边同样会遇到,咱们也会有本人的一些思考,在前面会讲到。 03 业务痛点 在外卖业务上,咱们也遇到了一些问题。 ...

October 26, 2020 · 2 min · jiezi

关于bootstrap:SAE-的极致应用部署效率

简介: SAE 在利用创立、部署、重启过程中的效率优化。 作者 | 文俊 阿里巴巴云原生团队本文整顿自《Serverless 技术公开课》 作为 Serverless 平台,SAE 提供了利用全托管的服务,充分利用了云原生的技术红利,以容器作为利用载体,提供了麻利的部署、编排、弹性等能力。SAE 屏蔽了底层的基础设施,对于用户来说,感知到的最底层资源是利用实例自身,利用创立、部署等操作是用户交互的次要接口。 接下来将介绍咱们在利用创立、部署、重启等过程所做的效率优化工作。 利用创立首先是利用创立。目前,用户界面可通过镜像或 war、jar 安装包的形式部署利用,最初在平台侧,以对立打包成容器镜像的形式进行散发,而后平台去申请计算、存储、网络等 IAAS 资源,再开始创立容器执行环境和利用实例。 在这个过程中,波及到调度、云资源创立和挂载、镜像拉取、容器环境创立、利用过程创立等步骤,利用的创立效率与这些过程严密相干。 咱们很自然而然地能想到,这其中局部过程是否能并行,以缩小整个创立的耗时呢?通过对每个过程的耗时剖析,咱们发现其中的一些瓶颈点,并且局部执行步骤之间是解耦独立的,比方云弹性网卡的创立挂载和利用镜像拉取,就是互相独立的过程。基于此,咱们将其中独立的过程做了并行化解决,在不影响创立链路的同时,升高了利用创立的时耗。 利用部署利用的部署,即利用降级。咱们晓得,传统的利用部署过程能够分为以下几个步骤: 首先创立新版本的实例;而后期待实例启动、业务过程 ready 后,接入流量,即创立对应 SLB 后端;最初将老版本实例从 SLB 后端摘除并销毁。在分批公布的场景下,如此持续循环下一批实例,进行滚动降级。咱们能看到,在这个过程中,利用实例产生了重建,同时实例 ip 也会产生浮动。 上文咱们讲到,利用实例的创立过程包含调度、云资源创立挂载、镜像拉取、容器环境创立、利用过程拉起等步骤,对于利用部署而言,齐全能够不必重走一遍所有的流程,因为咱们须要的仅仅是基于新的镜像,创立新的利用执行环境和过程而已。 因而,咱们实现了原地部署的性能,在滚动降级过程中,保留原来待降级利用实例及其挂载的云网络、云存储资源,只更新实例的执行环境,无需通过调度、云资源创立等过程。这样,原来的部署流程也简化为: 摘流,将运行实例从 SLB 后端摘除 -> 原地降级实例 -> 接入流量原地降级后,利用实例仍放弃原来的 ip。通过测试,对于 2 实例利用,部署效率将晋升4倍,将部署时长从原来的将近 1 分钟缩短到十几秒。 利用重启最初,简略介绍下咱们行将推出的原地重启性能。 重启实例在某些运维场合是必要的操作,说到利用重启,咱们心愿相似于 linux 零碎一样,能够只执行一次 reboot,而不是重建实例。具体的做法是,咱们在容器环境下,通过容器引擎 API 执行一次启停操作即可。原地重启相比原地降级,省去了镜像更新和执行环境创立的过程,并且相比 ECS,容器的重启更轻量,能达到秒级。 该性能近期会上线,敬请期待。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 23, 2020 · 1 min · jiezi

关于bootstrap:从等等到秒开再到直开是什么让闲鱼社区相见恨晚

简介: 快让我叉会儿腰~ 作者:闲鱼技术-颂晨 背景闲鱼前端页面的性能经常被人念叨,凡跳转、必跳鱼 的印象深入人心,局部页面甚至须要跳四五下能力关上,最近咱们对闲鱼前端页面系统性的做了些优化,因为闲鱼前端技术栈绝对多元,不同栈技术原理各不相同,优化计划也有所差别,本文次要介绍目前闲鱼占比拟重的 Weex 页面的优化过程。闲鱼 Weex 页面多以前端渲染为主,其关上过程与 Web 页面稍微相近,大抵分为以下几个阶段:咱们将「从开始加载(navigationStart)到屏幕首次 paint(绘制)像素内容」的这段时间称为 白屏工夫(FP),将「从开始加载(navigationStart)到首屏内容全副渲染实现」的这段时间称为 首屏工夫(FSP),受限于统计口径,目前 Weex 下的首屏工夫是不蕴含图片下载及后续过程的。 优化前后咱们拿闲鱼的直播频道页和玩家频道页作为参考,通过录屏的形式看下优化前后的比照:  通过录屏分帧的形式咱们统计了下这两个频道页在不同零碎不同机型下的首屏时长:能够看到,优化前 iOS、Android 支流机型上的首屏工夫都要超过 2s,低端机甚至要 3-5s,优化后各机型的首屏工夫均大幅降落,低端机首屏时长管制到了 2s 内,中高端机近乎直开。 拆解剖析确定优化计划前咱们对现有的 Weex 页面做了拆解剖析,从后果来看,以下几个因素对首屏工夫的影响较大: Bundle 体积:不仅影响 Bundle 加载时长,同时也影响 Bundle 的解析执行耗时(低端机尤为显著)首屏数据申请:页面渲染必须在首屏数据申请返回后,接口耗时间接影响首屏工夫首屏渲染范畴:首屏渲染量间接影响渲染时长(低端机尤为显著)优化计划基于下面的剖析调研,咱们初步把优化计划定为四层: 依照预期优化成果,Weex 页面的关上过程是这样的:体现在上述的四层构造中,次要蕴含以下几个优化点: Bundle 离线具体实现是将 Weex Bundle 以资源包为单位、以 URL 前缀为索引,通过肯定的更新策略离线到客户端本地,之前的更新策略次要有 拜访后装置、启动装置** 两种,对应的更新机会如下:这套机制在容器层有对立的计划撑持,然而包命中率始终不高(25% - 55%),导致最终成果差强人意,剖析后发现默认的更新策略(拜访后装置)与页面回访率强相干,闲鱼的前端页面大都是频道导购型的页面,回访率人造不高,所以包命中率绝对应也不会高。本次优化次要是对更新策略进行了扩大,减少了 “闲时装置” 的更新策略:会在定时更新期间被动装置,如果装置后未应用,则会在一周之后淘汰;如果一周内应用过,则进入惯例的更新淘汰机制(一个月未应用淘汰)。在 “闲时装置” 的更新策略上线后,包命中率大幅晋升(稳固后 90% 左右),页面性能也失去了显著晋升:不依赖首屏接口渲染的页面甚至能够达到「直开」:  数据预取传统的首屏数据申请都是在 Bundle 解析完当前发动的,首屏数据返回后渲染页面,是个典型的串行过程。本次优化中咱们把这个串行的过程并行化了: 将首屏申请的配置序列化当前作为参数配置到了 URL 上,同时反对一些动静替换的参数(譬如经纬度、城市等参数);在 navigationStart 的时候由客户端提取首屏申请配置,而后发动申请,并将后果以特定的 Hash Key(通过首屏配置生成的)作为索引存储到本地;在业务层真正发动首屏申请的时候会通过 Hash Key 进行比对,命中后将数据取出来返回给业务层;时序图如下: 非凡状况下的时序图:具体的技术细节本文不再赘述,数据预取的优化策略上线后,首屏工夫也失去了肯定水平的晋升,如下(iOS 侧因为各优化策略并行上线,没能做到繁多变量采集性能数据,暂以 Android 侧为参考):Bundle 离线、数据预取 的优化策略上线后,局部页面在中高端机型上迫近「直开」:  ...

October 23, 2020 · 1 min · jiezi

关于bootstrap:IEEE-EDGE-2020论文Astraea-以优雅的方式在边缘部署AI服务

简介: 近日,阿里云边缘计算团队博士后付哲的论文《Astraea: Deploy AI Services at the Edge in Elegant Ways》入选2020年IEEE边缘计算国内会议(IEEE International Conference on Edge Computing),并在大会上进行了宣讲。他和他的团队如何对待以上问题,本文将为您解答。 前言为什么说边缘计算带来了数据、计算的依据变动?边缘AI是边缘计算最重要的利用之一,它的挑战是什么?一个用于边缘计算场景的新型AI服务部署平台——Astraea是如何诞生的?如何通过Astraea一键化部署边缘AI服务?近日,阿里云边缘计算团队博士后付哲的论文《Astraea: Deploy AI Services at the Edge in Elegant Ways》入选2020年IEEE边缘计算国内会议(IEEE International Conference on Edge Computing),并在大会上进行了宣讲。他和他的团队如何对待以上问题,本文将为您解答。 边缘计算:5G时代对云网交融的挑战近年来,边缘计算曾经成为信息和通信技术中最热门的钻研畛域之一。随着5G时代的到来,越来越多的设施连贯到互联网上,随同着视频直播、云游戏、VR/AR、主动驾驶等带宽耗费和提早敏感的利用,给云计算带来了微小的挑战。 边缘计算反对分布式计算模式,将计算和数据资源转移到凑近最终用户的边缘节点,从而为新时代的翻新利用提供高带宽、低提早和大规模连贯能力。 边缘计算带来了数据、计算散布的根本变化。5G有以下个性:eMBB(增强型挪动宽带)、uRLLC(超牢靠低提早通信)、mMTC(大规模机器类型通信)。这些个性驱动着越来越多的数据和计算从云端转移到边缘。有行业报告示意:在5G时代,80%数据和计算将产生在边缘。 边缘 AI 是边缘计算的重要利用之一与此同时,边缘人工智能越来越受到人们的关注。Gartner去年的一份报告显示,Edge-AI正从其幼年期走向高峰,预计将在2-5年内达到成熟期。咱们时常在媒体报道中看到如下说法:边缘人工智能是下一波人工智能,人工智能是边缘计算中最常见的负载,人工智能是边缘计算的杀手级利用,等等。 人工智能的思维形式与人类的思维形式十分类似。一个人从过来产生的事件中吸取教训,从而失去一生的教训,如果有新的问题,他/她可能会从他/她以前学到的教训中失去解决办法。就像人类所做的一样,人工智能模型是从训练数据中训练进去的,如果有新的数据,模型就会输入后果。第一阶段称为训练,第二阶段称为推理。训练和推理是人工智能的两个次要阶段。 训练阶段须要大量的计算能力,因为它须要大量的矩阵乘法和迭代,而且即便应用GPU这样的硬件加速,对于简单的模型通常也须要几个小时或几天的工夫。推理阶段须要绝对较低的响应工夫,特地是对于某些对提早敏感的应用程序,如主动驾驶等等。推理的整个过程应该在不到1秒甚至更短的工夫内实现。随着神经网络越来越深刻和简单,海量的计算资源需要暴发,在挪动设施上进行人工智能推理变得越来越艰难。 云-边-端计算工作卸载与合作新兴的边缘计算范式带来了一个更好的解决方案,将人工智能服务的局部计算迁徙到边缘,以缓解提早和带宽瓶颈。这存在两个关键问题:第一个问题是是否将工作从云或终端设备卸载到边缘,第二个问题是如何以适当的形式将任务分配给云、边缘和终端设备。 咱们设P为终端设备、边缘服务器和云服务器的解决能力,C为计算任务量,D为须要传输的数据,B为终端设备与边缘节点或核心云之间的带宽。如果等式(1)成立,将计算从终端设备迁徙到边缘服务器能够缩小响应工夫。如果等式(2)成立,则将计算迁徙到边缘服务器后的性能优于迁徙到核心云。 然而,边缘AI仍旧存在痛点和难点。次要蕴含以下三个方面: 难部署 •AI框架品种泛滥,算法模型难以间接部署到生产环境,提供服务调用接口 •边缘资源类型异构,不同AI服务对资源需要不同 难运维 •生产环境的 AI 服务须要反对服务生命全周期治理,包含版本升级、灰度公布、状态监测、主动扩缩容等等 难调度 •边缘计算是典型的分布式系统,须要为终端用户抉择适合的边缘资源提供边缘AI服务,同时在用户体验、算力老本和流量老本上做到最优衡量 人工智能模型的开发人员和数据科学家通常不晓得或不太关怀他们的模型在生产环境中是如何服务的。例如,在边缘部署模型时,必须思考到不同框架的AI模型须要不同的部署形式,同时也须要一个API服务器将AI模型对外提供给终端用户。此外,边缘人工智能服务还须要全生命周期治理的能力,包含版本升级、灰度公布、主动缩放等,以及灵便的调度能力,以优化用户体验、计算成本和流量老本之间的衡量。 Astraea的诞生因而,阿里云边缘计算团队提出了Astraea — 一个实用于边缘计算场景的新型AI服务部署平台,它简化了部署阶段,同时充分利用了边缘计算的劣势。一个AI服务开发者只需提交模型、相干调用脚本和边缘资源需要,Astraea负责镜像构建、资源分配、模型服务和状态监测等全过程,最终提供规范的Restful API供终端设备应用。 Astraea具备以下长处。首先,Astraea的用户只须要提交不到10行的模板配置,Astraea可能在1分钟工夫内构建映像,在5分钟工夫内实现服务边缘部署。其次,Astraea反对Scikit learn、TensorFlow、Pythorch、ONNX等多个人工智能框架,能够一键化为AI服务主动生成Restful API。借助Astraea以及阿里云边缘节点服务,AI服务能够下沉到间隔用户10公里的范畴内。同时,Astraea基于阿里云边缘节点服务能力实现运维自动化。 如何通过Astraea一键化部署边缘AI服务 ...

October 22, 2020 · 1 min · jiezi

关于bootstrap:面对复杂业务ifelse-coder-如何升级

作者 | 张建飞  阿里巴巴高级技术专家 导读:针对业务在不同场景下的差别,咱们经常会习惯性地应用 if-else 来实现不同的业务逻辑,长此以往代码越来越难以保护。那么如何打消这些 if-else?面对简单业务应如何思考和剖析?本文分享阿里高级技术专家张建飞(Frank)对于简单业务治理的方法论,介绍一种多维度剖析问题的办法:矩阵分析法。You should not be a if-else coder, should be a complexity conquer. ——Frank 这篇文章,是对之前我在《阿里高级技术专家方法论:如何写简单业务代码?》说的“自上而下的结构化合成 + 自下而上的形象建模”方法论的降级。因为在之前的方法论中,咱们短少一个多维度看问题的视角,这种维度思维的缺失,可能会导致 miss 掉一些重要的业务信息,从而使咱们制订软件设计策略的时候,陷入艰难。 有了维度思维,咱们便能够更加方面的去看清业务的全貌,更加全面的掌握业务信息,从而帮忙咱们更加体系化的去治理复杂性。 从 if-else 说起我常常说,咱们不要做一个 if-else coder。这里的 if-else,不是说咱们在 coding 的时候不能应用 if-else,而是说咱们不应该简陋地用 if-else 去实现业务的分支流程,因为这样随便的代码堆砌很容易堆出一座座“屎山”。 业务的差异性是 if-else 的本源。以批发通的商品业务为例。不同的解决场景,其业务逻辑实现是有差异性的。如下图所示,商品业务的差异性,次要体现在商品类型、销售形式和仓储形式的不同。 这三个维度上的差别组合起来,有 2 3 2 = 12 之多。这就是为什么在老代码中,到处能够看到 if(组合品) blabla,if(赠品) blabla,if(实仓) blabla 之类的代码。 那么,要如何打消这些厌恶的 if-else 呢?咱们能够思考以下两种形式: 多态扩大:利用面向对象的多态个性,实现代码的复用和扩大。代码拆散:对不同的场景,应用不同的流程代码实现。这样很清晰,然而可维护性不好。多态扩大多态扩大能够有继承和组合两种形式。继承勿用多言,组合有点像策略模式,也就是把须要扩大的局部封装、形象成须要被组合的对象,而后对其进行扩大,比方星环的能力扩大点就是这种形式。 这里,咱们举一个继承的例子,商品在上架的时候要查看商品的状态是否可售,普通商品(Item)查看本人就好了,而组合商品(CombineItem)须要查看每一个子商品。 用过程式编码的形式,很容易就能写出如下的代码: public void checkSellable(Item item){ if (item.isNormal()){ item.isSellable(); _//省略异样解决_ } else{ List<Item> childItems = getChildItems(); childItems.forEach(childItem -> childItem.isSellable()); _//省略异样解决_ }}然而,这个实现不优雅,不满足 OCP,也短少业务语义显性化的表白。更好的做法是,咱们能够把 CombineItem 和 Item 的关系通过模型显性化的表达出来。 ...

October 21, 2020 · 1 min · jiezi

关于bootstrap:开发者故事阿相入职蚂蚁两年成长感悟

我15年从浙工大毕业,退出一家守业公司做全栈开发,后续又经验丁香园,最终在18年3月来到蚂蚁保险。在蚂蚁经验了2年的成长,获得了肯定后果,并在往年(2020)取得了降职的机会且顺利通过。 2年多下来,对于降职与成长,也有一些感悟,在这里与大家分享,大抵为:三个倡议、一个正告与两个误区。 三个倡议1、此时此刻、非我莫属这是阿里最新的外围价值观之一,顾名思义很好了解。我盲目地过来2年,我在这点儿做的还能够,如果没有「此时此刻,非我莫属」的勇气,很多事件要么实现不了,要么我罗唆就不会有这件事件。更不会有事件带来的挑战,以及级解决挑战带来的成长。 1.1、勿以事小而不为 很多时候,咱们会遇到一些痛点,业务的也好,研发效力的也好。甚至都有了一些小想法,但却始终没口头。因为这些点可能比拟小,或者说投入产出比不够大。其实很多事件出发点的确比拟小,但可能是一个大体系里的一个小问题。想到了,立马去做掉,获得肯定后果,再逐步从这个切入点去摸索其余能够持续建设的事,而后做成体系,可能就成了,咱们称之看大做小,由小及大。 比方说去年我做的保险经营中台,其实是2.0版。这之前曾经保护1年多了,过后产品体验特地差,被骂了一年多,但始终没有改?为什么呢,没有交互、没有产品经理,都是后端同学本人用一个上古搭建服务做的。这个问题就始终没人解,最初我是切实受不了了,本人进去画交互、写PRD,带着几个兄弟撸前端代码,最初实现了体验降级。 你说咱们做了什么小事吗?其实也没有,就是换了换肤,略微晋升了经营的体验。纯靠体验降级,其实也没太多技术难点,我必定也无奈降职,这件事甚至在我的降职PPT中也没提及。但后续基于新的经营平台,咱们开始尝试了更多能力的整合,交融了前端组件、营销搭建等等,最终为经营建设了很多增量能力。 1.2、敢于寻找未知答案 主管可能会给你很多问题,这个问题他本人心里也没明确的答案,你问他也没用。行业内要么找不到,要么就是技术背景、业务背景差别太大难以复制。这个时候很多答案须要本人去推导,有了答案也不晓得正确不正确,跑到线上才晓得。 这个时候很多人都会抉择退缩,即便嘴巴上先许可了,回头也是啥也没干。因为人总是喜爱回到有现成答案的题,依据问题查到答案,而后伪装先本人做一下,做不来再看下参考答案,看下其余大神怎么做。 但很多事件的答案没那么好找的,即便别的部门有看似相似的产品,但业务背景不一样,技术体系不一样,基础设施不一样,人家最多就是给个答案提醒,真正的解还是要本人一直去摸索的。我老板给我命题根本就没怎么给过我答案,兄弟部门的业务状况跟咱们也不太一样。咱们去年做的事件根本都是我跟小组同学一直调研,到处找输出,最初全组同学一直脑暴推导进去的。同时,这个过程也能造就咱们多元多维的体系化思考能力。 1.3、一直开掘业务诉求 有问题再求解,其实还是容易的,程序员最善于的就是求解,但最怕的就是问题都没有。业务仿佛只会提一些简略页面需要,除此之外也没啥技术挑战。其实很多时候,业务是有些很须要「技术挑战」的诉求的,只是他们本人感觉投入产出比低了些,亦或者有时候他们本人也没意识到,原来他们的需要能够用程序解决。 所以外围是:多与业务对话。关怀业务当初痛点,关怀业务目前的经营节奏。聊着聊着可能就有了很多新的想法。 当然,大部分时候可能是聊不出货色的。还有一个形式是:数据意识。去年我做了个营销模板,半年不到上线了300多个页面,起初我写了脚本把每个页面截图进去看了下。发现其实存在大量类似的页面,只是不同渠道换一些头图而已。因而咱们又将闪蝶搭建,交融了保险经营平台精细化经营能力,实现分渠道、分人群配置搭建的能力。 这样的需要,业务就素来没跟我讲过,每次都麻烦地创立十几个类似页面。如果不多察看具体的数据状况,那这个诉求就被掩藏了。 2、正向地影响团队过来两年我的成长其实是离不开主管的输出跟其余共事的帮忙的。有些技术事项,命题是老板给的,事儿是我协同一些人一起做的。为什么主管跟其他同学信赖我,我感觉最要害的,是我本人也始终在「正向地影响团队」。 咱们每个人都心愿本人的团队是一个好的团队,那好的团队有哪些因素?我感觉有如下几方面: 回升空间大:每个人都能有向上成长的空间。技术挑战多:团队存在一些技术专项,能让咱们在一些畛域深刻摸索。团队气氛好:大家相处融洽、互相帮助、乐于分享。 但一个团队不是天生就是有这些好的货色的。如果没有人继续的去做技术分享,建设技术专项,技术气氛不会好;如果每个人都死气沉沉,勾心斗角,团队气氛也不好;如果没有显著的人才梯队跟组织成长机制,回升空间也不大。 所以好的团队依赖于有好的个体,我了解好的集体须要这几个素质: 技术好:技术过硬,能独立解决业务需要。酷爱分享:爱学习,并常常将本人的教训分享别人;也违心将本人的高兴分享给别人。成就别人:乐于帮忙别人、辅导团队,不宽宏大量。然而没有一个环境是完满的,也不可能所有人都是完满的。保险我刚入职时,也就10集体出头,简直没什么技术专项,清一色P6,没有显明的领头羊。不完满的环境,必然也会滋生出一些负能量,有的人深深的藏着负能量,有的安安静静来到,有的人走的时候忽然暴发进去(内网发个大新闻)。 很多事件其实都是具备传染性的,行为、情绪都具备传染性,好的坏的都是。所以团队必定须要更多正能量、侧面行为的人。 我盲目在这些方面做的还能够,常常写文章、做分享、推React Hooks、组织个体CR、组织团建流动、招聘新人、拉技术专项等等,偶然也会说说段子,沉闷一下氛围。置信本人始终是在正向地影响团队的。 每个人性情略有不同,但我置信都有本人的劣势。有的人技术能力特地强,能够多做技术分享,多做提效工具;有的人特地内向开朗、组织力强,能够多组织团队流动,组织一些学习小组。这些都能正向地影响团队。 回到咱们的个人成长上,「正向地影响团队」最要害地是:帮忙咱们建设集体团队影响力,同时取得主管与个体的认可,在一些技术专项上,能够协同更多人,承受更大挑战。 3、做好工夫治理阿里的业务前端很大一部分都逃不开一个「忙」字,总感觉工夫不够用。不必狐疑,工夫是必定不够用的。我也有师弟表白过焦虑:咱们要求30%的工夫投入技术学习与积淀,但现实情况是业务需要曾经把本人打满了。 我本人想了想,感觉还是有一些能够缓解的方法的。 3.1、工夫要拉长看业务前端很容易遇到一整周都在做业务,一点儿没学习的状况(甚至好几周),而后就十分焦虑。我感觉也没必要,工夫是要拉长看的,一时的得失而已,回头补回来就好。之前如果有加班,回头能够有调休。调休时再花工夫学习就好。 3.2、学会回绝 不过很多人会说,才没有工夫调休呢。其实我感觉不是没工夫调休,是不习惯回绝。提前1个星期请好假,我置信很少有老板跟业务方会把你拽回来的。 有的人不违心回绝,是习惯了需要来了,都能做掉。因为做不掉业务提的需要,总感觉就是本人能力不够。其实并不是,业务需要排了那么多,有多少人能全副做完呢? 不过哪些需要能够拒,哪些需要不能拒,本人要有肯定的判断能力,这须要对业务有充沛了解,对业务的策略与打法也要有一些清晰意识。对于业务特地重要,生死攸关的需要,咱们还是应该致力反对的。 总之,该认怂的时候还是要认怂,千万不要一边不认怂,一边埋怨。对本人没任何成长,对团队也是负面影响。 3.3、先做最重要的事 这点承接学会回绝,但其实是最要害的,事件有了优先级,才晓得应该先做什么,应该回绝什么。工夫的问题,实质上是优先级的问题,优先级决定了外围产出。业务提的各类需要、老板提的一些事项、本人的学习打算、家庭与生存,所有的事件本人心田应该要有优先级,要有价值判断。经常性的问下本人来阿里是想要什么。想要成长,那成长的事就是咱们的第一优先级。 4、一个正告:别用战术上的怠惰覆盖策略上的懈怠这句话很多人都听过,艰深的说就是「用简略的事件给艰难的事件当挡箭牌」。为什么是正告呢?因为很多时候,咱们本人对这个点是没意识的,或者说「本人把本人骗了」。 怎么判断本人曾经陷入了「骗本人」的状态了呢?我感觉能够问本人三个问题。 是不是始终在低水平做事,根本不做深度思考?如果你的事项,根本不须要你做过多思考的,比方切切图、写下列表的添删改查。那么无论你有多勤奋,其实都是没卵用的。 忙是不是曾经成为了本人常常挂嘴边的借口?老板每次问你一些技术专项停顿怎么样的时候,如果你始终回最近比较忙。那么根本你也进入了「骗本人」的状态。在我刚虚线带人的时候,我其实是没怎么管人的。为什么呢?因为我一周如果投入半天在治理,大概率可能出不了什么后果。而我如果一周做需要,必定是有产出的。所以其实实质是我心田感觉需要简略,因而去做了需要,借此来回避艰难的事。 是不是对本人半年内的事件无布局?认真想想,本人半年内要做的事件都有哪些?如果很迷茫,还不清晰,阐明其实本人是不足对本人成长的思考的,就依赖于需要推着本人走,这也是有问题的。(当然,有些人是刚入职的,还在接触新环境,在landing的状态,不必过分焦虑)。 人们做事件其实就像一个电路图,电压是你的智商,电流是你的工夫。产出 = 智商 * 工夫。在这个电路中,大部分人都是偏向走电阻小的分支,电阻越小,投入的工夫越多,除非你适时地把那条分支的开关给关了。所以很多自制力差的人,罗唆卸载了抖音。 5、两个误区5.1、好绩效 !== 能降职 可能会有同学感觉本人KPI很清晰,老板也认可,往年干完绩效必定不错,到时候就能够提名降职了。后果发现最初居然没提名降职,而后本人肯定要提名,最初的最初可能也是失败。这里有个误区,3.75 并不等于 能降职。 举个例子,我是小A,一个P6,反对xxx业务,我的KPI设定分4块: 业务奉献:3.75指标是通过肯定伎俩,给业务带来20%增长;技术奉献:3.75指标是通过研发xxx工具,给大家带来20%研发提效;团队奉献:3.75指标是带2个师弟,做5次团队分享,内推2个高级人才;技术危险:3.75指标是通过肯定伎俩,升高了团队故障次数。最终通过一年的致力,我加班加点,一个人顶2个,反对了业务极速增长;形象了一些sdk跟工具办法,给大家研发缩小了15%的工作量;也带了师弟,做了分享,内推了好多集体;技术危险尽管没突出贡献,但全年无故障。最终取得评估375,对应到KPI也差不多是货真价实。但这样就能升吗?不肯定的,最终如果没看到体系化、没看到畛域深度、没看到部门影响力的话,提名了大概率也是失败的。 所以在KPI这块,须要跟主管对齐好预期。千万不要认为375就代表着能够降职,它顶多让你有一个能够本人提名降职的机会,并不代表本人能有降职的能力。像我的话,去年S1做了一个闪蝶模板,撑持了大量营销业务的配置化上线,根本开释了1-2开发人力。然而我的主管始终跟我说,这样还不够,这样还不够,没有体系进去。于是S2又做了很多营销与经营的中台能力建设。 5.2、瓜熟蒂落 !== 不必布局 咱们始终说「降职是瓜熟蒂落的事」,不过我发现会存在一些人存在误会。认为「瓜熟蒂落」的水是工夫。“论资排辈,往年应该到我了吧?”千万不能有这样的想法。「瓜熟蒂落」的水指的是能力,而不是工夫。相同,有些能力可能还会随工夫而「挥发」,尤其是技术能力。5年前,如果精通三大框架、会webpack与打包优化,可能就算是领域专家了。放到当初,可能就属于根底技术要求了。有些技术可能会随工夫过期,有的会随常识的遍及而根底化。 还有的人认为只有一直地做好手上的事,自然而然就会降职了」。降职是一件冲破的事,是冲破了自我,才是瓜熟蒂落。阿里对于前端的JobModel上也可能看出,每一个层级的回升都是有冲破的。P6 -> P7,从「独当一面、辅助团队」 -> 「领域专家、影响团队」。这个不肯定、且大多数时候不肯定是「做好手头事」就能够的。 那怎么样能力降职?我的观点是降职是须要提前布局的。如果降职是我的指标,那我就要布局好这一年半载的门路,以去达到JobModel上曾经拆解好的要害能力。而后把这些要害门路与后果体现在本人的KPI中。(也能够不成为公司零碎上的KPI,仅仅是本人要求本人的KPI) ...

October 20, 2020 · 1 min · jiezi

关于bootstrap:java安全编码指南之死锁dead-lock

简介java中为了保障共享数据的安全性,咱们引入了锁的机制。有了锁就有可能产生死锁。 死锁的起因就是多个线程锁住了对方所须要的资源,而后现有的资源又没有开释,从而导致循环期待的状况。 通常来说如果不同的线程对加锁和开释锁的程序不统一的话,就很有可能产生死锁。 不同的加锁程序咱们来看一个不同加锁程序的例子: public class DiffLockOrder { private int amount; public DiffLockOrder(int amount){ this.amount=amount; } public void transfer(DiffLockOrder target,int transferAmount){ synchronized (this){ synchronized (target){ if(amount< transferAmount){ System.out.println("余额有余!"); }else{ amount=amount-transferAmount; target.amount=target.amount+transferAmount; } } } }}下面的例子中,咱们模仿一个转账的过程,amount用来示意用户余额。transfer用来将以后账号的一部分金额转移到指标对象中。 为了保障在transfer的过程中,两个账户不被他人批改,咱们应用了两个synchronized关键字,别离把transfer对象和指标对象进行锁定。 看起来如同没问题,然而咱们没有思考在调用的过程中,transfer的程序是能够发送变动的: DiffLockOrder account1 = new DiffLockOrder(1000); DiffLockOrder account2 = new DiffLockOrder(500); Runnable target1= ()->account1.transfer(account2,200); Runnable target2= ()->account2.transfer(account1,100); new Thread(target1).start(); new Thread(target2).start();下面的例子中,咱们定义了两个account,而后两个账户相互转账,最初很有可能导致相互锁定,最初产生死锁。 应用private类变量应用两个sync会有程序的问题,那么有没有方法只是用一个sync就能够在所有的实例中同步呢? 有的,咱们能够应用private的类变量,因为类变量是在所有实例中共享的,这样一次sync就够了: public class LockWithPrivateStatic { private int amount; private static final Object lock = new Object(); public LockWithPrivateStatic(int amount){ this.amount=amount; } public void transfer(LockWithPrivateStatic target, int transferAmount){ synchronized (lock) { if (amount < transferAmount) { System.out.println("余额有余!"); } else { amount = amount - transferAmount; target.amount = target.amount + transferAmount; } } }}应用雷同的Order咱们产生死锁的起因是无法控制上锁的程序,如果咱们可能管制上锁的程序,是不是就不会产生死锁了呢? ...

October 16, 2020 · 2 min · jiezi

关于bootstrap:imagepngimgbVcHqGd码住Flink-Contributor-速成指南

简介: 不论初衷是什么,Flink 都十分欢送大家一起建设和欠缺社区。在开始具体的奉献步骤之前,咱们先简要介绍一下参加奉献的几种路径,以及 Clarify 对于开源奉献的一些固有印象。 作者:伍翀(云邪),Apache Flink PMC,阿里巴巴技术专家整理者:陈婧敏(清樾) 本文整顿自 Apache Flink PMC 伍翀(云邪)直播分享,旨在为具备肯定大数据根底、对 Flink 社区倒退感兴趣的同学提供参加奉献的一些教训和流程。 为什么要参加开源社区作为 Apache Flink PMC member 的云邪依据本身经验总结了参加开源社区倒退的三个次要起因。 1. 开源精力「自在」堪称是开源精力的外围,自在意味着世界范畴内自由自在的交换分享与思维的碰撞。云邪自述“拿我集体来说,我在大学阶段正好经验了 Hadoop、Spark 大火的阶段,那时候就特地神往做开源,特地崇拜能熟读源码的大神,特地心愿本人有一天也可能写很多开源代码,让本人写的代码被上万的用户应用。所以对于我来说,参加开源就像是一个喜好一样,违心为之付出工夫和致力。我也很幸运地在毕业后就接触上了开源社区。” 2. 技术成长参加开源是晋升集体代码品质的好办法。开源社区对于代码和设计要求十分高,不像一些外部我的项目绝对随便。对于设计,Flink 社区有一套专门的 FLIP 机制,任何重大的奉献都会通过公开和粗疏的探讨。对于代码,Flink CTO 亲自写了 26 页的 Code style 指南,此外每次提交 PR 后也会收到 Committers 的 Review 倡议,所以继续地在开源社区里奉献代码,对于集体的零碎思维能力和代码能力都有很大晋升。 3. 职业规划如果你在筹备跳槽或是公司外部降职,除了现有的 Title 外,参加开源社区的经验相对是一个加分项,因为开源产品自身就带有网红的标签,而参加其中则有助于进步本身的影响力 & 结识同行业的大牛们。开源奉献除了能间接地反映你的代码能力外,成为 Committer 甚至 PMC member 更能证实你的激情 & 毅力 & 沟通合作方面的 Soft skills(因为这须要你继续实现高质量的奉献,与社区其它成员独特合作,在有意见分歧的时候放弃凋谢敌对的态度 _etc_.)。 如何成为 Contributor1. 奉献路径不论初衷是什么,Flink 都十分欢送大家一起建设和欠缺社区。在开始具体的奉献步骤之前,咱们先简要介绍一下参加奉献的几种路径, 以及 Clarify 对于开源奉献的一些固有印象。 ...

October 15, 2020 · 3 min · jiezi

关于bootstrap:使用bootstrap遇到的问题

在应用bootstrap中的模态框时,点击按钮不会呈现模态框。浏览器报错。 留神上面js文件引入的程序<script src="/js/jquery.min.js"></script><script src="/bootstrap/js/bootstrap.min.js"></script>学习总结,仅供温习用

October 15, 2020 · 1 min · jiezi

关于bootstrap:130-秒揭秘-EDAS-30-如何平滑应对突发流量高峰为您的业务保驾护航

云原生时代下,企业的IT运维面临架构复杂化、业务需要多样化和运维数据海量化等挑战,如何可能实现精准告警、异样智能诊断、根因定位、异样预测和异样主动修复,已成为企业数字化转型的急切需要。 9月26日,阿里巴巴高级技术专家滕圣波在《GOPS寰球运维大会》上发表了题为《云上服务器无人值守与自助服务实战》的主题演讲,分享了阿里云弹性计算团队如何利用人工智能技术赋能运维自动化,实现云上服务器无人值守,帮忙用户升高云服务器实例治理的复杂性,来保障实例服务的稳固和高效运行。本文依据滕圣波的演讲整顿。 图:阿里巴巴高级技术专家滕圣波 本文内容架构:1、云上服务器为什么须要无人值守?2、阿里云无人值守的自服务实战3、无人值守背地的数据和AI 1、云上服务器为什么须要无人值守?运维是一种服务,既蕴含基础设施软件服务、也蕴含人力服务,服务的对象是企业中应用基础设施的业务团队,而云计算IaaS是一种运维服务,服务的对象已倒退为应用云服务的开发人员和运维团队。随着云计算的宽泛落地,大部分企业曾经上云,以后就有100万多家用户的业务运行在阿里云平台上,阿里云平台服务的用户也越来越多。 随着平台用户规模的扩充,咱们发现平台用户在ECS实例运维时广泛面临三个痛点: (1)背景沟通老本高,为什么我的实例出问题了?(2)人工解决须要较长的工夫,为什么这个问题这么久还没有解决?(3)客户操作不通明,问题看起来修复了,可是刚刚你做了什么? 为此,咱们须要重人力投入在客服人员上让用户的问题得以高效解决。为了防止用户规模扩充带来的客户侧运维老本的线性回升,咱们开始利用人工智能技术赋能用户运维治理。在无人批发、无人驾驶成为趋势的时候,咱们认为将来云上服务器也将实现无人值守。 事实上,阿里云弹性计算产品推出十年了,积淀了泛滥ECS实例运维治理教训和异样“行为”法则。所以依靠机器学习的数据驱动,咱们通过异样“行为”数据的剖析,构建了一套云上服务器的无人值守架构,并推出了一系列自助服务,实现了ECS实例的自诊断、自修复、自优化、自运维,帮忙用户升高ECS实例治理的复杂性,从而来保障实例服务的稳固和高效运行。 2、无人值守的自服务实战 云计算IaaS的运维工作能够拆分为服务侧运维和客户侧运维,服务侧运维是云平台的运维工作,通常对用户不可见的,次要波及基础设施、根底产品和下层管控三个层面,包含机房、物理设施的运维工作、资源虚拟化、资源调度、热迁徙等工作。随着用户规模的扩充,这些运维工作会越来越简单。而用户侧运维工作,是对用户本人可见的,次要是用户对ECS实例的批改操作和自动化工作,包含扩容、重启、监控、客服服务、工单反馈、资源编排和运维编排等。 咱们构建的云上服务器的无人值守架构,为阿里云平台用户提供了一系列的自助服务。狭义上看,阿里云的自助服务囊括了ECS实例自身、实例生命周期治理、系统管理和自动化、市场和生态四个维度,如下图。 图:狭义上的自助服务 广义上来说,阿里云自助服务为用户实现了ECS实例的诊断、修复和举荐的性能。当天,阿里云自助服务已提供实例诊断工具、实例优化举荐、主动修复工具、最佳模板举荐和ECS事件自动化等一系列自助服务工具,笼罩了80% ECS常见问题,将问题解决的均匀周期从几小时缩短至分钟级,整个过程无需客服人工参加,无隐衷透露危险,做到了云上服务器的无人值守。将来随着AI+数据的一直驱动,ECS实例的诊断和修复将会越来越精准。 ECS实例的智能诊断依据平台的数据统计,用户在应用ECS实例时次要面临四大类问题:(1)实例无奈近程拜访(2)实例无奈启动/进行(3)实例性能异样(4)磁盘扩容未失效 所以,在智能诊断的能力上,咱们笼罩了ECS零碎服务、磁盘衰弱服务、网络衰弱服务和Guest OS系统配置等维度,用户一键即可实现实例的智能衰弱诊断。 ECS实例的自动化修复在智能诊断实现后,咱们还会为用户提供ECS实例自动化修复计划,在前者定位问题所在之后,自动化修复可能在1-3分钟内解决问题,次要实现ECS零碎服务修复、网络问题修复和磁盘修复。 仅仅实现自动化修复是不够的,咱们认为自动化修复还应该是通明合规的。咱们通过运维编排服务OOS提供自动化引擎,通过云助手命令提供GuestOS内的执行能力,运维编排服务OOS+云助手命令独特帮忙用户实现自动化修复;同时,咱们开源了运维编排服务OOS+云助手命令的代码,做到所有修复逻辑对用户可见;所有修复操作还能够通过ECS实例的镜像、快照和数据备份实现回滚;通过阿里云RAM角色管制实现所有权限可控,通过阿里云操作审计ActionTrail实现所有记录可审计,做到了真正的通明合规。 3、无人值守背地的AI与数据能力让咱们实现智能诊断和自动化修复的,是冰山下弱小的技术撑持——AI+数据。依靠底层的数据中台,咱们实现了包含物理机数据、虚拟化数据、网络数据、管制面数据和GuestOS内数据等数据的采集、荡涤、剖析和模型的构建;加上AI算法的一直调优,咱们搭建了用户画像、决策树、预测和举荐模型等,从而保障异样诊断和主动修复越加的精准和高效。 以后,在整体的ECS自助服务架构中,次要依附管控监控核心实时监测日志服务、中间件监控、API申请监控以及控制台监控和自助诊断的数据,通过机器学习引擎实现问题预警和解决,进而驱动运维编排服务OOS实现自动化修复问题。 通过这套AI驱动的自服务架构,以后阿里云ECS实时内存异样感知准确率在70%以上,施行预测链路延时则管制在100s以内;另外交融专家教训、案例库和知识库,咱们构建了一个弱小的诊断决策树,为放慢问题的定位和修复提供了强有力的根据。 近两年,阿里云弹性计算团队继续一直地投入构建异样行为数据集,将来打算将其演进成为阿里巴巴团体在异样预测上的“ImageNet 数据集”并进行开源,心愿能为异样预测在业内的倒退奉献更大的价值。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 14, 2020 · 1 min · jiezi

关于bootstrap:维大杀器来了未来云上服务器或将实现无人值守

云原生时代下,企业的IT运维面临架构复杂化、业务需要多样化和运维数据海量化等挑战,如何可能实现精准告警、异样智能诊断、根因定位、异样预测和异样主动修复,已成为企业数字化转型的急切需要。 9月26日,阿里巴巴高级技术专家滕圣波在《GOPS寰球运维大会》上发表了题为《云上服务器无人值守与自助服务实战》的主题演讲,分享了阿里云弹性计算团队如何利用人工智能技术赋能运维自动化,实现云上服务器无人值守,帮忙用户升高云服务器实例治理的复杂性,来保障实例服务的稳固和高效运行。本文依据滕圣波的演讲整顿。 图:阿里巴巴高级技术专家滕圣波 本文内容架构:1、云上服务器为什么须要无人值守?2、阿里云无人值守的自服务实战3、无人值守背地的数据和AI 1、云上服务器为什么须要无人值守?运维是一种服务,既蕴含基础设施软件服务、也蕴含人力服务,服务的对象是企业中应用基础设施的业务团队,而云计算IaaS是一种运维服务,服务的对象已倒退为应用云服务的开发人员和运维团队。随着云计算的宽泛落地,大部分企业曾经上云,以后就有100万多家用户的业务运行在阿里云平台上,阿里云平台服务的用户也越来越多。 随着平台用户规模的扩充,咱们发现平台用户在ECS实例运维时广泛面临三个痛点: (1)背景沟通老本高,为什么我的实例出问题了?(2)人工解决须要较长的工夫,为什么这个问题这么久还没有解决?(3)客户操作不通明,问题看起来修复了,可是刚刚你做了什么? 为此,咱们须要重人力投入在客服人员上让用户的问题得以高效解决。为了防止用户规模扩充带来的客户侧运维老本的线性回升,咱们开始利用人工智能技术赋能用户运维治理。在无人批发、无人驾驶成为趋势的时候,咱们认为将来云上服务器也将实现无人值守。 事实上,阿里云弹性计算产品推出十年了,积淀了泛滥ECS实例运维治理教训和异样“行为”法则。所以依靠机器学习的数据驱动,咱们通过异样“行为”数据的剖析,构建了一套云上服务器的无人值守架构,并推出了一系列自助服务,实现了ECS实例的自诊断、自修复、自优化、自运维,帮忙用户升高ECS实例治理的复杂性,从而来保障实例服务的稳固和高效运行。 2、无人值守的自服务实战 云计算IaaS的运维工作能够拆分为服务侧运维和客户侧运维,服务侧运维是云平台的运维工作,通常对用户不可见的,次要波及基础设施、根底产品和下层管控三个层面,包含机房、物理设施的运维工作、资源虚拟化、资源调度、热迁徙等工作。随着用户规模的扩充,这些运维工作会越来越简单。而用户侧运维工作,是对用户本人可见的,次要是用户对ECS实例的批改操作和自动化工作,包含扩容、重启、监控、客服服务、工单反馈、资源编排和运维编排等。 咱们构建的云上服务器的无人值守架构,为阿里云平台用户提供了一系列的自助服务。狭义上看,阿里云的自助服务囊括了ECS实例自身、实例生命周期治理、系统管理和自动化、市场和生态四个维度,如下图。 图:狭义上的自助服务 广义上来说,阿里云自助服务为用户实现了ECS实例的诊断、修复和举荐的性能。当天,阿里云自助服务已提供实例诊断工具、实例优化举荐、主动修复工具、最佳模板举荐和ECS事件自动化等一系列自助服务工具,笼罩了80% ECS常见问题,将问题解决的均匀周期从几小时缩短至分钟级,整个过程无需客服人工参加,无隐衷透露危险,做到了云上服务器的无人值守。将来随着AI+数据的一直驱动,ECS实例的诊断和修复将会越来越精准。 ECS实例的智能诊断依据平台的数据统计,用户在应用ECS实例时次要面临四大类问题:(1)实例无奈近程拜访(2)实例无奈启动/进行(3)实例性能异样(4)磁盘扩容未失效 所以,在智能诊断的能力上,咱们笼罩了ECS零碎服务、磁盘衰弱服务、网络衰弱服务和Guest OS系统配置等维度,用户一键即可实现实例的智能衰弱诊断。 ECS实例的自动化修复在智能诊断实现后,咱们还会为用户提供ECS实例自动化修复计划,在前者定位问题所在之后,自动化修复可能在1-3分钟内解决问题,次要实现ECS零碎服务修复、网络问题修复和磁盘修复。 仅仅实现自动化修复是不够的,咱们认为自动化修复还应该是通明合规的。咱们通过运维编排服务OOS提供自动化引擎,通过云助手命令提供GuestOS内的执行能力,运维编排服务OOS+云助手命令独特帮忙用户实现自动化修复;同时,咱们开源了运维编排服务OOS+云助手命令的代码,做到所有修复逻辑对用户可见;所有修复操作还能够通过ECS实例的镜像、快照和数据备份实现回滚;通过阿里云RAM角色管制实现所有权限可控,通过阿里云操作审计ActionTrail实现所有记录可审计,做到了真正的通明合规。 3、无人值守背地的AI与数据能力让咱们实现智能诊断和自动化修复的,是冰山下弱小的技术撑持——AI+数据。依靠底层的数据中台,咱们实现了包含物理机数据、虚拟化数据、网络数据、管制面数据和GuestOS内数据等数据的采集、荡涤、剖析和模型的构建;加上AI算法的一直调优,咱们搭建了用户画像、决策树、预测和举荐模型等,从而保障异样诊断和主动修复越加的精准和高效。 以后,在整体的ECS自助服务架构中,次要依附管控监控核心实时监测日志服务、中间件监控、API申请监控以及控制台监控和自助诊断的数据,通过机器学习引擎实现问题预警和解决,进而驱动运维编排服务OOS实现自动化修复问题。 通过这套AI驱动的自服务架构,以后阿里云ECS实时内存异样感知准确率在70%以上,施行预测链路延时则管制在100s以内;另外交融专家教训、案例库和知识库,咱们构建了一个弱小的诊断决策树,为放慢问题的定位和修复提供了强有力的根据。 近两年,阿里云弹性计算团队继续一直地投入构建异样行为数据集,将来打算将其演进成为阿里巴巴团体在异样预测上的“ImageNet 数据集”并进行开源,心愿能为异样预测在业内的倒退奉献更大的价值。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 14, 2020 · 1 min · jiezi

关于bootstrap:SpringCloud-应用在-Kubernetes-上的最佳实践-高可用弹性伸缩

作者 | 三未 前言弹性伸缩是一种为了满足业务需要、保障服务质量、均衡服务老本的重要利用管理策略。弹性伸缩让利用的部署规模可能依据实时的业务量产生动静调整,在业务高峰期扩充部署规模,保障服务不被业务冲垮;在业务低谷期缩减部署规模,防止资源节约。 因为大部分云资源是按需取用,按量计费模式,相比应用 IDC,应用云的用户从弹性伸缩取得的老本劣势是非常明显的,弹性伸缩也是大多数云上用户的抉择。而对于如何用好弹性伸缩,始终是用户十分关怀的问题,本文尝试围绕这个话题,给出一些相干的思考和优化实际。 有两种实现弹性伸缩办法,一种是“垂直弹性”,即“Scale Up”,另一种是“程度弹性”,也就是“Scale Out”。 1. 垂直弹性伸缩垂直弹性伸缩个别是指通过升降服务器的规格来实现的弹性伸缩。这种伸缩形式对利用自身简直没有束缚,能够被大部分利用或组件应用,它的问题次要在两个方面: 动静调整服务器的规格而不影响下层部署的利用,对基础设施要求比拟高,对于许多云厂商而言是个难题,并不能实现业务齐全无感的动静变配;垂直弹性无奈冲破单台物理设施的规格限度,面向巨量的突发业务增长,垂直弹性的应答能力是有下限的。2. 程度弹性伸缩而程度弹性伸缩恰恰相反,它依附增减服务器的数量来实现弹性伸缩,对基础设施的要求不高,程度弹性除了能够解决容量下限的问题,多正本部署还能带来更高的可靠性,因为被宽泛的应用在生产零碎中,很多时候程度弹性也成了弹性伸缩的代名词,所以咱们后文的讲述的次要也是程度弹性。 微服务与弹性伸缩程度弹性尽管存在诸多劣势,但它对于利用自身的要求相比垂直弹性是更高的,开发者在应用前须要要思考好以下的问题: 多正本部署要求利用自身无状态化,如何抽离利用中的状态信息并放弃配置同步?弹性伸缩导致利用实例自身是不稳固的,如何保障利用实例之间能实现牢靠的互相调用?这些恰好也是微服务架构要解决的问题,而 SpringCloud 作为宽泛应用的微服务框架天然不例外,拿问题对号入座的来看: 其一,通过 SpringCloud,开发者能够将原先单体利用中无状态的局部拆解进去,以服务的模式来组织业务逻辑,无状态的服务自身是能够进行程度伸缩的,另外 SpringCloud 提供了很易用的集中式配置管理能力,确保了配置信息能够被高效的散发和同步;其二,SpringCloud 的服务注册和发现机制,使得服务能够动静的减少或移除实例,通过熔断等服务治理机制能够进一步晋升近程调用的可靠性。换个角度看,催生微服务的驱动力之一,就是开发者心愿利用云的弹性伸缩能力来实现经营老本和服务质量的均衡,因而微服务从设计上就思考到了要利用弹性伸缩的能力,它们之间是原本就是相辅相成,严密相干的。 原生的弹性伸缩利用架构反对只是应用弹性伸缩的必要条件之一,想用好弹性伸缩,另外还有两个关键点须要思考:在什么机会触发弹性伸缩,以及弹性伸缩产生进去的利用如何部署,即规定触发和实例调度。 在云原生的体系中,K8s 管制了利用的生命周期治理,在弹性规定触发与实例调度方面,K8s 也提供了相干的能力,足够实现利用弹性伸缩的整个过程。 K8s 中,无状态利用通常以 Deployment 的模式进行部署,弹性伸缩过程由 Horizontal Pod Autoscaler(HPA)来进行管制,开发者设定 CPU 或内存的指标使用率与 Deployment 的正本数区间,由 HPA 负责定时从监控数据中计算并设定指标的正本数,至于实例的调度过程则交由 K8s 的 Scheduler 来管制。 参考:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/  如何优化弹性伸缩?看起来借助 K8s 的 HPA 机制就能够很轻易的给微服务利用提供弹性伸缩能力,但这样真的就足够了吗?没有那么简略,在弹性伸缩上,目前 SpringCloud 和 K8s 的默认机制依然存在诸多有余,如果短少齐备而强壮的计划,将其间接用于生产零碎,其实是很容易踩坑的。怎么做能力保障弹性伸缩精准到位,过程如丝般顺滑,这是咱们写作本文,提供最佳实际的意义。 EDAS 作为一站式的分布式应用治理平台,对于弹性伸缩这样波及利用监、管、控全方位的场景,在对弹性伸缩的反对上做了零碎的设计,打磨出许多性能点,目标是为用户应用弹性伸缩的“减负”,使其能真正落地到用户生产零碎中。 顺着刚提到的两个关键点,规定触发与实例调度,咱们来看 EDAS 在优化弹性伸缩方面是如何思考与实现的。 1. 规定触发罕用的弹性伸缩规定是基于监控数据来进行触发的,K8s 也自带了基于 CPU 和内存监控来触发弹性伸缩的性能。但仅有这两种指标并不够,相比根底监控数据,利用指标数据对于业务量的反馈更为间接和敏感,能够说是适宜弹性伸缩参考的“黄金指标”。 但因为 K8s 无奈获取到利用的监控信息,这些信息只能通过自定义扩大 API 的形式来实现,对于用户来说,须要了解 K8s 的扩大机制,有肯定的学习老本;而且,基于监控数据的规定无奈实现实例数从 0 到 1 的扩容,这也不利于实现极致的老本管制。 ...

October 13, 2020 · 1 min · jiezi

关于bootstrap:一文快速入门分库分表必修课

之前有不少刚入坑 Java 的粉丝留言,想零碎的学习一下分库分表相干技术,可我始终没下定决心搞,眼下赶上公司我的项目在应用 sharding-jdbc 对现有 MySQL 架构做分库分表的革新,所以借此机会出一系分库分表落地实际的文章,也算是本人对架构学习的一个总结。 我在网上陆陆续续的也看了一些有对于分库分表的文章,可发现网上同质化的材料有点多,而且知识点又都比拟系统,还没有具体的实战案例。为了更深刻的学习下,我在某些平台买了点付费课程,看了几节课发现有点教训的人看还能够,但对于新手入门来说,其实学习难度还是蛮大的。 为了让老手也能看得懂,有些知识点我可能会用更多的篇幅加以形容,心愿大家不要嫌我啰嗦,等这分库分表系列文章完结后,我会把它做成 PDF 文档开源进来,能帮一个算一个吧!如果发现文中有哪些谬误或不谨严之处,欢送大家交换斧正。 具体实际分库分表之前在啰嗦几句,回头温习下分库分表的根底概念。 什么是分库分表其实 分库 和 分表 是两个概念,只不过通常分库与分表的操作会同时进行,以至于咱们习惯性的将它们合在一起叫做分库分表。 分库分表是为了解决因为库、表数据量过大,而导致数据库性能继续降落的问题。依照肯定的规定,将本来数据量大的数据库拆分成多个独自的数据库,将本来数据量大的表拆分成若干个数据表,使得繁多的库、表性能达到最优的成果(响应速度快),以此晋升整体数据库性能。 如何分库分表分库分表的核心理念就是对数据进行切分(Sharding),以及切分后如何对数据的疾速定位与查问后果整合。而分库与分表都能够从:垂直(纵向)和 程度(横向)两种纬度进行切分。 下边咱们就以订单相干的业务举例,看看如何做库、表的 垂直 和 程度 切分。 垂直切分垂直切分有 垂直 分库 和 垂直分表。 1、垂直分库垂直分库相对来说是比拟好了解的,核心理念就四个字:专库专用。 按业务类型对表进行分类,像订单、领取、优惠券、积分等相应的表放在对应的数据库中。开发者不能够跨库直连别的业务数据库,想要其余业务数据,对应业务方能够提供 API 接口,这就是微服务的初始状态。 垂直分库很大水平上取决于业务的划分,但有时候业务间的划分并不是那么清晰,比方:订单数据的拆分要思考到与其余业务间的关联关系,并不是说间接把订单相干的表放在一个库里这么简略。 在肯定水平上,垂直分库仿佛晋升了一些数据库性能,可实际上并没有解决因为单表数据量过大导致的性能问题,所以就须要配合程度切分形式来解决。 2、垂直分表垂直分表是基于数据表的列(字段)为根据切分的,是一种大表拆小表的模式。 例如:一张 order 订单表,将订单金额、订单编号等拜访频繁的字段,独自拆成一张表,把 blob 类型这样的大字段或拜访不频繁的字段,拆分进去创立一个独自的扩大表 work_extend ,这样每张表只存储原表的一部分字段,再将拆分进去的表扩散到不同的库中。 咱们晓得数据库是以行为单位将数据加载到内存中,这样拆分当前外围表大多是拜访频率较高的字段,而且字段长度也都较短,因此能够加载更多数据到内存中,来减少查问的命中率,缩小磁盘IO,以此来晋升数据库性能。 垂直切分的长处: 业务间数据解耦,不同业务的数据进行独立的保护、监控、扩大。在高并发场景下,肯定水平上缓解了数据库的压力。垂直切分的毛病: 晋升了开发的复杂度,因为业务的隔离性,很多表无奈间接拜访,必须通过接口方式聚合数据。分布式事务管理难度减少。数据库还是存在单表数据量过大的问题,并未基本上解决,须要配合程度切分。*程度切分前边说了垂直切分还是会存在单库、表数据量过大的问题,当咱们的利用曾经无奈在细粒度的垂直切分时,仍旧存在单库读写、存储性能瓶颈,这时就要配合程度切分一起了,程度切分能大幅晋升数据库性能。 1、程度分库程度分库是把同一个表按肯定规定拆分到不同的数据库中,每个库能够位于不同的服务器上,以此实现程度扩大,是一种常见的晋升数据库性能的形式。 这种计划往往能解决单库存储量及性能瓶颈问题,但因为同一个表被调配在不同的数据库中,数据的拜访须要额定的路由工作,因而零碎的复杂度也被晋升了。 例如下图,订单DB_1、订单DB_1、订单DB_3 三个数据库内有完全相同的表 order,咱们在拜访某一笔订单时能够通过对订单的订单编号取模的形式 订单编号 mod 3 (数据库实例数) ,指定该订单应该在哪个数据库中操作。 2、程度分表程度分表是在同一个数据库内,把一张大数据量的表按肯定规定,切分成多个构造完全相同表,而每个表只存原表的一部分数据。 例如:一张 order 订单表有 900万数据,通过程度拆分进去三个表,order_1、order_2、order_3,每张表存有数据 300万,以此类推。 ...

October 12, 2020 · 1 min · jiezi

关于bootstrap:看动画学算法之排序基数排序

简介之前的文章咱们讲了count排序,然而count排序有个限度,因为count数组是无限的,如果数组中的元素范畴过大,应用count排序是不事实的,其工夫复杂度会收缩。 而解决大范畴的元素排序的方法就是基数排序。 基数排序的例子什么是基数排序呢? 考虑一下,尽管咱们不能间接将所有范畴内的数字都应用count数组进行排序,然而咱们能够思考按数字的位数来进行n轮count排序,每一轮都只对数字的某一位进行排序。 最终依然能够失去后果,并且还能够解脱count数组大小的限度,这就是基数排序。 如果咱们当初数组的元素是:1221, 15, 20, 3681, 277, 5420, 71, 1522, 4793。 先看动画,看下最直观的基数排序的过程: 在下面的例子中,咱们先对个位进行count排序,而后对十位进行count排序,而后是百位和千位。 最初生成最终的排序后果。 基数排序的java代码实现因为基数排序实际上是别离按位数的count排序。所以咱们能够重用之前写的count排序的代码,只是须要进行一些革新。 doCountingSort办法除了传入数组外,还须要传入排序的位数digit,咱们用1,10,100,1000来示意。 看一下革新过后的doCountingSort办法: public void doRadixSort(int[] array, int digit){ int n = array.length; _// 存储排序过后的数组_ int output[] = new int[n]; _// count数组,用来存储统计各个元素呈现的次数_ int count[] = new int[10]; Arrays.fill(count,0); log.info("初始化count值:{}",count); _// 将原始数组中数据呈现次数存入count数组_ for (int i=0; i<n; ++i) { count[(array[i]/digit)%10]++; } log.info("count之后count值:{}",count); _// 这里是一个小技巧,咱们依据count中元素呈现的次数计算对应元素第一次应该呈现在output中的下标。_ _//这里的下标是从右往左数的_ for (int i=1; i<10; i++) { count[i] += count[i - 1]; } log.info("整顿count对应的output下标:{}",count); _// 依据count中的下标,构建排序后的数组_ _//插入一个之后,相应的count下标要减一_ for (int i = n-1; i>=0; i--) { output[count[(array[i]/digit)%10]-1] = array[i]; count[(array[i]/digit)%10]--; } log.info("构建output之后的output值:{}",output); _//将排序后的数组写回原数组_ for (int i = 0; i<n; ++i) array[i] = output[i]; }跟count排序变动不大,区别就是这里咱们须要应用count[(array[i]/digit)%10],来对每一位进行排序。 ...

October 10, 2020 · 1 min · jiezi

关于bootstrap:多数据源一站式入湖

简介: 通过一站式入湖,将不同数据源的数据对立归并到以OSS对象存储为基础架构的集中式数据湖存储中,解决了企业面临的数据孤岛问题,为对立的数据分析打好了根底. 背景数据湖作为一个集中化的数据存储仓库,反对的数据类型具备多样性,包含结构化、半结构化以及非结构化的数据,数据起源上蕴含数据库数据、binglog增量数据、日志数据以及已有数仓上的存量数据等.数据湖可能将这些不同起源、不同格局的数据集中存储管理在高性价比的存储如OSS等对象存储中,并对外提供对立的数据分析形式,无效解决了企业中面临的数据孤岛问题,同时大大降低了企业存储和应用数据的老本. 因为数据湖数据起源的多样性,如何简略高效的将这些异构数据源的数据迁徙到中心化的数据湖存储中,是数据湖构建过程面临的问题.为此,咱们须要提供欠缺的一站式入湖的能力,解决咱们面临的问题,次要包含以下几点: 反对异构数据源对立的入湖形式提供一个简略对立的入湖形式,用户能够通过简略的页面配置实现异构数据源的入湖操作. 满足数据入湖的时效性对于日志、binglog等类型的数据源,须要实现分钟级提早的数据入湖能力,满足实时交互式 剖析场景对时效性的要求. 反对数据源的实时变更对于数据库、TableStore Tunnel等类型的数据源,源头数据会常常产生变更,比方数据层面的update,delete等操作,甚至schema层面的字段构造变更. 须要利用更好的数据格式来反对这类变更行为. 为此,阿里云新推出了数据湖构建(Data Lake Formation,DLF)服务,提供了残缺的一站式入湖解决方案。 整体计划数据湖构建的入湖技术计划如下图所示: 数据入湖整体上分为入湖模板、入湖引擎、文件格式以及数据湖存储四个局部: 入湖模板入湖模板定义了常见的数据源入湖形式,目前次要包含RDS全量模板、DTS增量模板、TableStore模板、SLS模板以及文件格式转换5种模板. 用户依据不同的数据源抉择相应的入湖模板,而后填写源头相干参数信息,即可实现入湖模板的创立,并提交给入湖引擎运行. 入湖引擎入湖引擎应用了阿里云EMR团队自研的Spark Streaming SQL以及EMR Spark引擎,Streaming SQL基于Spark Structured Streaming,提供了绝对欠缺的Streaming SQL语法,极大简化了实时计算的开发成本。对于实时增量模板,下层入湖模板局部将入湖模板翻译成Streaming SQL,而后提交Spark集群运行。咱们在Streaming SQL外面扩大了Merge Into语法来反对update、delete操作。对于RDS等全量模板,则间接翻译成Spark SQL运行。 文件格式DLF反对的文件格式包含Delta Lake、Parquet、json等,更多文件格式比方Hudi也在接入中。Delta Lake和Hudi等文件格式能很好的反对update、delete等操作,同时反对schema merge性能。能够很好的解决数据源实时变更问题。 数据湖存储数据湖数据对立放在OSS对象存储中,OSS提供了海量数据存储的能力,同时在可靠性,价格等方面更具劣势. 一站式入湖计划在很好的解决了后面提的几个问题: 反对异构数据源对立的入湖形式通过模板配置,实现了对立简略的数据入湖形式. 满足数据入湖的时效性通过自研Streaming SQL实现了分钟级提早的数据实时入湖,满足了时效性要求. 反对数据源的实时变更通过引进Delta Lake等更优的文件格式,实现了对update、delete等数据实时变更要求. 实时入湖随着大数据的一直倒退,用户对数据时效性的要求越来越高,实时入湖也是咱们重点关注的场景,目前咱们曾经反对了DTS、TableStore以及SLS的实时入湖能力. DTS增量数据实时入湖DTS是阿里云提供了高牢靠的数据传输服务,反对不同类型数据库增量数据的订阅和生产。咱们实现了DTS实时订阅数据的入湖,反对用户已有订阅通道入湖和主动创立订阅通道入湖两种形式,缩小用户配置老本。 在技术上,反对增量数据对历史数据的update、delete变更操作,实现分钟级提早的数据变更感知能力。技术实现上在Streaming SQL中扩大了merge into语法来对接底层文件格式Delta Lake的相干接口. MERGE INTO delta_tbl AS targetUSING ( select recordType, pk, ... from {{binlog_parser_subquery}}) AS sourceON target.pk = source.pkWHEN MATCHED AND source.recordType='UPDATE' THENUPDATE SET *WHEN MATCHED AND source.recordType='DELETE' THENDELETEWHEN NOT MATCHED THENINSERT *和传统数仓的binlog入仓相比,基于数据湖的计划具备更大的劣势. 在传统数仓中,为了实现数据库等变更数据的入仓,通常须要保护两张表,一张增量表用于寄存每天新增的数据库变更明细数据,另外一张全量表,寄存历史所有的merge数据,全量表每天和增量表更据主键做merge操作. 显然,基于数据湖计划在实现的简略性和时效性上都更优. ...

September 25, 2020 · 1 min · jiezi

关于bootstrap:阿里巴巴电商搜索推荐实时数仓演进之路

简介: 自建实时数仓到底难在哪里?实时数仓应该怎么建?阿里巴巴搜寻团队告诉您答案 作者:张照亮(士恒)阿里巴巴搜寻事业部高级技术专家 业务背景======== 阿里巴巴电商搜寻举荐实时数据仓库承载了阿里巴巴团体淘宝、淘宝特价版、饿了么等多个电商业务的实时数仓场景,提供了包含实时大屏、实时报表、实时算法训练、实时A/B试验看板等多种数据利用反对。 数据的价值咱们认为数据处于阿里巴巴搜寻举荐的大脑地位,这体现在算法迭代、产品经营和老板决策等多个方面。那么数据是怎么在搜寻举荐业务场景中流转的呢?首先是信息采集,用户在应用手机淘宝的搜寻和举荐性能时,会触发到服务端上的埋点信息;接下来会通过离线和实时的ETL加工,再装载到产品引擎外面;而后咱们会基于引擎来构建剖析零碎,帮忙算法、产品做剖析决策;造成一次决策之后,会有一些新的内容上线,用户能够看到算法模型产出的一些业务状态;这样就产生了一轮新的数据采集、加工、装载和剖析的过程。这样一来就能够利用数据造成一个残缺的业务链路,其中每个环节都十分重要。 搜寻举荐典型场景实时数据在电商搜寻举荐中有多种不同的利用场景,如实时剖析、算法利用和精细化人群经营等。1)实时剖析和算法利用场景在实时剖析和算法利用场景中,咱们利用实时数据仓库搭建剖析报表、实时大屏、训练算法模型以及打造其余类型的数据产品。实时数据的需要搜寻举荐场景下次要有以下特点: 数据量大:单日PB级存储单表总条数:_千亿+_QPS高:峰值写入RPS 6500W+峰值查问QPS:_200+_数据灵活性要求高,剖析场景多样化,固定条件高频剖析、非固定条件多维查问2)精细化人群经营场景在电商经营中,常常会有针对不同人群采纳不同经营策略的需要。传统形式应用离线数据对人群进行流动投放,但个别须要到第二天能力看到前一日的流动经营成果。为了更高效地观测、晋升经营成果,实时的人群投放、人群画像成为必不可少的需要。实时数仓将会把实时数据以实时大屏、实时报表的模式,为流动经营提供实时的人群行为成果数据,如不同地区、不同年龄段人群的实时UV、实时成交额等。此外,还须要将实时数据与离线数据进行关联比照计算,提供实时的环比、同比数据。 2.典型实时数仓诉求综合以上背景,在实时数仓建设的过程中,咱们总结了以下几类典型的实时数仓诉求: 分组横截面例如分行业指标展现,通常是在SQL中用group by进行查问; 多维过滤场景过滤、用户过滤、商品过滤、商家过滤等,通常应用array字段进行属性值的过滤; 聚合基于明细数据聚合计算实时指标,如SUM、COUNT_DISTINCT计算等; A/B Test通过解析日志埋点中的分桶字段,计算测试桶与基准桶之间的实时Gap数据; 指定Key在排查问题或观测外围商家指标时,常常须要指定商家ID、商品ID查问实时指标,须要基于明细实时表中的id字段过滤后进行聚合计算; 流批一体因为实时数仓仅保留最近2天的数据,在面对计算同比、环比等需要时,就须要读取离线数据与实时数据进行关联计算,这样产品/经营在看下层报表展示时就能直观看到往年实时数据和去年同期的比照体现。 实时数仓架构========== 基于上诉典型实时数仓诉求,咱们形象出了如下图所示的典型实时数仓架构。实时采集的业务日志通过实时计算Flink荡涤过滤,将后果写到OLAP引擎外面,OLAP引擎既要反对多维的交互式查问、还要反对KV查问和流批一体查问,来满足咱们各种各样的业务诉求,同时OLAP引擎还须要对接下层构建的各种业务利用,提供在线服务。 基于这个典型的实时架构,上面则是咱们搜寻举荐场景下的实时架构演进过程。 1)实时数仓架构 1.0版首先是实时数仓架构1.0版,如下图所示,这个版本次要是由3个板块组成: 数据采集在数据采集层,咱们将上游实时采集的数据分为用户行为日志和商品维表、商家维表、用户维表等,为什么会有维表呢?因为每个业务在埋点时不会将所有信息全副埋在日志外面,如果所有信息都由用户行为日志承载,灵活性将会特地差,所以维表在业务上负责信息扩大的角色。采集的用户行为日志将会实时写入实时计算Flink,用户维表、商品维表等维表数据对立归档至MaxCompute中,在初步计算后将会通过数据同步工具(DataX)同步至批处理引擎中。 数据处理在数据处理层中,流解决局部,由Flink对实时写入的用户行为日志数据做初步解决,具体的解决包含数据解析、荡涤、过滤、关联维表等。批处理局部,为了在数据查问和服务中依据属性查问、筛选数据,须要在Flink作业中将用户的实时行为和维表做关联计算,这就须要批处理零碎可能反对高QPS查问,过后搜寻业务的单表QPS最高达6500万,通过多方调研,抉择了HBase作为维表的批处理引擎。Flink作业中基于用户ID、商品ID、商家ID等关联HBase维表中的属性数据,输入一张蕴含多个维度列的实时宽表,再输入到OLAP引擎。为了简化Flink实时作业,升高实时计算的压力,咱们没有在Flink中应用窗口函数做指标的聚合工作,只是对实时日志简略过滤、关联后间接输明细数据到上游,这就要求上游引擎须要提既要反对KV查问、OLAP多维交互式查问,还要反对流批一体查问。 数据查问和服务在第一版架构中咱们应用的是Lightning引擎来承载Flink输入的实时明细数据,并基于Lightning实现查问流批一体,再对下层利用提供对立的实时数据查问服务。然而Lightning的局限性也是非常明显的:第一是查问形式是非SQL类型不够敌对,若是写SQL须要二次封装。第二是Lightning采纳的是公共集群,多用户资源不隔离,当须要查问大量数据时,容易呈现性能稳定和资源排队等问题,使得查问耗时较久,在理论业务场景应用中有肯定的限度。 2)实时数仓架构 2.0版基于Lightning的限度,咱们心愿能找到一款代替产品,它的能力要在Lightning之上,撑持OLAP的交互式查问以及高QPS的维表校验查问。于是在2.0版的实时数仓架构中,咱们开始接入Hologres。最开始,咱们只是用Hologres代替Lightning提供KV、OLAP查问能力,解决了Lightning所带来的局限性。这样的架构看起来很好,但因为还须要通过HBase存储维表,随着数据量的增长,数据导入至HBase的工夫也越长,实际上节约了大量资源,并且随着线上服务实时性要求减少,HBase的弊病也越来越显著。而Hologres的外围能力之一是减速离线数据,尤其是针对MaxCompute的数据,在底层与其资源买通,能减速查问。所以咱们就萌发了将Hologres代替HBase的想法,以Hologres为对立的存储,数据也无需再导入导出,保障了一份数据一份存储。 于是,最终的实时数仓架构2.0版如下:数据处理阶段间接将用户维表、商品维表、商家维表以行存模式存储到Hologres中,以此代替Hbase存储。Flink中的作业能够间接读取Hologres的维表,与行为日志进行关联。在数据查问和服务阶段,咱们将Flink解决输入的实时明细数据对立存储至Hologres,由Hologres提供高并发的数据实时写入和实时查问。 基于Hologres的最佳实际=================== 实时数仓2.0版本因为Hologres的接入,既精简了架构,节约了资源,也真正实现了流批一体。这个架构也始终应用至今,上面是Hologres基于此架构在搜寻举荐具体多个业务场景中的最佳实际。 1)行存最佳实际Hologres反对行存和列存两种存储模式,行存对于key-value查问场景比拟敌对,适宜基于primary key的点查和 scan,能够将行存模式的表看作是一张相似于Hbase的表,用不同的表存储不同实体的维度信息。在Flink实时作业中能够高效地从Hologres行存表中读取维表数据,与实时流中的实体进行关联。 2)列存最佳实际Hologres中默认表的存储模式是列存,列存对于OLAP场景较为敌对,适宜各种简单查问。基于Hologres的列存模式,咱们搭建了搜寻、举荐业务的实时数据查问看板,在实时看板上能够反对数十个不同维度的实时筛选过滤。在最高峰值每秒写入条数(RPS)超过500万的同时依然能够秒级查问多个维度筛选下的聚合指标后果。同时Hologres表反对设置表数据TTL的属性,个别咱们将一张实时表的生命周期设置为48小时,超过48小时的数据会被主动删除,在实时看板中反对用户对最近两天内的实时数据进行查问,防止了不必要的资源节约。 3)流批一体最佳实际Hologres不仅反对基于实时明细的数据的即席剖析查问,也反对间接减速查问MaxCompute离线表,因而咱们利用这一个性,实现流批一体的查问(实时离线联邦剖析)。 在天猫大促流动中,咱们利用Hologres的联邦剖析能力搭建了外围商家的指标完成率、去年同期比照看板,为经营算法决策提供了无效的数据撑持。其中指标完成率看板开发借助实时离线联邦剖析变得更为简略,即通过Hologres实时查问大促当天的指标,并用实时表的当天指标除以离线表中设定的指标指标,从而让经营可能看到实时更新的外围商家当天指标的实现状况。去年同期比照实时看板的计算逻辑也是相似的,能够在SQL中将实时表与去年的离线表JOIN后进行要害指标的同比计算。所有的计算都能够在Hologres中实现,通过SQL表白计算逻辑即可,无需额定的数据开发工作,一份数据一套代码,升高开发运维难度,真正实现流批一体。 4)高并发实时Update在一些场景下,咱们不仅须要向OLAP引擎实时增量写入数据,还须要对写入的数据进行更新操作(update)。 例如,在订单成交归因时,Flink实时作业会将订单提交数据流与进度点击数据流进行双流JOIN,并且在还须要取订单提交前的最初一次点击事件进行关联。当有多条点击事件先后达到时,咱们就须要更新订单归因明细数据,此时须要利用Hologres的update反对,通过数据的主键更新原有数据,保障成交归因的数据准确性。在实践中Hologres的update写入峰值能达50W,满足业务高并发实时更新需要。 将来瞻望======== 咱们心愿将来基于Hologres引擎继续改良现有的实时数仓,次要的方向次要有: 1)实时表JOINHologres现阶段反对百亿级表与亿级表之间的JOIN,秒级查问响应。基于这个个性,冀望将本来须要在数据处理阶段由Flink实时作业实现的维表关联工作,能够改为在查问Hologres阶段实时JOIN计算。例如表1是明细数据表,表2是用户维表,在查问阶段的JOIN能够通过筛选用户维表,而后与明细数据表关联,达到筛选过滤数据的目标。这样的改良将带来几个益处:1)缩小Hologres中的数据存储量,防止实时表中存储大量的数据冗余(如:同一个商品ID的数据会反复存储);2)晋升实时数据中维度属性的时效性,在查问阶段实时JOIN维表数据后进行计算,能够使得咱们在通过维度筛选数据的时候,始终是用的最新的维度属性。 2)长久化存储咱们将来将摸索如何将罕用维度的实时数据,利用Hologres的计算和存储能力,将计算结果长久化存储。 原文链接本文为阿里云原创内容,未经容许不得转载。

September 25, 2020 · 1 min · jiezi

关于bootstrap:对话猿辅导阿里云远程办公零信任落地创新安全

简介: 大型实战场景验证,灵便应答简单环境。 2020,一场从天而降的新冠疫情,引发了史上最大规模的近程办公。疫情让平安问题裸露得更加突出,与疫情的反抗也是阿里云平安的战场。 9月18日,2020云栖大会技术重磅公布专场,阿里巴巴副总裁、阿里云智能事业部总经理肖力公布“近程办公零信赖解决方案”。 计划基于阿里巴巴团体十几万员工每天大规模近程接入的平安响应,以及疫情期间服务泛滥客户紧急扩缩容的平安实际落地,帮忙百万云上用户理解如何基于一直变动的网络内动静因素构建一套成熟的平安体系,进而体验到与阿里巴巴等同能力的平安服务。 疫情催化近程办公常态化 上半年,近程办公、近程授课等需要在短时间内迅速减少,而种种迹象也显示,这一景象或将常态化。 - Gartner调研显示,在新冠疫情之后,有74%的企业将至多5%的前现场工作人员,转移到永久性的近程职位。 古代简单商业决定了,近程办公早已不局限于传统意义的拜访公司OA零碎、审批零碎、公司邮件、视频会议等常见需要,还包含近程开发、近程测试、近程运维、近程客服等更加简单的场景。 当典型办公场景面临平安挑战寰球累计用户数量冲破4亿的猿辅导,员工总数已达三万余人。疫情期间,响应“复课不停学”的号召,大量员工须要近程办公。 每日须要接入的设施逾十万台,外部IT建设越来越简单,安全隐患逐步浮现,摆在面前的是泛滥的难题: ·员工泛滥而平安力量无限,员工入职、调岗、到职权限治理压力大;·办公网没有综合管控体系,一旦呈现后门存在数据泄露危险;·各利用零碎账户体系扩散,零碎呈现卡顿;·员工办公须要在20多个利用间切换,反复验证体验感差;·大批量应用iPad挪动终端授课,零碎无奈自动识别并进行管控;·企业应用的云化和 SAAS 化,环境更动静多变;·...... 阿里云近程办公零信赖解决方案阿里云近程办公零信赖解决方案以可信、动静为外围,通过可信认证体系的IP、设施、利用,在进入办公网络进行权限获取和数据调用时,凭借可信认证获取权限,实现动静平安检测防护。 整个计划蕴含了三大外围模块:近程终端平安治理、云端动静决策管控、对立可信网络。 近程终端平安治理对近程终端进行可信认证以及身份治理,通过认证的设施能力拜访外部零碎,零碎同时采集剖析终端平安数据,实时而非动态的判断入网设施的安全性。 云端动静决策管控对访问者信息进行对立的高强度平安认证。采纳包含人脸识别、指纹识别、人声辨认、动静二维码、手机短信、令牌等穿插平安认证形式来晋升整个身份认证的强度。同时,零碎会以智能模型剖析可信验证后果,综合判断拜访身份的可信等级,实现用户权限的动态分配。 例如,若某位员工偏离了日常登录地址,忽然有一天显示海内登录,那么零碎就会给出不同的身份认证,匹配不同的拜访权限。 对立可信网络通过IDaaS产品买通了不同利用零碎间的账户认证和受权体系,通过智能管理中心和多种平安管控节点,实现集中权限治理以及全面审计能力,使企业的所有利用零碎可信接入办公网络,帮忙企业晋升安全性与便利性。 阿里云近程办公零信赖解决方案典型利用场景 猿辅导构建全新办公平安体系为了实现欠缺的办公安全性与业务晦涩度、员工体验感的对立,阿里云的近程办公零信赖解决方案进入猿辅导的视线。 主动笼罩所有员工联动治理基于IDaaS平台的集中式身份治理服务,阿里云为猿辅导建设对立身份管理中心,基于设施和人的绑定关系,批量笼罩所有员工的联动治理,全面晋升拜访状况的能见度。 细粒度硬件设施入网组网治理猿辅导网络直播课程中,为保障网络传输速度,提出了须要通过有线网络连接大规模大批量应用iPad的终端资产治理和网络安全需要,阿里云通过管制入网组网,实现了对挪动设施转接头入网状况的突破性辨认,同时监控设施状态,针对设施可能呈现的异样状态做好动静分级的权限治理,联合终端平安检测与杀毒,实现全生态的挪动设施治理。 跨利用免验证高速切换晋升体验IDaaS平台内预置了多种模板利用,同时平台自带开发者服务功能模块,反对利用集成,联合上网行为治理和终端数据防透露能力,高效、平安地实现在猿辅导20多个利用间的便捷切换和对立治理。 继续监控确保全链路可信分段、隔离和管制网络的能力,依然是零信赖网络安全的关键点,阿里云近程办公零信赖策略组合利用了多种现有技术和办法,基于微隔离技术的网络分段,辅以继续的访问控制、安全监控和审计,帮忙猿辅导实现近程拜访过程中网络链路的可信。 计划通过最小受权准则,对进入零碎的任何人和动作进行继续的安全监控和审计,不再以边界防护、IP信赖模式来判断安全性,实现自适应的平安防护。用户无需配置内网准入和VPN,应用公网即可接入办公网络,防止了繁琐配置和技术自身限度带来的网络提早,晋升办公、业务效率和用户体验。 成熟的近程办公零信赖解决方案三大特色: 特色一:通过大型实战场景验证经验过多年的“双11”和 COVID-19 疫情的大考,阿里云近程办公零信赖解决方案在日常办公中继续一直优化对用户身份治理、设施治理、利用和网络管理的实际,胜利撑持来自阿里巴巴团体十几万员工、数十万台设施的近程办公需要。 特色二、面对流量峰值实现业务高效、员工无感承载过诸如双十一期间一天抵挡峰值超百亿次攻打,办公零碎与业务零碎仍不受影响的考验,阿里云帮忙团体外部员工实现无感、平滑、高效的办公网络拜访。这种基于多年实际积攒的丰盛教训,在不同行业实现了进一步的精准落地。 特色三、了解云端环境灵便应答简单场景“云化”和宏大分支机构等状况使平安边界逐渐融化,以边界平安为尺度的防护理念,正疲于应答灵便动静的应用规范,和对平安更加严苛的要求: ·所有的设施、用户和网络流量都应该通过认证和受权;·平安的策略必须是动静的,并基于尽可能多的数据源计算而来。 “云钉一体”是阿里云近程办公零信赖解决方案在数字新基建的大环境下,赋能行业的重要实际,曾经为政务、教育、医疗、新批发、制作等多行业提供多维度的解决方案。 计划基于阿里云平安本身办公网络管理在零信赖架构实际中的精细化打磨和落地教训,为不同行业多样化的业务类型和操作系统提出了定制化的策略设计,完满适配简单办公场景下职场分部多、办公地位不确定、合作厂商多、互联网利用使用量大、资产信息庞杂和业务数据规模大等架构特点,帮忙各行业企业晋升资产信息、用户信息和业务数据的能见度,实现在近程办公场景的动静、智能、无感防护。 原文链接本文为阿里云原创内容,未经容许不得转载。

September 22, 2020 · 1 min · jiezi

关于bootstrap:Kubernetes-新玩法在-yaml-中编程

简介: 如何做性能测试?要么是通过编码的形式实现,写一堆脚本,用完即弃;要么是基于平台,在平台定义的流程中进行。对于后者,通常因为指标场景的复杂性,如部署特定的 workload、观测特定的性能项、网络拜访问题等,往往导致性能测试平台要以高老本能力满足一直变动的开发场景的需要。在云原生的背景下,是否能够更好解决这种问题? 作者 | 悟鹏 引子性能测试在日常的开发工作中是惯例需要,用来摸底服务的性能。 那么如何做性能测试?要么是通过编码的形式实现,写一堆脚本,用完即弃;要么是基于平台,在平台定义的流程中进行。对于后者,通常因为指标场景的复杂性,如部署特定的 workload、观测特定的性能项、网络拜访问题等,往往导致性能测试平台要以高老本能力满足一直变动的开发场景的需要。 在云原生的背景下,是否能够更好解决这种问题? 先看两个 yaml 文件: performance-test.yaml 形容了在 K8s 中的操作流程: 创立测试用的 Namespace启动针对 Deployment 创立效率和创立成功率的监控下述动作反复 N 次:① 应用 workload 模板创立 Deployment;② 期待 Deployment 变为 Ready删除测试用的 Namespacebasic-1-pod-deployment.yaml 形容应用的 workload 模板performance-test.yaml : apiVersion: aliyun.com/v1alpha1kind: Beidoumetadata: name: performance namespace: beidouspec: steps: - name: "Create Namespace If Not Exits" operations: - name: "create namespace" type: Task op: CreateNamespace args: - name: NS value: beidou - name: "Monitor Deployment Creation Efficiency" operations: - name: "Begin To Monitor Deployment Creation Efficiency" type: Task op: DeploymentCreationEfficiency args: - name: NS value: beidou - name: "Repeat 1 Times" type: Task op: RepeatNTimes args: - name: TIMES value: "1" - name: ACTION reference: id: deployment-operation - name: "Delete namespace" operations: - name: "delete namespace" type: Task op: DeleteNamespace args: - name: NS value: beidou - name: FORCE value: "false" references: - id: deployment-operation steps: - name: "Prepare Deployment" operations: - name: "Prepare Deployment" type: Task op: PrepareBatchDeployments args: - name: NS value: beidou - name: NODE_TYPE value: ebm - name: BATCH_NUM value: "1" - name: TEMPLATE value: "./templates/basic-1-pod-deployment.yaml" - name: DEPLOYMENT_REPLICAS value: "1" - name: DEPLOYMENT_PREFIX value: "ebm" - name: "Wait For Deployments To Be Ready" type: Task op: WaitForBatchDeploymentsReady args: - name: NS value: beidou - name: TIMEOUT value: "3m" - name: CHECK_INTERVAL value: "2s"basic-1-pod-deployment.yaml: ...

September 22, 2020 · 14 min · jiezi

关于bootstrap:后台单元测试参数模拟使用MockitoanyTclass而非Mockitoany

前言本周开始就正式开始上课了,虽说这学期结尾不怎么好,然而这学期的课都还挺不错的,学着很有意思,在团队学习了这么长时间,再加上半年多没在教室学习,导致我对老师讲课的形式不是很适应,“万课皆实践”这种形式在我看来是不会教,然而在和团队的同学探讨之后,发现是我全面了,毕竟对于大多数人来说,学习的目标是拿高问题,高绩点,而我想的是要学会怎么用,反正不论怎么样吧,都会好好学的。 问题 @Test void page() throws Exception { int page = new Random().nextInt(); Long courseId = new Random().nextLong(); Long modelId = new Random().nextLong(); Integer difficult = new Random().nextInt(); Subject subject = getOneSubject(); Subject subSubject = getOneSubject(); subject.setSubjects(Arrays.asList(subSubject)); Tag tag = TagControllerTest.getOneTag(); subject.setTags(Arrays.asList(tag)); List<Subject> subjects = new ArrayList<>(); subjects.add(subject); Page<Subject> subjectPage = new PageImpl(subjects); Mockito.doReturn(subjectPage).when(this.subjectService).page(Mockito.any(), Mockito.any(Long.class), Mockito.any(Long.class), Mockito.any(Integer.class), Mockito.any()); String url = baseUrl; this.mockMvc.perform(MockMvcRequestBuilders.get(url) .param("page", String.valueOf(page)) .param("collegeId", courseId.toString()) .param("modelId", modelId.toString()) .param("difficult", difficult.toString()) .param("tags", Arrays.asList(tag).toString())) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].id").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].mark").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].stem").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].analysis").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].createTime").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].difficult").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].used").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].course").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].course.name").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].model").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].options.length()").value(1)) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].options[0].id").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].options[0].content").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].subjects.length()").value(1)) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].subjects[0].id").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].tags.length()").value(1)) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].tags[0].id").exists()) .andExpect(MockMvcResultMatchers.jsonPath("$.content[0].tags[0].name").exists()); }以上是对page()办法进行的单元测试,而后看一下报错: ...

September 5, 2020 · 1 min · jiezi

关于bootstrap:SpringBoot工程下活动Activity模块设计及实现

业务形容基于Spring,MyBatis,SpringBoot,Thymeleaf,Ajax技术实现流动模块的查问,增加等操作。 我的项目环境初始化筹备工作1. MySQL(5.7)2. JDK (1.8)3. Maven (3.6.3)4. STS(4.7.1)数据库初始化关上mysql控制台,而后按如下步骤执行goods.sql文件。 第一步:登录mysql。 mysql –uroot –proot第二步:设置控制台编码方式。 set names utf8;第三步:执行activity.sql文件(切记不要关上文件复制到mysql客户端运行)。 source d:/activity.sql其中activity.sql文件内容如下: drop database if exists dbactivity;create database dbactivity default character set utf8;use dbactivity;create table tb_activity( id bigint primary key auto_increment, title varchar(100) not null, category varchar(100) not null, startTime datetime not null, endTime datetime not null, remark text, state tinyint, createdTime datetime not null, createdUser varchar(100))engine=InnoDB;insert into tb_activity values (null,'ABS','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli');insert into tb_activity values (null,'VALIDATE','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli');insert into tb_activity values (null,'VALIDATE','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli');insert into tb_activity values (null,'ABS','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli');insert into tb_activity values (null,'ACCESS','cuoxiao','2020-02-02 15:00:00','2020-02-03 15:00:00','...',1,now(),'xiaoli');创立我的项目并增加依赖第一步:基于start.spring.io 创立我的项目并设置根本信息。 ...

September 5, 2020 · 3 min · jiezi

关于bootstrap:勒索病毒如何防治看阿里云双拳出击不留隐患

简介: 阿里云与合作伙伴Commvault联结公布勒索病毒防治解决方案,从公共云、混合云等场景动手,提供欠缺的解决方案 在泛滥的数据安全工作中,勒索病毒的防治是近几年备受关注的畛域。从互联网诞生伊始,勒索病毒就相生相伴。当初勒索病毒的防治曾经成为涵盖网络安全、数据备份、人员意识晋升等多方面因素在内的全面的、多线程的一体化工作。 近期,阿里云与合作伙伴Commvault联结公布勒索病毒防治解决方案,从公共云、混合云等场景动手,提供欠缺的解决方案: 1、 公共云计划 基于阿里云云平安核心提供的针对支流勒索、挖矿、DDoS 木马等病毒的实时拦挡能力,能够实现对已知勒索病毒的一键进攻,联合钓饵目录的能力实现对未知勒索病毒的检测和查杀能力。 此外,借助对象存储OSS的WORM(Write once read many)性能,确保数据不可删除、不可篡改,也能够启用版本控制性能,无效避免存储在OSS上的数据被误删除、误笼罩,同时联合跨区域复制能力或HBR备份能力,实现数据的异地灾备。 2、 混合云计划 基于阿里云混合云灾备存储产品提供欠缺的病毒告警、数据备份等服务,可能在生产环境之外建设一个隔离的数据环境来保障数据安全,同时阿里云云平安核心能够在混合云服务器上安装,反对混合云服务器上的勒索病毒一键进攻,联合钓饵目录的能力实现对未知勒索病毒的检测和查杀能力。 2017年5月12日,寰球暴发的勒索病毒WannaCry借助高危破绽“永恒之蓝”(EternalBlue)在世界范畴内暴发。正是在这一次,勒索病毒开始被广为人知。正如在事实世界中病毒会长期存在一样,在网络世界中,勒索病毒同样会长期存在,为了更好的预防这些病毒,须要理解一些相应准则: 首先,一直加固零碎的安全性。须要确保服务器上的所有软件已更新和装置了最新补丁,不存在弱口令的危险,定时备份有价值的数据,关注最新的破绽警报,并立刻扫描其零碎以查找可能被利用的已知CVE,并且在不影响业务的状况下,禁用Powershell、SMB等服务。 其次,增强安全意识。须要造就良好的平安习惯和最佳操作标准,这对于网络及数据安全至关重要。常见的平安操作标准包含: • 除了起源已知和可信的附件之外,不要关上任何附件; • 不要运行从互联网上下载的软件,除非下载的软件起源可信或已实现恶意软件扫描; • 点击电子邮件或社交媒体程序中的链接时务必审慎,即使是来自可信起源和敌人的也不例外; • 平安应用社交媒体。热门主题是欺骗的重灾区,有些链接会疏导至虚伪的登录页面; • 激励员工在发现可疑状况时进行举报; • 如果 Windows 用户在点击 URL 或应用搜索引擎后看到 “被感化”的正告时 ( 这有可能是虚伪的防病毒报警 ),应应用 Alt-F4、CTRL+W 或工作管理器敞开浏览器,而后告诉相干人员。 第三、不要回应。相干专家和事实案例都通知咱们,在零碎感化勒索病毒之后,不要领取赎金。首先,因为赎金多是以比特币的模式领取,比特币本身的特点导致黑客并不知道他收到的赎金的领取者是谁,也就无奈作出相应的解密行为;其次,领取赎金只会让网络犯罪分子确认勒索行为是无效的,进一步变本加厉。 在把握以上准则之后,咱们也须要从行业的理论状况动手,建设欠缺的解决方案。以医疗行业为例,近几年针对医疗机构的勒索软件攻打事件一直增多,究其原因,除了医疗行业本身业务个性之外,在信息化方面投入有余也为黑客提供了可乘之机。 针对医疗行业的信息安全现状有专家概括为:如幼儿抱赤金行于闹市。 首先,一些医疗单位往往疏忽了网络及数据安全的建设。依据相干报告,以后没有及时更新操作系统的医疗机构仍占有肯定的比例,这为数据及业务平安带来极大的安全隐患;其次,医疗行业的数据都是病人的隐衷数据,一旦失落或泄露将造成巨大损失;最初,现阶段整个IT环境是一个异样简单的环境,不同零碎主机需采纳不同的防护计划,导致治理保护工作量大,危险无处不在。 随着挪动医疗、AI医疗影像、电子病历等数字化程序的遍及,医疗数据的安全性和业务连续性越来越重要,为了防止失落重要数据进而影响医疗工作,须要在网络及数据安全爱护和员工教育方面付出肯定的投入。为此,阿里云正联结合作伙伴一直推出欠缺的网络及数据安全解决方案,帮忙包含医疗在内的多个行业更好的预防病毒,抵挡网络攻击,构建一套集危险监测、剖析、灾备等为一体的平安防护体系。 原文链接 本文为阿里云原创内容,未经容许不得转载。

September 4, 2020 · 1 min · jiezi

关于bootstrap:基于实时计算Flink的机器学习算法平台及场景介绍

作者:高旸(吾与),阿里巴巴高级技术专家 1. 前言随着互联网“人口红利”的“耗费殆尽”,基于“T+1”或者离线计算的机器学习平台及举荐零碎转化率与成果日趋“平淡”。后疫情时代的新社会模式及经济状态必将催生出新的商业模式,在线业务及相干利用场景的流量出现井喷式倒退,惯例的离线零碎及离线机器学习平台已无奈满足业务倒退要求。人口红利吃尽之后,基于大数据及AI平台的业务零碎在工夫维度上的思考将变得至关重要,通过业务零碎实时化向工夫要价值曾经成为支流趋势。基于流式计算引擎的在线机器学习平台将越来越被器重, 通过增量模型的准实时或实时举荐零碎更能“因时而异” 充沛捕获指标用户瞬息万变的需要,从而进行精准举荐和变现。实时举荐零碎也从最早的电商场景, 扩大到社交场景, 在线教育场景, 游戏场景及更广大的在线场景。 本文介绍重点介绍基于阿里云大数据及AI产品家族的实时计算Flink及PAI Alink机器学习算法平台,以及该产品组合在实时举荐场景(实用于电商、游戏及在线教育解决方案)、实时评分卡场景(实用于金融、平安及营销风控解决方案)以及异样检测场景(实用于工业畛域及其他产业互联网畛域)的场景利用。 2. 实时计算引擎及机器学习算法平台介绍2.1 阿里云实时计算Flink阿里云实时计算Flink作为Apache Flink开创团队的商业化产品,从极致(较传统微批模式)的实时数据处理维度,为企业大数据处理及业务实时化提供了可能。商业化的对立开发及管控平台,成熟、准标准化的SQL及元数据管理能力,让业务人员及数据分析师大幅度晋升开发效率, SQL配合UDF根本能够解决80%+的业务场景。企业级的State Backend – Gemini大幅度晋升IO效率,整体执行引擎较开源3倍以上的性能晋升。 基于阿里云Kubernetes的全新Serverless全托管云上实时计算Flink服务,应用全新的硬多租技术计划,基于VPC提供网络层隔离,阿里云平安容器提供计算层隔离,基于弹性云盘提供存储级隔离,通过用户级Master及超级Master实现极致资源弹性下的多租户隔离。基于负载的细粒度弹性伸缩, 充沛进步资源使用率, 升高整体TCO。新一代的Serverless实时计算Flink产品为在线机器学习算法平台提供了松软(“时“)的根底。 2.2 阿里云PAI Alink机器学习算法平台 与SparkML算法相比,Alink算法更全面,性能更优异,场景更丰盛(同时反对流批),本地化更杰出(反对中文分词)是疾速搭建在线机器学习零碎的不二之选。 3. 基于实时计算Flink-机器学习场景介绍:3.1实时举荐场景:从依据用户点击和浏览的内容实时推送的电商场景,到社交媒体依据用户浏览的内容实时“喂送“的实时举荐零碎,再到游戏推送平台依据用户行为实时推送的游戏零碎,实时举荐零碎俨然曾经成为了在线业务零碎的外围。 阿里云PAI Alink算法平台提供: 召回(例如:ALS、FM、Deep Walk等),特色编码(OneHot、MultiHot及GBDT等) ,排序(LR及FFM等)以及Online算法(OnlineFM及Ftrl)流式和批式的算法能力全流程构建能力。配合阿里云实时计算Flink海量样本实时拼接能力,可能疾速端到端实现离在线一体化的举荐零碎。 通过特色工程批式训练初始化模型,通过实时样本拼接配合流式算法(OnlineFM及Ftrl) 生成增量的模型,最终提供对立模型的整体后果预测,更实时更动静的晋升举荐成果。 3.2 评分卡场景介绍:阿里云实时计算Flink及PAI Alink产品组合能够帮忙客户疾速搭建实时金融风控解决方案。评分卡在金融场景有宽泛的利用,是否构建精确的评分卡模型关系到是否平安的发展领取、贷款、保险、理财、信用等业务,评分卡常被用于信用评估畛域,比方信用卡危险评估,贷款发放;评分卡也会用来作为分数评估,比方客户品质打分,信用分。波及金融的场景都须要:可追溯、可审计及可解释,如下的评分卡模型就具备很好的可解释性。例如:用户年龄27岁,性别男,婚姻状况已婚,学历本科,月支出10000。依据如下评分卡,该用户的评分为:评分 = 223(基准分) + 8(年龄) + 4(性别评分)+ 8(婚姻状况)+ 8(学历评分)+ 13(月支出评分)= 264分。 阿里云实时计算Flink及PAI Alink产品组合提供最先进的评分卡解决方案, 分箱将每个特色依照需要进行分箱训练;评分卡训练生成评分模型;样本稳定性通过PSI等指标掂量样本稳定性;模型评估,评估二分类模型成果。该解决方案反对多特色维度模型训练,反对大规模样本建模。 3.3 异样检测场景异样检测及时序剖析是一个较为常见并且利用宽泛的场景,在工业界的利用尤甚。利用阿里云实时计算Flink及PAI Alink产品组合能够帮忙客户疾速搭建异样检测解决方案。实时计算Flink弱小的性能与Alink丰盛的算法库机相结合,能够帮忙数据分析和利用开发人员实现数据处理、特色工程、模型训练、预测等多个环节端到端的解决。在异样检测场景下,Alink反对工夫序列异样检测、异样集检测两个外围场景。 在工夫序列异样检测中,Alink具备品种齐全、批流一体、性能优异、并行计算、使用方便等劣势。针对不同的应用场景,分为基于时序预测和时序合成两种类型: 时序预测算法适宜流式数据,即时响应时序合成算法适宜全量数据,可能从全量数据中开掘无效信息。Alink也提供了时序预测和时序合成算法,用户能够独自应用。 异样集检测是风控场景的外围诉求之一。Alink 异样集检测中具备如下劣势: ...

September 2, 2020 · 1 min · jiezi

关于bootstrap:阿里云机器学习怎么玩这本新手入门指南揭秘了

想晓得我是怎么收费在阿里云上玩机器学习的吗? 不慌,这就通知你答案~ 它来了--阿里云向集体收费凋谢云端深度学习开发环境DSW(DataScienceWorkshop),还有收费GPU资源能够应用,试验的数据还会收费保留30天!更有老手玩法指南带你入坑不迷路! 《阿里云机器学习PAI-DSW入门指南》从老手攻略到实际场景,手把手教你疾速从入门到进阶,实战参加评估你的相亲战斗力、CNN手写辨认模型、热狗辨认模型、验证语音降噪等四大场景。 复制该链接到浏览器实现下载或分享:https://developer.aliyun.com/topic/download?id=844[点击收费下载 >>《阿里云机器学习PAI-DSW入门指南》<<](https://developer.aliyun.com/... 目录 领先上手云端IDE:阿里云机器学习与PAI-DSW咱们从用户和技术的两个角度来梳理阿里云机器学习的技术体系大图。从用户的角度来说,依据应用机器学习的深度不同,在云栖大会上,咱们展现了飞天AI平台的技术分层关系: ...... 而PAI-DSW能够实现多实例、多环境,GPU/CPU资源、JupyterLab、WebIDE以及全屏应用Terminal无烦扰工作。目前PAI-DSW曾经向所有阿里云的用户收费凋谢了探索者版!>>点击开始你的云上数据迷信之旅。 新手上路:PAI-DSW实验室创立攻略老手攻略指南:教你四步创立你的PAI-DSW实验室! 第一步:创立并关上你的DSW实验室第二步:创立一个Notebook第三步:写下你的第一行代码并运行第四步:计算一个斐波那契数列>>点击查看具体步骤 疾速进阶:PAI-DSW案例四大实战指南案例一:大数据算命系列之用机器学习评估你的相亲战斗力尽管我不能间接帮你测试你和某个特定的人间接的缘分,然而咱们能够借助哥伦比亚大学多年钻研相亲找对象的心血,通过几个简略的特色来评估你的相亲战斗力指数。收费应用阿里云的DSW探索者版助力测试你的相亲战斗力指数!>>点击下载电子书查看你的后果哦~ 案例二:四步训练出本人的CNN手写辨认模型这一次,咱们要借助阿里云的PAI-DSW来疾速构建训练一个手写模型并且部署出一个生产可用级别的服务的教程让大家能够在其余的产品中调用这个服务作出更加有意思的我的项目。>>点击查看上手步骤哦~ 案例三:如何本人训练一个热狗辨认模型美剧《硅谷》大家想必都没怎么看过,大家可能都不晓得人工智能辨认热狗曾是硅谷最赚钱的技术之一。咱们明天要做都就是这部美剧外面第四季外面让杨建成为百万富翁的模型:热狗辨认模型。这一次,就让阿里云的数据迷信老司机带你一起,利用机器学习PAI平台训练本人的热狗辨认模型,突破技术封闭。让你出任CEO,迎娶白富美/高富帅,走上人生巅峰。>>点击赢取你的人生福利! 案例四:半小时验证语音降噪—贾扬清邀你体验快捷云上开发语音降噪,在开源畛域通过科学计算必定有现有的解决方案。从业务需要上讲,最有价值的一件事件是,怎么让大家能迅速地做POC,架起解决方案? 本文将实战解说贾扬清在答复外部同学提出的业务问题时,给本人设的一个挑战,半个小时架构一个有体感的demo,达到语音降噪的成果。>>点击下载电子书贾扬清带你来体验~

August 27, 2020 · 1 min · jiezi

关于bootstrap:闲鱼靠什么支撑起万亿的交易规模-云原生Talk

简介: 为了撑持起闲鱼万亿的交易规模,王树彬和技术团队正在紧锣密鼓地进行传统巨型利用的 Serverless 化革新,“闯过了 Serverless 的这一关,才是我比较满意的状态。” 造梦者 | 王树彬,阿里巴巴闲鱼架构负责人 2014年6月28日,阿里行将赴美上市的这一年,西溪园区的一个茶水间里,28集体日夜赶工了三个月后,上线了一个闲置交易平台——闲鱼。往年5月份,在阿里巴巴的年报中对外颁布了闲鱼的数据:GMV2000亿元,同比增长100%,每天在线卖家数超过3000万人。 闲鱼曾经从一个茶水间守业的外部小产品,变成了在C2C畛域的当先平台。 据艾媒数据预计,2020年全年的二手物品交易市场的规模将达到万亿以上。线上交易的凋敝亟需技术架构做相应的调整、演进能力撑持业务的疾速倒退。闲鱼对于阿里而言,有比营收更重要的意义,那就是翻新。翻新不只体现在业务模式上,闲鱼的技术架构也在摸索最新的方向——向Flutter化、云原生/Serverless化发展。 2009年,从浙江大学毕业的王树彬,在UT斯康达工作了三年后,退出阿里巴巴。2017年,王树彬首次将Flutter引入到闲鱼,从2018年开始,王树彬率领闲鱼技术团队在下一盘更大的棋:布局Serverless。颠覆性翻新往往是从边缘性的中央呈现,而向云原生化/Serverless化降级,对于闲鱼是一条全新的路,但趟出了这条路,对于很多做线上交易的公司有着微小的借鉴意义。 明天,咱们就一起聊聊闲鱼的云原生故事。 01 为什么要做Serverless?闲鱼是依靠阿里电商体系的前台型业务,有十分独特的业务特点和用户诉求,在底层依靠阿里零碎的同时,在体现层和业务层须要摸索适宜闲鱼的、并且更加疾速灵便的研发体系。 依照传统的开发方式,闲鱼原有的 IT 零碎会面临很多痛点,比方: 1、客户端交互层、服务端业务胶水层、畛域层边界划分不清晰,这就导致很小的业务需要就须要整条链路的同学参加,协同老本高,开发调试周期长。 2、服务端存在巨型利用,研发耦合、公布耦合、运维耦合重大,甚至零碎稳定性也受到很大挑战,单个业务问题往往会影响整个利用。 3、运维老本极高。为了保障业务的稳定性和可用性,阿里对每一个利用上线都有相应的标准和规定。哪怕是一个很小的外部利用,一天可能只有一两个访问量,上线也须要恪守既有的标准,这势必会耗费一些固定资源。单个利用耗费的资源可能很无限,但所有利用耗费的资源累积起来也是一个不小的数字。而对于巨型利用,因为影响面微小,公布时要有更加严格的流程和步骤,一次公布至多要耗时6小时,导致运维老本极高。 Serverless 的呈现,一方面使云端一体化研发成为可能,很多小业务需要的协同老本能够大大降低。另一方面,Serverless 使业务胶水层的巨型利用,有了比微服务更加正当的拆分形式。 传统巨型利用的老本(速度)、稳固、品质互相制约的瓶颈,能够用上面这个三角形来直观的示意。 云原生/Serverless 这些新技术的呈现,能够使利用运维能力下沉,传统巨型利用的老本(速度)、稳固、品质互相制约的瓶颈才有可能被突破。闲鱼在落地新技术的过程中,先围绕 Flutter 重点攻坚了 Flutter 混合工程体系、高性能组件库。而后围绕Serverless 重点攻坚云端一体化研发体系、服务端业务组装层架构体系。 闲鱼客户端基于 Flutter 进行架构演进与翻新,通过 Flutter 对立 Android 和 iOS 双端晋升研发效力之后,心愿通过 Flutter+Serverless 解决各角色间存在的大量的协同问题,正是这些问题导致整体研发效率低,挪动端离业务越来越远,服务端没有工夫做底层畛域积淀。通过 Serverless 的引入,闲鱼会显著看到整体研发效率的晋升。 02 一边摸索,一边实际2018年,闲鱼技术团队开始摸索 Serverless,整体分为四个阶段:自建Dart Server、依靠FaaS平台、云端一体化、传统巨型利用Serverless化。 2018年5月,以 Serverless 思路构建了2s内冷启动的 Dart Server 利用框架,用于服务端业务胶水层的轻量化开发。 2018年底到2019年初,闲鱼启动与Gaia团队协同共建基于Gaia平台的Dart 运行时,并上线了局部业务。注:Gaia是基于阿里云的面向淘宝业务特点封装的、用于淘宝业务的FaaS平台。 2019年,闲鱼基于Gaia的Dart Runtime标准化,摸索 Flutter+FaaS 云端编程一体化,畛域接口元数据化,最终诞生了 Nexus 等胶水层业务框架,并在闲鱼20多个业务落地。 ...

August 26, 2020 · 2 min · jiezi

关于bootstrap:七夕阿里云AI帮你算算你的战斗值

"用姓名测试恋情,80%准确率! “ “俗话说,名如其人,缘分就是人生的后半生。” “心动不如口头,来一个属于本人的名字配对缘分测试吧!” 这些话你肯定曾经在很多微信号、电视节目,甚至奇奇怪怪的小网站上都看到过。 你肯定也很好奇,名字缘分测试背地到底是不是有科学依据撑持。 明天,作为数据迷信老司机的我,尽管不能间接帮你测试你和某个特定的人间接的缘分,然而咱们能够借助哥伦比亚大学多年钻研相亲找对象的心血,通过几个简略的特色来评估你的相亲战斗力指数。 具体模型的测试页面在这里,只是正式开始试验之前,咱们须要寻找一个简略好用不便上手的工具,这里我举荐一波阿里云的PAI-DSW探索者版,它对于集体开发者是收费的,还有收费GPU资源能够应用,试验的数据更会收费保留30天。点击这里只有登陆就可间接应用。明天,咱们就会通过这个工具来摸索兽性的神秘,走进两性关系的神秘空间,嘿嘿嘿。 整个试验的数据收集于一个从2002年到2004年的线下疾速相亲的试验。这个试验中,参与者被要求加入多轮与同性进行的疾速相亲,每轮相亲继续4分钟,在4分钟完结后,参与者单方会被询问是否违心与他们的对象再见面。只有当单方都答复了“是”的时候,这次相亲才算是配对胜利。 同时,参与者也会被要求通过以量化的形式从外观吸引力,真挚度,智商,有趣水平,事业心,兴趣爱好这六个方向来评估他们的相亲对象。 这个数据集也蕴含了很多加入疾速相亲的参与者的其余相干信息,比方地理位置,爱好,对于现实对象的偏好,收入水平,职业以及教育背景等等。对于整个数据集的具体特征描述能够参考这个文件。 本次咱们试验的目标次要是为了找出,当一个人在加入疾速相亲时,到底会有多高的几率可能遇到本人心动的人并胜利牵手。 在咱们建模剖析摸索兽性的机密之前,让咱们先读入数据,来看看咱们的数据集长什么样。 import pandas as pddf = pd.read_csv('Speed Dating Data.csv', encoding='gbk')print(df.shape) 通过观察,咱们不难发现,在这短短的两年中,这个试验的小酒馆经验了8000多场疾速相亲的试验。由此咱们能够十分轻易的推断出,小酒馆的老板应该赚的盆满钵满(大雾) 而后从数据的宽度来看,咱们会发现一共有靠近200个特色。对于每个特色的具体形容大家能够参考这篇文档。而后咱们再察看数据的残缺度,看看是否有缺失数据。 percent_missing = df.isnull().sum() * 100 / len(df)missing_value_df = pd.DataFrame({ 'column_name': df.columns, 'percent_missing': percent_missing})missing_value_df.sort_values(by='percent_missing') 通过以上代码,咱们不难发现,其实还有很多的特色是缺失的。这一点在咱们前面做剖析和建模的时候,都须要关注到。因为一旦一个特色缺失的数据较多,就会导致剖析误差变大或者模型过拟合/精度降落。看完数据的残缺水平,咱们就能够持续往下摸索了。 而后第一个问题就来了,在这8000多场的疾速相亲中,到底有多少场相亲胜利为加入的单方找到了适合的伴侣的?带着这个问题,咱们就能够开始咱们的第一个探索性数据分析。 # 多少人通过Speed Dating找到了对象plt.subplots(figsize=(3,3), dpi=110,)# 结构数据size_of_groups=df.match.value_counts().valuessingle_percentage = round(size_of_groups[0]/sum(size_of_groups) * 100,2) matched_percentage = round(size_of_groups[1]/sum(size_of_groups)* 100,2) names = [ 'Single:' + str(single_percentage) + '%', 'Matched' + str(matched_percentage) + '%'] # 创立饼图plt.pie( size_of_groups, labels=names, labeldistance=1.2, colors=Pastel1_3.hex_colors)plt.show() ...

August 25, 2020 · 2 min · jiezi

关于bootstrap:bootstrapvue-固定表头

性能场景:固定表头的地位不在浏览器顶端办法一:反对表中有合并单元格的状况下 兼容多个浏览器(包含ie) 实现逻辑通过定义两个table来实现 一个table只有thead一个table只有tbody > vue <div class="table-head"> <b-table-simple fixed bordered> <colgroup> <col style="width:11%;" /> <col style="width:19%;" /> <col style="width:6%;" /> <col style="width:7%;" /> </colgroup> <colgroup> <col style="width:8%;" /> <col style="width:8%;" /> <col style="width:9%;" /> <col style="width:8%;" /> <col style="width:8%;" /> <col style="width:8%;" /> <col style="width:8%;" /> </colgroup> <b-thead head-variant="dark" class="text-center"> <b-tr> <b-th rowspan="2">第一行表头1</b-th> <b-th rowspan="2">第一行表头2</b-th> <b-th rowspan="2">第一行表头3</b-th> <b-th rowspan="2">第一行表头4</b-th> <b-th colspan="7">第一行表头5</b-th> </b-tr> <b-tr> <b-th>第二行表头1</b-th> <b-th>第二行表头2</b-th> <b-th>第二行表头3</b-th> <b-th>第二行表头4</b-th> <b-th>第二行表头5</b-th> <b-th>第二行表头6</b-th> <b-th>第二行表头7</b-th> </b-tr> </b-thead> </b-table-simple> </div> <div class="table-body"> <b-table-simple fixed striped bordered> <colgroup> <col style="width:11%;" /> <col style="width:19%;" /> <col style="width:6%;" /> <col style="width:7%;" /> </colgroup> <colgroup> <col style="width:8%;" /> <col style="width:8%;" /> <col style="width:9%;" /> <col style="width:8%;" /> <col style="width:8%;" /> <col style="width:8%;" /> <col style="width:8%;" /> </colgroup> <b-tbody> <template v-for="(item,i) in items"> <b-tr :key="i + 'odd'"> <b-td rowspan="2" style="height:58px;">内容1</b-td> <b-td style="height:29px;">内容2</b-td> <b-td class="text-center" style="height:29px;">内容3</b-td> <b-td class="text-right" style="height:29px;">内容4</b-td> <b-td class="text-right" style="height:29px;">内容5</b-td> <b-td class="text-right" style="height:29px;">内容6</b-td> <b-td class="text-right" style="height:29px;background-color:#FFEBD9;"> 内容7 </b-td> <b-td class="text-right" style="height:29px;">内容8</b-td> <b-td class="text-right" style="height:29px;">内容9</b-td> <b-td class="text-right" style="height:29px;">内容10</b-td> <b-td class="text-right" style="height:29px;">内容11</b-td> </b-tr> <b-tr :key="i + 'even'"> <b-td style="height:29px;">内容12</b-td> <b-td class="text-center" style="height:29px;">内容13</b-td> <b-td class="text-right" style="height:29px;">内容14</b-td> <b-td class="text-right" style="height:29px;">内容15</b-td> <b-td class="text-right" style="height:29px;">内容16</b-td> <b-td class="text-right" style="height:29px;background-color:#FFEBD9;"> <b>内容17</b> </b-td> <b-td class="text-right" style="height:29px;">内容18</b-td> <b-td class="text-right" style="height:29px;">内容19</b-td> <b-td class="text-right" style="height:29px;">内容20</b-td> <b-td class="text-right" style="height:29px;">内容21</b-td> </b-tr> </template> </b-tbody> </b-table-simple> </div>> css .table-head { .table-bordered { border-bottom-width: 2px; } } .table-body { margin-top: -17px; @media (min-width: 768px) { max-height: 650px; } @media (min-width: 1024px) { max-height: 350px; } &::-webkit-scrollbar { display: none; } -ms-overflow-style: none; overflow-y: auto; .table-bordered { border-top-width: 0px; } }通过标签<colgroup>能够调整单元格的大小 ...

August 25, 2020 · 2 min · jiezi

关于bootstrap:Redis面试整理

1、Redis 外围数据结构都有哪些?String、List、Set、Hash、ZsetString类型的特点:能够是字符串,整数或者浮点数。2、Redis值类型中 hash 和 string 区别。Redis hash 是一个 string 类型的 field 和 value 的 映射表。它的增加、删除操作都是 0(1)(均匀操作),hash 特地 适宜用于存储对象。绝对于将单个对象存储成String类型,更能缩小内存的占有。3、Redis 长久化是如何工作的?Redis会独自创立(fork)一个子过程来进行长久化,会先将数据写进一个临时文件中,等到长久化过程完结了,再用这个临时文件替换上次长久化好的文件。在这个过程中,只有子过程来负责IO操作,主过程依然解决客户端的申请,这就确保了极高的性能。(1).SAVE 间接调用rdbSave,阻塞Redis主过程看,直到保留实现为止.在主过程阻塞期间,服务器不能解决客户端的任何申请.(2).BGSAVE 则fork 出一个子过程,子过程负责调用rdbSave ,并在保留实现之后向主过程发送信号,告诉保留已实现.因为rdbSave 在子过程被调用,所以Redis 服务器在BGSAVE 执行期间依然能够持续解决客户端的申请.4、Redis 长久化形式Rdb和Aof的优缺点RDB是一个紧凑压缩的二进制文件,代表Redis在某一个工夫点上的数据快照。非常适合用于备份,全量复制等场景。AOF(append only file)长久化:以独立日志的形式记录每次写命令,重启时再从新执行AOF文件中命令达到复原数据的目标。AOF的次要作用是解决了数据长久化的实时性。5、Redis 内存不够时如何解决新的申请?启动配置文件中的maxmemory-policy默认值是noeviction。删除redis键具备的淘汰规定。6、Redis 内存淘汰算法 LRU/ LFU LRU即最近起码应用,是一种缓存置换算法。其原理是保护一个双向链表,key -> node,其中node保留链表前后节点关系及数据data。LFU是依据key的最近被拜访的频率进行淘汰,很少被拜访的优先被淘汰,被拜访的多的则被留下来。7、Redis 有序数据结构zset底层zset底层的存储构造包含ziplist或skiplist,在同时满足以下两个条件的时候应用ziplist,其余时候应用skiplist,两个条件如下: 有序汇合保留的元素数量小于128个有序汇合保留的所有元素的长度小于64字节8、Redis 位图利用场景及实现原理位图不是一个实在的数据类型,而是定义在字符串类型上的面向位的操作的汇合。因为字符串类型是二进制平安的二进制大对象,并且最大长度是 512MB,适宜于设置 2^32个不同的位。 位操作分为两组:常量工夫单个位的操作,像设置一个位为 1 或者 0,或者获取该位的值。对一组位的操作,例如计算指定范畴位的置位数量。 位图的最大劣势是有时是一种十分显著的节俭空间来存储信息的形式。例如,在一个零碎中,不同用户由递增的用户 ID 来示意,能够应用 512MB 的内存来示意 400 万用户的单个位信息(例如他们是否须要接管函件)。 简而言之,位图操作是用来操作比特位的,其长处是节俭内存空间。为什么能够节俭内存空间呢?如果咱们须要存储100万个用户的登录状态,应用位图的话起码只须要100万个比特位(比特位1示意登录,比特位0示意未登录)就能够存储了,而如果以字符串的模式存储,比如说以userId为key,是否登录(字符串“1”示意登录,字符串“0”示意未登录)为value进行存储的话,就须要存储100万个字符串了,相比之下应用位图存储占用的空间要小得多,这就是位图存储的劣势。位图的罕用操作如下: setbit设置特定key对应的比特位的值。getbit 获取特定key对应的比特位的值。bitcount 统计给定key对应的字符串比特位为1的数量。9、Redis 集群分片原理Redis 集群是一个网状结构,无核心构造,每个节点都通过 TCP 连贯跟其余每个节点连贯。 在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连贯,和 N-1 个流入的连贯。10、Redis6.0 的多线程a、主线程负责接管建设连贯申请,获取 socket 放入全局期待读解决队列 b、主线程解决完读事件之后,通过 RR(Round Robin) 将这些连贯调配给这些 IO 线程 c、主线程阻塞期待 IO 线程读取 socket 结束 d、主线程通过单线程的形式执行申请命令,申请数据读取并解析实现,但并不执行 e、主线程阻塞期待 IO 线程将数据回写 socket 结束 f、解除绑定,清空期待队列11、redis多线程是否平安Redis的多线程局部只是用来解决网络数据的读写和协定解析,执行命令依然是单线程程序执行。所以咱们不须要去思考管制 key、lua、事务,LPUSH/LPOP 等等的并发及线程平安问题。12、Redis 的缓存穿透/缓存雪崩/缓存重建/ 下次整顿 ...

August 24, 2020 · 1 min · jiezi

关于bootstrap:点货网-x-mPaaS-仅-2-位-Java-开发使用小程序上线一款-App

简介: Java “司机”上路指南 一次真正意义上的低成本技术架构降级。我的项目背景衡东点货网是依据物流行业发展趋势及国家政策疏导开发的网络货运平台,其次要性能承载“车货信息公布、匹配、运费领取与发放、信用治理等”。 而对于我的项目的开发人员组成,长期以来仅仅只是“外围开发 2 人 + 实习开发 2 人“的规模,在撑持日常的业务迭代方面力有不逮。同时,联合 2020 年网络货运平台政策的调整,点货网作为网络货运平台,咱们的挪动端 App 内需嵌入监管平台的 SDK 插件,从而日常业务经营数据可能与监管平台的零碎买通,对立治理标准。 难点呈现了。 因现有的开发团队组成次要以 Java 工程师为主,同时可能对接三方 SDK 的开发仅两位,开发资源忽然顾此失彼。而在原有的工程中,存在 Uni-App 的选型,在短少对方技术团队反对的状况下,要咱们现有团队实现原生 SDK 的接入颇有难度。同时思考到后续“点货网 App”本身需具备接入原始 SDK 的能力,因而咱们的视角开始转向了“如何保障我的项目顺利完成联调测试,并晋升自有 App 的健壮性”。 咱们开始筛选市面上各类跨平台的 App 开发技术,在此期间比照了 Uni-App、Weex、Flutter、mPaaS 等跨平台开发框架。 作为一名 Java 开发,以上各跨平台开发框架的比照仅作为第一印象。针对各框架的优劣比照没有开展深度剖析,仅实用于大家在现有我的项目/工程中应答特定需要的技术选型参考。 因集体目前只具备 Java 和 Vue.js 的开发能力,无奈在短时间内疾速把握一门全新的开发语音或原生 UI 组件开发的能力,但因业务要求咱们务必要彻底晋升 App 的健壮性,因而团队决定将 Uni-App 替换为 mPaaS。 接入过程回顾 作为一名 Java 开发,对于 Vue.js 的语法还算相熟,因而我在 2019 年 8 月起开始接触并测试 mPaaS 的框架能力,尤其是小程序容器的局部,同时在这期间开始理解安卓开发的相干常识。 ...

August 24, 2020 · 1 min · jiezi

关于bootstrap:5G专网为江南皮革厂带来了什么

简介: 往年6月底,通信畛域迎来了一个重磅音讯,负责制订5G通信规范的国内组织3GPP颁布了Release 16的5G规范,这也是5G的第二版规范。如果说5G的第一版规范Release 15次要面向的是消费者市场,那么5G的第二版规范则是将5G网络的边界拓展到了垂直行业,是面向工业的5G。那么这些规范将如何赋能工业企业,满足企业主的需要呢?本文试图从一个制造业企业“江南皮革厂”的理论需要登程,看5G R16规范是如何让传统企业乘风破浪的。 3GPP R16解冻3GPP Release 16规范曾经于往年6月底实现,最初的总结报告也在7月31号上传到了FTP[1]。此前,2019年实现的R15 5G规范,次要是面向消费者市场,针对智能手机等产品提出了一系列eMBB的加强个性,使用户能够感触到1Gbps的超高速体验。这次的R16规范所定义的内容,除了对R15已有个性的加强外,更令人关注的是为了满足垂直行业需要所定义的新技术。有了这些关键技术,5G网络的边界失去了进一步的拓展,5G的网络状态,也将会从繁多服务一般消费者的to C网络,逐步扩大到to B的垂直行业专网。 面向垂直行业的新个性以下是R16中所给出的新个性: Enhancement of Ultra-Reliable (UR) Low Latency Communications (URLLC)5GS Enhanced support of Vertical and LAN ServicesCellular IoT support and evolutionAdvanced V2X support5G Location and Positioning ServicesUE radio capability signalling optimizationSatellite Access in 5GEnablers for Network Automation Architecture for 5GWireless and Wireline Convergence EnhancementMission Critical, Public Warning, Railways and MaritimeStreaming and TVUser Identities, Authentication, multi-device(Network) SlicingOther cross-TSG Release 16 FeaturesNR-related Release 16 FeaturesRelease 16 Features impacting both LTE and NRLTE-related Release 16 Features其中和5G垂直行业密切相关的个性有: ...

August 24, 2020 · 1 min · jiezi

关于bootstrap:独家下载小程序Serverless云上开发一站到底

阿里云小程序Serverless 提供包含云函数、数据存储、文件存储等一整套后端服务。开发者通过API 形式即可获取云函数、数据存储、文件存储、音视频、图像处理等服务,不须要关怀服务器或底层运维设施,能够更专一于代码和业务自身。 《小程序Serverless 云开发》电子书上线,5个小程序开发核心技术+1个小程序云数据分析办法,带你7天学会支付宝小程序云上开发! 点击立刻下载>>《小程序Serverless 云开发》 目录 内容领先看实现小程序云开明阿里云小程序Serverless 提供以下性能:• 数据存储 数据存储服务是基于MongoDB 托管在云端的数据库,数据以JSON 格局存储。数据库中的每条记录都是一个JSON 格局的对象。一个数据库能够有多个汇合(相当于关系型数据库中的表)。 • 文件存储 文件存储服务反对文本、图片和其余由用户生成的内容存储到云端。开发者能够在小程序端和控制台应用云存储性能。图片上传胜利后,零碎会主动生成一个资源链接。开发者能够在小程序中应用该图片地址。 • 云函数... 点击查看>>实现小程序云开明 如何操作云数据库云数据库(数据存储服务)是基于MongoDB托管在云端的数据库,数据以JSON格局存储。作为开发者,您能够在客户端内间接操作数据,也能够在云函数中读写数据。 步骤一:设置数据表权限 小程序Serverless提供了一套扼要易懂的JSON语法用来管制用户对资源的拜访,相似于身份验证体系里的IAM或者网络安全中的ACL。您能够通过批改权限规定来控制数据表权限。...点击查看>>如何操作云数据库 如何应用云存储mpserverless.file 对象提供 uploadFile 和 deleteFile办法管理文件。上传的文件将通过CDN进行网络减速。 步骤一:设置文件权限 小程序Serverless提供了一套扼要易懂的JSON语法用来管制用户对资源的拜访,相似于身份验证体系里的IAM或者网络安全中的ACL。您能够通过批改权限规定来管理文件权限。...点击查看>>如何应用云存储 如何应用云函数云函数(FaaS)是一段运行在云端的、轻量的、无关联的、并且可重用的代码。无需治理服务器,只需编写和上传代码,即可取得对应的数据后果。应用云函数能够使企业和开发者不须要放心服务器或底层运维设施,能够更专一代码和业务自身,也能够使代码进一步解耦,减少其重用性。...点击查看>>如何应用云函数 如何应用云调用云调用是基于小程序 Serverless 的云函数来应用支付宝小程序凋谢接口的能力,能够不便的让开发者在小程序中间接调用支付宝的后端凋谢接口,不须要关注服务端的相干配置,极大的缩小了接入的流程,进一步升高了支付宝小程序的开发门槛。...点击查看>>如何应用云调用 教你一个云开发技巧在云开发技巧中,咱们将向你介绍: 应用云函数HTTP触发器+云调用实现无需后端接入支付宝领取性能,并通过云函数接管领取回调性能;应用云函数定时触发器实现每天凌晨定时调度工作。...点击查看>>教你一个云开发技巧实现你的小程序统计分析小程序上线之后,如果咱们须要监控统计小程序的启动次数,用户新增,沉闷用户等指标,咱们能够先在控制台创立利用,而后在小程序我的项目中装置统计分析服务SDK。 要接入支付宝小程序进行用户应用数据统计分析,您须要实现以下操作: ...点击查看>>实现你的小程序统计分析 原文链接 本文为阿里云原创内容,未经容许不得转载。

August 21, 2020 · 1 min · jiezi

关于bootstrap:减少运维工作量如何通过-ROS-轻松实现资源编排新方式

简介: 以“基础设施即代码”的理念代替“重复劳动”。 在日常工作中,咱们肯定遇到过须要疾速构建零碎的工作情景: 作为资源管理人员,须要接管肯定数量以及配置的资源申请,这些申请要求网络、存储设备按需到位;作为开发人员,须要将一套开发环境,复制一份测试环境以及线上环境;架构师布局一套零碎,须要在云上进行搭建。这些场景都展示着咱们日常所遇的各种艰难: 对各类云端资源须要进行广泛支持与治理:这其中须要包含罕用根底IaaS 资源及 PaaS 服务,比方主机、路由器、负载均衡器等计算网络资源以及各种数据库、缓存、大数据、存储服务;资源编排应用难度大:技术栈简单而难用,实现简单拓扑关系须要系统化常识与丰盛教训;大量机械反复的手动配置操作:不仅是各资源及其拓扑关系按配置进行手工部署,各资源间的拓扑关系更是令人头疼;学习老本高:过往的资源管理依赖于通过命令行调用API 的形式,晋升了操作难度和学习老本。由此可见,自动化运维成了运维人员的业务刚需,各大云厂商也相继推出各自的资源编排服务(Resource Orchestration,以下简称 ROS)。ROS 的理念是“基础设施即代码”,一方面是用代码思维的版本治理来记录基础设施变动,另一方面通过代码实现自动化运维,简化编写代码复杂度,用户通过应用 Json / Yaml 格局模版形容多个云计算资源(如 ECS、RDS、SLB)的配置、依赖关系等,并主动实现所有云资源在多个不同地区以及多个账户中的部署和配置,就像乐高积木个别,运维人员轻松实现搭建。 通过屡次调研后,咱们发现针对于云服务器最多的场景是基于云服务器“此刻的状态”再创立 1-N 台云服务器,新创建的云服务器系统盘和数据盘都是“此刻的状态”。咱们以一个网站服务为例,个别运维工程师会在系统盘或数据盘中装置一些利用,如:Tomcat、Jenkins、MySql、网站本身的数据/文件等等。如果须要再创立一台云服务器与目前已有云服务器的零碎或数据状态保持一致,能够将系统盘做成自定义镜像,数据盘做成快照,而后再新购买云服务器时镜像抉择该自定义镜像,数据盘的快照抉择该快照,平安组的规定配置与原云服务器统一的规定,就能够创立一台基于原云服务器“此刻状态”的新云服务器。 如果只需创立这一台云服务器且不须要记录历史状态,上述办法是比拟适合的。 但理论状况远远比这简单得多,比方可能会频繁创立/开释云服务器;或者生成镜像的操作人员与购买云服务器的人员不是同一个人,一但购买选项没有选正确,新购的这台云服务器就不能投入业务中,按量计费的须要再开释,包年包月的须要等到到期开释或者做数据迁徙,势必带来老本损失;想记录或跟踪云服务器的历史演变,如平安组配置变动、根底镜像等信息,也须要独自记录。 面对上述问题,运维人员应用 ROS 的模板作为交付物,将资源固定参数在模板资源中定义,将可变参数在模板参数中定义,不便运行时输出理论参数。这样在频繁创立云服务器时,只须要输出可变参数中的内容即可,如镜像 ID、快照 ID,或者克隆原云服务器,或者没有可变参数,将所有定义都在资源中形容,依据理论业务要求进行模板编写。模板也能够寄存在 Github 中,能够像治理代码一样跟踪模板历史,也能够基于模板之上创立适宜于企业外部的运维工具,实现自动化运维,以“基础设施即代码”的理念代替“重复劳动”。 咱们能够看到 ROS 的弱小个性: 可读、易编写的文本文件:运维人员能够间接编辑 JSON 格局文本,或应用 ROS 控制台提供的可视化编辑器编辑模板。通过 SVN、Git 等版本控制工具管制模板版本,以达到管制基础设施版本目标。也可通过 API、SDK 等形式将 ROS 的编排能力与本人的利用进行整合,实现基础设施即代码(Infrastructure as Code);标准化的资源和利用交付形式:独立软件供应商(ISV)能够通过 ROS 模板交付蕴含云资源和利用的整体零碎和解决方案。ISV 能够通过这种交付形式,整合阿里云的资源和 ISV 的软件系统,实现对立交付;通过资源栈(Stack)对立治理一组云资源(一个资源栈即为一组阿里云资源):对于云资源创立、删除、克隆等操作,以资源栈为单位来实现。在 DevOps 实际中,能够应用 ROS 克隆开发环境、测试环境和线上环境,实现利用的整体迁徙、扩容。在理解 ROS 的弱小后,咱们就在日常应用过程中会创立各种数量的 ROS 模板。这也就造成了咱们在日常的运维治理中,须要更便捷的工具对模板进行治理。为了更好的治理本地与云端的 ROS 模版,咱们上线了 Alibaba Cloud Toolkit - Alibaba ROS Templates,通过一个资源配置文件(.ros.config.yml),帮助用户对模板文件进行治理操作。 ...

August 19, 2020 · 1 min · jiezi

关于bootstrap:我在阿里写代码学会的六件事

简介: 从团队的角度来看,写好代码是一件十分有必要的事件。如何写出洁净优雅的代码是个很艰难的课题,我没有找到万能的 solution,更多的是一些 trade off,能够略微讨论一下。 写了多年的代码,始终感觉如何写出洁净优雅的代码并不是一件容易的事件。按 10000 小时刻意训练的定理,假如每天 8 小时,一个月 20 天,一年 12 个月,大略也须要 5 年左右的工夫成为巨匠。其实咱们每天的工作中真正用于写代码的工夫不可能有 8 个小时,并且很多时候是在实现工作,在业务压力很大的时候,可能想要达到的指标是如何尽快的使得性能 work 起来,代码是否洁净优雅十分可能没有能放在第一优先级上,而是怎么快怎么来。 在这样的状况下是非常容易欠下技术债的,工夫长了,这样的代码基本上无奈保护,只能推倒重来,这个老本是十分高的。欠债要还,只是迟早的问题,并且等到要还的时候还要赔上额定的不菲的利息。还债的有可能是本人,也有可能是起初的继任者,但都是团队在还债。所以从团队的角度来看,写好代码是一件十分有必要的事件。如何写出洁净优雅的代码是个很艰难的课题,我没有找到万能的 solution,更多的是一些 trade off,能够略微讨论一下。 代码是写给人看的还是写给机器看的?在大部分的状况下我会认为代码是写给人看的。尽管代码最初的执行者是机器,然而实际上代码更多的时候是给人看的。咱们来看看一段代码的生命周期:开发 --> 单元测试 --> Code Review --> 功能测试 --> 性能测试 --> 上线 --> 运维、Bug 修复 --> 测试上线 --> 退休下线。开发到上线的工夫兴许是几周或者几个月,然而线上运维、bug 修复的周期能够是几年。 在这几年的工夫外面,简直不可能还是原来的作者在保护了。继任者如何能了解之前的代码逻辑是极其要害的,如果不能保护,只能本人从新做一套。所以在我的项目中咱们常常能见到的状况就是,看到了后任的代码,都感觉这是什么垃圾,写的乌七八糟,还是我本人重写一遍吧。就算是在开发的过程中,须要他人来 Code  Review,如果他们都看不懂这个代码,怎么来做 Review 呢。还有你也不心愿在休假的时候,因为其他人看不懂你的代码,只好打电话求助你。这个我印象极其粗浅,记得我在工作不久的时候,一次回到了老家休假中,忽然共事打电话来了,呈现了一个问题,问我该如何解决,过后电话还要收漫游费的,十分贵,然而我还不得不反对直到耗光我的电话费。 所以代码次要还是写给人看的,是咱们的交换的路径。那些十分好的开源的我的项目尽管有文档,然而更多的咱们其实还是看他的源码,如果开源我的项目外面的代码写的很难读,这个我的项目也基本上不会火。因为代码是咱们开发人员交换的根本路径,甚至可能口头探讨不分明的事件,咱们能够通过代码来说分明。代码的可读性我感觉是第一位的。各个公司预计都有本人的代码标准,遵循相干的标准放弃代码格调的对立是第一步(举荐谷歌代码标准和微软代码标准)。标准里个别都包含了如何进行变量、类、函数的命名,函数要尽量短并且放弃原子性,不要做多件事件,类的根本设计的准则等等。另外一个倡议是能够多参考学习一下开源我的项目中的代码。 KISS (Keep it simple and stupid)个别大脑工作记忆的容量就是 5-9 个,如果事件过多或者过于简单,对于大部分人来说是无奈间接了解和解决的。通常咱们须要一些辅助伎俩来解决简单的问题,比方做笔记、画图,有点相似于在内存不够用的状况下咱们借用了外存。 学 CS 的同学都晓得,外存的访问速度必定不如内存访问速度。另外一般来说在逻辑简单的状况下出错的可能要远大于在简略的状况下,在简单的状况下,代码的分支可能有很多,咱们是否可能对每种状况都思考到位,这些都有艰难。为了使得代码更加牢靠,并且容易了解,最好的方法还是放弃代码的简略,在解决一个问题的时候尽量应用简略的逻辑,不要有过多的变量。 然而事实的问题并不会总是那么简略,那么如何来解决简单的问题呢?与其借用外存,我更加偏向于对简单的问题进行分层形象。网络的通信是一个非常复杂的事件,两头应用的设施能够有无数种(手机,各种 IOT 设施,台式机,laptop,路由器,交换机...), OSI 协定对各层做了形象,每一层须要解决的状况就都大大地简化了。通过对简单问题的合成、形象,那么咱们在每个档次上要解决解决的问题就简化了。其实也相似于算法中的 divide-and-conquer, 简单的问题,要先拆解掉变成小的问题,从而来简化解决的办法。 ...

August 19, 2020 · 2 min · jiezi

关于bootstrap:Bootstrap45栅格系统解决任意列问题

一、问题bootstrap3中的栅格零碎大抵是:container容器中每行12个单位格子,能够依据理论状况自在的设置列,如下图所示,第一行均等的分了12列,第二行非均等分了2列(两列的格子数之和为12),第三行均等的分了3列,第四行均等的分了2列。当然,依据须要,还能够把一行均等的分为4列(每列3个格子)、6列(每列占据2个格子)。问题来了,如果我想均等的分为5或7或8或9列等。。。怎么办。这里的问题是均等的调配列的宽度,每一列宽度雷同。当然,对于以上问题能够不应用bootstrap的栅格零碎,自定义浮动布局,设置每列的宽度百分比,同样可能解决简单的问题,但我不想钻研这种根底问题,只想把框架利用率晋升到最高。基于以上问题,我尝试在bootstrap4中找到答案。 二、bootstrap4更全的技术细节参考官网文档参考地址:https://getbootstrap.com/docs/4.5/1、响应式布局容器以.container-lg为例,当屏幕宽度小于960px的时候,容器会占满屏幕宽度,全屏显示,此时成果等同.container-fluid。2、栅格零碎bootstrap4更加灵便自在,能够轻而易举的解决问题中遇到的瓶颈。bootstrap4的栅格零碎继承了前一个版本的大部分内容,同时进行了大量的优化。上面是一个一行5个等宽列的例子: <div class="container"> <div class="row"> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div></div>运行后果:bootstrap4会依据行内col的数量(最多12)计算每列的宽度所占百分比,进行均分,这就意味着一行中能够呈现12以内(包含12)的所有可能列数。超出12局部的col,主动进入下一行,并均分下一行的宽度。如下图所示想要主动每行5列怎么办?等宽多行通过插入.w-100来创立逾越多行的等宽列,在该行中您心愿列换行到新行。 <div class="container"> <div class="row"> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="w-100"></div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="w-100"></div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div> <div class="col border border-primary">.col</div></div>显示后果通过<div class="w-100"></div>,强制换行,就不会傻傻的12列挤在一起了。 ...

August 15, 2020 · 1 min · jiezi

关于bootstrap:进化论合乎科学吗

进化论合乎迷信吗? ------ 唐崇荣 创世纪第一章26-27节:“上帝说,咱们要照着咱们的形像,按着咱们的款式造人,使他们治理海里的鱼,地面的鸟,地上的家畜,和全地,并地上所爬的所有昆虫。上帝就照着本人的形像造人,乃是照着他的形像造男造女。” 我在十七岁的时候,已经因为进化论所引发对基督教信奉的矛盾,产生了很大的抵触,最初我还是抉择了基督教的信奉。这是一件小事,我置信每一个基督徒都已经面对这样的抵触矛盾,并作出抉择。 我到底是谁?每一个外面都有一个“我”的自觉性,而这个“我”把我与“非我”分得很分明。“我”所以是我,因为“我”不是“非我”;“非我”是谁?“非我”不是“我”。我这个“我”到底是什么?我要怎么样去意识这个“我”? 首先阐明一件很重要的事件就是为什么须要意识我这个存在。在宇宙中,咱们看见有“存”与“觉存”两件不同的事件。“存”到底是什么?咱们用物理学来看什么叫做存在,和以存在哲学来思维什么叫做存在,你会发现,同样一个名词,它的定义是齐全不一样的。 在物理学的领域中,凡占有空间、能够用物质的定律去推算出来的,就是一个存在;然而在哲学领域里,存在主义的“存在”是齐全不同的另一种观点。 德国的哲学把“存在”与“存在物”作很严格的辨别。例如:这个桌子是存在的,然而这个桌子的存在是我感觉它存在,而不是这个桌子本人感觉它存在,这个桌子是一个不盲目本人存在的一个存在,而我对这个桌子的“知其存在”是感觉它存在的一个存在。我岂但感觉这个桌子是存在,我还能够证实、剖析它的存在。我这个对其余存在的觉醒、剖析和认知,是依据我本人自身的存在,所以我这个“存在”岂但觉醒到我以外的存在的存在,我这个“存在”也觉醒到我本人的存在,所以存在的自觉性,是人类一种很特地的感觉。 动物是不是有这种自我存在的盲目呢?如果有的话,肯定与咱们的这种盲目有很大的不同。动物所有的所有知觉和所有悟性,都不能脱离它存在的最根本的本能的问题。它的意志、情感和常识,都被限度在其本能的范畴内,是在本能的范畴内施展它的感情,是在本能的范畴内表白它的意志,对于动物,基本谈不上这本能之外的超过;动物则更不用说,因为动物的知觉性是更远低于动物。 这样,咱们看见了人之所以是人,是由两个不同的成份形成的:一是物质,二是对物质存在的知觉性。 我意识到我存在,而我又晓得我这个存在又有外在物质部份的存在。所以当人问:“你是谁?”的时候,你通常说:“是我。”特地是在人看不见你的时候,你是用“我”自称的;看得见的时候你就用名字称,这句话是什么意思呢?当你在门外敲门的时候,对方问你:“你是谁?”你说:“是我。”你晓得天下有几个我呢?有差不多五十万万个我,每一个人的名都叫做“我”。因为对方看不见你,你先假如他能够从你的声音晓得你是谁,所以你说:“我”。但当他曾经看见了你的时候,他问:“你是谁?”你便会说:“我是唐崇荣。”这时你便会用名字介绍你本人了。你讲“我”的时候,你正在表白我是一个“我”,我是一个主体。当你提到我、你、他的时候,你所波及的是位格的关系(the relationship between the persons)。 若你对着你的爱人的照片讲话:“你对我好吗?”如果那一张照片说“好。”你会吓坏了,怎么一张纸会讲话呢?当你对一张纸讲话的时候,其实是把这非位格的,当作有位格的,那是一个跳跃,这照片基本不是有位格的,是先有那个人,才有这个人的相片。 当你提到你集体的存在的时候,你就用第一个称说本人,这个我,是对本人存在这一个主体性的觉醒,把你与非你全副离开来,我所以是我,因为我不是一个非我,非我之所以是非我,因为不是一个我。这个我是自称,这个我外面有另外一个字,叫做己,每一个人都有一个己。人若只渴望意识本人以外的货色,这是浮浅的一种思维观,正像一个小孩子,思维还不够深刻,他的认知性只向外倒退,所以小小孩子问他的母亲说:“这是什么?那是什么?”他要晓得非我界。当有一天,这个孩子突然问:“我是什么?”的时候,他整个思维过程就进到一个新的阶段一认知本人。 人心愿认知本人。整个宇宙,整个世界,除了人以外,你无奈找到任何一种活物,有认知本人的欲望。对自我的认知欲,是从哪里来的?我要意识我是谁,所以我就问一个问题:“我是谁?”这一句话在其个体(collective)意义上,即人要晓得人到底是谁。 人是什么?这是一个很庄重的问题。 “Who asks this question?” “Man asks the question.” “Whom does he ask?” “Himself.” “What does he ask?” “He asks,’what is man?” 所以当人问:“人是什么?”的时候,外面就有三个问题: 第一个问题“谁问”? 第二个问题“问谁”? 第三个问题“问什么”? 当你看这三个问题的答案时, “人问。” “问谁?” “问人。” “问什么?” “问人是什么。” 这个是人的人在这里提问。 当咱们还没有提到发明论与进化论的别离的时候,先提到人的认知欲望,咱们岂但提到存与觉存,咱们还提到知与被知。“知”是觉存的人才有的,我要晓得,当“知”的时候,你是处于主体性的位置(you are in the subjective position),那么我当初到底是站在主体性的位置,或者站在客体性的位置呢?当我要知人的时候,人就变成被知的对象了,这就产生人把本人当作主体又当作客体的“主客混合体”(the mixture between the subject and the object),人本人要晓得人是什么,要知的是人,要被知的也是人,人要知人,那么为什么要晓得呢?一方面是不晓得,另一方面是可晓得,人渴望去晓得,就在一个违心晓得可能被晓得的范畴内,不晓得的自身又想晓得,所以要晓得的就是那个要被晓得而不晓得的,所以理解人是很不简单的一件事件。 咱们要思维的不单是我本人这个人的事件,咱们还追朔到一个超历史的境地,当初我介绍另外一个名词,“超历史的性质”(super-historical nature)。什么叫做超历史性?我活在世界上只有几十年,然而,我不会因为几十年前生,过几十年当前死,便称心这几十年。在认知方面,我与被知的我,是主客两体的混合,然而在我的超越性外面,我诚然能够在工夫与历史中被淘汰掉,然而我外面有一个认知性是超过工夫空间的,所以我渴望晓得几千几万年以前的事件,我也渴望晓得当前整个人类最终的终局是什么,这样认知就超过工夫、超过空间了,这就是人类能够领有历史的起因之一。 ...

August 12, 2020 · 1 min · jiezi

新一期的干货来了BootStrap该怎么用乐字节java5

BootStrap 插件 如果须要更多材料点击下方图片加好友支付⬇(注明来意) 表单次要性能是用来与用户做交换的一个网页控件,良好的表单设计可能让网页与用户更好的沟通。表单中常见的元素次要包含:文本输入框、下拉抉择框、单选按钮、复选按钮、文本域和按钮等。 导航 应用下拉与按钮组合能够制作导航 要点: 1、根本款式: .nav 与 “nav-tabs”、“nav-pills”组合制作导航2、分类: 1)、标签型 (nav-tabs)导航 2)、胶囊形(nav-pills)导航 3)、堆栈(nav-stacked)导航 4)、自适应(nav-justified)导航 5)、面包屑式(breadcrumb)导航 ,独自应用款式,不与nav一起应用,间接退出到ol、ul中即可,个别用于导航,次要是起的作用是通知用户当初所处页面的地位(以后地位)3、状态: 1)、选中状态 active 款式 2)、禁用状态: disable4、二级菜单标签式导航<p>标签式的导航菜单</p><ul class="nav nav-tabs"> <li class="active"><a href="#">Home</a></li> <li><a href="#">SVN</a></li> <li><a href="#">iOS</a></li> <li><a href="#">VB.Net</a></li> <li><a href="#">Java</a></li> <li><a href="#">PHP</a></li></ul>胶囊式导航<p>根本的胶囊式导航菜单</p><ul class="nav nav-pills"> <li class="active"><a href="#">Home</a></li> <li><a href="#">SVN</a></li> <li><a href="#">iOS</a></li> <li><a href="#">VB.Net</a></li> <li><a href="#">Java</a></li> <li><a href="#">PHP</a></li></ul>分页导航 分页随处可见,分为页码导航和翻页导航 页码导航:ul标签上加pagination [pagination-lg | pagination-sm] 翻页导航:ul标签上加pager 分页<ul class="pagination"> <li><a href="#">&laquo;</a></li> <li><a href="#">1</a></li> <li><a href="#">2</a></li> <li><a href="#">3</a></li> <li><a href="#">4</a></li> <li><a href="#">5</a></li> <li><a href="#">&raquo;</a></li></ul>翻页<ul class="pager"> <li><a href="#">Previous</a></li> <li><a href="#">Next</a></li></ul>下拉菜单 在应用Bootstrap框架的下拉菜单时,必须应用两个js <!-- 如果要应用Bootstrap的js插件,必须先调入jQuery --><script src="js/jquery-3.4.1.js"></script><!-- 包含所有bootstrap的js插件或者能够依据须要应用的js插件调用 --><script src="js/bootstrap.min.js"></script> 要点: 1、应用一个类名为dropdown 或btn-group的div 包裹整个下拉框: <div class="dropdown"></div>2、默认向下dropdown,向上弹起退出 . dropup 即可3、应用button作为父菜单,应用类名: dropdown-toggle 和自定义data-toggle属性<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"></button>4、在button中 应用font 制作下拉箭头 <span class="caret"></span>5、下拉菜单项应用一个ul列表,并且定义一个类名为“dropdown-menu6、分组分割线: <li>增加类名“divider”来实现增加下拉分隔线的性能7、分组题目: li 增加类名 “dropdown-header” 来实现分组的性能8、对齐形式: 1)、dropdown-menu-left 左对齐 默认款式 2)、dropdown-menu-right 右对齐9、激活状态(.active)和禁用状态(.disabled)<!--应用一个类名为dropdown,默认向下dropdown,向上弹起退出 . dropup 即可--><div class="dropdown "> <!--应用button作为父菜单,应用类名: dropdown-toggle 和自定义data-toggle属性--> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> 喜爱频道 <span class="caret"></span><!--下拉箭头--> </button> <!--下拉菜单项应用一个ul列表,并且定义一个类名为“dropdown-menu--> <ul class="dropdown-menu"> <!--dropdown-menu-right右对齐--> <!--分组题目: li 增加类名 “dropdown-header” 来实现分组的性能--> <li class="dropdown-header">----科普----</li> <li> <a href="#">人与自然</a> </li> <!--分组分割线: <li>增加类名“divider”来实现增加下拉分隔线的性能--> <li class="divider"></li> <li class="dropdown-header">----搞笑----</li> <li> <a href="#">欢畅悲剧人</a> </li> <li> <a href="#">高兴大本营</a> </li> <li class="divider"></li> <li class="disabled"> <!--禁用状态--> <a href="#">生存大爆炸</a> </li> </ul></div>模态框 模态框(Modal)是笼罩在父窗体上的子窗体。通常,目标是显示来自一个独自的源的内容,能够在不来到父窗体的状况下有一些互动。子窗体可提供信息、交互等。 ...

July 11, 2020 · 2 min · jiezi

新一期的干货来了BootStrap该怎么用乐字节java4

表单 如果须要更多材料点击下方图片加好友支付⬇(注明来意) 表单次要性能是用来与用户做交换的一个网页控件,良好的表单设计可能让网页与用户更好的沟通。表单中常见的元素次要包含:文本输入框、下拉抉择框、单选按钮、复选按钮、文本域和按钮等。 表单控件 .form-control .input-lg(较大) .input-sm(较小) 输入框 text .form-control <div class="col-sm-3"> <input type="text" name="" id="" class="form-control" /> <input type="text" name="" id="" class="form-control input-lg" /> <input type="text" name="" id="" class="form-control input-sm" /></div>下拉抉择框 select 多行抉择设置:multiple="multiple" <div class="col-sm-3"> <select class="form-control"> <option>北京</option> <option>上海</option> <option>深圳</option> </select> <select class="form-control" multiple="multiple"> <option>北京</option> <option>上海</option> <option>深圳</option> </select></div>文本域 textarea<div class="col-sm-3"> <textarea class="form-control" rows="3"></textarea></div>复选框 checkbox 垂直显示: .checkbox 程度显示: .checkbox-inline <!-- 垂直显示 --><div> <div class="checkbox"> <label><input type="checkbox" >游戏</label> </div> <div class="checkbox"> <label><input type="checkbox" >学习</label> </div></div><!-- 程度显示 --><div> <label class="checkbox-inline"> <input type="checkbox" >游戏 </label> <label class="checkbox-inline"> <input type="checkbox" >学习 </label></div>单选框 radio 垂直显示: .radio 程度显示: .radio-inline ...

July 10, 2020 · 2 min · jiezi

新一期的干货来了BootStrap该怎么用乐字节java3

罕用款式 如果须要更多材料点击下方图片⬇(备注来意) 排版题目 Bootstrap和一般的HTML页面一样,定义题目都是应用标签<h1>到<h6>,只不过Bootstrap笼罩了其默认的款式,应用其在所有浏览器下显示的成果一样。为了让非题目元素和题目应用雷同的款式,还特意定义了.h1~.h6六个类名。同时前面能够紧跟着一行小的副标题或应用.small <h1>h1. Bootstrap heading<small>副标题</small></h1><div class="h1">Bootstrap题目1<span class="small">副标题</span></div>段落 段落是排版中另一个重要元素之一。通过.lead 来突出强调内容(其作用就是增大文本字号,加粗文本,而且对行高和margin也做相应的解决。能够应用以下标签给文本做突出款式解决: :小号字 :加粗 :斜体 <p class="lead"><small>当前的</small><b>你</b>会<i>感激</i>当初<em>致力</em>的<strong>你</strong></p>强调 定义了一套类名,这里称其为强调类名,这些强调类都是通过色彩来示意强调,具本阐明如下: .text-muted:提醒,应用浅灰色(#999) .text-primary:次要,应用蓝色(#428bca) .text-success:胜利,应用浅绿色(#3c763d) .text-info:告诉信息,应用浅蓝色(#31708f) .text-warning:正告,应用黄色(#8a6d3b) .text-danger:危险,应用褐色(#a94442)<div class="text-muted">提醒成果</div><div class="text-primary">次要成果</div><div class="text-success">胜利成果</div><div class="text-info">信息成果</div><div class="text-warning">正告成果</div><div class="text-danger">危险成果</div>对齐成果 在CSS中经常应用text-align来实现文本的对齐格调的设置。 其中次要有四种格调: 左对齐,取值left ; 居中对齐,取值center; 右对齐,取值right ; 两端对齐,取值justify。 为了简化操作,方便使用,Bootstrap通过定义四个类名来管制文本的对齐格调:.text-left:左对齐 .text-center:居中对齐 .text-right:右对齐 .text-justify:两端对齐。 <p class="text-left">我居左</p><p class="text-center">我居中</p><p class="text-right">我居右</p><p class="text-justify">网格零碎的实现原理非常简单,仅仅是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最初联合媒体查问,就制作出了弱小的响应式网格零碎。Bootstrap框架中的网格零碎就是将容器平分成12份</p>列表 在HTML文档中,列表构造次要有三种: 无序列表(<ul><li>…</li></ul>) 有序列表(<ol><li>…</li></ol>) 定义列表(<dl><dt>…</dt><dd>…</dd></dl>) 去点列表 class="list-unstyled" <ul class="list-unstyled"> <li>无序我的项目列表一</li> <li>无序我的项目列表二</li></ul>内联列表 class="list-inline",把垂直列表换成程度列表,而且去掉我的项目符号(编号),放弃程度显示。也能够说内联列表就是为制作程度导航而生。 <ul class="list-inline"> <li>首页</li> <li>java学院</li> <li>在线课堂</li></ul>定义列表 在原有的根底退出了一些款式,应用款式 class="dl-horizontal" 制作程度定义列表 : 当题目宽度超过160px时,将会显示三个省略号。 <dl> <dt>HTML</dt> <dd>超文本标记语言</dd> <dt>CSS</dt> <dd>层叠样式表是一种样式表语言</dd></dl><dl class="dl-horizontal"> <dt>HTML 超文本标记语言</dt> <dd>HTML称为超文本标记语言,是一种标识性的语言。</dd> <dt>测试题目不能超过160px的宽度,否则2个点</dt> <dd>我在写一个程度定义列表的成果,我在写一个程度定义列表的成果。</dd></dl>代码 个别在集体博客上应用的较为频繁,用于显示代码的格调。在Bootstrap次要提供了三种代码格调: ...

July 9, 2020 · 1 min · jiezi

Bootstrap4项目开发实战

一、企业网站项目 课件 0.课程简介 1.顶部区域的制作 2.导航区域的制作 3.轮播区域的制作 4.产品区域的制作 5.最新资讯区域的制作 6.底部区域的制作 二、化妆品网站项目 1.项目初始化_导航的制作 2.推荐区域的制作 3.产品特点区域的制作 4.星品宝贝区域的制作 5.移动APP下载区域的制作 6.公司简介区域的制作 7.联系我们区域的制作 8.底部区域的制作_滚动监听 9.动画效果的添加 观看:http://www.web-666.com/7.html

June 25, 2019 · 1 min · jiezi

springboot通过jar包方式引入bootstrap

一、springboot引入bootstrap的两种方式SpringBoot结合前端有主要有两种方法,一种是在static里面直接加入下载的bootstrap中的css或js;另一种是引入webjars,以jar包的形式加入项目。手动在static中引入bootstrap需要自己去手动下载bootstrap,而引入webjars通过jar包方式就需要配置pom.xml即可。webjars方式引入bootstrap,实际上就是通过webjars方式管理前端静态资源的方式,具体的可以参考:https://www.jianshu.com/p/66d...WebJars官网找到项目所需的依赖,例如在pom.xml引入 jQuery、BootStrap前端组件等。二、webjars方式引入新建一个SpringBoot Web项目。然后在pom文件引入webjars的jar,pom文件代码如下: <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>3.3.5</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.1.1</version> </dependency>然后我们观察下项目的依赖包:然后在src/main/resources/static文件下新建index.html,代码如下: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Dalaoyang</title> <link rel="stylesheet" href="/webjars/bootstrap/3.3.5/css/bootstrap.min.css" /> <script src="/webjars/jquery/3.1.1/jquery.min.js"></script> <script src="/webjars/bootstrap/3.3.5/js/bootstrap.min.js"></script></head><body><div class="container"><br/> <div class="alert alert-success"> <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a> <h3>index首页</h3>Hello, <strong>springboot and bootstrap!!!</strong> </div></div></body></html>配置结束,启动项目,访问http://localhost:8888/三、参考链接https://www.cnblogs.com/dalao...[https://www.cnblogs.com/dalao...][7]

June 20, 2019 · 1 min · jiezi

Bootstrap入门

什么是Bootstrap?Bootstrap,来自Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。 它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目。 国内一些移动开发者较为熟悉的框架,如WeX5前端开源框架等,也是基于Bootstrap源码进行性能优化而来。 Bootstrap框架用途和优点我们可以使用Bootstrap框架提供的样式和组件快速的完成一个网站的前端页面,只需要引用一些定义好样式和组件(通过定义好的class来引用相应的样式和组件),就可以完成一个非常漂亮网页。而且Bootstrap框架还支持自适应,在不同大小的屏幕上会自动调节网页显示的内容,避免了在在pc上很漂亮的网页,而在移动端左右出现滚动条,网页内容太小看不清等不利于用户体验的表现。 Bootstrap文档目录结构bootstrap /├── css // CSS文件│ ├── bootstrap-theme.css // Bootstrap主题样式文件│ ├── bootstrap-theme.css.map│ ├── bootstrap-theme.min.css // 主题相关样式压缩文件│ ├── bootstrap-theme.min.css.map│ ├── bootstrap.css│ ├── bootstrap.css.map│ ├── bootstrap.min.css // 核心CSS样式压缩文件│ └── bootstrap.min.css.map├── fonts // 字体文件│ ├── glyphicons-halflings-regular.eot│ ├── glyphicons-halflings-regular.svg│ ├── glyphicons-halflings-regular.ttf│ ├── glyphicons-halflings-regular.woff│ └── glyphicons-halflings-regular.woff2└── js // JS文件│ ├── bootstrap.js│ ├── bootstrap.min.js // 核心JS压缩文件└── npm.js 更多Bootstrap课程:阿里云大学——开发者课堂

May 29, 2019 · 1 min · jiezi

datatables增加跳转指定页功能-datatable自定义分页

DataTable使用方便,快捷。但有时候用户需求对分页有需求,例如输入页数进行分页跳转。这样就需要扩展功能了,datatable也支持自定义扩展,下面以使用DataTable bootstrap分页为例 1. 初始化DataTablevar $table = $('#listTable');var listTable = $table.DataTable({ language: { url: path + '/resources/js/bootstrap/dtChinese.json' }, searching: false, //搜索栏 ordering: true, //排序 scrollX: true, scrollY: scrollY, //表格滚动区高度 columns: columns, serverSide: true, //打开后台分页 processing: true, //打开数据加载时的等待效果 lengthChange: false, //禁用每页显示的记录数 sPaginationType: "bootstrap", //bootstrap / full_numbers // lengthMenu: [ // [20, 50, 100, -1], // [20, 50, 100, "All"] // ], pageLength: 20, ajax: path + '/searchBase?name=' + sqlStr + '&type=getSqlValues&dataBase=' + opt.dataBase });2. 扩展功能DataTable自定义分页(bootstrap分页)扩展代码如下 ...

May 10, 2019 · 3 min · jiezi

SpringBoot 仿抖音短视频小程序开发(三)

SpringBoot 仿抖音短视频小程序开发(一):项目的简介(https://segmentfault.com/a/11...SpringBoot 仿抖音短视频小程序开发(二):项目功能分析与具体实现(https://segmentfault.com/a/11…源代码: SpringBoot 仿抖音短视频小程序开发 全栈式实战项目(https://gitee.com/scau_zns/sh…)短视频后台管理系统:(https://gitee.com/scau_zns/sh…小程序的后台管理系统涉及的技术栈:Bootstrap + jQuery + jGrid + SSM框架 + zookeeper一、用户列表的获取与分页前端代码: <div class=“usersList_wrapper”> <!– 用户列表展示的表格 –> <table id=“usersList”></table> <!– 底部的分页条 –> <div id=“usersListPager”></div> </div> jGrid发送请求获取数据封装好展示到页面// 用户列表 var handleList = function() { // 上下文对象路径 var hdnContextPath = $("#hdnContextPath").val(); var apiServer = $("#apiServer").val(); var jqGrid = $("#usersList"); jqGrid.jqGrid({ caption: “短视频用户列表”, url: hdnContextPath + “/users/list.action”, mtype: “post”, styleUI: ‘Bootstrap’,//设置jqgrid的全局样式为bootstrap样式 datatype: “json”, colNames: [‘ID’, ‘头像’, ‘用户名’, ‘昵称’, ‘粉丝数’, ‘关注数’, ‘获赞数’], colModel: [ { name: ‘id’, index: ‘id’, width: 30, sortable: false, hidden: false }, { name: ‘faceImage’, index: ‘username’, width: 50, sortable: false, formatter:function(cellvalue, options, rowObject) { <!– 配置的虚拟目录apiServer = http://192.168.199.150:8080 –> var src = apiServer + cellvalue; var img = “<img src=’” + src + “’ width=‘120’></img>” return img; } }, { name: ‘username’, index: ‘password’, width: 30, sortable: false }, { name: ’nickname’, index: ’nickname’, width: 30, sortable: false }, { name: ‘fansCounts’, index: ‘age’, width: 20, sortable: false }, { name: ‘followCounts’, index: ‘sexValue’, width: 20, sortable: false }, { name: ‘receiveLikeCounts’, index: ‘province’, width: 20, sortable: false, hidden: false } ], viewrecords: true, // 定义是否要显示总记录数 rowNum: 10, // 在grid上显示记录条数,这个参数是要被传递到后台 rownumbers: true, // 如果为ture则会在表格左边新增一列,显示行顺序号,从1开始递增。此列名为’rn’ autowidth: true, // 如果为ture时,则当表格在首次被创建时会根据父元素比例重新调整表格宽度。如果父元素宽度改变,为了使表格宽度能够自动调整则需要实现函数:setGridWidth height: 500, // 表格高度,可以是数字,像素值或者百分比 rownumWidth: 36, // 如果rownumbers为true,则可以设置行号 的宽度 pager: “#usersListPager”, // 分页控件的id subGrid: false // 是否启用子表格 }).navGrid(’#usersListPager’, { edit: false, add: false, del: false, search: false }); // 随着窗口的变化,设置jqgrid的宽度 $(window).bind(‘resize’, function () { var width = $(’.usersList_wrapper’).width()0.99; jqGrid.setGridWidth(width); }); // 不显示水平滚动条 jqGrid.closest(".ui-jqgrid-bdiv").css({ “overflow-x” : “hidden” }); // 条件查询所有用户列表 $("#searchUserListButton").click(function(){ var searchUsersListForm = $("#searchUserListForm"); jqGrid.jqGrid().setGridParam({ page: 1, url: hdnContextPath + “/users/list.action?” + searchUsersListForm.serialize(), }).trigger(“reloadGrid”); }); }后端获取用户列表分页数据的接口: @PostMapping("/list") @ResponseBody public PagedResult list(Users user , Integer page) { PagedResult result = usersService.queryUsers(user, page == null ? 1 : page, 10); return result; }搜索功能的实现:<!– 搜索内容 –> <div class=“col-md-12”> <br/> <form id=“searchUserListForm” class=“form-inline” method=“post” role=“form”> <div class=“form-group”> <label class=“sr-only” for=“username”>用户名:</label> <input id=“username” name=“username” type=“text” class=“form-control” placeholder=“用户名” /> </div> <div class=“form-group”> <label class=“sr-only” for=“nickname”>昵称:</label> <input id=“nickname” name=“nickname” type=“text” class=“form-control” placeholder=“昵称” /> </div> <button id=“searchUserListButton” class=“btn yellow-casablanca” type=“button”>搜 索</button> </form> </div>使用jGrid发送请求给后台 // 条件查询所有用户列表 $("#searchUserListButton").click(function(){ var searchUsersListForm = $("#searchUserListForm"); jqGrid.jqGrid().setGridParam({ page: 1, url: hdnContextPath + “/users/list.action?” + searchUsersListForm.serialize(), }).trigger(“reloadGrid”); });二、背景音乐BGM的上传、查询和删除上传 $("#file").fileupload({ pasteZone: “#bgmContent”, dataType: “json”, done: function(e, data) { console.log(data); if (data.result.status != ‘200’) { alert(“长传失败…”); } else { var bgmServer = $("#bgmServer").val(); var url = bgmServer + data.result.data; $("#bgmContent").html("<a href=’" + url + “’ target=’_blank’>点我播放</a>”); $("#path").attr(“value”, data.result.data); } } });后台接口保存BGM的方法参考上传头像的方法分页查询参考用户列表信息的分页查询多少删除BGM var deleteBgm = function(bgmId) { var flag = window.confirm(“是否确认删除???”); if (!flag) { return; } $.ajax({ url: $("#hdnContextPath").val() + ‘/video/delBgm.action?bgmId=’ + bgmId, type: “POST”, success: function(data) { if (data.status == 200 && data.msg == ‘OK’) { alert(‘删除成功~~’); var jqGrid = $("#bgmList"); jqGrid.jqGrid().trigger(“reloadGrid”); } } })}三、举报管理禁止播放var forbidVideo = function(videoId) { var flag = window.confirm(“是否禁播”); if (!flag) { return; } $.ajax({ url: $("#hdnContextPath").val() + “/video/forbidVideo.action?videoId=” + videoId, type: “POST”, async: false, success: function(data) { if(data.status == 200 && data.msg == “OK”) { alert(“操作成功”); var jqGrid = $("#usersReportsList"); //reloadGrid是重新加载表格 jqGrid.jqGrid().trigger(“reloadGrid”); } else { console.log(JSON.stringify(data)); } } })}四、后台管理系统增加或删除BGM,向zookeeper-server创建子节点,让小程序后端监听【重点】1、首先安装Zookeeper到Linux上,启动服务器2、编写zk客户端代码:import org.apache.curator.framework.CuratorFramework;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.ZooDefs.Ids;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class ZKCurator { //zk客户端 private CuratorFramework client = null; final static Logger log = LoggerFactory.getLogger(ZKCurator.class); public ZKCurator(CuratorFramework client) { this.client = client; } public void init() { client = client.usingNamespace(“admin”); try { //判断在admin命名空间下是否有bgm节点 /admin/bgm if( client.checkExists().forPath("/bgm") == null ) { //对于zk来讲,有两种类型的节点,一种是持久节点(永久存在,除非手动删除),另一种是临时节点(会话断开,自动删除) client.create().creatingParentContainersIfNeeded() .withMode(CreateMode.PERSISTENT) //持久节点 .withACL(Ids.OPEN_ACL_UNSAFE) //匿名权限 .forPath("/bgm"); log.info(“zookeeper客户端连接初始化成功”); log.info(“zookeeper服务端状态:{}",client.isStarted()); } } catch (Exception e) { log.error(“zookeeper客户端连接初始化失败”); e.printStackTrace(); } } /* * 增加或者删除Bgm,向zk-server创建子节点,供小程序后端监听 * @param bgmId * @param operType */ public void sendBgmOperator(String bgmId, String operObject) { try { client.create().creatingParentContainersIfNeeded() .withMode(CreateMode.PERSISTENT) //持久节点 .withACL(Ids.OPEN_ACL_UNSAFE) //匿名权限 .forPath("/bgm/” + bgmId, operObject.getBytes()); } catch (Exception e) { e.printStackTrace(); } }}3、在applicationContext-zookeeper.xml配置zookeeper: <!– 创建重连策列 –> <bean id=“retryPolicy” class=“org.apache.curator.retry.ExponentialBackoffRetry”> <!– 每次重试连接的等待时间 –> <constructor-arg index=“0” value=“1000”></constructor-arg> <!– 设置最大的重连次数 –> <constructor-arg index=“1” value=“5”></constructor-arg> </bean> <!– 创建zookeeper客户端 –> <bean id=“client” class=“org.apache.curator.framework.CuratorFrameworkFactory” factory-method=“newClient” init-method=“start”> <constructor-arg index=“0” value=“120.79.18.35:2181”></constructor-arg> <constructor-arg index=“1” value=“10000”></constructor-arg> <constructor-arg index=“2” value=“10000”></constructor-arg> <constructor-arg index=“3” ref=“retryPolicy”></constructor-arg> </bean> <!– 调用init方法启动 –> <bean id=“ZKCurator” class=“com.imooc.web.util.ZKCurator” init-method=“init”> <constructor-arg index=“0” ref=“client”></constructor-arg> </bean>4、上传或者删除BGM时调用VideoServiceImpl.java的方法 @Autowired private ZKCurator zKCurator; @Override public void addBgm(Bgm bgm) { String id = sid.nextShort(); bgm.setId(id); bgmMapper.insert(bgm); Map<String, String> map = new HashMap<>(); map.put(“operType”, BGMOperatorTypeEnum.ADD.type); map.put(“path”, bgm.getPath()); zKCurator.sendBgmOperator(id, JSONUtils.toJSONString(map)); } @Override public void deleteBgm(String id) { Bgm bgm = bgmMapper.selectByPrimaryKey(id); bgmMapper.deleteByPrimaryKey(id); Map<String, String> map = new HashMap<>(); map.put(“operType”, BGMOperatorTypeEnum.DELETE.type); map.put(“path”, bgm.getPath()); zKCurator.sendBgmOperator(id, JSONUtils.toJSONString(map)); }5、小程序编写代码监听zookeeper的节点,并对其做出相应的删除和上传操作【重点】初始化zookeeper客户端 private CuratorFramework client = null; final static Logger log = LoggerFactory.getLogger(ZKCuratorClient.class);// public static final String ZOOKEEPER_SERVER = “120.79.18.36:2181”; public void init() { if(client != null) { return; } //重试策略 RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5); //创建zk客户端 120.79.18.36:2181 client = CuratorFrameworkFactory.builder().connectString(resourceConfig.getZookeeperServer()).sessionTimeoutMs(10000) .retryPolicy(retryPolicy).namespace(“admin”).build(); //启动客户端 client.start(); try { addChildWatch("/bgm"); } catch (Exception e) { e.printStackTrace(); } } 监听zk-server的节点,当短视频后台管理系统上传或者删除某个BGM的时候,小程序后台服务器通过Zookeeper监听自动下载背景音乐public void addChildWatch(String nodePath) throws Exception { final PathChildrenCache cache = new PathChildrenCache(client, nodePath, true); cache.start(); cache.getListenable().addListener(new PathChildrenCacheListener() { @Override public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)){ log.info(“监听到事件CHILD_ADDED”); //1. 从数据库查询bgm对象,获取路径Path String path = event.getData().getPath(); String operatorObjStr = new String(event.getData().getData()); Map<String, String> map = JsonUtils.jsonToPojo(operatorObjStr, Map.class); String operatorType = map.get(“operType”); String songPath = map.get(“path”);// String[] arr = path.split("/");// String bgmId = arr[arr.length-1];// Bgm bgm = bgmService.queryBgmById(bgmId);// if(bgm == null){// return;// } //1.1 bgm所在的相对路径// String songPath = bgm.getPath(); //2. 定义保存到本地的bgm路径// String filePath = “E:\imooc_videos_dev” + songPath; String filePath = resourceConfig.getFileSpace() + songPath; //3. 定义下载的路径(播放url) String[] arrPath = songPath.split("\\"); //windows// String[] arrPath = songPath.split("/"); //linux String finalPath = “”; //3.1 处理url的斜杠以及编码 for(int i=0; i<arrPath.length;i++){ if(StringUtils.isNotBlank(arrPath[i])) { finalPath += “/”; finalPath += URLEncoder.encode(arrPath[i], “UTF-8”); } }// String bgmUrl = “http://192.168.199.150:8080/mvc” + finalPath; String bgmUrl = resourceConfig.getBgmServer() + finalPath; if(operatorType.equals(“1”)){ //下载bgm到springboot服务器 URL url = new URL(bgmUrl); File file = new File(filePath); FileUtils.copyURLToFile(url, file); client.delete().forPath(path); }else if(operatorType.equals(“2”)){ File file = new File(filePath); FileUtils.forceDelete(file); client.delete().forPath(path); } } } }); } ...

April 11, 2019 · 5 min · jiezi

基于Laravel5.8支持Markdown的开源博客VienBlog

laravel-blogVien Blog - 一款基于laravel5.8开发的,支持markdown编辑以及图片拖拽上传的博客系统、SEO友好博主网站VienBlog这里有些小秘密博客亮点界面简洁、适配pc和mobile、有良好的视觉体验支持markdown、并且可以拖拽或者粘贴上传图片、分屏实时预览SEO友好:支持自定义文章slug、支持meta title、description、keywords自定义导航、自定义sidebar、随时去掉不需要的模块支持标签、分类、置顶、分享、友链等博客基本属性支持AdSense支持百度自动提交链接和手动提交链接博客展示Demo演示地址: 这是一个DEMO后台管理文章列表主要操作有创作、编辑、置顶、删除(软删除)创作和编辑创作和编辑页面Markdown编辑器:支持拖拽粘贴上传图片、预览、全屏、分屏预览前端展示参照 这是一个DEMO看完Demo,如果你觉得还过得去,想要用一用试试呢,赶紧往下看喔。使用博客安装获取源码git clone git@github.com:luvvien/laravel-blog.git进入项目目录后,用composer安装依赖composer install生成.env文件cp .env.example .env创建数据库vienblog ,字符集采用 utf8mb4, utf8mb4_general_ci编辑.env文件 vim .env,修改MySQL数据库连接配置,请将DB_HOST,DB_PORT,DB_USERNAME,DB_PASSWORD 改成你的数据库配置。[…]DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=vienblogDB_USERNAME=rootDB_PASSWORD=root[…]数据迁移和数据填充php artisan migratephp artisan db:seed创建storage软连接php artisan storage:link设置目录权限chmod -R 755 storage/chown -R www-data:www-data storage/使用可以选择临时预览,也可以用Nginx部署服务临时预览php artisan serv打开浏览器访问127.0.0.1:8000使用NginxNginx配置,将root指向项目的public目录,请用pwd 查看目录,并且改成你目录,千万不要直接粘贴复制。root /app/laravel-blog/public;完整配置server { listen 8088 default_server; listen [::]:8088 default_server; root /apps/vien_blog/public; index index.php index.html index.htm; server_name _; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.2-fpm.sock; # fpm,因为版本不同路径会有区别,这里请改成你,不知道路径可以执行php-fpm便会显示 # fastcgi_pass 127.0.0.1:9000; # cgi }}打开浏览器访问127.0.0.1:8088后台登录地址/admin默认的admin管理账号是vien@byteinf.com密码是vienblog,进入控制台后可以修改管理员信息使用百度自动推送和主动推送请先在config/vienblog.php中按照注释配置相关的信息,自动推送是在网页访问时推送,主动推送执行以下代码会将未提交过的链接提交到百度php artisan push:baidu讨论群QQ群号:149347741 (欢迎开发者,技术爱好者,站长加入)联系我Email: support@vienblog.comLicense使用Vien Blog构建应用,必须在页脚保留Powered by Vien Blog字样以及相关链接在遵守以上规则的情况下,你可以享受等同于MIT License协议的授权。使用Vien Blog并且遵守上述协议的用户可以享受Vien Blog的博客导航,联系我将你的博客地址添加到Vien Blog的网站导航中。 ...

April 6, 2019 · 1 min · jiezi

Bootstrap优秀模板-ColorAdmin.4.3.0

老牌的Bootstrap商业模板,提供HTML、AngularJS、AngularJS5、Vue、React多种环境,风格覆盖Flat、Material、Apple、Transparent甚至Facebook,还有12种配色,组件和页面也奇多,非常推荐!下面是官方介绍:Color Admin is the new premium and fully responsive admin template. Concept of design for Color Admin is based on the FLAT design and finally it comes out with a clean and neat design. It is built on top of the popular Bootstrap Framework. Besides that, it is bundled with a lot of third party plugins and useable elements such as buttons, thumbnails, media objects and much more…(ColorAdmin是一个新的高级的完全响应式的管理端模板,设计理念基于FLAT设计风格,最终形成了一个干净灵巧的设计风格,本模板基于流行的Bootstrap框架构建,除此之外,还加入了很多第三方的组件和游泳的元素诸如按钮、缩略图、媒体组件等等)先来张官方图下面是官方介绍:特性Built with Bootstrap Bootstrap 4 & 3(基于Bootstrap4、3构建)AJAX + HTML + ANGULAR + ANGULAR 5 + VUE.JS + REACT.JS Version(有Ajax、HTML、AJS、AJS5、Vue、React版本)5 Admin Theme (Flat + Material Design + Apple Design + Transparent + Facebook Design)(5中风格,Flat、Material、Apple、Transparent、Facebook)4 Front End Template(4种前端模板)12 Admin Color Scheme(12种管理端配色)2 Admin Header Color Scheme(2种管理端头部配色)2 Admin Sidebar Color Scheme(2种侧边菜单配色)Unlimited Admin Page Options(无限制的管理选页面选项)2 Admin Content Color Scheme(2种管理端内容配色)Local Storage Panel(本次存储面板)Modern & Old Browser Compatibility(新旧浏览器同步支持)Compatible with DataTables & 9 DataTables Extension(适配DateTables系列组件)Unlimited Nav Tabs(无限数量导航组件)Smooth Mobile / Tablet Scrollbar Implementation(移动端和平版权平滑滚动过渡)Vector Icons - FontAwesome v5.7(FontAwesome5.7版本字体图标)Vector Icons - Simple Line Icons(Simple Line字体图标)Vector Icons - Ionicons (600++ Icons)(Ionicons字体图标)Vector Icons - Google Material Icons(谷歌Material字体图标)Fully Responsive HTML5 Markup & CSS3(完全的响应式支持,CSS3设计)JShint & HTML5 Valid(JS和H5代码检查)Easy to understand HTML Structure, CSS Classes & Javascript markup(轻松理解HTML元素、CSS类名和JS相关)Contrast Colors(反色支持)Well Documented(文档健全)其他特性初码国内源码Demo地址如果地址打不开手动浏览器输入:muban.chuma.cn即可。下面是下载地址 ...

April 4, 2019 · 1 min · jiezi

微信账单数据可视化项目

微信账单数据可视化项目哈喽各位小伙伴们Night 微信账单分析来袭!让数据说话! Demo网址http://www.dnnnns.com话不多说,导出你的微信账单分析吧,走边了多少个城市,吃遍了多少个馆子,最爱消费的商铺等等…. 小Bill帮你的账单数据可视化。还支持导出账单小票操作吆,又可以装B了。(友商合作可重点看最后一图) 此外本项目完全开源,项目上传GitHub https://github.com/hltfaith/w…废话不多说直接上图,走起

April 2, 2019 · 1 min · jiezi

Bootstrap优秀模板-Unify.2.6.2

这是一个非常老牌的Bootstrap商业模板,全面性和稳定性俱佳,有LandingPage、BussinessPage、AdminPage多种模式,非常推荐用来构建官网、响应式应用Web、管理端Web等。最早这个模板20多美元,现在增加了AdminPage,价格也涨到40美元了,总的来说,非常对得起这个价格,值得在商业项目中使用,很多布局和控件不需要自己造轮子,用这个就完了。先来张官方图下面是官方特性介绍:核心特性100% Responsive(100%响应式) Based on Bootstrap 4(基于Boostrap4构建) Full Built in SASS(样式基于SASS构建) 600+ Pre-made HTML5 Pages(600多种预设样式页面) 1750+ Reusable UI Components(1750+可复用控件) 200+ Slider Demos(200+Slider案例) 85+ Header Options(85+头部样式) 30+ Beautiful Promo Blocks(30+漂亮的首页开屏推介模块(Promo Blocks我也不知道翻译成啥好..就这么叫吧)) 40+ Footer Options(40+底部样式) 40+ Extensive Blog Layouts(40+大宽度博客布局) 45+ Carefully Customized Libraries(45+精心定制的组件库) 45+ Crafted Portfolio Layouts(45+组件组合布局) 40+ Ready to Start Templates(40+准备发布页面模板)其他特性100% Customizable(100%可定制改造) Bootstrap Flexbox Grid(支持Bootstrap弹性布局组件) Premium Plugins & Libraries(高级组件和库) Youtube, Vimeo & HTML5 Background Videos(Youtube、Vimeo视频支持,H5背景视频) Google Maps - over 10 functional examples including theming options(谷歌地图,10+功能案例) 4000+ Font Icons (Font Awesome, Simple Line Icons etc.)(4000+各种字体图标) Massive Collection of Pricing Tables and Demos(很多价格表单页面案例) Smooth Parallax Scrolling(平滑视觉过渡(这个也不知道如何翻译,就是那种整个页面从上翻到下面视觉过渡,像比如小米卖手机那种页面)) Image & Content Sliders(图片和内容滑动) Over 30 Counters options including pie chart options(30+计数器,包含饼状图计数器) Over 30 Popup Functionalities(30+弹出样式功能) Lightbox Image View - comes with huge functional options(Lightbox图片浏览(这个是个插件名称)) Extensive Galleries Options(大照片浏览插件) Countdown Variations(倒计时插件) Sticky Blocks - make any blocks “sticky” in your content, perfect for sidebars(一个叫Sticky Blocks的插件,让任何块内容保持粘性不动,非常适合做工具栏模块) Animated Typing Words(文字动态输出(这个也不知道如何翻译了,大概意思就是模拟打字这样把文本显示出来)) Huge Collection of Form Options(超大的表单收集) Background Overlays - put any colors on top of video and image backgrounds(背景素材叠加覆盖,能把任何颜色、视频、图片等覆盖在背景上) Drop Zone File Upload(拖拽上传文件) Google Fonts - over 800 font options to use(谷歌字体) On Scroll Animations(滚动动画) Masonry Grid Layouts(瀑布流布局) Pie Charts(饼状图表) Over 30 Product Designs - use for any type of e-commerce, events and listing pages(30+产品设计样式,适合电商等页面) Timeline Designs(时间轴页面) Over 10 User Design Blocks - perfect for profile/admin pages(饼状图表) Over 20 Login & Sign Up Pages(20+登录注册页面) 15 Ready to Start Unique Home Pages(15个准备开始唯一首页页面) Profile Pages(个人中心页面) Search Result Pages(搜索结果页面) Job Pages(职位介绍页面) Coming Soon Page(即将上线页面) 404 Error Pages(404错误页面) Developer Friendly & Clean Code(对开发者很友好,代码干净整洁) Extensive Documentation(丰富的文档) Free & Lifetime Updates(一次付费终生升级) Easy to Customize(很容易定制) Stunning Support(售后支持让你吃惊)官方Demo地址初码国内源码Demo地址下面是下载地址 ...

March 28, 2019 · 2 min · jiezi

图片滑动的内部原理,这就涉及到简单的算法

导读项目已上传到我的码云,如果有需要的,可以自行下载:项目原码今天,应产品经理的要求,当我们点击左按钮时,上下都显示第六张图片;当我们点击右按钮时,上下读显示第-1张图片。涉及的框架你可以将项目down下来,使用 webstorm或HBuilder打开。使用JQuery将静态的HTML变得有灵魂。使用vue.js实现将数据数据的双向绑定使用bootstrap来美化静态页面使用layui的更美地弹出信息,比如已经达到最后一张了,无法左移页面设计<!DOCTYPE html><html lang=“en”> <head> <meta charset=“UTF-8”> <title>图片的滑动</title> <link href="../css/bootstrap.css" rel=“stylesheet”> <link href="../css/bootstrap.min.css" rel=“stylesheet”> <link href="../css/layer.css" rel=“stylesheet”> <link href="../css/code.css" rel=“stylesheet”> <script src="../js/jQuery.js" type=“text/javascript”></script> <script src="../js/bootstrap.js" type=“text/javascript”></script> <script src="../js/bootstrap.min.js" type=“text/javascript”></script> <script src="../js/vue.js" type=“text/javascript”></script> <script src="../js/layui.js" type=“text/javascript”></script> <script src="../js/layui.all.js" type=“text/javascript”></script> <script src="../js/imgSlide.js" type=“text/javascript”></script> </head> <body> <h2 style=“width: 100%;text-align: center;margin-top: 20px”>图片移动</h2> <div class=“containsImg”> <div class=“container” style=“width:36%;height: 400px;position: relative;margin: 1% 32%;border-radius: 5px “> <img :src=“upImg.paths” :title=“upImg.name” class=“img-rounded” style=“width: 100%;height: 100%;"> </div> <div class=“container” style=“width:36%;height: 90px;position: relative;margin: 0 32%;border-radius: 5px “> <img src=”../imgs/left.png” class=“img-rounded” onclick=“fns.toLeft()” style=“width: 6%;height: 100%;margin-right: 2%;float: left;"> <img v-for=“it in images” :src=“it.paths” :title=“it.name” onclick=“fns.toUp(this)” onmouseover=“fns.toUp(this)” class=“img-rounded” style=“width: 16%;height: 100%;margin-right: 1%;float: left;"> <img src=”../imgs/right.png” class=“img-rounded” onclick=“fns.toRight()” style=“width: 6%;height: 100%;float: left;margin-left: 1%"> </div> </div> </body></html>js页面/** * @author zby * @description 图片移动 //* * 自调用函数 * 函数表达式可以 “自调用”。 * 自调用表达式会自动调用。 * 如果表达式后面紧跟 () ,则会自动调用。 * 不能自调用声明的函数。 * 通过添加括号,来说明它是一个函数表达式: * (function () { * var x = “Hello!!”; // 我将调用自己 * })(); /(function (document, window, $) { ‘use strict’; var vm = {}, length = 5; var imgSrcs = new Array(); var layer = {} /* * jQuery信息初始化 / $(function () { var fns = { /* * 设计思路,图片左移 * 比如有六张图片,首先展示1,5折五张图片,向左移动一次,展示2,6张图片,以此类推。。。 / toLeft: function () { if (imgSrcs.length > 5) { if (length < imgSrcs.length) { length++; vm.images = imgSrcs; vm.images = vm.images.slice(length - 5, length); //下标减1 vm.upImg = imgSrcs[length - 1]; } else { length = imgSrcs.length; layer.msg(“已经达到最后一张了,无法左移”, {time: 800}); } } else { layer.msg(“小图已全部展示,无法左移”, {time: 800}); } }, /* 设计思路,图片右移 比如有六张图片,首先展示2,6折五张图片,向右移动一次,展示1,5张图片,以此类推。。。 / toRight: function () { if (imgSrcs.length > 5) { if (length > 5) { length–; vm.images = imgSrcs; vm.images = vm.images.slice(length - 5, length); //下标减5 vm.upImg = imgSrcs[length - 5]; } else { length = 5; layer.msg(“已经达到第一张了,无法右移”, {time: 800}); } } else { layer.msg(“小图片已全部展示,无法右移”, {time: 800}); } }, toUp: function (me) { vm.upImg = { paths: $(me).attr(“src”), name: $(me).attr(“title”) } } } / * 变量、方法提升,也就是说,可以在定义之前使用该变量和方法 / init(); //变量升级为window对象,fns是局部变量,将其提升为全局变量,即Windows变量 //全局变量可应用于页面上的所有脚本。 window.fns = fns; }); / * 初始化数据 */ function init() { vm = new Vue({ el: “.containsImg”, data: { images: {}, upImg: {} }, }) imgSrcs.push({paths: “../imgs/1.jpg”, name: “清幽竹林”}); imgSrcs.push({paths: “../imgs/2.jpg”, name: “夕阳晚景”}); imgSrcs.push({paths: “../imgs/3.jpg”, name: “山峰湖水”}); imgSrcs.push({paths: “../imgs/4.jpg”, name: “月下荡人”}); imgSrcs.push({paths: “../imgs/6.jpg”, name: “蓝天白云水悠悠”}); imgSrcs.push({paths: “../imgs/7.jpg”, name: “峭壁临水”}); imgSrcs.push({paths: “../imgs/8.jpg”, name: “青山绿树”}); imgSrcs.push({paths: “../imgs/9.jpg”, name: “明亮春景”}); imgSrcs.push({paths: “../imgs/10.jpg”, name: “银装素裹”}); imgSrcs.push({paths: “../imgs/11.jpg”, name: “雾凇雪路”}); imgSrcs.push({paths: “../imgs/12.jpg”, name: “柏树绿水”}); vm.images = imgSrcs; if (vm.images.length > 0) { vm.upImg = { name: imgSrcs[0].name, paths: imgSrcs[0].paths, } if (vm.images.length > 5) { vm.images = vm.images.slice(0, 5); } } layui.use(’layer’, function () { layer = layui.layer; }); }})(document, window, jQuery)最终达到的效果当我们点击向左移动时,上面的大图也会随着改变;如果达到最后一张了,就提示无法左移。当我们点击向右移动时,上面的大图也会随着改变;如果达到第一张了,就提示无法右移。*当鼠标滑过下面的小图时,上面的大图也会随着改变。 ...

March 16, 2019 · 2 min · jiezi

Metronic学习之路(一)

使用GULP构建工具对Metronic进行管理部署gulp打开终端并进入到 Metronic 的 theme 根目录,运行以下代码$ npm install //安装程序的依赖包发现 npm install 报 node-sass 错误原因: npm install 的时候所下载的 node-sass 文件夹是空的在 C:UsersadminAppDataRoamingnpm-cachenode-sass3.13.1 下面可以看到解决方法:自己单独用 npm i node-sass 下载一遍会在 C:Users姓名AppDataRoamingnpm-cachenode-sass4.7.2 下面会有一个文件 win32-x64-57_binding.node ,把这个文件复制到 3.13.1 下面然后重新 npm install 就解决了全局安装gulp$ npm install gulp -g测试 gulp,在终端输入 gulp报错 Cannot find module ‘gulp-prettify’ 模块找不到进入 npm 搜索包名并安装$ npm i gulp-prettify再次执行 gulp 命令,出现错误$ gulp[09:53:07] Using gulpfile F:\web\metronic_v4.5.2\theme\gulpfile.js[09:53:07] Task never defined: default[09:53:07] To list available tasks, try running: gulp –tasks说明 gulp 部署成功,只是默认任务还没有配置,需要看看 gulpfile.js 列出的其他任务。如果有其他问题,请参考[转]初探前端自动化神器(Gulp)[转]Bootstrap 之 Metronic 模板的学习之路 - (7)GULP 前端自动化工具gulp 任务运用gulp localhost安装 Connect 插件npm install–save-dev gulp-connectnpm install –save-dev 可以简化为 npm i -D为 web 服务器定义一个任务, gulpfile.js 文件中添加gulp.task(’localhost’, function() { connect.server();});只要在终端/命令行中执行 gulp, 就可以启动 web 服务器,然后可以在浏览器中打开 localhost:8080gulp localhost-live给 connect.server() 方法传入一个参数gulp.task(’localhost-live’, function() { connect.server({ livereload: true });});SASS 编译gulp sass打开终端进入到 gulpfile.js 所在的 theme 目录。输入 gulp sass 命令执行手工构建任务。发现报错It’s not clear which file to import for ‘@import “file”’.由于 sass _filename.scss 不允许出现 同名无下划线 filename.scss ,写文件全称试试解决:components-md.scss 中@import ‘_components.scss’; 继续执行 gulp sass,发现报错Message: sass\global_components.scssError: Import directives may not be used within control directives or mixins. on line 7 of sass/global/_components.scss from line 8 of sass/global/components-md.scss解决:_components.scss 中// General CSS Reset@if $theme-style == “square” { @import ‘components/_reset-rounds’;}去掉 @if 判断继续执行 gulp sass ,出现新的报错Error: Undefined variable: “$general-border-radius”. on line 134 of sass/apps/inbox.scss border-radius: $general-border-radius;解决:global/_variables.scss 中@if $theme-type == “material-design” {$general-border-radius: 2px !default;} @else {$general-border-radius: 4px !default;}在 @if 前添加$general-border-radius: 2px !default;继续执行 gulp sass ,出现新的报错The following tasks did not complete: testGulp Did you forget to signal async completion?官方方法:在不使用文件流的情况下,向task的函数里传入一个名叫done的回调函数,以结束task。参考gulp.task(’testGulp’, done => { console.log(‘Hello World!’); done();});gulp sass:watch输入 gulp sass:watch 运行 scss 实时监控 css 文件的编译,编译后的 css 文件会输出到 assets 目录。Error: watching ./sass//*.scss: watch task has to be a function (optionally generated by using gulp.parallel or gulp.series) at Gulp.watch (F:\web\metronic_v4.5.2\theme\node_modules\gulp\index.js:28:11) at F:\web\metronic_v4.5.2\theme\gulpfile.js:59:10 at taskWrapper (F:\web\metronic_v4.5.2\theme\node_modules\undertaker\lib\set-task.js:13:15) at bound (domain.js:395:14) at runBound (domain.js:408:12) at asyncRunner (F:\web\metronic_v4.5.2\theme\node_modules\async-done\index.js:55:18) at process._tickCallback (internal/process/next_tick.js:61:11)分析:这个是由于require引入的包的版本问题导致的。在不同的版本里,接口参数发生了变化。在gulp4.0之后已经只能接受watch第二个参数必须为函数。解决办法:修改gulpfile.jsgulp.task(‘sass:watch’, function () { gulp.watch(’./sass//*.scss’,gulp.series(‘sass’));});RTL SASS 编译因为 RTL 的主题文件和默认的主题文件不在同一个目录,一个在 theme_rtl ,一个在 theme,所以,在 theme_rtl 目录下,需要对 gulp 进行重新部署。然后进入 gulpfile.js 位于的 theme_rtl 目录。确定最新修改的 SCSS 已通过 gulp sass 或 gulp sass:watch 命令编译。运行 gulp rtlcss 命令执行 css 文件的 RTL 版本修改任务。编译后的 RTL css 会被输出到 assets 目录.CSS 和 JS 文件的压缩在命令行下进入 theme 目录。运行 gulp minify 执行 css 和 js 文件压缩任务.压缩后的文件会输出到 html 目录.HTML 格式化gulp prettify 该命令可以将 HTML 格式化缩进,对于 pre 和 code 两个标签内的内容不进行格式化。 ...

March 13, 2019 · 2 min · jiezi

Bootstrap FileInput(文件上传)中文API整理

下载地址、API和DOM地址(英语好的小伙伴可以看看)下载地址:https://github.com/kartik-v/b…API文档 :http://plugins.krajee.com/fil…D E M O:http://plugins.krajee.com/fil…做项目用到bootstrap fileinput插件上传文件,在用的过程中,遇到一些问题,所以想着整理一份比较详细的文档,方便自己今后使用,也希望能给大家带来帮助,如有错误,希望大家积极指正,积极交流。注意:第三部分内容因为存在i标签,某些文字被转换成图标一、引入文件<link href="../css/bootstrap.min.css"rel=“stylesheet”><link href="../css/fileinput.css" media=“all"rel=“stylesheet” type=“text/css” /><scriptsrc=”../js/jquery-2.0.3.min.js"></script><script src="../js/fileinput.js"type=“text/javascript”></script><script src="../js/bootstrap.min.js"type=“text/javascript”></script>二、初始化设置//初始化fileinputinitFileInput();function initFileInput() { $("#uploadImg").fileinput({ language: ‘zh’, //设置语言 dropZoneTitle: ‘可以将图片拖放到这里 …支持多文件上传’, uploadUrl: “index.php”, //上传的地址 uploadExtraData: function(previewId, index) { //该插件可以向您的服务器方法发送附加数据。这可以通过uploadExtraData在键值对中设置为关联数组对象来完成。所以如果你有设置uploadExtraData={id:‘kv-1’},在PHP中你可以读取这些数据$_POST[‘id’] var id = $(’#id’).val(); return {seriesId: id}; }, allowedFileExtensions: [‘jpg’,‘png’],//接收的文件后缀 uploadAsync: true, //默认异步上传 showUpload: true, //是否显示上传按钮 showRemove: true, //显示移除按钮 showPreview: true, //是否显示预览 showCancel:true, //是否显示文件上传取消按钮。默认为true。只有在AJAX上传过程中,才会启用和显示 showCaption: true,//是否显示文件标题,默认为true browseClass: “btn btn-primary”, //文件选择器/浏览按钮的CSS类。默认为btn btn-primary dropZoneEnabled: true,//是否显示拖拽区域 minImageWidth: 50, //图片的最小宽度 minImageHeight: 50,//图片的最小高度 maxImageWidth: 1000,//图片的最大宽度 maxImageHeight: 1000,//图片的最大高度 maxFileSize: 1024,//单位为kb,如果为0表示不限制文件大小 minFileCount: 1, //每次上传允许的最少文件数。如果设置为0,则表示文件数是可选的。默认为0 maxFileCount: 0, //每次上传允许的最大文件数。如果设置为0,则表示允许的文件数是无限制的。默认为0 previewFileIcon: “<i class=‘glyphicon glyphicon-king’></i>”,//当检测到用于预览的不可读文件类型时,将在每个预览文件缩略图中显示的图标。默认为<i class=“glyphicon glyphicon-file”></i> layoutTemplates:{ actionUpload:’’//去除上传预览缩略图中的上传图片 actionZoom:’’, //去除上传预览缩略图中的查看详情预览的缩略图标 actionDownload:’’ //去除上传预览缩略图中的下载图标 actionDelete:’’, //去除上传预览的缩略图中的删除图标 },//对象用于渲染布局的每个部分的模板配置。您可以设置以下模板来控制窗口小部件布局.eg:去除上传图标 msgFilesTooMany: “选择上传的文件数量({n}) 超过允许的最大数值{m}!”,//字符串,当文件数超过设置的最大计数时显示的消息 maxFileCount。默认为:选择上传的文件数({n})超出了允许的最大限制{m}。请重试您的上传! }).on(‘filebatchpreupload’, function(event, data) { //该方法将在上传之前触发 var id = $(’#id option:selected’).val(); if(id == 0){ return { message: “请选择”, // 验证错误信息在上传前要显示。如果设置了这个设置,插件会在调用时自动中止上传,并将其显示为错误消息。您可以使用此属性来读取文件并执行自己的自定义验证 data:{} // any other data to send that can be referred in filecustomerror }; } });}//fileuploaded此事件仅针对ajax上传触发,并在每个缩略图文件上传完成后触发。此事件仅针对ajax上传并在以下情况下触发:当点击每个预览缩略图中的上传图标并且文件上传成功时,或者当你有 uploadAsync设置为true您已触发批量上传。在这种情况下,fileuploaded每一个人选择的文件被上传成功后,触发事件。var id_str = ‘’;$(’#uploadImg’).on(‘fileuploaded’, function(event, data, previewId, index) { if(typeof(data.response.id) != ‘undefined’){ id_str = id_str+data.response.id+’,’; }});// filebatchuploadcomplete此事件仅在ajax上传和完成同步或异步ajax批量上传后触发。$(’#uploadImg’).on(‘filebatchuploadcomplete’,function (event,files,extra) { if(id_str.length == 0){ layer.msg(‘上传失败’, {icon: 0});//弹框提示 return false; } setTimeout(function(){ //执行延时关闭 closeSelf(); },1000);});三、Options 说明属性名属性类型描述说明默认值languageString多语言设置,使用时需提前引入locales文件夹下对应的语言文件,中文zh,引入语言文件必须放在fileinput.js之后’en’showCaptionBoolean是否显示被选文件的简介trueshowBrowseBoolean是否显示浏览按钮trueshowPreviewBoolean是否显示预览区域trueshowRemoveBoolean是否显示移除按钮true,showUploadBoolean是否显示上传按钮true,showCancelBoolean是否显示取消按钮true,showClose:Boolean是否显示关闭按钮trueshowUploadedThumbsBoolean truebrowseOnZoneClickBoolean falseautoReplaceBoolean是否自动替换当前图片,设置为true时,再次选择文件, 会将当前的文件替换掉。falsegenerateFileIdObject nullpreviewClassString添加预览按钮的类属性‘’captionClassString ‘’frameClassString ‘krajee-default’mainClassString ‘file-caption-main’mainTemplateObject nullpurifyHtmlBoolean truefileSizeGetterObject nullinitialCaptionString ‘‘initialPreviewArray/Object []initialPreviewDelimiterString ‘$$‘initialPreviewAsDataBoolean falseinitialPreviewFileTypeString ‘image’initialPreviewConfigArray/Object []initialPreviewThumbTagsArray/Object []previewThumbTagsObject {}initialPreviewShowDeleteBoolean trueremoveFromPreviewOnErrorBoolean falsedeleteUrlString删除图片时的请求路径’‘deleteExtraDataObject删除图片时额外传入的参数{}overwriteInitialBoolean truepreviewZoomButtonIconsObject {prev: ‘’,next: ‘’,toggleheader: ‘’,fullscreen: ‘’,borderless: ‘’,close: ‘’},previewZoomButtonClassesObject {prev: ‘btn btn-navigate’,next: ‘btn btn-navigate’,toggleheader: ‘btn btn-default btn-header-toggle’,fullscreen: ‘btn btn-default’,borderless: ‘btn btn-default’,close: ‘btn btn-default’},preferIconicPreviewBoolrean falsepreferIconicZoomPreviewBoolrean falseallowedPreviewTypesundefined undefinedallowedPreviewMimeTypesObject nullallowedFileTypesObject接收的文件后缀,如[‘jpg’, ‘gif’, ‘png’],不填将不限制上传文件后缀类型nullallowedFileExtensionsObject nulldefaultPreviewContentObject nullcustomLayoutTagsObject {}customPreviewTagsObject {}previewFileIconString ‘‘previewFileIconClassString ‘file-other-icon’previewFileIconSettingsObject {}previewFileExtSettingsObject {}buttonLabelClassString ‘hidden-xs’browseIconString ‘ ‘browseClassString ‘btn btn-primary’removeIconString ‘‘removeClassString ‘btn btn-default’cancelIconString ‘‘cancelClassString ‘btn btn-default’uploadIconString ‘‘uploadClassString ‘btn btn-default’uploadUrlString上传文件路径nulluploadAsyncboolean是否为异步上传trueuploadExtraData 上传文件时额外传递的参数设置{}zoomModalHeightnumber 480minImageWidthString图片的最小宽度nullminImageHeightString图片的最小高度nullmaxImageWidthString图片的最大宽度nullmaxImageHeightString图片的最大高度nullresizeImageboolean falseresizePreferenceString ‘width’resizeQualitynumber 0.92resizeDefaultImageTypeString ‘image/jpeg’minFileSizenumber单位为kb,上传文件的最小大小值0maxFileSizenumber单位为kb,如果为0表示不限制文件大小0resizeDefaultImageTypenumber 25600(25MB)minFileCountnumber表示同时最小上传的文件个数0maxFileCountnumber表示允许同时上传的最大文件个数0validateInitialCountboolean falsemsgValidationErrorClassString ’text-danger’msgValidationErrorIconString ’ ‘msgErrorClassString ‘file-error-message’progressThumbClassString “progress-bar progress-bar-success progress-bar-striped active"rogressClassString “progress-bar progress-bar-success progress-bar-striped active"progressCompleteClassString “progress-bar progress-bar-success"progressErrorClassString “progress-bar progress-bar-danger"progressUploadThresholdnumber 99previewFileTypeString预览文件类型,内置[‘image’, ‘html’, ’text’, ‘video’, ‘audio’, ‘flash’, ‘object’,‘other‘]等格式’image’elCaptionContainerString nullelCaptionTextString设置标题栏提示信息nullelPreviewContainerString nullelPreviewImageString nullelPreviewStatusString nullelErrorContainerString nullerrorCloseButtonString ‘<span class=“close kv-error-close”>×</span>‘slugCallbackfunction选择后未上传前 回调方法nulldropZoneEnabledboolean是否显示拖拽区域truedropZoneTitleClassString拖拽区域类属性设置’file-drop-zone-title’fileActionSettingsObject设置预览图片的显示样式{showRemove: true,showUpload: false,showZoom: true,showDrag: true,removeIcon: ‘’,removeClass: ‘btn btn-xs btn-default’,removeTitle: ‘Remove file’,uploadIcon: ‘’,uploadClass: ‘btn btn-xs btn-default’,uploadTitle: ‘Upload file’,zoomIcon: ‘’,zoomClass: ‘btn btn-xs btn-default’,zoomTitle: ‘View Details’,dragIcon: ‘’,dragClass: ’text-info’,dragTitle: ‘Move / Rearrange’,dragSettings: {},indicatorNew: ‘’,indicatorSuccess: ‘’,indicatorError: ‘’,indicatorLoading: ‘’,indicatorNewTitle: ‘Not uploaded yet’,indicatorSuccessTitle: ‘Uploaded’,indicatorErrorTitle: ‘Upload Error’,indicatorLoadingTitle: ‘Uploading …’}otherActionButtonsString ‘’textEncodingString编码设置’UTF-8’ajaxSettingsObject {}ajaxDeleteSettingsObject {}showAjaxErrorDetailsboolean true四、提示说明设置属性名默认值中文fileSinglefile文件filePluralfiles个文件browseLabelBrowse &hellip选择 …removeLabelRemove移除removeTitleClear selected files清除选中文件cancelLabelCancel取消cancelTitleAbort ongoing upload取消进行中的上传uploadLabelUpload上传uploadTitleUpload selected files上传选中文件msgNoNo没有msgNoFilesSelectedNo files selected“”msgCancelledCancelled取消msgZoomModalHeadingDetailed Preview详细预览msgSizeTooSmallFile “{name}” ({size} KB) is too small and must be larger than {minSize} KB.File “{name}” ({size} KB) is too small and must be larger than {minSize} KB.msgSizeTooLargeFile “{name}” ({size} KB) exceeds maximum allowed upload size of {maxSize} KB.文件 “{name}” ({size} KB) 超过了允许大小 {maxSize} KB.msgFilesTooLessYou must select at least {n} {files} to upload.你必须选择最少 {n} {files} 来上传.msgFilesTooManyNumber of files selected for upload ({n}) exceeds maximum allowed limit of {m}.选择的上传文件个数 ({n}) 超出最大文件的限制个数 {m}.msgFileNotFoundFile “{name}” not found!文件 “{name}” 未找到!msgFileSecuredSecurity restrictions prevent reading the file “{name}".安全限制,为了防止读取文件 “{name}".msgFileNotReadableFile “{name}” is not readable.文件 “{name}” 不可读.msgFilePreviewAbortedFile preview aborted for “{name}".取消 “{name}” 的预览.msgFilePreviewErrorAn error occurred while reading the file “{name}".读取 “{name}” 时出现了一个错误.msgInvalidFileNameInvalid or unsupported characters in file name “{name}".Invalid or unsupported characters in file name “{name}".msgInvalidFileTypeInvalid type for file “{name}”. Only “{types}” files are supported.不正确的类型 “{name}”. 只支持 “{types}” 类型的文件.msgInvalidFileExtensionInvalid extension for file “{name}”. Only “{extensions}” files are supported.不正确的文件扩展名 “{name}”. 只支持 “{extensions}” 的文件扩展名.msgFileTypes{‘image’: ‘image’,‘html’: ‘HTML’,’text’: ’text’,‘video’: ‘video’,‘audio’: ‘audio’,‘flash’: ‘flash’,‘pdf’: ‘PDF’,‘object’: ‘object’},{‘image’: ‘image’,‘html’: ‘HTML’,’text’: ’text’,‘video’: ‘video’,‘audio’: ‘audio’,‘flash’: ‘flash’,‘pdf’: ‘PDF’,‘object’: ‘object’},msgUploadAbortedThe file upload was aborted该文件上传被中止msgUploadThresholdProcessing…Processing…msgUploadBeginInitializing…Initializing…msgUploadEndDoneDonemsgUploadEmptyNo valid data available for upload.No valid data available for upload.msgValidationErrorValidation Error验证错误msgLoadingLoading file {index} of {files} …加载第 {index} 文件 共 {files} …msgProgressLoading file {index} of {files} - {name} - {percent}% completed.加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.msgSelected{n} {files} selected{n} {files} 选中msgFoldersNotAllowedDrag & drop files only! {n} folder(s) dropped were skipped.只支持拖拽文件! 跳过 {n} 拖拽的文件夹.msgImageWidthSmallWidth of image file “{name}” must be at least {size} px.宽度的图像文件的”{name}“的必须是至少{size}像素.msgImageHeightSmallHeight of image file “{name}” must be at least {size} px.图像文件的”{name}“的高度必须至少为{size}像素.msgImageWidthLargeWidth of image file “{name}” cannot exceed {size} px.宽度的图像文件”{name}“不能超过{size}像素.msgImageHeightLargeHeight of image file “{name}” cannot exceed {size} px.图像文件”{name}“的高度不能超过{size}像素.msgImageResizeErrorCould not get the image dimensions to resize.无法获取的图像尺寸调整。msgImageResizeExceptionError while resizing the image.<pre>{errors}</pre>错误而调整图像大小。<pre>{errors}</pre>msgAjaxErrorSomething went wrong with the {operation} operation. Please try again later!Something went wrong with the {operation} operation. Please try again later!msgAjaxProgressError{operation} failed{operation} failedajaxOperations{deleteThumb: ‘file delete’, uploadThumb: ‘file upload’, uploadBatch: ‘batch file upload’, uploadExtra: ‘form data upload’ },{deleteThumb: ‘file delete’,uploadThumb: ‘file upload’, uploadBatch: ‘batch file upload’,uploadExtra: ‘form data upload’},dropZoneTitleDrag & drop files here …拖拽文件到这里 …支持多文件同时上传dropZoneClickTitle(or click to select {files})(或点击{files}按钮选择文件)previewZoomButtonTitles{prev: ‘View previous file’,next: ‘View next file’, toggleheader: ‘Toggle header’,fullscreen: ‘Toggle full screen’, borderless: ‘Toggle borderless mode’, close: ‘Close detailed preview’ }{ prev: ‘预览上一个文件’,next: ‘预览下一个文件’,toggleheader: ‘缩放’, fullscreen: ‘全屏’, borderless: ‘无边界模式’,close: ‘关闭当前预览’}fileActionSettings { removeTitle: ‘删除文件’,uploadTitle: ‘上传文件’,zoomTitle: ‘查看详情’,dragTitle: ‘移动 / 重置’,indicatorNewTitle: ‘没有上传’, indicatorSuccessTitle: ‘上传’,indicatorErrorTitle: ‘上传错误’, indicatorLoadingTitle: ‘上传 …’},五、Method说明方法名描述fileerror异步上传错误结果处理$(’#uploadfile’).on(‘fileerror’, function(event, data, msg) {});fileuploaded异步上传成功结果处理$("#uploadfile”).on(“fileuploaded”, function (event, data, previewId, index) {})filebatchuploaderror批量上传错误结果处理$(’#uploadfile’).on(‘filebatchuploaderror’, function(event, data, msg) {});filebatchuploadsuccess批量上传成功结果处理$(’#uploadfile’).on(‘filepreupload’, function(event, data, previewId, index) {});filebatchselected选择文件后处理事件$("#fileinput”).on(“filebatchselected”, function(event, files) {});upload文件上传方法$("#fileinput”).fileinput(“upload”);fileuploaded上传成功后处理方法$("#fileinput”).on(“fileuploaded”, function(event, data, previewId, index) {});filereset fileclear点击浏览框右上角X 清空文件前响应事件$("#fileinput”).on(“fileclear”,function(event, data, msg){});filecleared点击浏览框右上角X 清空文件后响应事件$("#fileinput”).on(“filecleared”,function(event, data, msg){});fileimageuploaded在预览框中图片已经完全加载完毕后回调的事件 ...

March 12, 2019 · 4 min · jiezi

【zzzmh个人博客】一枚Java程序的个人建站之路 (干货)

目前版本的博客地址: https://zzzmh.cn图片演示:个人建站已有半年有余,简单分享一下建站的心路历程和用到的一些技术自从学了编程以后,就一直想着要有一个自己的线上网站苦于学艺不精,对java以外的技术又知之甚少,一直拖到去年才开工。期间也走了不少弯路例如我的第一个网站是建在手机里的。用安卓手机跑linux虚拟机+花生壳DDNS+H5页面实现的简单的小站,源码我仍留在服务器上,同2个版本。第一版:https://zzzmh.cn/history/welcome/第二版https://zzzmh.cn/history/myblog/虽然也花了不少时间精力,但总是走不出“前端太简陋” 、 “头重脚轻没内容” 、 “开发完就无人问津” 等老大难问题。又不似php、nodejs程序员可以直接套用wp、hexo框架来快速建站,不重复发明轮子。希望还是以Java为主开发一套独一无二的博客。于是在半年间花心思自学了一下前端技术(Vue、Amazeui、Bootstrap、ES6)以及Linux入门。至此开启了新的折腾之旅。网站前端用的是模板之家的一套前端现成的H5C3的模板:链接同时试过前后端分离等各种开发模式后,考量了服务器性能才1C2G1M的学生服务器。以及百度收录的时候不执行JS脚本等原因。最终绝对逆流而上,倒退二十年。启用JSP的C标签。虽然技术老掉牙,但是效率高,占用内存低。能对应高并发,还能被百度爬虫识别。主要内容如标题、文章等用C标签渲染,让百度爬虫一次收录成功。其余次要元素如评论、留言板、阅读次数等仍使用Springboot+SpringJPA提供接口。前端用了一堆第三方框架来丰富视觉效果。除Bootstrap以外,还有例如 代码高亮prettify.js、自我介绍的网页3DPPTimpress.js、一键分享social-share.min.js、瀑布流isotope.js、图片轮播owl.carousel.js等等相关博客:Animate.css、Isotope.js、loadding动画、share.js、懒加载、impress.js后端的优化主要集中在Tomcat 、 Nginx、Mysql控制并发、访问频率、内存占用。以及开启GZIP、HTTPS 、HTTP2等。相关博客:HTTPS、HTTP2、Mysql、Nginx、Tomcat、Centos最后图片、js、css一多,1M上行网速瞬时捉襟见肘,需要开启OSS&CDN来加速OSS&CDN我也是把但凡有免费额度的都用了个遍如阿里云OSS、腾讯云COS、网易云NOS、七牛云OSS、UCLOUD、又拍云OSS中间由于技术支持情况以及费用等种种原因,目前整体用下来感觉是七牛云和又拍云的体验最好。除了国内访问速度快、技术支持完整以外,最主要是免费额度大,持续时间长,完全能作为主力OSS&CDN长期使用相关博客:OSS尾声一如编程深似海,学不完的技术,改不完的bug。头发可以脱,妹纸可以没有。技术还得继续折腾下去。附上博客地址:https://zzzmh.cn其他线上项目:极简壁纸:https://bz.zzzmh.cn极简插件:https://chrome.zzzmh.cn

January 29, 2019 · 1 min · jiezi

less学习之Bootstrap(按钮篇)

less学习之Bootstrap按钮篇)如我上一篇less学习之Bootstrap里面,介绍了Bootstrap的目录结构,说明了在variables.less这个文件里面,定义了主题色,也包括了按钮的主题色。接下来看一看 buttons.less与 mixins/buttons.less.文件 buttons.less 与 mixins/buttons.less内容不是很多,总结下来就是:1、“.btn”的基础样式定义。2、按钮的各种状态含义的样式定义,例如:btn-primary、btn-success等。3、伪连接,按钮的样式显示为连接的样式。4、按钮尺寸的class:lg、sm、xs。5、input类型的按钮定义。基础样式定义代码:.btn { display: inline-block; … … &, &:active, &.active { &:focus, &.focus { .tab-focus(); } } … …// 余下的为hover、disabled时的样式}说明:知识点1:&amp;在less与scss的语法中,表示同父级,就上一个例子来说,就是编译之后&amp;将会被.btn替换,如果是多层时也是相同的道理。提示1:运用了函数tab-focus。此函数定义在mixins/tab-focus.less中,代码很短.tab-focus() { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px;}修改浏览器默认的大纲样式:表现在按钮、form表单等原生组件上。提示2: 运用了函数user-select。此函数定义在mixins/vendor-prefixes中。.user-select(@select) { -webkit-user-select: @select; -moz-user-select: @select; -ms-user-select: @select; // IE10+ user-select: @select;}作用,让文本是否能够选择。提示3: 运用了函数opacity。此函数定义在mixins/opacity中。.opacity(@opacity) { opacity: @opacity; @opacity-ie: (@opacity * 100); filter: “alpha(opacity=@{opacity-ie})”;}此处做了IE的兼容IE,IE的透明度采用 filtger:alpha(opacity=value),其中 0 <= value && value <= 100.符号“”,可以意为JavaScript里面的 evel ,可以将字符串转化为表达式。所以说一些复杂的选择器也能够作为变量定义。特别说明函数button-variantBootstrap里面抽象出来的函数,作用于按钮不同状态下的颜色变化。例如:hover、focus、active等状态。函数说明参数:@color; @background; @border // 分别时字体颜色、背景颜色、边框颜色结构如下:.button-variant(@color; @background; @border) { color: @color; background-color: @background; border-color: @border; &:focus, &.focus { color: @color; background-color: darken(@background, 10%); border-color: darken(@border, 25%); } … …// 余下的为hover、disabled时的样式 .badge { color: @background; background-color: @color; }}由上面两个文件可以总结出的结论是:.less里面写的是选择器定义、变量定义,而mixins/.less里面写的是函数。本篇总结关于Bootstrap听到过不少的见闻,有好有坏,我有身边也有人说这个框架很垃圾。但是对于Bootstrap这个框架怎么样,我不做评价,但是Bootstrap用来作为学习的资料时非常合适的,Less的语法糖都了知道,那么如何才能让Less用起来得心应手?无疑,源码是一种途径。接下来的安排,自己写的文章自己也会去实现它,另外关于Less的学习也不会停止。 ...

January 16, 2019 · 1 min · jiezi

less学习之Bootstrap

less学习笔记之bootstrap目录说明源代码里面的目录是这样的(只给出部分): .csscomb.json│ .csslintrc│ alerts.less│ badges.less│ bootstrap.less│ breadcrumbs.less│ button-groups.less│ buttons.less│ carousel.less│ close.less│ …│└─mixins alerts.less background-variant.less border-radius.less buttons.less center-block.less clearfix.less forms.less gradients.less …文件 variables.less顾名思义,为整个Bootstrap定义的全局变量。知识点一:Less的作用域和css很相似,变量和混合(mixins)在当前文件无法找到时会继承父级作用,如果任然没有找到则会编译抛出异常。定义在Bootstrap中使用的灰色和品牌颜色。@gray-base: #000;@gray-darker:lighten(@gray-base, 13.5%);@gray-dark: lighten(@gray-base, 20%); @gray: lighten(@gray-base, 33.5%); // #555@gray-light: lighten(@gray-base, 46.7%); @gray-lighter: lighten(@gray-base, 93.5%); // 这部分定义的主要色:成功、失败、警告等等。@brand-primary: darken(#428bca, 6.5%); // #337ab7@brand-success: #5cb85c;@brand-info: #5bc0de;@brand-warning: #f0ad4e;@brand-danger: #d9534f;具体体现:知识点2:函数 lighten与darken描述: 参数:color, amount, method功能: color + amount 表示在color的基础上,变得更淡或者更深,加上method后表示在color * method 的基础上,变淡/深 amount,这里先不解释less中色值是怎么计算的。之后也定义了默认背景色。定义字体风格字体大小定义Bootstrap的基础字体为14px。知识点3:函数ceil和floor简单说明:分别为向上取整和向下取整输入框风格定义cursor:not-allowed //当button与input处于disabled时,鼠标指针的样式优先级定义设置一些默认层级优先级z-index,用于特定的组件,例如:navbar、dropdown、popover、modal-background、tooltip、navbar-fixed。值都为1000+,这也就是有时候我们自己自定义了一些优先级,但是还是达不到效果,可以想一想是不是值不够?

January 15, 2019 · 1 min · jiezi

jq为a标签绑定的onclick事件在移动端不响应

问题描述项目用的jQuery + Bootstrap进行开发,其中用到Bootstrap的导航栏当页面在移动端打开的时候,导航栏会收缩,就是这样的:其中我为下拉菜单的a标签在js中绑定了onclick事件:jQuery(document).ready(function($){ ‘use strict’; $(’#see’).click(seeArrange) // 会议安排 function seeArrange () {} //…}一切在PC端运行正常,但是在移动端的时候,a标签绑定的onclick事件在移动端就没有响应。解决在网上看了很多方法之后,我觉得可能是移动端收缩之后的那个导航栏容器里的a没有绑定到点击事件。因此我就换成在html里绑定事件,结果就点击正常了。。。// html <li><a href=“javascript:void(0);” id=‘see’ onclick=“seeArrange();">会议议程</a></li>// jsjQuery(document).ready(function($){ ‘use strict’; // $(’#see’).click(seeArrange) // 会议安排 // …}function seeArrange () {}总结其实具体原因我不知道是什么,烦请知道的大佬们提点一下我。网上找的各种方法也说一下吧,做个笔记很多人是说移动端不支持点击事件,换成touch事件或者tap事件试试。$(”*").bind(“click”,function(){}); // 在页面初始化时,为其添加事件绑定参考IOS微信浏览器点击事件不起作用问题移动端微信内置浏览器(或QQ浏览器)无法识别onclick事件的解决

January 10, 2019 · 1 min · jiezi

vue2.0+bootstrap实战(一)

俗话说,纸上学来终觉浅,绝知此事要躬行,最近两天学习了下Vue2.0,想做个项目练下手,顺便写个文章方便复习回顾~1.使用cue-cli创建vue项目进入指定目录,右击Git Bash Here打开git命令行,vue init webpack 项目名称,创建基于webpack的vue项目根据命令行的提示,选择是否安装vue-router,是否添加单元测试等,此处均选择"n",创建一个最基本的项目项目创建完成后使用webstorm打开(楼主的webstorm中没法创建vue项目,其实上面两步也可以再webstorm中进行操作),在webstorm命令行中运行npm install或cnpm install安装依赖包在webstorm中运行npm run dev 运行之后在浏览打开http://localhost:8081,显示如下页面则表示创建成功2.在vue项目中引入bootstrap和jQuery在项目根目录下的package.json文件中添加bootstrap和jquery依赖,行在webstorm命令行中运行npm install或cnpm install安装依赖包在main.js中导入jquery和bootstrap 此时刷新浏览器显示jQuery还未引入成功,还需要使用内置插件ProvidePlugin自动加载模块需在build/webpack.base.conf.js中增加插件配置 再在配置中添加: 此时项目中就可以使用jQuery和Bootstrap了3. 使用bootstrap创建表格组件在components文件夹下新建.vue文件,文件的基本结构如下,也可以以此作为.vue文件的模板<template> </template><script> export default { name: “${NAME}” }</script><style scoped></style>在script标签中预先定义要显示在表格中的数据data() { return { books: [ {id: 1, name: ‘红楼梦’, author: ‘曹雪芹’, price: 32}, {id: 2, name: ‘水浒传’, author: ‘施耐庵’, price: 30}, {id: 3, name: ‘三国演义’, author: ‘罗贯中’, price: 24}, {id: 4, name: ‘西游记’, author: ‘吴承恩’, price: 20} ] } }2.在template标签中引用bootstrap和数据定义表格 <div id=“table”> <table class=“table table-striped table-bordered”> <thead> <tr> <td>序号</td> <td>书名</td> <td>作者</td> <td>价格</td> </tr> </thead> <tbody> <tr v-for=“book in books”> <td>{{ book.id }}</td> <td>{{ book.name }}</td> <td>{{ book.author }}</td> <td>{{ book.price }}</td> </tr> </tbody> </table> </div>3.在main.js中引入组件,并将组件填充到Vue实例中// The Vue build version to load with the import command// (runtime-only or standalone) has been set in webpack.base.conf with an alias.import Vue from ‘vue’import App from ‘./App’//导入jquery和bootstrapimport ‘jquery/dist/jquery.min’import ‘bootstrap/dist/js/bootstrap.min.js’import ‘bootstrap/dist/css/bootstrap.min.css’import myTable from ‘./components/MyTable’Vue.config.productionTip = false/* eslint-disable no-new */new Vue({ el: ‘#app’, components: { App,myTable }, template: ‘<myTable/>’})4.稍微调整样式后,浏览器显示结果如图: ...

January 9, 2019 · 1 min · jiezi

Bootstrap 4 gulp 配置

最近想写个项目,由于之前一直写后端,很少接触前端,所以这次来好好学一下前端。看了下Yii框架,它自带了Bootstrap框架,最开始想的是怎么快速写个页面,哪知道这个就像剥洋葱一样,就剥到了学习构建工具的阶段。说个很沮丧的消息,等我把gulp这套工具调通了后,发现Github上居然有很多这样的模板了!废了我3天时间来搞这个东西。给个关键词:bootstrap 4 gulp boilerplate。额,以及还有一个网站,这是我读完bootstrap的文档后发现的:https://vanillajstoolkit.com/…。在项目目录下的babelln/gulpfile.babel.js:// 如果要编译babel可以启用// const babel = require(‘gulp-babel’);// const concat = require(‘gulp-concat’);// const uglify = require(‘gulp-uglify’);const del = require(“del”);const gulp = require(“gulp”);const browserSync = require(“browser-sync”);const sassCompile = require(“gulp-sass”);const server = browserSync.create();const paths = { scripts: { src: “src/scripts/.js”, dest: “dist/scripts” }, css: { src: “src/scss/.scss”, dest: “dist/css” }};// 定义清理方法,会删除dist目录const clean = () => del([“dist”]);// 定义需要拷贝到dist目录的文件,一般APP最终使用的JS和CSS文件在这个目录中const scriptFiles = [ paths.scripts.src, “node_modules/bootstrap/dist/js/bootstrap.min.js”, “node_modules/jquery/dist/jquery.min.js”, “node_modules/popper.js/dist/umd/popper.min.js”];// 编译babel文件的时候使用// function scripts() {// return gulp.src(paths.scripts.src, { sourcemaps: true })// .pipe(babel())// .pipe(uglify())// .pipe(concat(‘index.min.js’))// .pipe(gulp.dest(paths.scripts.dest));// }// 将源代码文件复制到目的地,中间可以加入其他处理程序function scripts() { return gulp.src(scriptFiles).pipe(gulp.dest(paths.scripts.dest));}// 重启web服务function reload(done) { server.reload(); done();}// 编译sass文件,在dist/css目录产生结果文件function sass() { return gulp .src([“node_modules/bootstrap/scss/bootstrap.scss”, paths.css.src]) .pipe(sassCompile()) .pipe(gulp.dest(paths.css.dest));}// 服务初始化,以当前目录babelln/作为网站根目录function serve(done) { server.init({ server: { baseDir: “./” } }); done();}// 定义需要监控的文件const watches = [paths.scripts.src, “*.html”, paths.css.src];// 定义watch函数,它监控watches定义的文件,然后顺序执行这些方法const watch = () => gulp.watch(watches, gulp.series(scripts, sass, reload));// 再包装一层,整个流程就是清理,编译脚本,编译sass,初始化web服务,启动监控const dev = gulp.series(clean, scripts, sass, serve, watch);// 暴露默认方法给外部程序exports.default = dev;这个就是根据gulp官方的模板来捏的,最终还算是可以工作。最后放个效果图^^编译界面: ...

January 5, 2019 · 1 min · jiezi

火狐浏览器table表格th、td填充背景描边后设置position: relative边框失效问题

转载火狐浏览器table表格th、td填充背景描边后设置position: relative边框失效问题一般在开发管理系统的时候经常会用到表格,在使用表格式时通常会给thead部分的th或td加上背景色然后还有边框颜色,在这种情况下浏览器基本都显示正常的,但是当给th或td加上position: relative时火狐浏览器就会显示th或td的边框被遮盖,只显示一片背景色没有边框,如下请在火狐浏览器查看,demo:火狐浏览器table边框失效问题我为什么要在th或td加上position: relative呢,我在开发系统的时候使用bootstrap结合jquery.dataTables,不想使用dataTables自带的图标主题,使用的bootstrap.dataTable 的主题,主题的图标是通过伪类:before和:after实现的,所以加上的position: relative,其实这也是主题的一个小bug,然后导致火狐浏览器只会显示背景色边框完全被遮盖。解决方法1:去掉th的背景色,把背景色填充在thend 的 tr上,这样就能完全解决这个问题,如下.table{ thead{ tr{ background-color: #4587E7; } th{ position: relative; color: #fff; } }}demo2解决方法2:给th设置一个z-index-1属性,这样也能完全解决这个问题,如下.table{ thead{ th{ position: relative; z-index: -1; color: #fff; background-color: #4587e7; } }}demo3转载火狐浏览器table表格th、td填充背景描边后设置position: relative边框失效问题扩展阅读:http://www.w3help.org/zh-cn/c…

December 26, 2018 · 1 min · jiezi

Spring Cloud Config 规范

Spring Cloud Config 规范首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过@Value的形式注入到业务代码中的能力。那Spring Cloud Config 要解决的问题就是:如何将配置加载到 Environment 。配置变更时,如何控制 Bean 是否需要 create,重新触发一次 Bean 的初始化,才能将 @Value 注解指定的字段从 Environment 中重新注入。配置变更时,如何控制新的配置会更新到 Environment 中,才能保证配置变更时可注入最新的值。要解决以上三个问题:Spring Cloud Config 规范中刚好定义了核心的三个接口:PropertySourceLocator:抽象出这个接口,就是让用户可定制化的将一些配置加载到 Environment。这部分的配置获取遵循了 Spring Cloud Config 的理念,即希望能从外部储存介质中来 loacte。RefreshScope: Spring Cloud 定义这个注解,是扩展了 Spring 原有的 Scope 类型。用来标识当前这个 Bean 是一个refresh 类型的 Scope。其主要作用就是可以控制 Bean 的整个生命周期。ContextRefresher:抽象出这个 Class,是让用户自己按需来刷新上下文(比如当有配置刷新时,希望可以刷新上下文,将最新的配置更新到 Environment,重新创建 Bean 时,就可以从 Environment 中注入最新的配置)。Spring Cloud Config 原理Spring Cloud Config 的启动过程1、如何将配置加载到Environment:PropertySourceLocator在整个 Spring Boot 启动的生命周期过程中,有一个阶段是 prepare environment。在这个阶段,会publish 一个 ApplicationEnvironmentPreparedEvent,通知所有对这个事件感兴趣的 Listener,提供对 Environment 做更多的定制化的操作。Spring Cloud 定义了一个BootstrapApplicationListener,在 BootstrapApplicationListener 的处理过程中有一步非常关键的操作如下所示:private ConfigurableApplicationContext bootstrapServiceContext( ConfigurableEnvironment environment, final SpringApplication application, String configName) { //省略 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); // Use names and ensure unique to protect against duplicates List<String> names = new ArrayList<>(SpringFactoriesLoader .loadFactoryNames(BootstrapConfiguration.class, classLoader)); //省略 }这是 Spring 的工厂加载机制,可通过在 META-INF/spring.factories 文件中配置一些程序中预定义的一些扩展点。比如 Spring Cloud 这里的实现,可以看到 BootstrapConfiguration 不是一个具体的接口,而是一个注解。通过这种方式配置的扩展点好处是不局限于某一种接口的实现,而是同一类别的实现。可以查看 spring-cloud-context 包中的 spring.factories 文件关于BootstrapConfiguration的配置,有一个比较核心入口的配置就是:org.springframework.cloud.bootstrap.BootstrapConfiguration=\org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration可以发现 PropertySourceBootstrapConfiguration 实现了 ApplicationContextInitializer 接口,其目的就是在应用程序上下文初始化的时候做一些额外的操作。在 Bootstrap 阶段,会通过 Spring Ioc 的整个生命周期来初始化所有通过key为_org.springframework.cloud.bootstrap.BootstrapConfiguration_ 在 spring.factories 中配置的 Bean。Spring Cloud Alibaba Nacos Config 的实现就是通过该key来自定义一些在Bootstrap 阶段需要初始化的一些Bean。在该模块的 spring.factories 配置文件中可以看到如下配置:org.springframework.cloud.bootstrap.BootstrapConfiguration=\org.springframework.cloud.alibaba.nacos.NacosConfigBootstrapConfiguration在 Bootstrap 阶段初始化的过程中,会获取所有 ApplicationContextInitializer 类型的 Bean,并设置回SpringApplication主流程当中。如下 BootstrapApplicationListener 类中的部分代码所示:private void apply(ConfigurableApplicationContext context, SpringApplication application, ConfigurableEnvironment environment) { @SuppressWarnings(“rawtypes”) //这里的 context 是一个 bootstrap 级别的 ApplicationContext,这里已经含有了在 bootstrap阶段所有需要初始化的 Bean。 //因此可以获取 ApplicationContextInitializer.class 类型的所有实例 List<ApplicationContextInitializer> initializers = getOrderedBeansOfType(context, ApplicationContextInitializer.class); //设置回 SpringApplication 主流程当中 application.addInitializers(initializers .toArray(new ApplicationContextInitializer[initializers.size()])); //省略…}这样一来,就可以通过在 SpringApplication 的主流程中来回调这些ApplicationContextInitializer 的实例,做一些初始化的操作。如下 SpringApplication 类中的部分代码所示:private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) { context.setEnvironment(environment); postProcessApplicationContext(context); //回调在BootstrapApplicationListener中设置的ApplicationContextInitializer实例 applyInitializers(context); listeners.contextPrepared(context); //省略…}protected void applyInitializers(ConfigurableApplicationContext context) { for (ApplicationContextInitializer initializer : getInitializers()) { Class<?> requiredType = GenericTypeResolver.resolveTypeArgument( initializer.getClass(), ApplicationContextInitializer.class); Assert.isInstanceOf(requiredType, context, “Unable to call initializer.”); initializer.initialize(context); }}在 applyInitializers 方法中,会触发 PropertySourceBootstrapConfiguration 中的 initialize 方法。如下所示:@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) { CompositePropertySource composite = new CompositePropertySource( BOOTSTRAP_PROPERTY_SOURCE_NAME); AnnotationAwareOrderComparator.sort(this.propertySourceLocators); boolean empty = true; ConfigurableEnvironment environment = applicationContext.getEnvironment(); for (PropertySourceLocator locator : this.propertySourceLocators) { PropertySource<?> source = null; //回调所有实现PropertySourceLocator接口实例的locate方法, source = locator.locate(environment); if (source == null) { continue; } composite.addPropertySource(source); empty = false; } if (!empty) { //从当前Enviroment中获取 propertySources MutablePropertySources propertySources = environment.getPropertySources(); //省略… //将composite中的PropertySource添加到当前应用上下文的propertySources中 insertPropertySources(propertySources, composite); //省略… }在这个方法中会回调所有实现 PropertySourceLocator 接口实例的locate方法,locate 方法返回一个 PropertySource 的实例,统一add到CompositePropertySource实例中。如果 composite 中有新加的PropertySource,最后将composite中的PropertySource添加到当前应用上下文的propertySources中。Spring Cloud Alibaba Nacos Config 在 Bootstrap 阶段通过Java配置的方式初始化了一个 NacosPropertySourceLocator 类型的Bean。从而在 locate 方法中将存放在Nacos中的配置信息读取出来,将读取结果存放到 PropertySource 的实例中返回。具体如何从Nacos中读取配置信息可参考 NacosPropertySourceLocator 类的实现。Spring Cloud Config 正是提供了PropertySourceLocator接口,来提供应用外部化配置可动态加载的能力。Spring Ioc 容器在初始化 Bean 的时候,如果发现 Bean 的字段上含有 @Value 的注解,就会从 Enviroment 中的PropertySources 来获取其值,完成属性的注入。Spring Cloud Config 外部化配置可动态刷新感知到外部化配置的变更这部分代码的操作是需要用户来完成的。Spring Cloud Config 只提供了具备外部化配置可动态刷新的能力,并不具备自动感知外部化配置发生变更的能力。比如如果你的配置是基于Mysql来实现的,那么在代码里面肯定要有能力感知到配置发生变化了,然后再显示的调用 ContextRefresher 的 refresh方法,从而完成外部化配置的动态刷新(只会刷新使用RefreshScope注解的Bean)。例如在 Spring Cloud Alibaba Nacos Config 的实现过程中,Nacos 提供了对dataid 变更的Listener 回调。在对每个dataid 注册好了相应的Listener之后,如果Nacos内部通过长轮询的方式感知到数据的变更,就会回调相应的Listener,在 Listener 的实现过程中,就是通过调用 ContextRefresher 的 refresh方法完成配置的动态刷新。具体可参考 NacosContextRefresher 类的实现。Sring Cloud Config的动态配置刷新原理图如下所示:ContextRefresher的refresh的方法主要做了两件事:触发PropertySourceLocator的locator方法,需要加载最新的值,并替换 Environment 中旧值Bean中的引用配置值需要重新注入一遍。重新注入的流程是在Bean初始化时做的操作,那也就是需要将refresh scope中的Bean 缓存失效,当再次从refresh scope中获取这个Bean时,发现取不到,就会重新触发一次Bean的初始化过程。这两个操作所对应的代码如下所示:public synchronized Set refresh() { Map<String, Object> before = extract( this.context.getEnvironment().getPropertySources()); //1、加载最新的值,并替换Envrioment中旧值 addConfigFilesToEnvironment(); Set<String> keys = changes(before, extract(this.context.getEnvironment().getPropertySources())).keySet(); this.context.publishEvent(new EnvironmentChangeEvent(context, keys)); //2、将refresh scope中的Bean 缓存失效: 清空 this.scope.refreshAll(); return keys;}addConfigFilesToEnvironment 方法中发生替换的代码如下所示:ConfigurableApplicationContext addConfigFilesToEnvironment() { ConfigurableApplicationContext capture = null; try { //省略… //1、这里会重新触发PropertySourceLoactor的locate的方法,获取最新的外部化配置 capture = (SpringApplicationBuilder)builder.run(); MutablePropertySources target = this.context.getEnvironment() .getPropertySources(); String targetName = null; for (PropertySource<?> source : environment.getPropertySources()) { String name = source.getName(); //省略.. //只有不是标准的 Source 才可替换 if (!this.standardSources.contains(name)) { if (target.contains(name)) { //开始用新的PropertySource替换旧值 target.replace(name, source); } // } } } // return capture;}this.scope.refreshAll() 清空缓存的操作代码如下所示:@Override public void destroy() { List<Throwable> errors = new ArrayList<Throwable>(); //清空Refresh Scope 中的缓存 Collection<BeanLifecycleWrapper> wrappers = this.cache.clear(); //省略… }为了验证每次配置刷新时,Bean 是新创建的,特意写了一个Demo 验证了下,如下所示:Acm Properties: beijing-region//刷新前Object Instance is :com.alibaba.demo.normal.ConfigProperties@1be96342018-11-01 19:16:32.535 INFO 27254 — [gPullingdefault] startup date [Thu Nov 01 19:16:32 CST 2018]; root of context hierarchyAcm Properties: qingdao-region//刷新后Object Instance is :com.alibaba.demo.normal.ConfigProperties@2c6965e0Spring Cloud Config 扩展Scope的核心类:RefreshScope可以看到上面的代码中有 this.scope.refreshAll(),其中的scope就是RefreshScope。是用来存放scope类型为refresh类型的Bean(即使用RefreshScope注解标识的Bean),也就是说当一个Bean既不是singleton也不是prototype时,就会从自定义的Scope中去获取(Spring 允许自定义Scope),然后调用Scope的get方法来获取一个实例,Spring Cloud 正是扩展了Scope,从而控制了整个 Bean 的生命周期。当配置需要动态刷新的时候, 调用this.scope.refreshAll()这个方法,就会将整个RefreshScope的缓存清空,完成配置可动态刷新的可能。更多关于Scope的分析请参考 这里后续关于ContextRefresh 和 RefreshScope的初始化配置是在RefreshAutoConfiguration类中完成的。而RefreshAutoConfiguration类初始化的入口是在spring-cloud-context中的META-INF/spring.factories中配置的。从而完成整个和动态刷新相关的Bean的初始化操作。本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 17, 2018 · 3 min · jiezi