科技云报道混合办公的B面:安全与效率如何兼得?
科技云报道原创。《工作的乐趣》一书的作者布鲁斯·戴斯利曾表示:“我们的工作正在经历前所未有的大变革,而这场变革刚刚开始。”在疫情反复影响下,全球很多企业开始主动拥抱“混合办公”这一工作模式。Twitter宣称员工可以永远远程工作;Dropbox宣布集中工作的办公空间会慢慢“退出”;微软、苹果、亚马逊正在将混合办公常态化。在国内,携程率先宣布推出“3+2”混合办公模式,允许员工在每周两天自行选择办公地点,结果显示“在家办公”提高了员工13%的绩效,离职率下降了50%。对于企业而言,混合办公模式一方面可以降低企业的运营成本,另一方面也能提升员工的幸福感,降低公司离职率。正如腾讯研究院与腾讯安全共同发布的《2022年混合办公安全白皮书》(以下简称“白皮书”)指出,混合办公是一种未来已来的新的工作模式、是新的企业生存策略和竞争战略。所有致力于未来竞争的企业,都将向混合办公模式进行迁移,先行者将享有先发优势。混合办公的B面:安全是核心问题尽管混合办公成为一种势不可挡的趋势,但背后的隐忧也随之浮出水面。白皮书调研数据显示,混合办公模式下,安全和效率成为最受关注的核心问题。受访者把安全(68.3%)排在了混合办公中第二重要的要素,仅次于效率(82.6%)。图片来源:腾讯研究院、腾讯安全《2022年混合办公安全白皮书》混合办公模式下,远程访问成为企业员工的必须。相比之前受到各类防火墙保护的企业内网,远程访问相当于在坚固的城堡里开了许多扇门,供远程办公人员进出,调取各类文件、信息、数据以满足工作需求,风险敞口骤然加大。从宏观层面看,网络攻击规模化与攻击门槛降低,使得混合办公成为了新的威胁跳板。近年来,对企业安全造成威胁的外部安全攻击事件案例层出不穷。从微观层面看,企业员工在混合办公时存在各类安全风险操作行为,如:接入公共场所的 WiFi进行办公;没有将个人文件和办公文件分开,并加密重要文件;因个人原因使用过公司的设备;结束混合办公时未及时退出公司系统等等,都为企业在面对安全威胁和安全管理带来了新挑战。但更严峻的是,在混合办公模式下,企业安全的认知和保障严重不足。白皮书调研数据显示,64.5%的受访者所在企业的混合办公安全保障不佳,其中37.3%的受访者表示,其所在的企业没有为混合办公提供技术支持和安全保障,另外有27.2%的受访者表示不了解。这表明大部分企业还未开始宣传或有可能尚未有任何安全保障措施。值得庆幸的是,安全技术的不断演进,为企业更好地拥抱混合办公提供了可行路径。白皮书指出,混合办公模式想要真正长期可持续发展,实现混合办公安全“i-DEAN”五要素必不可少,包括:身份安全、数据安全、设备安全、应用安全和网络安全。其中,身份安全是混合办公安全的核心,一切混合办公安全需要保证使用者的身份是安全可靠的,而数据作为资产、应用作为关键载体、设备作为重要入口、网络作为基础纽带,同样是混合办公安全需要保护的。可以说数据安全、设备安全、应用安全、网络安全是围绕在身份安全核心的不同方面与维度。图片来源:腾讯研究院、腾讯安全《2022年混合办公安全白皮书》混合办公的安全成熟度事实上,混合办公模式仍在发展演变中,许多企业并不确定自身正在施行的混合办公模式是否高效、安全,他们迫切希望以更加科学的方法来评估自身混合办公模式安全的成熟度。针对这一问题,腾讯安全率先开启了混合办公安全成熟度的研究。在白皮书中,一套评估混合办公安全成熟度的模型被提出,模型分为6个领域,分别是:架构设计、业务契合度、规章制度、团队配备、技术工具、运营迭代。每个领域,从低到高分为5个等级,分别是:原始、起步、初步成型、成型后发展、成熟中优化。图片来源:腾讯研究院、腾讯安全《2022年混合办公安全白皮书》举个例子,一家拥有30000员工的民营企业,明确了开启混合办公模式的基本原则,并制定了细致的相关规章制度,以及具体的分阶段实施计划。公司改造并实现了混合办公下的身份安全和数据安全的防护,打通了混合办公模式下的业务全流程与相应企业安全体系,并配备了相应的运维保障人员,同时其它部门已有跟安全小组对接的计划。基于混合办公安全成熟度模型的评估打分,该企业的整体混合办公安全成熟度属于初步成型阶段,即初步形成了有效的混合办公安全体系,且在大多数领域有了实施细节,但在整体混合办公安全体系下,依然有许多不成熟的细节。例如:企业在技术工具和运维保障方面依然薄弱,需继续重点补齐应用安全、设备安全、网络安全等能力。此外,该企业在业务契合度和团队配置两方面也尚处于初步成型阶段,尤其是以业务契合度作为混合办公安全成熟度的中坚核心,也需要企业进一步将所有业务与其混合办公安全体系进行磨合。当企业将自身混合办公安全成熟度与混合办公安全“i-DEAN”五要素有机结合起来,就能更清楚地定位自身在混合办公安全领域的发展水平,以及持续发展和优化的方向。零信任:混合办公安全的“解药”可以随处工作的混合办公,恰恰是对工作场景提出最高要求的一种模式,其背后是安全和效率的双重保障。那么企业到底应如何开启混合办公的安全之旅?目前,以“零信任”为代表的安全理念正在成为集大成者,将“i-DEAN”五要素融为一体。作为一个全面的安全模型,零信任涵盖了身份安全、数据安全、应用安全、网络安全、设备安全等各个方面,致力于构建一个以身份为中心的策略模型以实现动态的访问控制,以保护关键数据或者业务流程。在混合办公模式兴起的当下,企业网络边界已消失,企业中的人、设备、应用、数据所面临的安全风险都大大提升。零信任不再基于企业网络边界作为信任分界线、默认企业内网访问受信,而是企业网络内外的任何人、设备和应用都需要“持续验证,永不信任”,从而保障企业办公的终端安全、链路安全和访问控制安全。正因如此,零信任成为解决混合办公安全问题的重要技术手段。不仅如此,对于企业和员工来说,零信任最大的价值点在于能够同时实现安全和效率,这也是企业梦寐以求的公司运营驱动双轮。作为高效的工具,零信任能让企业快速打通身份账号数据,从企业角度统一对各类终端设备、身份信息进行高效的安全管理,很好地帮助企业提升安全管理和运维的效率;同时,终端用户也可以通过一个零信任客户端直连网络和应用,操作简易且无感,实现快速访问公司内部服务。事实上,零信任自2010年由研究机构Forrester提出至今已有12年,在技术和市场的交替验证下已逐步成熟,被越来越多的企业积极拥抱。白皮书调研数据显示,在了解零信任概念的受访者中,22.7%的受访者所在企业零信任产品已经到位,40.2%的受访者所在企业零信任项目正在进行中,22.3%的受访者所在企业零信任项目已经计划好。图片来源:腾讯研究院、腾讯安全《2022年混合办公安全白皮书》蓄势已久的零信任,正在成为保障混合办公安全和效率问题的解药。零信任落地按下加速键尽管近年来零信任理念理念在技术圈非常火爆,但由于国内外不同的市场环境,零信任在美国已进入规模化发展阶段,而在中国的落地情况依然不容乐观。腾讯安全零信任产品总经理杨育斌在采访中表示,目前零信任在落地过程中面临多种难题:一是如何适配多样化终端;二是如何保障异构网络环境下的服务稳定性和安全性;三是如何协同和认证分散的身份账号;四是如何做好最小权限的授权和治理;五是如何实现持续的威胁防护。此外,零信任能否和企业现有安全建设形成联动体系,避免信息安全孤岛,也是现实问题。值得注意的是,零信任落地从来都不是一蹴而就的事。2011年,谷歌内部开始实施零信任,整整花了6年时间才在企业网实现了零信任落地。在国内,腾讯是最早实践零信任的大型厂商之一,从2016年腾讯开始在公司内部实践零信任整体的体系建设,到2019年腾讯将内部实践对外输出形成商业版iOA零信任安全管理系统,也历经了4年时间。但肉眼可见,零信任落地步伐在加速。以腾讯零信任iOA为例,推出几年之内已广泛应用于金融、地产、物流、教育、工业等十大行业、数百家企业。就在今年早些时候,腾讯iOA的部署终端突破了100万,成为国内首个落地百万的零信任产品,从市场需求侧证明了零信任在国内的成熟和规模化落地。以混合办公为代表的远程访问场景,正是国内零信任落地的最佳切入口。高灯科技作为腾讯iOA第一百万端的客户,在2020年疫情期间,他们使用的传统VPN无法支撑激增的远程办公需求,并且高危漏洞频发。部署腾讯iOA之后,高灯科技实现了终端安全一体化,增强了合规基线的检测和数据安全的管控能力,保证了公司业务稳定、高效地进行。高灯科技副总裁兼安全负责人莫晓盛在采访中表示,如果按照传统方式需要部署多家厂商的安全产品,但是腾讯iOA作为一个综合性安全平台带来了一整套的防病毒、终端安全管控、VPN转入、数据防泄露等功能,“一个运维人员就可以管理多个平台和系统,防护效果还比传统部署方式要好”。事实上,和高灯科技面临同样困境的政企机构不在少数。自疫情持续爆发以来,混合办公就成为国内政企机构业务运转的常态,从而使得零信任的发展迎来了新的分水岭在这个过程中,腾讯安全也一直在思考如何让零信任更好的落地。杨育斌表示,零信任已经进入了2. 0时代,无论是在事前、事中、事后,都需要对访问的主体、客体以及环境进行持续监控和防护,基于各维度风险进行实时响应,实现持续自适应风险与信任一体化机制,即“自适应零信任阶段”。因此,零信任解决方案需要在“接、防、管、控”层面做到一体化。在此背景下,腾讯安全重磅发布了全新升级的零信任安全管理系统——腾讯零信任iOA7. 0 版本。据了解,腾讯零信任iOA7. 0 在可信接入、威胁防护、安全管理、风险控制及全平台覆盖等维度上实现了焕新升级,提升了接入安全性和效率,打造了立体防御体系,实现多平台终端全管控和XDR全程联动响应。此外,腾讯零信任iOA7. 0在平台覆盖上也提升了产品自适配度,有效支持企业设备和自带设备。这也很好地解决了零信任落地的另一个关键问题,即多厂商的产品异构,让企业很难将零信任与现有安全设备联动起来,并避免企业IT投资的浪费。为此,腾讯牵头联合生态伙伴共同推动零信任的行业标准化。目前,腾讯零信任标准工作组制定的接口标准,已实现了同18个行业安全厂商的对接。接口标准化促进了企业安全办公体系的融合,进一步优化了办公体验,也让零信任的落地变得更加容易。结语后疫情时代,混合办公模式已成为企业新的竞争力来源,安全和效率作为混合办公模式下的必备能力项,为企业IT建设提出了新的挑战,而零信任无疑是解决混合办公安全和效率问题的最佳解药。如今,零信任正在跨越鸿沟进入主流市场。【关于科技云报道】专注于原创的企业级内容行家——科技云报道。成立于2015年,是前沿企业级IT领域Top10媒体。获工信部权威认可,可信云、全球云计算大会官方指定传播媒体之一。深入原创报道云计算、大数据、人工智能、区块链等领域。
LSF 集群全面监控!浅析 HPC 基于龙蜥操作系统的迁移替代解决方案
近日,北京常青藤开源科技有限公司(以下简称“常青藤开源科技”)与龙蜥社区完成基于龙蜥操作系统(?Anolis OS?)安装部署 HPCinsights?监控平台解决方案,进一步助力龙蜥操作系统在高性能计算领域的优化、提升。芯片企业在芯片日常研发中,存在高性能计算(HPC) 集群资源平均利用率不高,同时伴随大量 pending 作业,以及作业平均等待时间较长等问题,对企业日常芯片设计整体进度造成不利影响。HPCinsights 是一款对 HPC 集群进行监控和智能分析的软件,不仅具备常见的系统监控能力,也可以在作业资源分析、多维度资源统计和作业资源实时监控等方面,实现快速发现 HPC 集群存在的配置和使用问题,全面掌控集群资源状况,优化集群资源分配。常青藤开源科技加入龙蜥社区后开展深入合作,基于龙蜥操作系统(?Anolis OS?)安装部署 HPCinsights?监控平台,实现对?LSF?集群资源调度使用情况进行全面监控和配置优化,从而提升芯片设计相关工作整体进度。通过对其 HPC 队列作业进行可视化分析,快速识别出集群使用的多个问题。HPCinsights 平台对 IC 设计计算任务进行统计、 查询、分析和资源监控,持续优化和改进 LSF 集群配置,集群资源利用率和作业平均等待时间得到较大提升,充分利用了现有服务器资源,并为后续芯片设计上云提供了数据支撑。HPCinsights 软件产品和 Anolis OS 联合解决方案的完成,不仅解决了企业对国外产品高度依赖带来的 IT 成本和安全隐患影响,又可以在同等条件下获得到更好的技术支持和服务保障。在操作系统快速发展的支持下,摆脱对国外产品的依赖,使我们在信息安全防控上更加具有主动权。龙蜥社区始终秉持着“中立开放”的原则继续诚邀各企业与龙蜥操作系统(Anolis OS),围绕兼容适配、技术合作、商业版发行等多角度进行逐步合作,欢迎各位合作伙伴来进行产品适配或安装部署解决方案等,如有适配需求,请联系:陈佳 jackie.cj@openanolis.org「龙腾计划」自发布以来,已有超过百家企业签署?CLA 协议加入龙蜥社区,包括安全厂商格尔软件、海泰方圆,数据库厂商南大通用、巨杉数据库,中间件厂商东方通、中创中间件、宝兰德等,欢迎更多企业加入。?龙腾计划可参看:“龙腾计划”启动!邀请 500 家企业加入,与龙蜥社区一起拥抱无限生态。—— 完 ——关于常青藤开源科技常青藤开源科技成立于 2017 年,专注于 HPC (高性能计算)和开源解决方案,为国内芯片设计企业和制造业、金融、电信等行业客户提供领先的 HPC (高性能计算)解决方案和开源基础设施解决方案;及开源技术咨询、系统架构设计、操作系统安全补丁管理、自动化运维、系统软件定制和技术支持等相关服务。常青藤开源科技拥有多款自主研发的产品,为国内客户提供创新性产品和技术服务。关于龙蜥社区龙蜥社区(OpenAnolis)由企事业单位、高等院校、科研单位、非营利性组织、个人等在自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、开放的 Linux 上游发行版社区及创新平台。龙蜥社区成立的短期目标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应对方案,构建一个兼容国际 Linux 主流厂商的社区发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。目前,Anolis?OS 8.4 已发布,支持 X86_64 、Arm64、LoongArch 架构,完善适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。欢迎下载:https://openanolis.cn/download加入我们,一起打造面向未来的开源操作系统!https://openanolis.cn
【活动】MongoDB 5.0时序存储特性线上研讨会
每个行业和每个公司都需要查询、分析和报告时间序列数据。比如,股票交易者在一天内不断查看股票价格,他们根据每小时或每天的时间范围来查看交易数据这需要运行算法来分析趋势以识别机会。车联网公司需要随时随地获取遥测数据,例如发动机性能和能量消耗以改善组件设计,并监控磨损率,以便他们可以提前安排车辆维修出现问题。时间序列数据越来越多的出现在物联网、股票交易、信息流、社交媒体等现代核心应用中。时间序列的有效捕获和分析数据可以使组织更好地预测和应对变化,领先于竞争者,同时提高运营效率以降低成本和风险!在本次的研讨会中,您将了解到MongoDB时序存储的新特性及最佳实践!扫码预约直播!扫码加入钉群,与MongoDB专家一对一沟通,了解更多阿里云MongoDB产品与方案,市场活动及线上培训等内容。
一种Vue应用程序错误/异常处理机制
现在构建前端应用程序不像以前那么简单,现在,应用程序更加复杂和多样。这就需要在构建前端应用程序的时候考虑很多,错误/异常处理是最重要的方面之一。在应用程序中拥有良好的错误处理机制可以带来很多的好处,如下:良好的错误处理机制可以避免应用程序在出现未处理的异常时崩溃在生产环境下,可以轻松地存储或者跟踪错误记录日志,以便异常的处理可以统一处理错误信息,例如在不破坏应用程序交互的情况下,更改错误信息展示UI有助于改善用户体验在前端应用程序中,最常见的错误/异常类型可能包括以下几种:语法错误:使用了一些错误的语法运行时错误:由于执行期间的非法操作导致的逻辑错误:由于程序逻辑错误Http 错误:API 返回的错误有很多方法可以解决上面的问题,例如使用 eslint 来检查语法错误,使用适当的 try-catch 语句处理运行时错误,通过适当的单页或者集成测试减少逻辑错误,http 错误可以通过使用 Promise 来处理。之前在文章《浅谈前端异常监控平台实现方案》中简单介绍前端异常监控的实现方案,在本文中,将推荐一种在 Vue 应用程序中实现错误/异常处理机制。全局配置Vue 应用程序有一个全局配置 Vue.config,可以配置禁止日志和告警、devtools、错误处理程序等等。可以用自己的配置覆盖这些配置,对于错误处理,可以为其分配一个处理函数 Vue.config.errorHandler。在整个应用程序中,任何 Vue实例(Vue组件)中的任何未捕获异常都会调用该处理程序。以下代码片段为Vue 应用程序注册一个错误处理方法(一般在项目的 main.js 文件中):/**
*
* @param {*} error 错误跟踪
* @param {*} vm 组件错误
* @param {*} info 特定的错误信息,如生命周期钩子、事件等。
*/
Vue.config.errorHandler = (error, vm, info) => {
console.info(error);
console.info(vm);
console.info(info);
};处理程序包含 3 个参数:error:完整的错误跟踪,包含 message 和 error stackvm:发生错误的Vue组件/实例info: 特定的错误信息,例如生命周期钩子、事件等。Vue.config.errorHandler 捕获特定于Vue实例的错误,但无法捕获 Vue 实例之外的错误,如服务。要捕获 Vue 实例之外的错误,可以使用 window.onerror 事件,可以注册一个错误处理函数,该函数将捕获所有非特定于 Vue 实例的未处理异常。下面的代码片段为其应用注册window.onerror 异常处理函数:window.onerror = function(message, source, lineno, colno, error) {
// TODO: 定义跟踪逻辑
};自定义异常组件通常项目中有一些可预知的异常需要自定义 UI ,可以自定义异常组件来统一接管异常的处理。实现的逻辑是如果有异常显示异常信息,否则就显示组件信息,代码如下:<template>
<div>
<slot v-if="errors" name="errors">
<a-alert
:message="errors.title"
:description="errors.description"
show-icon
type="warning"
class="mb-2"
>
</a-alert>
</slot>
<slot v-else></slot>
</div>
</template>
<script>
export default {
name: "QtErrorContainer",
props: {
errors: Object, // {title:"500错误",description:"数据库连接超时"}
},
};
</script>以上面的组件作为容器来加载其他组件,如通过后台接口拉取列表数据,调用如下:<QtErrorContainer :errors="errors">
<a-table ></a-table>
</QtErrorContainer>上面的代码在 errors 为 null 或者 false 的时候,显示表格组件 <a-table></a-table>,否则不显示而显示异常信息。这样实现好处就是所有可预知的异常都由统一的组件来处理,提高复用和灵活性。日志处理对于日志处理,可以封装为一个独立的类,如 logger ,负责收集Vue中所有的异常日志,输出到控制台或者通过接口发送到服务器存储或借助第三方日志跟踪平台,只需要修改 logger 的处理方式即可,如下:import { environment } from "@/environment/";
/**
* Logger 日志类
*/
class Logger {
/**
* @constructor AppLogger
*/
constructor() {
this.init();
}
init() {
if (environment !== "production") {
this.log = console.log.bind(console);
this.debug = console.debug.bind(console);
this.info = console.info.bind(console);
this.warn = console.warn.bind(console);
this.error = console.error.bind(console);
this.toServer = this.error;
} else {
/** 在生产的情况下,替换函数定义 */
this.log = this.debug = this.info = this.warn = this.error = () => {};
/** TODO: 方法中可以增加接口或者第三方平台跟踪的逻辑 */
this.toServer = (err) => {
console.error(err);
};
}
}
}
const logger = new Logger();
export { logger };可以将 logger 类引用到上面的全局配置的处理方法中,如下:import Vue from "vue";
import { logger } from "@/logger";
/**
*
* @param {*} error 错误跟踪
* @param {*} vm 组件错误
* @param {*} info 特定的错误信息,如生命周期钩子、事件等。
*/
Vue.config.errorHandler = (error, vm, info) => {
logger.toServer({ error, vm, info });
};
window.onerror = function (message, source, lineno, colno, error) {
logger.toServer({ message, source, lineno, colno, error });
};总结错误处理对于应用程序非常重要,在本文中,讨论了Vue.config.errorHandler 使用生命周期钩子的全局错误处理程序和自定义组件来处理可预知的异常。本文提供了基本细节,借助这些细节,可以轻松实现应用程序的错误处理并记录它们,这将有助于创建更好的用户体验。
细说节流(Throttle)和防抖(Debounce)
节流(Throttle)和防抖(Debounce)对于前端开发人员来说应该是十分熟悉的,节流(Throttle)和防抖(Debounce)是两种可以节省性能的编程技术,两者的目的都是为了优化性能,提高用户体验,都是基于 DOM 事件限制正在执行的 JavaScript 数量的方法。但两者的有什么不一样呢?节流会强制执行一个函数在一段时间内可以被调用的最大次数。如“最多每 100 毫秒执行一次此函数”。假设在正常情况下,会在 10 秒内调用此函数 1,000 次。如果将其限制为每 100 毫秒仅一次,则该函数最多只会执行 100 次。(10s * 1,000) = 10,000 ms10,000 ms / 100 ms 限制 = 100 个最大调用防抖强制一个函数在一段时间内没有被调用之前不会被再次调用。如“仅当 100 毫秒过去了而没有被调用时才执行此函数”。也许一个函数在短时间内被调用 1000 次,分散在3秒内,然后停止调用。如果在 100 毫秒的时间内启动,这个功能只会在 3.1 秒的时间内启动一次。每次在突发事件期间调用该函数时,它都会重置恢复计时器。区别是什么?这些概念的一个主要用例是某些 DOM 事件,例如滚动和调整大小。例如,如果将滚动处理程序附加到一个元素,并将该元素向下滚动 5000 像素,可能会看到 100 多个事件被触发。如果事件处理程序做了大量工作(例如繁重的计算和其他 DOM 操作),可能会看到性能问题(卡顿)。如果可以减少执行该处理程序的次数,而不会对经验造成太大影响,那么这可能是值得的。常用的场景如下:等到用户停止调整窗口大小在用户停止输入之前不要触发 AJAX 事件监测或者获取页面的滚动位置,最多每 100ms 响应一次在应用中拖动元素时确保良好的性能怎么做?节流(Throttle)和防抖(Debounce)两个函数都内置到 Lodash 脚本库中,无需自己实现。节流(Throttle)场景$("body").on("scroll", _.throttle(function() {
// 处理逻辑
}, 100));防抖(Debounce)场景实际生活中,如百度搜索,输入文本后会出现下拉选择,这个过程一般绑定文本事件 keypress。下图描述了使用防抖(Debounce)前状态的性能监控捕获,每次 keypress 引发事件时,它都会触发搜索引擎请求数据并将结果呈现在屏幕上。事实上,这些结果并没有被用户看到,因为它们已经被最新 keypress 事件的后续结果覆盖了,屏幕上仅呈现最新结果。下面是使用防抖(Debounce)进行优化后的结果,如下:正如所看到的,搜索过程和结果呈现只调用一次(当用户完成输入时),没有重复调用不重要的功能,如布局渲染、内存处理、DOM元素管理。下面是以搜索为场景,展示 AJAX 的请求情况:还有下面的窗口大小调整场景,如下:$(window).on("resize", _.debounce(function() {
// 处理逻辑
}, 100));在现代浏览器中,可以使用 requestAnimationFrame,告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。总结节流(Throttle)和防抖(Debounce)这两个来自于需要延迟功能的执行,因为用户不想进行过多的HTTP请求。如今,这些是提高 Web 性能的重要方法。
ECS使用感受
本人现在是大四,软件工程专业,通过B站一位UP主推荐来到阿里云,并且刚好看到阿里正在搞“飞天加速计划·高校学生在家实践”活动,这么好的活动对于我一个没有收入的学生来说真的是雪中送炭! 购买了服务器我就立即使用Xshell工具远程连接上我的云服务器,并简单的测试了一下基本的Linux使用指令,真正的体验到接近于实战的Linux,收获颇丰。在这里呢,我也总结了一下我在使用的过程中遇到的一些问题以及解决方法。第一个,当然就是如何配置安全组,没有设置安全组的话,就无法远程连接服务器了。所以我就简单的查询了一下网上资料就顺利解决了,至于配置方法,网上大部分都介绍得有,我就不过多阐述了。第二呢,就是使用远程命令安装jdk,tomcat,mysql等遇到的一些小问题,当然了我也简单的花了几十分钟顺利的全部搞定了。第三个呢,就是防火墙的关闭以及安全组端口的开启,没有开的话就开,再把防火墙关闭即可。查看防火墙,将防火墙关闭,查看安全组,公网入口通道是否开启就可以解决了。这里我推荐下监控CPU和内存的日志工具,现在安骑士已经升级为云安全中心了,云安全中心是一个实时识别、分析、预警安全威胁的统一安全管理系统。通过本次阿里云“高校学生在家实践”,逐渐对服务器有了个初步的认识。在使用过程中,让我难忘的就是创建一个实例,搭建服务器的过程,虽然这个过程挺艰难的,但是按照网上的教程一步一步来就能完成的。在” 高校学生在家实践”之前,我还不会搭建服务器环境和部署项目的,但有了这次的活动,我也掌握了一项技能了。
用console画条龙?
相识console一定是各位前端er最熟悉的小伙伴了,无论是console控制台,还是console对象,做前端做久了,打开一个网页总是莫名自然的顺手打开控制台,有些调皮的网站还会故意在控制台输出一些有意思的东西,比如招聘信息,像百度的:其他的不说,真的每年都更新,看着还挺让人热血沸腾。另外输出一些花里胡哨的字符图形也是很常见的,比如天猫的:也有一些网站可能不喜欢被人调试,只要打开控制台就自动进入调试模式,还是无限debugger的那种,最简单的实现方式如下:setInterval(() =>{
debugger
}, 1000)破解也不难,有兴趣的可以百度一下。不知道是否有人像我一样,做前端很多年,就靠一个console.log走天下,仿佛console就一个log方法,如果是,那么本文就来一起进一步认识一下console对象吧。相知console对象是由宿主环境提供的,如浏览器和nodejs,作为全局对象的一个属性,不需要通过构造函数创建,直接使用即可,console对象的__proto__指向的是一个空对象,所以 console对象的方法都挂在对象自身,在 chrome控制台打印console可以看有如下方法或属性:console输出信息的方法都可以接收多个以逗号分隔的参数,打印的时候会在同一行进行显示,不会换行,想要换行的话请使用console方法打印多次。另外在不同的浏览器上同一个方法可能会有差异,鉴于大家基本都是使用chrome,所以以下内容大部分都是在chrome下的效果。直接罗列api说实话挺无聊的,所以我们按场景来看。场景1:输出普通的调试信息,如数字、字符串、对象、数组、函数等可以使用console.log或console.info,这两个方法基本是一样的:场景2:想输出不同等级的调试信息,如警告信息或报错信息调试级别的信息可以使用console.debug方法,控制台默认是不显示的,想要看到的话需要勾上控制台对应的选项:警告信息可以使用console.warn方法,会将这行信息添加黄色的背景以及一个感叹号图标,同时会显示堆栈信息:错误信息可以使用console.error方法,会将这行信息添加红色的背景以及一个叉号图标,同时会显示堆栈信息:场景3:想查看某个DOM元素的所有属性比如说我想看body元素的所有属性要怎么看呢:console.log(document.body)这样在控制台打印出的是dom结构,看不到具体是属性:那怎么办呢,可以使用for in来遍历:for(let p in document.body) {
console.log(p, document.body[p])
}还有一个简单的方法是把它作为数组的一项或者是对象的一个属性值:console.log([document.body], {body:document.body})当然,以上都不是最简单的,最简单的是直接使用console.dir方法:场景4:想查看具体的调用位置、调用堆栈等信息只需要找到调用位置的话,log、info、error等方法都可以,如果还想查看调用堆栈信息的话可以使用console.assert、console.error、console.warn以及专门的方法console.trace,trace方法可以不带参数:场景5:有时候console写多了,打印出太多信息,无法一眼看出都是哪里的,也不容易分清楚哪些是相关联的这个可以手动把其他的都给注释掉,只留你本次需要的(这要你说?),当然如果你愿意多敲几行代码的话,也可以使用console.group方法来进行分组显示,使用console.groupEnd方法结束分组,可以多级嵌套:console.group(xxx)
xxx
console.groupEnd()相恋场景1:实现一下上述百度的效果console要输出换行的字符需要使用\n:console.log('每一个星球都有一个驱动核心,\n每一种思想都有影响力的种子。\n感受世界的温度,\n年轻的你也能成为改变世界的动力,\n百度珍惜你所有的潜力。\n你的潜力,是改变世界的动力!')输出红色的字可以使用占位符,占位符格式为:console.log('%x其他字符', 'xxx', [xxx, xxx...])设置样式使用%c占位符,可以使用多个,为占位符后面的字符应用样式,替换完占位符还剩下的参数也会正常打印出来:console.log('%c百度2021校园招聘简历投递:', 'color:red', 'https://talent.baidu.com/external/baidu/campus.html')支持常用的样式属性:console.log(
'%c街%c角%c小%c林',
'font-size: 20px;margin-right: 5px',
'color: #58A7F2',
'font-size: 24px;background: #F4605F;color: #fff;padding: 5px',
'border: 1px solid #8F4CFF;padding: 10px;border-radius: 50%'
)除了%c,还有其他几个占位符:%i、%f、%s等,因为不太常用,所以就不具体介绍了。场景2:在控制台画条龙吧看来最近很流行画龙啊,行,满足你:console.log('%c', 'background-image: url(?龙.jpg); background-size: 100%; padding:267px 300px;')ps.在chrome不知道为啥没有效果,以上是在edge浏览器上的效果。(用图片就属于耍赖皮了啊,而且图片的支持性很差,估计很多浏览器都显示不出来,能不能换种方式?)要求还挺多,不能用图片,那就和上述天猫的那只猫一样给你用字符画吧,不过这样我们需要先把图片转成字符,原理和大帅的那篇文章一样,只不过是把div换成字符。使用canvas获取到图片的像素数据后,使用两层循环嵌套,外层遍历高,内层遍历宽,迭代高的时候添加一个换行符\n,迭代宽的时候,根据当前像素点的r、g、b信息判断是添加空字符还是非空字符,最后拼接完成的字符就是我们要打印的字符,不过需要注意的是因为我们是一个像素点对应一个字符,但是字符的实际大小肯定是比一个像素大的,比如一个16px的文字,那么最终我们得到的字符图形将是原图片的16倍,这显然太大了,控制台显示不下,所以需要缩小,怎么缩小呢,有两个方法,一个是缩小图片,图片小了,像素点自然就少了,二是减少取样点,比如每隔10px我们取一个点,这样的问题是最终图形可能会和原图片有点偏差。// 加载龙的图片
let img = new Image()
img.src = '.?龙.jpg'
img.onload = () => {
draw()
}
// 把图片绘制到canvas里
const draw = () => {
const canvas = document.getElementById('canvas')
canvas.width = img.width
canvas.height = img.height
const ctx = canvas.getContext('2d')
ctx.drawImage(img, 0, 0, img.width, img.height)
// 获取像素数据
const imgData = ctx.getImageData(0, 0, img.width, img.height).data
// 拼接字符
join(imgData)
}
// 把像素数据拼接成字符
const join = (data) => {
let gap = 10
let str = ''
for (let h = 0; h < img.height; h += gap) {
str += '\n'
for (let w = 0; w < img.width; w += gap) {
str += ' '// 因为字符的高度普遍都比其宽度大,所以额外添加一个空字符平衡一下,否则最终的图形会感觉被拉高了
let pos = (h * img.width + w) * 4
let r = data[pos]
let g = data[pos + 1]
let b = data[pos + 2]
// rgb转换成yuv格式,根据y(亮度)来判断显示什么字符
let y = r * 0.299 + g * 0.578 + b * 0.114
if (y >= 190) {
// 浅色
str += ' '
} else {
// 深色
str += '#'
}
}
}
console.log(str)
}效果如下:可以看到虽然大致形状出来了,但是细节少了很多,另外一种缩小图片的方式有兴趣可以自行尝试,效果可能会比这种好一点。不过也不用这么麻烦,有很多网站就可以直接帮你转,比如:www.degraeve.com/img2txt.php。相爱场景1:怎么更方便的打印对象对象,我们都知道它是引用类型,平时开发中,我们经常会打印某个对象或数组,如果没有修改它的话当然没有什么问题,但是如果中途对它有多次修改,又想看每次修改后的这一时刻的数据,很遗憾,直接使用console.log或dir之类的方法最终显示的都是该对象最后时刻的数据:let obj = {a: 1, b: [1, 2, 3]}
console.log(obj)
obj.a = 2
console.error(obj)
obj.b.push(4)
console.dir(obj)可以看到旁边都有个叹号,移上去会显示一行提示:This value was evaluated upon first expanding,It may have changed since then.,意思就是这个值计算了一次,但是后面可能是会变化的,所以我们往往会使用:console.log(JSON.stringify(obj))或者深拷贝一下再打印,有没有更简单的方法呢?我们可以给console加两个方法,一个叫console.obj,先深拷贝一下再打印,另一个叫console.str,把对象序列化后再打印:console.obj = function (...args) {
let newArgs = args.map((item) => {
if (Object.prototype.toString.call(item) === '[object Object]' || Array.isArray(item)) {
return deepClone(item)
} else {
return item
}
})
console.log(...newArgs)
}
console.str = function (...args) {
let newArgs = args.map((item) => {
try {
let obj = JSON.stringify(item)
return obj
} catch(e) {
return item
}
})
console.log(...newArgs)
}场景2:怎么在生产环境去掉console想去掉生产环境的console可以通过webpack的插件来做,也可以拦截一下console对象的方法,判断是否是生产环境,是的话就不打印日志了,让我们来重写一下console对象:let oldConsole = window.console
let newConsole = Object.create(null)
// 其他方法这里暂时省略了
;['log'].forEach((method) => {
newConsole[method] = function (...args) {
// 非开发环境直接返回
if (process.env.NODE_ENV !== 'development') {
return
}
oldConsole[method](...args)
}
})
window.console = newConsole重写console可以用在任何需要知道console调用的场景下,比如前端监控日志上报。相守nodejs中的console和浏览器的是有点差异的,这个显而易见,毕竟命令行肯定没有浏览器这么强大:如图所示,log、info、error、warn、debug这几个方法表面上看起来没有什么区别,error和warn不像在浏览器上一样有堆栈信息,trace还是保持着一致,对于对象的打印也是直接展开的,所以想要格式化的显示需要自行对要打印的对象进行处理,比如对于纯对象:console.log(JSON.stringify({a: 1, b: [1, 2, 3]}, null, 4))另外%c的占位符显然也是没有效果的,如果想要打印出带颜色的可以使用chalk之类的工具库,其他一些方法的输出效果如果命令行不支持的话最终都会直接调用console.log来处理。浏览器环境里没有Console类,但是nodejs里是存在的,有两种方式获取到:const { Console } = require('console')
const { Console } = console通过Console类可以根据你的需求传入参数来实例化一个新的console实例:/*
stdout:可写流,用来输出信息
stderr:可选的可写流,用来输出错误信息,不传则使用stdout
ignoreErrors:在写入底层流时忽略错误
*/
new Console(stdout[, stderr][, ignoreErrors])默认的全局console是输出到标准输出流和标准错误流,相当于:new Console(process.stdout, process.stderr)那么你完全可以选择把日志输出到指定的文件里:const output = fs.createWriteStream('./stdout.log')
const errorOutput = fs.createWriteStream('./stderr.log')
new Console(output, errorOutput)再见纵是不舍,终有离别,各位看到这里的有缘人我们下次再见吧~
ARMS中H5前端监控短信通知报警成功了,但是钉钉和WebHook没收到预警是为什么呀?
ARMS中H5前端监控短信通知报警成功了,但是钉钉和WebHook没收到预警是为什么呀?
Quick BI数据大屏可视化大赛
一、活动背景为帮助企业客户更好地满足大屏相关的数据可视化需求,Quick BI推出数据大屏模块(当前免费公测中),同时举办本次Quick BI数据大屏可视化大赛活动,帮助用户更好地学习和掌握数据大屏的功能和应用。数据大屏是面向企业数据消费者,将可视化和场景叙事技术结合,运行在智能设备上,非接触式连接的酷炫大屏,满足CXO大盘、业务监控、以及对外PR等场景、从而推动企业数据群体消费。数据大屏的常见应用场景包括CXO驾驶舱、活动数据监控、项目会议演示、对外接待或PR等,是Quick BI四大数据分析场景的重要组成部分,致力于满足企业高可视化要求的数据展示场景。二、活动规则1.作品要求:参与活动的用户需要使用Quick BI产品的数据大屏模块,搭建1张大屏页面(不得直接套用内置Quick BI模板)。Quick BI产品控制台:bi.aliyun.com2.数据来源:参赛选手自行准备,可使用企业相关数据搭建(敏感数据可打马赛克或做脱敏处理)。3.评分规则:Quick BI产品团队将对选手提交的作品进行评分,评分主要考虑以下因素:评分维度占比可视化展现美观性60%作品推广价值40%三、奖励发放大赛最终将评选出一等奖3名、二等奖5名、三等奖10名,给予不同额度的天猫超市购物卡(电子版)奖励:奖项名额奖品一等奖3猫超卡¥1000/人二等奖5猫超卡¥500/人三等奖10猫超卡¥100/人四、作品提交提交参赛报名表(点击报名),包含参赛作品的高清截图(敏感数据可打马赛克或做脱敏处理),数据大屏公开分享链接(可选),以及作品简介(包含数据来源,清洗建模及展现、创意思路,推广价值等)信息。注:大赛组织方有权将参赛作品、作品相关、作者信息用于宣传品、指定及授权媒体发布、官方网站浏览及下载、展览(含巡展)等活动项目,本活动最终解释权归Quick BI产品团队所有。五、活动时间作品提交时间:2022年6月13日-2022年7月3日作品评分时间:2022年7月4日-2022年7月6日奖品发放时间:2022年7月7日六、学习资料Quick BI数据大屏产品文档:https://help.aliyun.com/document_detail/108979.htmlQuick BI数据大屏产品视频:https://help.aliyun.com/document_detail/433242.htmlQuick BI数据大屏产品Demo:https://bi.aliyun.com/template/nl/public