关于设计:什么是设计领域的-4-eyes-design

4 Eyes Design(四目设计)是一种设计审查和验证过程,旨在确保设计我的项目的品质、准确性和可靠性。这一设计办法通常用于软件开发和产品设计等畛域,其外围概念是通过引入多个独立的视角和专业知识,来审查和验证设计方案,以升高谬误和问题的危险。4 Eyes Design的名称源自于“四双眼睛”即四个独立的视角,它侧重于减少设计决策的透明度和品质管制。 在4 Eyes Design中,通常波及以下四个次要角色: 设计师(Designer):设计师是我的项目的创造者,负责制订和施行设计方案。他们负责将想法和概念转化为具体的设计,以满足我的项目的需要和指标。初审者(Reviewer 1):初审者是第一个独立的审查者,通常是另一位有教训的设计师。他们的工作是审查设计方案,查看是否符合规范和最佳实际,并提出倡议和改良意见。复审者(Reviewer 2):复审者是第二个独立的审查者,通常也是一位有教训的设计师,但与初审者不同。他们的工作是再次审查设计,提供额定的视角,确保没有脱漏的问题或潜在的改良机会。产品经理或项目经理(Product/Project Manager):产品经理或项目经理是我的项目的监督者,负责确保设计方案满足我的项目的业务需要和指标。他们能够提供战略性的反馈,并协调设计师和审查者之间的交换。4 Eyes Design的核心理念是多样性的审查和验证,以确保设计方案的全面性和品质。以下是一个示例,具体阐明4 Eyes Design的过程和益处: 示例:电子商务网站的4 Eyes Design假如一个团队正在设计一个新的电子商务网站,以提供在线购物体验。以下是该项目标4 Eyes Design过程: 步骤1:设计师制订初步设计计划首先,设计师开始制订初步的电子商务网站设计方案。他们思考用户界面、网站导航、商品展现、购物车和领取流程等方面。设计师应用工具如Sketch或Adobe XD创立初步设计原型。 步骤2:初审者审查设计初审者是另一位有教训的设计师,他们承受初步设计计划的审查工作。他们查看设计是否合乎用户体验准则,如易用性、可拜访性和响应性。初审者可能会提出以下倡议和问题: 导航栏是否清晰?:初审者关注网站的导航构造,确保用户可能轻松找到所需的信息和产品。响应性设计是否足够?:他们查看设计在不同设施上的体现,包含桌面、平板和手机。色调搭配是否适合?:初审者评估色调计划是否与品牌标识相符,并提供改良倡议。步骤3:设计师批改设计基于初审者的反馈,设计师进行必要的批改和改良。他们可能从新设计导航栏、优化页面布局,并确保网站在不同设施上的显示良好。 步骤4:复审者审查设计复审者是第二个独立的审查者,他们的工作是再次审查设计,提供额定的视角。他们可能关注不同的细节,例如网站的速度性能、安全性和跨浏览器兼容性。复审者还能够提供与初审者不同的倡议,以确保设计方案的全面性。 步骤5:设计师进一步欠缺设计基于复审者的反馈,设计师进一步欠缺设计,确保网站在各个方面都达到最佳程度。 步骤6:产品经理或项目经理的最终审查最初,产品经理或项目经理表演监督者的角色,对设计方案进行最终审查。他们确保设计满足业务需要和指标,合乎我的项目估算和时间表,并与其余我的项目阶段协调一致。他们还能够提供战略性的反馈,确保设计与整体业务策略相符合。 益处与重要性4 Eyes Design具备多重益处和重要性: 质量保证:通过引入多个独立的审查者,4 Eyes Design有助于检测和纠正设计中的谬误和问题,进步设计方案的品质。升高危险:通过多样性的审查,能够升高我的项目前期呈现重大问题的危险,缩小从新设计和修复的老本和工夫。多视角:每个审查者都有不同的专业知识和教训,他们的审查提供了多个视角,有助于发现潜在的改良机会。透明度:4 Eyes Design促成了团队成员之间的单干和交换,减少了设计决策的透明度,确保每个人都了解设计的指标和决策依据。业务一致性:产品经理或项目经理的参加确保设计与我的项目的业务指标和策略统一,有助于放弃我的项目的一致性和方向。客户满意度:通过进步设计品质和用户体验,4 Eyes Design有助于进步客户满意度,减少用户忠诚度。总之,4 Eyes Design是一种有助于进步设计品质和升高危险的无效办法,它通过多样性的审查和验证,确保设计方案满足我的项目的需要和规范。在古代简单的设计我的项目中,采纳这种办法能够帮忙团队提高效率,并确保最终交付的设计是高质量的。

September 24, 2023 · 1 min · jiezi

关于设计:一文弄懂访问者模式

对于设计模式,咱们得联合生存中的案例来学习;最近我在网上也看了不少文章,明天想跟大家分享一下对于访问者模式的一些常识,先来看一个简略的案例吧。 置信大家都去过医院,看完病,医生都会给咱们开一个处方单,很多医院都存在如下解决流程:划价人员拿到处方单之后依据药品名称和数量计算总价,药房工作人员依据药品名称和数量筹备药品。 咱们能够将处方单看成一个药品信息的汇合,外面蕴含了一种或多种不同类型的药品信息,不同类型的工作人员(如划价人员和药房工作人员)在操作同一个药品信息汇合时将提供不同的解决形式,而且可能还会减少新类型的工作人员来操作处方单。 在软件开发中,有时候咱们也须要解决像处方单这样的汇合对象构造,在该对象构造中存储了多个不同类型的对象信息,而且对同一对象构造中的元素的操作形式并不惟一,可能须要提供多种不同的解决形式,还有可能减少新的解决形式。在设计模式中,有一种模式能够满足上述要求,其模式动机就是以不同的形式操作简单对象构造,该模式就是咱们本章将要介绍的访问者模式。 模式概述访问者模式(Visitor Pattern):提供一个作用于某对象构造中的各元素的操作示意,它使咱们能够在不扭转各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式。 访问者模式是一种较为简单的行为型设计模式,它蕴含访问者和被拜访元素两个次要组成部分,这些被拜访的元素通常具备不同的类型,且不同的访问者能够对它们进行不同的拜访操作。例如处方单中的各种药品信息就是被拜访的元素,而划价人员和药房工作人员就是访问者。访问者模式使得用户能够在不批改现有零碎的状况下扩大零碎的性能,为这些不同类型的元素减少新的操作。 在应用访问者模式时,被拜访元素通常不是独自存在的,它们存储在一个汇合中,这个汇合被称为“对象构造”,访问者通过遍历对象构造实现对其中存储的元素的一一操作。 其构造如下图所示: Vistor(形象访问者):形象访问者为对象构造中每一个具体元素类ConcreteElement申明一个拜访操作,从这个操作的名称或参数类型能够分明晓得须要拜访的具体元素的类型,具体访问者须要实现这些操作方法,定义对这些元素的拜访操作。ConcreteVisitor(具体访问者):具体访问者实现了每个由形象访问者申明的操作,每一个操作用于拜访对象构造中一种类型的元素。Element(形象元素):形象元素个别是抽象类或者接口,它定义一个accept()办法,该办法通常以一个形象访问者作为参数。ConcreteElement(具体元素):具体元素实现了accept()办法,在accept()办法中调用访问者的拜访办法以便实现对一个元素的操作。ObjectStructure(对象构造):对象构造是一个元素的汇合,它用于寄存元素对象,并且提供了遍历其外部元素的办法。它能够联合组合模式来实现,也能够是一个简略的汇合对象,如一个List对象或一个Set对象。实用场景(1)一个对象构造蕴含多个类型的对象,心愿对这些对象施行一些依赖其具体类型的操作。在访问者中针对每一种具体的类型都提供了一个拜访操作,不同类型的对象能够有不同的拜访操作。 (2)须要对一个对象构造中的对象进行很多不同的并且不相干的操作,而须要防止让这些操作“净化”这些对象的类,也不心愿在减少新操作时批改这些类。访问者模式使得咱们能够将相干的拜访操作集中起来定义在访问者类中,对象构造能够被多个不同的访问者类所应用,将对象自身与对象的拜访操作拆散。 (3)对象构造中对象对应的类很少扭转,但常常须要在此对象构造上定义新的操作。 案例场景一某银行开发了一套OA零碎,在该OA零碎中蕴含一个员工信息管理子系统,该银行员工包含正式员工和临时工,每周人力资源部和财务部等部门须要对员工数据进行汇总,汇总数据包含员工工作工夫、员工工资等。该公司根本制度如下: (1)正式员工(Full time Employee)每周工作工夫为40小时,不同级别、不同部门的员工每周基本工资不同;如果超过40小时,超出局部依照100元/小时作为加班费;如果少于40小时,所缺工夫依照销假解决,销假所扣工资以80元/小时计算,直到基本工资扣除到零为止。除了记录理论工作工夫外,人力资源部需记录加班时长或销假时长,作为员工平时体现的一项根据。 (2)临时工(Part time Employee)每周工作工夫不固定,基本工资按小时计算,不同岗位的临时工小时工资不同。人力资源部只需记录理论工作工夫。 人力资源部和财务部工作人员能够依据各自的须要对员工数据进行汇总解决,人力资源部负责汇总每周员工工作工夫,而财务部负责计算每周员工工资。 一坨坨代码实现class EmployeeList { private ArrayList<Employee> list = new ArrayList<Employee>(); //员工汇合 //解决员工数据 public void handle(String departmentName) { //财务部解决员工数据 if (departmentName.equalsIgnoreCase("财务部")) { for (Object obj : list) { if (obj.getClass().getName().equalsIgnoreCase("FulltimeEmployee")) { System.out.println("财务部解决全职员工数据!"); } else { System.out.println("财务部解决兼职员工数据!"); } } //人力资源部解决员工数据 } else if (departmentName.equalsIgnoreCase("人力资源部")) { for (Object obj : list) { if (obj.getClass().getName().equalsIgnoreCase("FulltimeEmployee")) { System.out.println("人力资源部解决全职员工数据!"); } else { System.out.println("人力资源部解决兼职员工数据!"); } } } }} 在handle()办法中,通过对部门名称和员工类型进行判断,不同部门对不同类型的员工进行了不同的解决,满足了员工数据汇总的要求。然而该解决方案存在如下几个问题: ...

April 12, 2023 · 5 min · jiezi

关于设计:电商通用型商品中心设计

作者:京东物流 顶峰1 需要构建一个电商通用型商品核心,可反对商品的品种和属性繁多,能够售卖实物、虚构、会员、服务类商品。每一种商品具备不同的规格,不同的规格的商品有多种价格,商品可反对多种货币的领取。 1)目标是什么? 带大家一起实现一个通用型商品核心,从中学到一些扩展性设计思维。 2)你能学到什么? 了解行业术语和概念动静sku表单设计属性和sku扩展性设计价格扩展性设计商品规格设计3)不能学到什么? 商品图片存储设计商品高低架设计商品标签设计库存设计搜寻筛选设计2 商品的基本概念商品核心是电商各个系统的最根底单元,为商城、订单,优惠促销、库存、仓储物流等零碎提供根底数据。 电商的根本术语。 SKU:(Stock Keeping Uint,即库存量单位),库存管制的最小可用单位。例如“iPhone 7 Plus 128G银色”就是一个SKU,仓库治理、洽购进货、库存治理都是以SKU为记录单元。SPU:(Standard Product Unit,即标准化产品单元),是一组标准化信息的汇合,例如“iPhone 7 Plus”就是一个SPU。类目:即分类树。电商罕用的有两层类目:前台展现类目和后端商品类目。 前台类目指的是展现给消费者看的类目,会依据节令、销售策略、流动进行变动; 后盾类目属于根底数据,不可随便变动,增加SKU时都须要抉择后盾类目,进行绑定。属性:分为要害属性、销售属性、非关键属性、非凡属性。要害属性 是指可能惟一确定产品的属性,是必填项,例如手机的屏幕尺寸、型号属于要害属性。销售属性 是组成SKU的非凡属性,或称为“规格属性”,例如手机的“色彩”、“内存”。非关键属性 指的是除要害属性、销售属性外的其余属性,如前置摄象头像素、后置摄像头像素、产地、分辨率。非凡属性 指须要通过调用其余服务能力获取到的属性。3 商品架构图参考上面的商品组成模块图,商品模块的组成较为简单,在定义SKU与SPU时,波及类目、属性、品牌、生产信息等数据的组合,在定义出SKU后再创立SPU,在SPU上增加商品形容和规格最初就成了商品。依据商品又衍生出了价格治理、评论治理、搜寻筛选等模块。 3.1 商品组成模块图 3.2 商品核心外围ER图 3.3 商品核心整体架构图 4 商品类目4.1 类目治理商品类目分为两层:根底数据类目层(后盾类目)、前台展现类目层(前台类目)。那为什么要将前、后盾类目离开治理,而不是前、后盾共用一套类目呢? 后盾类目面向商家或供应链人员,商品属性、销售属性及品牌等很多数据都是在根底类目上进行治理; 前台类目面向用户,不便用户查找商品,还能够随着经营须要去调整。比方而且随着节日、气节节令变动,经营会常常变更前台类目。 4.2 后盾类目后盾类目次要面向平台经营人员或商家,用于治理商品、属性和品牌等数据。 后盾类目绝对固定,确定了之后不会轻易变更或删除,如果类目下挂载有商品,就不能删除或作废。 类目树的档次不能太深,个别三层或四层。如果太深,对于商品的治理不太不便。类目树中最初一层类目称为叶子类目,商品必须挂载于叶子类目下。 4.3 前台类目前台类目次要面向用户,不便用户筛选查找商品,如图图所示。 前台类目能够依据经营须要,灵便多变。所以解决商品的前端类目时,就应该提供多样化的前端类目来反对。 前台类目可反对不同客户端的设置。PC端、H5端、APP端等 前台类目不同于固定的后盾类目,编辑很灵便、可重叠、可删除、可随时变动,定时失效。 4.4 类目表结构设计4.1.1 后端类目表设计 CREATE TABLE `category` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(32) NOT NULL COMMENT '类目名称', `parent_id` bigint(11) NOT NULL COMMENT '父id', `leaf` tinyint(4) NOT NULL COMMENT '是否叶子节点 1是 0不是', `level` tinyint(4) NOT NULL COMMENT '类目层级', `path` varchar(128) DEFAULT NULL COMMENT '残缺父级门路:父父id_父id', `sort` int(11) unsigned NOT NULL COMMENT '排序字段', `status` tinyint(4) NOT NULL COMMENT '分类状态:1上架 2下架', `del` tinyint(4) unsigned NOT NULL COMMENT '是否删除', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创立工夫', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新工夫', PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='类目表';4.4.2 后端类目数据展现 ...

March 31, 2023 · 5 min · jiezi

关于设计:聊一聊过度设计

 老手程序员在做设计时,因为缺乏经验,很容易写出欠设计的代码,但有一些教训的程序员,尤其是在刚学习过设计模式之后,很容易写出适度设计的代码,而这种代码比老手程序员的代码更可怕,适度设计的代码不仅写进去时的老本很高,后续保护的老本也高。因为绝对于毫无设计的代码,适度设计的代码有比拟高的了解老本。说这么多,到底什么是适度设计? 什么是适度设计? 为了解释分明,我这里用个类比,如果你想拧一颗螺丝,失常的解决方案是找一把螺丝刀,这很正当对吧。 然而有些人就想:“我就要一个不止能拧螺丝的工具,我想要一个能够干各种事的工具!”,于是就花大价格搞了把瑞士军刀。在你解决“拧螺丝”问题的时候,重心早已从解决问题转变为搞一个工具,这就是适度设计。 再举个更技术的例子,假如你进来面试,面试官让你写一个程序,能够实现两个数的加减乘除,办法出入参都给你提供好了 int calc(int x, int y, char op),一般程序员可能会写出以下实现。 public int calc(int x, int y, int op) { if (op == '+') { return x + y; } else if (op == '-') { return x - y; } else if (op == '*') { return x * y; } else { return x / y; } } 而高级程序员会使用设计模式,写出这样的代码: public interface Strategy { int calc(int x, int y);}public class AddStrategy implements Strategy{ @Override public int calc(int x, int y) { return x + y; }}public class MinusStrategy implements Strategy{ @Override public int calc(int x, int y) { return x - y; }}/** * 其余实现 */public class Main { public int calc(int x, int y, int op) { Strategy add = new AddStrategy(); Strategy minux = new MinusStrategy(); Strategy multi = new MultiStrategy(); Strategy div = new DivStrategy(); if (op == '+') { return add.calc(x, y); } else if (op == '-') { return minux.calc(x, y); } else if (op == '*') { return multi.calc(x, y); } else { return div.calc(x, y); } }} 策略模式益处在于将计算(calc)和具体的实现(strategy)拆分,后续如果批改具体实现,也不须要改变计算的逻辑,而且之后也能够加各种新的计算,比方求模、次幂……,扩展性明显增强,很是牛x。 但光从代码量来看,复杂度也明显增加。回到咱们原始的需要上来看,如果咱们只是须要实现两个整数的加减乘除,这显著适度设计了。 ...

February 26, 2023 · 1 min · jiezi

关于设计:前端需要了解的色彩知识

概述在前端畛域,咱们经常须要跟色调打交道,除了一部分从设计转过来的前端外(ps:历史起因),起初的新生代前端绝大多数根本都是学理工科出身的,个别没有通过专门的设计训练和造就,这样在还原设计图的过程中对于色调的了解都会或多或少有些出入,从而导致设计和前端产生不必要的矛盾(ps:本是同根生,都互相谅解下),本文旨在通过介绍相干的一些色调常识,为大家提供一些设计和前端双重视角下的观点,也心愿可能给大家提供一些对色调的不同的意识和了解。 色调实践人类对色调的钻研其实很早都有记录,但真正把色调作为一门学科或者说有其理论体系,还要从牛顿说起,在之后一直的迷信倒退过程中,人们逐步对色调有了不同的意识,也正是因为迷信的倒退,色调实践在不同畛域都有了长足的倒退,本文着重分享两个对咱们前端来说须要着重理解的色调实践,即:色环实践以及加增色模式实践。 色环 色环实践经验了牛顿色环、伊顿色环(传统色环)、孟塞尔色环、Yurmby色环等几个不同的阶段,这里重点介绍传统的经典色环,也就是伊顿色环,其作为包豪斯体系中重要的实践课程,对设计畛域的影响微小(ps:对设计史感兴趣的童鞋,能够参看之前的这篇文章世界古代设计史),总体来说,色环实践能够简略提炼出以下几个常见的色调概念: 名称相差度数解释邻近色0-15度色环中两色相差较小,比拟靠近,不同人辨认度不同,通常辨认度较低类似色15-45度色环中两色相差适中,既具备辨认度,又具备类似度中差色45-105度色环中两色相差有显著辨认度,但又不会显得过于跳跃对比色105-150度色环中两色相差有较强辨认度,容易产生跳跃感邻近互补色150-179度色环中两色相差较大,不倡议搭配应用互补色180度色环中两色相差比照强烈加色模式 & 增色模式 在介绍加色模式和增色模式,咱们先来看下咱们从小学到的对于色调的一些基本知识。咱们之前上学的时候,美术老师可能教过三原色和三基色的概念,或者辨别光学三原色和色调三原色等等,这其实就曾经是加色模式和增色模式的一个初步理解了,实质来说:三原色或者说三基色都是基于不同环境下资料而提出的一种根本色调而已,我这里以光学三原色和色调三原色来辨别,光学三原色是:红(R)、绿(G)、蓝(B),也是咱们前端开发过程中罕用到的元色;而除了光学三原色外,还有一个色调三原色,或者叫美术三原色,它们是:红(M)、黄(Y)、蓝(C),这个是印刷或者绘画过程中经常用到的元色。置信仔细的同学曾经发现我在标注英语的时候,色调三原色和光学三原色里的红色及蓝色如同是不一样的,没错,正是因为不同场景下对于色调应用的不同,而对色调进行加合的过程中呈现了不同的模式。这里,就要引出咱们这一部分的外围实践了,即:加色模式和增色模式。 上面给出不谨严的加色模式和增色模式的定义 加色模式是指对色调模型中的属性进行加和的模式;增色模式是指对色调模型中的属性进行排汇的模式那么为什么光学色调是加色法而美术色调却是增色呢?因为实质上,在光学场景中,比方在计算机显示器中通常应用的是从一种光源来收回不同的元色给人出现色调,不同的显示器制作资料有不同的显示特点,比方有:阴极射线管显示器(CRT)、等离子显示器(PDP)、液晶显示器(LCD)以及有机发光半导体显示器(OLED)等等,但这些通常都会是从一个光源收回的,因此这些通常就是加色模型,而一般来说会有RGB模型、YUV(YCrCb)模型等,在前端来说,咱们常见的是以RGB模型进行的相干对应关系代码操作,这里波及到了色调模型,具体请看下一部分的介绍。而在美术或者印刷场景中,则是利用的物体反射光线的原理,也就是说咱们日常看到的物体的色彩其实是显示的它不能被排汇的色彩,例如:粉色颜料其实排汇了除粉色以外的所有光线,所以咱们能力看到它是粉色,因此增色其实是排汇的模式,因此在CMYK模型中,其就是典型的增色模式。 色调模型 在有了对色调的初步意识之后,如果想要来形容色调,咱们就须要建设一个模型来形容它,这里就引出了色调模型的概念,基于wiki百科和百度百科,咱们不谨严的给出如下的定义: 色调模型是用一个元组或者汇合来形容可见光的子集,这里的元组通常为三元或者四元。通常来说,依照是否设施相干,咱们能够将色调模型分为设施相干色调模型以及设施不相干的色调模型,基于此大抵能够分为两大体系,即:RGB体系及XYZ体系,这里咱们将介绍以下几种常见的色调模型:RGB/CMYK、YUV/YCrCb、HS*、Lab、XYZ,上面将别离介绍下相干的色彩模型。 RGB & CMYK RGB模型是典型的加法模型,其通过设立RGB为三个基色进行多种色彩的不同模型组合,其中R/G/B别离作为三维欧氏空间中的维度示意,对色彩进行相干的构建,如上图所示。 不同于RGB模型的加法合成,对于印刷相干的场景,则是典型的减法合成,而这里最常见的就是跟物质相干的根底颜料作为根底模型空间的维度,最常见的便是CMYK模型,其依然是合乎欧氏空间的模型构建,只是对于合成的算法过程中应用的是减法合成。 YUV & YCrCb YUV模型作为RGB模型的变形模式,其罕用于视频、电视畛域的色调示意。因为在视频及电视畛域中,对于色调和饱和度的指标绝对更为要害,因此应用U+V来示意色度,应用Y来示意亮堂度。 随着视频编码技术的倒退,YCbCr模型作为视频流采纳的一种变形模型规范,其不再是通过u+v来示意色度,而是通过RGB输出信号的R与亮度的差别即Cr和通过RGB输出信号的B与亮度的差别即Cb进行维度构建,这绝对于YUV或者YPrPb编码而言便是数字色差信号而不再是模仿色调信号了。 YUV和YCrCb色调模型罕用于计算机视觉的相干剖析中,对于视频及图像剖析相干的同学能够更深刻理解一下HSV & HSL & HSB & HSI对于人的视觉而言,其实通常最容易形容的就是基于色相(Hue)、饱和度(Saturation)以及最初这一个明度或者说亮度来辨别,然而对于最初两个指标而言,不同模型的构建其实是不太一样的,这里咱们将重点介绍两种模型,即:类HSL和类HSV模型 对于HSL模型而言,最初定义的指标是一个混入了黑白的量,其最初的状态在欧氏空间中,体现为一个全椎体,如上图所示。 而对于HSV模型而言,最初定义的指标只是混入了一个彩色的量,其最初状态在欧氏空间中,体现为一个倒立的圆锥体,如上图所示。 正是因为这种对于S和 * 的解决不同,导致呈现了很多不同的名词及示意模型,这里咱们用以下表格做一下常见的 HS* 模型的比照: 简写全称正文HSVHue, Saturation, Value明度HSLHue, Saturation, Lightness亮度HSBHue, Saturation, Brightness明度HSIHue, Saturation, Intensity亮度论断:HSV = HSB,HSL ≈ HSI 如上图所示,后续咱们不加特地阐明的话,后续将以HSV和HSL这两种作为HS*的两种典型代表进行表述,作为RGB模型的变种,咱们后续在色调计算过程中对 HS* 和 RGB模型的换算进行详解。 LAB 随着倒退,人们对色调的钻研不再局限于设施根底条件的限定,由此,CIE(Commission Internationale de Photométrie)国内照明协会提出了Lab模型,其不同于RGB的模型,其中L代表亮度,而a则是从深绿色(低亮)到灰色(中亮)再到亮粉红色(高亮)的过渡,b则是亮蓝色(低亮)到灰色(中亮)再到黄色(高亮)的过渡,其合成模型如上图所示。 XYZ 在上一个Lab模型中咱们晓得,CIE对色调做了进一步的调研钻研,其实Lab模型也是XYZ模型的一个衍生变种,其对RGB模型中的光源做了坐标系方面的辨别,其对三元色进行了相干的修改,其是设施无关的,如上图所示,在欧氏空间中,两个坐标系产生了偏移。(ps:具体的变动,能够参考这篇文章RGB色调体系和XYZ色调体系) 色调空间 色调空间又称为色域,在上一部分咱们介绍了不同的色调模型,那么对于理论生产过程中会遇到各种不同的理论状况,因此各个厂家或者组织基于各自的设施或者场景的不同而理论造成的色调映射关系,从而提出了各自的色调范畴,这里咱们联合wiki百科及百度百科,不谨严的给出如下定义: 色调空间是基于色调模型而对理论特定场景的色调范畴的映射关系。对于常见的色调空间,咱们列举了以下几种: ...

May 30, 2022 · 6 min · jiezi

关于设计:数据密集型型系统设计LSMTree-VS-BTree

引言本文为《数据密集型利用零碎设计》的读书笔记第一局部第三章的笔记整顿,也是集体认为的这本书第一局部最重要的内容。本文将会针对目前数据库系统两个次要营垒进行开展,别离是采纳日志型存储构造高速读写的LSM-Tree和面向OLTP的事务数据库BTree两种数据结构比照。 次要内容本文的次要内容介绍如下: 最简略key/value数据库考量和拓展,从零开始理解日志型存储构造。索引对于数据库的重要性,哈希索引如何优化key/value数据库。Btree 数据结构的简略介绍,数据结构和特点等。LSM-Tree日志存储构造 VS Btree存储引擎,两大阵营的优劣比照。OLTP到OLAP的比照,行存储到列式存储构造演进,以及数据仓库呈现和数据分析的演进。数据库底层设计考量底层存储模式:记录存储的根本设计格局,尽管格局会有不同的设计,然而最终都是以文件的模式存储。查问/新增/读取/批改形式:在内部来看也就是在数据库概念中的DML操作,这种操作面对的是客户端,属于对外接口的局部。而从外部来看则是存储数据结构,操作数据结构和并发性能的考量。操作日志:出于持久性的考量,操作日志是不可或缺的因素,也是意外之后数据修复的保障。数据类型:比方Key/value存储还是针对行列的存储构造。key/value存储构造和哈希索引要害:#key/value存储构造解决 #哈希索引优化 从零开始设计一个数据库的存储模式,能够从上面的几个点思考,从存储构造登程咱们看日志存储构造数据库是如何呈现的。 首先是key/value数据库数据结构设计第一版,从最简略的k/v存储数据库开始理解由此引申出哈希索引的构造: 下面构造有如下的特点: 存储模式:次要以key/value存储模式,key/value能够是任何内容。底层应用纯文本的模式存储,应用追加形式更新数据,雷同key应用最初一次读到的key为基准。 读写形式:db_set xx设置数据,db_get xx读取数据,批改一个key通过最初一行追加模式,意味着更新和删除操作没有任何的开销,无需关注并发的问题。 查问性能:查找数据的开销为O(n),新增和批改的性能都是O(1)。 追加式解决长处 程序写比随机写好很多段文件是追加不可变的,意味着并发拜访和解体复原比拟容易压缩和合并分段能够避免数据文件碎片化问题最简略的k/v模式的数据库造成有哪些毛病? 追加对于存储空间的节约,尽管追加对于更新和新增非常方面并且保护老本较低,然而有个显著的问题是存储空间的节约,同时咱们发现其实并不需要存储原始文本的模式,同时数据自身能够通过压缩更加紧凑。查问效率随着数据的收缩而升高,所以须要对于查问速度进行优化,对于查问最简略的形式是引入索引,而对于key/value存储模式设计索引最为常见的是哈希索引对于Key/value存储引擎来说哈希是罕用的索引类型,哈希索引应用内存中的哈希表进行实现,键值对的键存储数据须要索引的数值,而值存储偏移量,偏移量通过计算获取存储地位,在原始数据中间接找到相干地位的数据间接读取。 上面是哈希索引对于key/value构造数据进行索引优化。 纯文本存储数据收缩如何避免性能变差? 分段数据:当追加到肯定水平之后则写入一个新的文件。压缩段:将最新的数据进行压缩存储,因为应用追加新增形式,能够间接抛弃旧数据。段压缩和多段合并:压缩与合并的过程没有特定布局,取决于数据结构和存储构造的抉择。如何避免性能变差: 哈希表和段进行绑定,一个段对应一个哈希表,同时执行段压缩和多端合并,保障脏数据及时清理,最初肯定在内存中引入哈希表进行保护。 理解了大抵思路之后,如何进行具体优化? 压缩合并存储:为了让存储数据更加紧凑同时没有节约,定期对于追加数据进行合并压缩是必要的,同时数据分段也能够进步线程并发读写性能。数据分段:留神数据分段是联合压缩合并一起解决的,当压缩合并存储的数据达到一定量的时候须要对于数据进行分段解决,目标是避免单文件过大同时能够进步索引的搜寻效率。哈希表:引入哈希表构造,在数据行上加一层索引目录,能够放慢查问性能,索引的key存储的是键须要保障惟一,而value则存储了行记录的指针,这实用于分段的数据结构找到数据存储的地位,通过一次遍历分段间接通过偏移指针查指定数据是否符合要求即可。下面探讨的存储构造其实存在理论的实现形式,此数据库存储引擎便是:Bitcast。 哈希索引: 哈希索引设计特点 文件格式:并没有应用纯文本存储而是应用二进制,应用字节来记录字符串长度,前面存储实在数据。(二进制也有利于压缩) 解体复原:最大的问题是重启之后哈希表会被开释,如果须要从新建设哈希表须要从新读取段,所以最大的性能开销在扫描段上,有一种优化形式是将哈希表的快照存储磁盘上间接读取。局部写入记录:应用SHA盐值和操作日志对于局部写入记录进行复原,操作日志绝对于数据存储日志更为简略,只须要做增量操作,因为目标仅仅用于存储引擎解体之后能够保证数据的持久性。并发管制:Bitcast实际上是一个写线程和多个读线程,数据应用追加形式能够保障多个线程读取,然而只能保障一个线程写入,然而因为数据分段,能够多线程同时改写不同数据段。通过下面哈希构造的介绍,咱们能够总结出哈希索引的几个特点: 哈希索引实用于查问多,增删少的状况,尽管压缩和分段合并能够解决数据存储效率低的问题,然而对于频繁的增删须要额定的开销从新保护改变哈希表。哈希表须要在内存中进行应用,所以受限于内存的大小,当然并不是说磁盘无奈存储哈希表,而是哈希表在磁盘中难以保护和存储。哈希的索引模式也存在局限性: 尽管哈希表不肯定必须放入内存,实践能够在磁盘上保护哈希表,然而这样做须要大量的IO,同时哈希抵触须要更简单的解决逻辑。区间查问效率不高,对于范畴查问的解决能力较弱,此时工夫复杂度会进化为O(n)。以上是哈希构造对于key/value存储的构造的优化。 哈希索引通常的实用场景: 点击数:对于数据的准确性要求并不是非常高,然而对于效率要求非常高大量数据的惟一记录查找,留神是大量数据,因为哈希表空间无限。小结: 咱们能够看到,从一个最简略的k/v数据库到哈希索引的构造引入,数据的存储和读取构造逐步变简单,能够看到哈希索引非常适合key/value的存储引擎,然而显然它存在比拟显著的缺点,比方只能保护哈希表到内存,并且频繁的更新插入key/value对于索引的保护开销也不小,最初最为致命的是范畴查问对于哈希索引是硬伤。 总结:索引特点 放慢原始数据的查问速度空间换工夫,须要更多的存储空间以及更长写数据工夫索引很多时候被视为和原始数据离开的构造通过下面的设计有毛病,针对哈希索引有了第一层进化,那就是 SSTable和LSM-Tree。 SSTable和LSM-Tree构造SSTable #LSM-Tree概念在具体的内容介绍之前,咱们须要弄清楚SSTable和LSM-Tree有什么区别,简略来说LSM-Tree是对SSTable概念和思维的一个继承。另外须要留神这个构造特点正好解决了哈希索引局限性问题,同时SSTable并没有摈弃key/value这样的存储构造,而是在索引构造上进一步降级。 SSTable概念SSTable起源自谷歌在2006年公布的一篇轰动世界的论文,外面的BigTable就是SSTable和LSM-Tree的前身:Bigtable: A Distributed Storage System for Structured Data。如果感觉论文难以了解,能够参考这篇文章了解: https://blog.csdn.net/OpenNai... 这里挑了其中一些和SSTable无关的内容,惋惜的是这篇论文并没有具体的介绍SSTable的外部数据结构,在论文第六个大节中介绍了SSTable的作用: BigTable和GFS 是什么关系呢?在论文中咱们能够看到一个相似树的构造,其中根节点为主服务器,主服务器负责承受申请,通过治理分片服务器将申请分片到不同的片服务器中,所以从外层看最终干活的是片服务器,实际上片服务器自身只是负责管理本人分片SSTable,通过非凡索引晓得数据在那个SSTable分片中,而后从GFS中读取SSTable文件的数据,而GFS则可能要从多个chuncker server外面搜寻数据。 而图中的metatable原数据表能够看作是和SSTable绑定的相似索引的关系,元数据表的数据是不能被外界拜访的,外界拜访的是元数据对应的SSTable分片,这和前面介绍的LSM-Tree有着非常相熟的符合关系。 改良与比照关键点: 数据存储形式,索引查找形式改良 SSTable通常如何工作?写入的时候不写入磁盘而是先写入内存表的数据结构,同时在内存将数据进行排序。当数据结构内存占用超过肯定的阈值就能够间接写入到磁盘文件因为曾经是排好序的状态,所以能够对于旧构造笼罩,写入效率比拟高。并且写入和数据结构改变能够同时进行。读写程序依照 内存 -> 磁盘 -> 上一次写入文件 -> 未找到这样的程序进行查找和搜寻。后盾定时线程定时合并和压缩排序分段,将废除值给笼罩或者抛弃。SStable的改良点上面是SSTable绝对于哈希构造的特点: 高效合并:合并段的过程更加高效,每一个段都是依照特定程序排序,当呈现多个反复数值的时候能够合并到最新的段,对于旧数据则能够间接舍弃后面的内容。范畴索引优化:内存中哈希表也是有序存储,能够将多个kv对应的数据条目一起压缩存储,这样索引条目只须要结尾局部的键值即可,因为后续所有的记录都是有序的。索引优化:比起哈希较为涣散随便的构造,这样的解决就义肯定的读写开销换来更加高效的存储和索引构造,并且能够反对范畴索引扫描。程序读写:数据顺序存储的益处是能够程序读写,防止磁盘的随机读写能够大幅度晋升读写性能上面是改良过后的压缩过程图: 最大的改变点:压缩合并的根底上对于SSTable根底内容进行合并操作。 ...

April 3, 2022 · 2 min · jiezi

关于设计:元宇宙到家那些聪明的设计工具

✏️ 编者按: 想要量身定制一款专属你的衣橱?想要亲自设计色彩和布局?外部的隔板、抽屉、网篮要什么尺寸?挂衣杆和裤架也不能少?甚至……你还想同时对比多个相似的衣橱? 在这个妇孺皆知家具和家居批发企业,你除了能够选购现成的家具,还能线上 DIY,拼接组装你想要的家具整机。在用户设计实现后,在线商城还会贴心地举荐多个类似家具供顾客参考。 这个聪慧的设计和举荐平台是如何实现的?Milvus 社区有幸邀请到了来自该外资家居企业的工程师陈晨,与大家分享 Milvus 数据库在家具行业中的利用。 嘉宾简介: 陈晨,Leader of data smart offering platform,负责构建智慧数据生成平台,毕业于复旦大学,热衷摸索新技术,迭代、重构和降级已有零碎。 业务背景在家具与家居行业,为了让用户对产品有一个直观的概念,须要先“打样”,也就是把家具拼出来展现。家具通常体积宏大,须要较大展现空间。如何在无限的空间内让用户更好地「看到」家具,成为了家具行业的痛点。 为了解决这个问题,咱们找到了一款在线解决方案(如上图所示),能够实现在线打样、部分调整、在线出样等性能。 该智能化平台须要蕴含以下数据链路: 筹备数据,定义整机在线召回,通过排序找到满足用户须要的数据一些补充的业务逻辑,随后最终交付给用户技术选型 在上图的智能生产数据平台模型中,左侧是与销售业务相干的信息,右侧是与数据生产相干的内容。为了反对设计工具的应用,咱们须要将物理空间中的家具组件转化为计算机能够意识的数据模型。 除此之外,咱们还须要反对 H5、App、小程序等多平台,须要领有在线的高性能召回排序,稳固的、可兼容的存储。为了可能满足以上需要,咱们还须要加强平台鲁棒性,让平台能够自我修复、能够本人降级、能够去做一些迭代。 基于以上需要,咱们是这样设计该智能化平台的: Elasticsearch 负责一些较粗的召回和简略筛选,这些数据来自多个数据源对基于一些规定生成的向量,应用 Milvus 数据库进行向量间隔计算,而后再做排序Backend 负责 BU、business insight 做数据后处理,这样就实现了数据的最终交付因为家具是一个平面的空间概念,须要多维度形容一件家具的构造,很难用传统的标量数据(如  SKU)形容全副信息。所以,咱们须要抉择了一款迭代迅速、兼容性好、使用方便的向量数据库实现向量数据的存储和检索,下图是咱们对 Elasticsearch、 Faiss、 Milvus 数据库等向量搜寻解决方案的横纵向测评,基于性能、稳定性、易用性等因素综合考量,咱们最初抉择了向量数据库 Milvus。 架构与数据链路 以上是咱们的平台架构示意图。其中,Milvus 数据库负责存储向量数据。基于这个架构,咱们又拆散线和在线两个局部。 离线过程分为五步: 定义 items,将物理空间上的整机示意为计算机可能了解的 item数据生成对家具进行了特色工程,包含标签选取、表征 encoding召回数据筹备,将数据转成可搜寻的数据结构数据排序筹备,此时会实现 embedding 以及数据集治理等工作在线过程分为五步: Backend 步骤中,设计工具将后盾收到的 query 与通过隐衷含糊解决的用户画像拼接,用于组织后续召回、排序的参数和策略Query understanding 步骤中,平台依据用户的需要和事后配置的参数,组织召回策略和排序参数Search platform 将解析进去的后果组成 DSL,通过多个数据集进行召回Ranking 步骤中,平台依据事后定义的规定和表征信息进行混合打分和后果调整回到 Backend 步骤,补全数据,依据经营需要重新整理数据返回给前端应用示例在实在场景中,咱们是如何实现这个平台的呢? 下图左侧的衣柜展现了多种挂置和叠放的可能性,这些特色会被转化为数据标签保留在 Elasticsearch 中,Elasticsearch 中的代码设置如右侧所示。这些标签次要用于线上的粗召回以及线上数据 debug。 ...

January 6, 2022 · 1 min · jiezi

关于设计:提升产品创新能力试试斯坦福大学设计思维模型

作者:Yvonne 起源:恒生LIGHT云社区 前言设计思维的概念目前在在教育、艺术、商业等畛域失去越来越多的利用,有翻新需要的公司越来越宽泛地应用设计思维来制订设计理念,晋升产品的创新能力。在这样的趋势下,设计思维的重要性也显而易见,作为设计师也须要借助一些迷信的办法和理念,来帮忙本人找到设计突破口,斯坦福大学设计思维模型便是一种十分无效的思维模型,咱们一起来学习一下吧。 什么是斯坦福大学设计思维?设计思维最早起源于诺贝尔奖得主赫伯特·西蒙开创性的著述《设计办法的迷信》一书。设计思维在这个根底上产生了很多变体,斯坦福大学五阶段设计思维模型便是其中一种。 那么到底什么是设计思维,在学习一个概念之前,咱们能够尝试用“黄金圈法令”去定义它。 从成绩(what)来看,设计思维帮忙创新性地解决简单问题(满足需要);从理念(why)来看,设计思维是一种以人为核心的设计观;从伎俩办法(how)来看,设计思维是设计师解决问题的工作流程和办法。 因而,综合来说,设计思维一种以人为核心的,通过使用设计师的工作流程和办法,创新性解决简单问题的一种思维形式。 作为一种思维的形式,它被普遍认为能够用来解决简单问题,可能了解问题产生的背景、可能催生洞察力及解决办法,并可能感性地剖析和找出最合适的解决方案。 斯坦福大学设计思维的五个阶段斯坦福大学五阶段设计思维模型次要包含五个阶段:共情、定义(问题)、构思、原型和测试。 一、共情设计思维是一种以人为本的设计观点,共情的外围是指作为设计者要主观地了解指标用户,满足他们的需要与偏好的思考形式。 这个步骤的要害是站在指标用户的视角,去察看、去感知,找到他们最实在的需要、实在在乎的货色。在这个阶段,设计师罕用的办法有:访谈法、观察法、问卷调研、5W1H问题法等,其中最罕用的个别为访谈法和观察法。 二、定义问题定义问题在斯坦福设计流程中也被叫做POV(Point Of View),就是指透过景象开掘实质的过程。咱们常说用户所说的经常不是他的实在诉求,诚如汽车大王亨利福特的名言:“如果我当年去问顾客他们想要什么,他们必定会通知我:‘一匹更快的马。’”。正是因为福特晓得人们想要的其实不是想要跑的更快的马,是想要更快的速度,所以他能力绕开表象,造出了世界上第一辆汽车。 其次,定义问题也是一个收敛的过程,咱们须要将共情阶段收集的信息碎片,通过整顿剖析找出需要背地的实在场景,造成清晰的问题定义。 比方在设计一款DevOps产品时,通过调研发现同样一个新建需要的页面,解决简略需要的人员会心愿创立需要的时候表单能够重点突出他们须要填写的内容,弱化掉烦扰项;而解决简单需要的人员则心愿所有字段都能够平铺开展,通过地位记忆的形式去定位到须要填写的字段。同样都是出于晋升工作效率的诉求,然而他们会给你传播截然不同的需要。所以只有通过调研,通盘考虑能力制订出适合的设计策略。 三、构想在这一步咱们须要针对定义进去的问题,去构想解决方案,这个解决方案可能是多层面的,有可能是产品交互、产品性能、服务体验等等。 这个阶段能够应用的头脑风暴的办法,来刺激自在思考和扩充问题范畴。到序幕的时候对所有计划进行收敛,挑选出一个最具备可行性或者最具备价值的解决方案。 四、原型这一步的外围是把构想出的解决方案从虚构的想法,转化为能够测试的原型。 从效率上来说原型须要做到简略、正当、疾速。因而他可能只是一个交互原型或者线上demo,只有是能够用来测试用户反馈的物理载体都能够。咱们的目标是为后面的阶段得出的每个问题寻找最正当的解决方案。 五、测试最初一步就是拿着原型去找指标客户测试,让他们去应用原型,并基于应用的体验给出反馈。 在这个过程中咱们能够引入用户调研、可用性测试去收集整理用户的反馈,并在整顿的后果中会发现新的需要。带着这些新需要,咱们回到定义阶段修改或减少问题清单,而后在构想阶段修改或者从新设计方案,而后再制作新的原型进行测试,直到最终解决客户问题为止。 基于上述介绍,咱们能够剖析得出设计思维有两个特点:一、 设计思维是一种从发散到收敛的思维过程从共情采集需要到定义具体问题,从头脑风暴寻求解决方案到造成惟一可解决问题的原型,都是发散到收敛的过程。 发散能够开辟视线、思考更多跨畛域可能性,是创新性的土壤。先发散,而后再收敛,使用谨严的逻辑和数据,通过业余的测评剖析造成可行度最高或者价值最大的指标和计划。 二、设计思维是一种非线性循环工作流程设计思维不是一个线性的过程,它而蕴含了大循环和小循环,在前面的阶段取得的信息能够用于重构或优化后面阶段的论断,从而造成一个永动的循环。 你能够依照程序执行这五个阶段,也能够灵便地将这五个阶段了解为达成指标的不同切入点的模块,彼此能够独立并行运行,不须要遵循特定的程序,并且能够迭代地反复执行来扩大解决方案空间,直到找到最佳的解决方案。 总结在我看来,设计思维不仅是一套迷信的工作模式,作为设计师更能够从中学习到一些设计哲学 从设计观来讲,咱们尊重和关爱咱们的用户,去共情、去摸索,放下执著的偏见;从心态上来讲,设计师须要放弃凋谢好奇,拥抱不确定性和模糊性,将问题视为一种时机而不是一种威逼;从工作态度上来讲,咱们须要敢于对计划进行测试和修改,有承受经常性失败的勇气和执着寻找解决方案的韧性。设计师通过设计思维这个永动的循环,一直取得新的见解,对用户体验有更粗浅的了解。 想向技术大佬们多多取经?开发中遇到的问题何处探讨?如何获取金融科技海量资源? 恒生LIGHT云社区,由恒生电子搭建的金融科技业余社区平台,分享实用技术干货、资源数据、金融科技行业趋势,拥抱所有金融开发者。 扫描下方小程序二维码,退出咱们!

December 24, 2021 · 1 min · jiezi

关于设计:设计方法与实践介绍

工夫滴答走,学习不停歇。明天的内容是《设计办法与实际介绍》,咱们将从软件设计准则、clean code、单元测试、重构和配置化架构这五大方面给大家进行解说。 还愣着干什么,学起来吧~ 01 软件设计准则1、软件设计的目标软件设计是为了使软件在长期范畴内可能容易的进行变动。咱们从上面这三个点来了解这句话。 (1)变动:软件不是变化无穷的,无论是软件自身的需要、软件依赖的其余软件资源都是始终在发生变化的,惟一不变的就是变动。 (2)容易:任何一个软件的变动都须要老本,要尽可能的升高变动的老本,使得软件能够很容易应答软件的变动。 (3)长期:事实上须要长期进行保护的软件更应该做好软件设计,因为软件长期的变动十分多,难以提前作出预测,须要良好的软件设计来应答。 2、软件设计准则 软件设计有着很多的准则,最根本的准则是高内聚低耦合,它也是软件设计谋求的最高指标。内聚指的是一个软件外部间元素相关联的水平。高内聚谋求的是严密相关联的元素要放在一起。低耦合指的是单位之间尽可能少地关联,依赖。 在高内聚低耦合之上有很多其余的准则:如SOLID准则、简略设计、正交设计,在这之上还会有设计模式作为最高层的软件设计准则。 02 clean code1、clean code的概念clean code中文解释为整洁代码,是指写的代码可能在尽可能短的工夫内被他人读懂,且代码看上去排版整洁、逻辑清晰、扩展性好。 2、命名规定代码中命名须要遵循以下的几个规定: (1) 表白它是什么,不要表白怎么做。 (2) 代码要做到自正文。 (3) 应用有意义的循环迭代变量。 (4) 防止缩写,尤其拼音缩写。 (5) 不要应用非约定俗成的缩写。 (6) 防止应用魔法数。 (7) 不要胆怯长变量名。 3、正文正文对于代码来说是必不可少的。通常状况下,好的正文蕴含:版权信息,设计用意,警示信息。 不好的正文则具备以下一个或几个特点:同义重复、费解关联关系、套用模板、提供历史批改记录以及正文掉的代码。 4、函数在写函数时,该当留神,每个函数只做一件事,每个函数都是繁多职责的。 函数分为骨架函数和步骤函数。 → 骨架函数是业务逻辑和算法是在高层次上的形象形容。 →步骤函数是业务逻辑和算法的一些实现细节,是被暗藏起来的。 5、编码细节在编码细节方面,须要遵循以下几点规定: (1)应用天然的比拟程序。 (2)简化逻辑档次,防止多层嵌套。 (3)在写三元表达式时不要呈现简单的逻辑和过长的条件。 (4)须要控制变量的作用域,也就是放大变量作用域的范畴,越小越好。 03 单元测试1、为什么进行单元测试测试是分为不同档次的:最底层是单元测试,两头是基于模块级、组件级的测试,再往上则是零碎级别的测试。 越底层的测试,越可能疾速地发现问题。底层的测试集成性更好,可能平安的进行代码批改。下层的测试个别状况下取得反馈的速度比较慢,测试过程也比拟轻便。 所以单元测试具备更早发现问题,更容易集成,更平安地代码批改的长处。 2、写好单元测试的重要性写好单元测试不是一件容易的事件,须要破费许多工夫。 请看下面的示意图:x轴上方示意的是单元测试的老本,在理论开发的过程中,写单元测试的老本甚至不亚于写代码的老本。单元测试带来的益处就是能够升高产品开发的老本 好的单元测试可能升高产品开发的老本。如果单元测试写得不好的话,岂但会减少产品开发的老本,而且还会减少单元测试老本。 3、单元测试准则与模式单元测试具备许多的准则与模式,本次课程重点介绍四个准则。 第一个准则:Tests As Documentation将测试当成一个文档工作,也就是说咱们须要把测试写得像文档一样简洁,通过一些形容,能够清晰地晓得这个测试的作用。在之后对我的项目批改时,只须要查看单元测试即可。第二个准则:Fully Automated and Self-Checking单元测试都是能够进行自我查看、自我校验的,通过代码的编写,可能晓得测试是否胜利,不须要人为断定。第三个准则:Do No Harm,不可破坏性。局部开发人员在进行测试时,为了实现目标,会基于测试代码创建一些逻辑,这种做法是谬误的。在写测试时不能独自为测试创立特地的逻辑,更不能毁坏原有代码的逻辑。第四个准则:Keep tests as simple as possible,简洁性。单元测试尽管是用来保障代码的正确性,但单元测试也是一份代码,为了防止过多的测试代码相笼罩,要尽可能地把单元测试的代码写得简略,保障其不会出错。04 重构在进行重构时须要遵循肯定的规定。 1、业务导向重构肯定是要解决理论的业务问题的,而不是为了重构去重构。 2、小步快跑通常重构是须要多人同时参加,重构过程中开发人员要随时比照骨干与分支的状况。当某一个开发人员在分支上进行了大量改变并筹备将其合并到骨干时,有可能骨干和分支的代码有很大的差别。所以进行重构时,要将问题拆分成多个小的单元进行批改,并且每批改一个就进行一次分支合并。这种小步快跑的模式能够随时同步骨干上的代码,缩小出错的可能。 ...

September 14, 2021 · 1 min · jiezi

关于设计:Windows-10-中到底有多少层不一样的-UI

原文链接:https://ntdotdev.wordpress.co...可能你据说过这种说法:如果咱们深刻开掘 Windows 10 的 UI,很可能会发现这里边甚至有 Windows 3.X 时代的设计元素。不过事实真的如此吗?在这篇文章中,咱们会探寻 Windows 10 中到底有多少层不一样的 UI,以及这些 UI 最早是什么时候呈现的。 思考到试验的目标,我抉择了最新的 Windows 10 版本(2021 年 2 月 6 号公布),也就是 Windows 10 build 21301 版本。 那么,话不多说,咱们开始吧! 第一层:Fluent Design咱们先从最新也是最棒的 UI 层开始,也即 Fluent Design(晦涩设计)。这种 UI 最早公布于 2017 年,之后在 WIndows 10 1803 版本的更新中引入。Fluent Design 是 Modern Design Language 2 (MDL2)通过大幅度重设计后的版本,旨在带来具备光感、深度、动效、质感与缩放的元素。同时,它也带来了全新的光照成果和亚克力半透明背景。 当初,大部分的 UWP 利用都进行了降级以应用全新的晦涩设计提供的元素,当然还包含了局部前端元素,包含开始菜单、活动中心以及登陆页面等。 尽管 Fluent Design 广受好评,但很多死忠粉还是认为这种设计来得太晚了,而且利用得还不够全面 —— 只有局部个性遵循这种新的设计格调进行了拓展。 上面咱们通过几张图片感受一下 Fluent Design: ...

June 21, 2021 · 2 min · jiezi

关于设计模式:浅谈设计模式-迭代器模式十一

浅谈设计模式 - 迭代器模式(十一)前言 迭代器模式通常只须要晓得该模式的实现原理和理解结构图即可,在设计模式当中本人实现的状况简直是没有的,所以这个模式简略的过一遍。 什么是迭代器模式定义:提供程序的办法拜访一个聚合对象的各个元素,同时又不会裸露外部的性能 迭代器模式通过接管遍历的细节,让提供方不用关怀迭代的具体细节,只须要提供对应的聚合对象即可。 迭代器模式和加强的FOR循环: Jdk1.5之后,将泛型和加强for循环退出到语言体系,能够间接对于汇合的内容进行for循环查看,其实实质上还是调用了iterator办法,而java通过语法糖的模式为咱们进行的遍历的暗藏。 迭代器模式结构图 迭代器模式的结构图如下: Aggregate:聚合对象的独特接口,定义了具备遍历性能的聚合对象,通过定义创立迭代器的接口来建设与迭代器的组合ConcreateAggregate:具体的迭代器实现对象,通过接口办法返回具体的迭代器实现Iterator:迭代器接口,定义迭代器的对立标准,所以派生类都须要强制依照接口标准执行迭代器的实现。保障迭代器具备类似的行为。ConcreteIterator:具体的迭代器实现,外部聚合对象的同时,能够扩大迭代器的遍历形式,比方ListIterator。迭代器模式特点迭代器将遍历的细节进行了封装,聚合对象不须要在关怀客户端如何操作外部的变量,而是通过委托给迭代器的模式交由迭代器去实现具体的遍历细节。迭代器能够在不裸露内部结构的同时让外界能够拜访到外部的聚合对象,所以即便是齐全不同的对象也能够对立看待和解决。迭代器是一种职责的转移,将遍历的工作从本来的聚合对象中进行独立,能在不改变数据结构的同时扭转数据的操作形式。迭代器的注意事项:须要留神迭代器存在外部的迭代器和内部的迭代器,外部的迭代器供对象自身应用不对外开放,内部的迭代器通过办法返回给调用方应用。每个责任对应一个区域,超过区域象征多了一个责任,遍历和数据操作实际上是两个操作,应该辨别看待。留神迭代器是如何体现繁多职责的准则,他剥离了遍历对象的性能,将其封装到一个迭代器外部进行应用。好的迭代器该当具备“疾速失败机制”,目标是为了避免操作外部元素的指针越界,同时及时告诉客户端遍历异样。如果想让办法不反对某些性能,最好应用异样机制揭示客户端我不反对某些操作。案例 光有实践还是不够的,这里配合代码解说迭代器是如何实现解耦聚合对象的遍历的。 模仿场景: 因为迭代器在理论工作中应用概率 简直为0,这里设置的场景比较简单 咱们应用window最常见的文件系统来作为案例,咱们通常进入不同的磁盘,首先就是对该磁盘上面的第一级目录进行遍历,同时咱们依据遍历形式的不同,能够将页面展现为分组,依照工夫排序,显示不同的详略信息.....这些性能的实质都是遍历,只不过遍历的模式不同,为了实现对于菜单的不同模式遍历,咱们通过定义不同迭代器来实现这一个指标。 接着,咱们会发现迭代的品种丰盛还不够,咱们还须要迭代其余的内容,比方工作管理器须要迭代不同的过程,同样也蕴含了排序的或者暗藏局部过程等等一系列的性能,所以须要让不同的对象能够撑持类似的迭代操作,并且能够自在的替换迭代的形式,当然这部分性能不会放入案例局部,案例局部为简略的迭代器实现。 具体实现 在进行具体的编码之前,先检查一下须要的根本构建类: Travelsable:定义对象具备迭代的性能接口。MissionBoard:任务栏,储存根本的工作信息,提供迭代器供内部展现。TaskItemlIterator:工作迭代器,用于工作的迭代操作ConcreteCatalogIterator:目录迭代器的实现具体子类,定义了不同的迭代品种。TaskItem 工作项,定义一个工作的内容Computer 电脑,只须要治理任务栏和文件管理器即可。FileManager 文件管理器,负责管理文件夹的内容FileIterator 文件迭代器,治理文件夹的迭代操作FileItem 文件项 上面间接依照结构图构建具体代码: // 电脑,只须要治理任务栏和文件管理器即可。public class Computer { private FileManager fileManager; private MissionBoard missionBoard; public Computer(FileManager fileManager, MissionBoard missionBoard) { this.fileManager = fileManager; this.missionBoard = missionBoard; } public void display(){ Iterator fileManagerIterator = fileManager.createIterator(); Iterator missionBoardIterator = missionBoard.createIterator(); while (fileManagerIterator.hasNext()){ Object next = fileManagerIterator.next(); System.out.println(next); } while (missionBoardIterator.hasNext()){ Object next = missionBoardIterator.next(); System.out.println(next); } }}// 文件项public class FileItem { private String fileName; private String editDate; private String ceateDate; private long size; // 省略局部内容}// 工作项public class TaskItem { private String name; private int size; // 省略局部内容}// 迭代器标准接口public interface Travelsable<E extends Object>{ /** * 创立迭代器的办法 * @return */ Iterator<E> createIterator();}// 任务栏,治理工作项. 实现接口,反对迭代操作public class MissionBoard implements Travelsable { private Stack<TaskItem> taskItems; public MissionBoard() { taskItems = new Stack<>(); taskItems.push(new TaskItem("工作1", 10)); taskItems.push(new TaskItem("工作2", 1230)); taskItems.push(new TaskItem("工作3", 123)); taskItems.push(new TaskItem("工作4", 414)); taskItems.push(new TaskItem("工作5", 555)); } @Override public Iterator createIterator() { return new TaskItemlIterator(taskItems); }}// 文件管理器,管理文件项,实现接口并且反对迭代操作public class FileManager implements Travelsable{ private FileItem[] fileItems; public FileManager() { this.fileItems = new FileItem[10]; Random random = new Random(10000); for (int i = 0; i < fileItems.length; i++) { fileItems[i] = new FileItem("文件"+i, random.nextInt(2000)); } } @Override public Iterator createIterator() { return new FileIterator(fileItems); }}//文件迭代器public class FileIterator implements Iterator{ private FileItem[] fileItems; private int index; public FileIterator(FileItem[] fileItems) { this.fileItems = fileItems; this.index = 0; } @Override public boolean hasNext() { return index++ < fileItems.length - 1; } @Override public Object next() { return fileItems[index]; } @Override public void remove(Object ele) { throw new UnsupportedOperationException("数组不反对以后操作"); }}// 工作迭代器public class TaskItemlIterator implements Iterator{ private Stack<TaskItem> taskItems; public TaskItemlIterator(Stack<TaskItem> taskItems) { this.taskItems = taskItems; } @Override public boolean hasNext() { if(taskItems.isEmpty()){ return false; } TaskItem peek = taskItems.peek(); return peek != null; } @Override public Object next() { return taskItems.pop(); } @Override public void remove(Object ele) { taskItems.remove(ele); }}以上就是迭代的大抵实现案例代码,古代编程根本不会本人去设计迭代器,所以理解概念和晓得样板代码即可。 ...

April 11, 2021 · 2 min · jiezi

关于前端:设计稿UI视图自动生成代码方案的探索

1 背景设计稿(UI视图)转代码是前端工程师日常一直反复的工作,这部分工作复杂度较低但工作占比拟高,所以晋升设计稿转代码的效率始终是前端工程师谋求的方向之一。此前,前端工程师尝试过将业务组件模块化构建成通用视图库,并通过拖拽、拼接等模式搭建业务模块,从而实现视图复用,升高设计稿转代码的研发老本。但随着业务的倒退和个性化的驱动,通用视图库无奈笼罩所有利用场景,本文提出了一种设计稿主动生成代码的计划。 目前,业内支流的代码生成计划有两种,一种是通过训练神经网络,从图片或草图间接生成代码,以微软sketch2json为代表;另一种是基于Sketch源文件,从中解析出图层信息转化成DSL并生成代码,以imgCook为代表。通过实际,咱们发现第一种计划基于神经网络的代码生成算法尽管简略粗犷,但简单层布局的准确率较低、可解释水平不高导致后续无奈继续优化。计划二中Sketch源文件信息量丰盛、算法自定义水平高、优化空间大。因而,咱们调研了业界基于Sketch的代码主动生成计划(已对外颁布或者开源),发现了一些有余并尝试解决,上面从算法准确率、代码可读性、研发流程覆盖度等方面做一下比照(该比照后果仅考查业界计划对咱们本人业务的适用性,理论后果可能存在差别): 算法准确率方面:淘宝imgCook反对基于AI的组件辨认,不反对成组布局,准确率中等(从官网理解到能够辨认循环布局,但不能辨认出测试样本中的循环布局),58 Picasso仅反对原始组件的辨认,简单组件生成谬误较多,不反对成组/悬浮/循环布局,准确率较低。代码可读性方面:淘宝imgCook在生成布局时,测试样本中图层重叠区域应用到了基于根布局的相对定位形式,不合乎RD预期,可读性个别,而咱们的计划应用绝对定位形式,可读性较好。研发流程覆盖度方面:淘宝imgCook从RD视角构建了一个IDE,反对在IDE中实现款式调整、逻辑绑定;而咱们的计划从产研合作视角登程,反对数据、逻辑、埋点的可视化配置及上线。2 计划介绍如图所示,配置平台次要分成三块包含:设计稿转视图树(UI2DSL)、视图树转代码(DSL2Code)、以及业务信息绑定,上面简略介绍一下每一块的作用。 设计稿转DSL视图树(UI2DSL):将设计稿转化成平台无关的DSL视图树。视图树转代码(DSL2Code):将DSL视图树转化成基于Flex布局的MTFlexBox动态代码。业务信息绑定:提供可视化配置工具,反对MTFlexBox动态代码绑定后盾数据、业务逻辑、以及曝光/点击等埋点逻辑。2.1 设计稿转视图树(UI2DSL)UI2DSL次要经验以下四个步骤: 2.1.1 设计稿导入在日常开发过程中,咱们接触比拟多的组件有按钮、题目、进度条、评分组件等,然而Sketch数据源中并没有这些组件只有图层信息,图层是设计师在设计UI视图时用到的视图控件。组件与图层的对应关系是一对多的关系,图层在Sketch数据源中的表现形式如下图中的JSON数据结构所示,形容了图层的坐标、大小等信息,后续布局生成就是基于对图层的切割来实现的。 [ { "class_name":"MSTextLayer", "font_face":"PingFangSC-Medium", "font_size":13.44, "height":36.5, "index":8, "line_height":18.24, "name":"恒都民生精选猪小排带骨400g±25g", "object_id":"EF55F482-A690-4EC2-8A6E-6E7D2C6A9D91", "opacity":0.9000000357627869, "text":"恒都民生精选猪小排带骨400g±25g", "text_align":"left", "text_color":"#FF000000", "type":"text", "width":171.8, "x":164.2, "y":726.7 }, //......]2.1.2 组件辨认从下面的数据源能够看出,图层有图片、文字、矩形等根本类型,在组件辨认这一步图层须要被转化成文字/图片/进度条/评分组件/价格组件/角标等日常开发应用的组件类型。然而目前咱们的停顿还停留在只能将图层辨认为文字或者图片的阶段,后续咱们将接入淘宝开源的pipcook框架,基于神经网络算法进行更加丰盛的组件类型辨认。 2.1.3 可视化干涉设计稿作为输出源是设计稿主动转代码的根底,这对设计稿的设计规范要求较高。但在实践中,咱们发现设计师会利用Sketch中的根本图形(每个图形最终造成数据源中的一个图层)叠加来形容一个组件的视觉效果,因而设计稿中不可避免会呈现冗余图层的问题,烦扰DSL的生成。尽管咱们也尝试了利用自动化的伎俩删除冗余图层,但对于算法不能辨认的局部(例如:图片上有一个文本图层,然而理论状况中文本是显示在图片里的,这个时候无奈从算法层面决定是否删除文本),依然须要靠人工进行图层删除、合并等,否则无奈失常生成DSL。设计稿次要有以下几类问题。 图层未合并 上图是从设计稿解析进去的后果,能够发现在“美团优选”文字上方的图片中有很多红色的矩形框(每个矩形框是一个独自的图层),而算法预期的输出是一个图层,因而须要在算法解决前将多个图层合并成一个图层,右侧的三张图也有相似问题。咱们与设计同学进行过沟通,设计同学示意违心在产出设计稿之前将图层进行合并,但因为目前无奈提供检测机制(图层合并是否有脱漏无奈自动检测进去),也就无奈彻底防止图层未合并的问题。 图层地位穿插 实际中发现当设计稿中不同字体/大小/色彩的文字排列在一起时,解析进去的图层信息往往会呈现重叠的状况,因为DSL视图树算法依赖地位来确定不同组件的束缚关系,因而地位的穿插会对算法准确度造成较大的影响。 简单背景图层 上图中红色背景是由2个图层(2个蓝色矩形框)拼接造成的,左图上的蓝色图层是纯色,右图上的蓝色图层是渐变色,在两个图层未合并的状况下,算法生成的代码将会出错。 下面提出的问题,通过束缚设计师来达到设计稿的规范化,难度较大,所以咱们提供了可视化干涉工具。上面对上述问题做一个简略的总结: 问题一:图层未合并问题肉眼很容易辨认进去,利用工具将冗余图层进行疾速合并删除即可。问题二:图层穿插问题肉眼不易辨认,因而咱们提供了检测工具,基于检测工具能够对设计稿中的穿插问题疾速修复。问题三:简单背景问题肉眼不易辨认,临时也没有无效的检测工具,用户能够采纳边干涉边生成的形式生成DSL。 可视化干涉是UI2DSL重要的一环,通过可视化干涉,将不规范的设计稿转化为规范的图层信息后再输出给算法,能够极大地晋升算法的准确率。 这里咱们和imgCook的解决形式有一个区别:imgCook在引入了阈值解决等算法后(更智能,出错概率更大),可视化干涉能力次要体现在预先,而咱们在生成DSL之前容许用户对图层进行干涉,在干涉时用户面对的是直观的图层信息,能够无效升高工具的应用门槛(更稳固,成果更好)。 2.1.4 视图树生成将扁平的数据源转化为树状构造的DSL,这个过程如果是人脑来做会怎么思考呢?先确定布局的整体构造是行布局或者列布局,而后再确定部分区域应该是什么布局构造,最初组装起来造成视图树。这个过程与递归算法相似,因而咱们采纳了递归算法作为算法的主框架,同时引入了“横竖切割+布局构造+模型评估”三大利器。 利器一:横竖切割 生成DSL时采纳了整分的思路,行将大布局一直的切分成小布局,上面以动画的模式看一下简化过的DSL生成过程: 将设计稿一部分区域视为一个子区域,最开始的时候子区域和整个模板的面积一样大,基于图层的地位、大小信息,计算每个图层的上/下/左/右边缘坐标与其余图层的绝对关系,就能够寻找到切割点(如上图中红色箭头所指的地位)。接下来根据切割点,将子区域切割成更小的子区域,在切割的过程中如果切割点是横向的,则生成列布局;如果切割点是纵向的,则生成行布局。通过一直的切割子区域失去更小的子区域,直到所有的子区域只剩下图片或者文本等不可切割的图层,这样就能够生成残缺的DSL视图树了。为了不便读者了解,图例中只演示了行布局、列布局的切分过程,理论状况还蕴含了其余布局类型,会要简单许多。 这里还要留神一个问题,当有3个切割点时,咱们抉择了间接将子区域切割成4个子区域,实际上咱们能够只抉择1个切割点进行切割,也能够抉择2个切割点进行切割,当有N个切割点时,实际上存在(N的阶乘+1)种切割形式,具体抉择哪种切割形式,咱们会在利器三中探讨。 利器二:布局构造 每个图层都是一个矩形,为了生成布局构造只能依赖矩形的上下左右坐标信息。因而,对布局构造进行分类时,咱们依据矩形与矩形之间的地位关系(相交、相离和蕴含关系)做了以下分类。 留神:从生成DSL的后果来看,蕴含布局和成组布局的解决形式其实是一样的,都是应用相似于FrameLayout的层叠布局蕴含外部图层元素,然而咱们依然放弃分类准则(矩形之间的地位关系)不变。 上图中,相离、蕴含比拟好了解,为什么两个图层相交的时候,会有成组和悬浮两种类型的布局构造呢?咱们看下上述成组布局、悬浮布局两个设计稿中别离标出了相交的元素A、B,它们在地位上的绝对关系是一样的,都是A、B两个图层对应的矩形框产生了穿插。然而咱们心愿现实态的DSL视图树却有所差别,如下图所示: 成组布局中:A、B逻辑上是一个整体,穿插是必然的,最终DSL中A、B被层叠布局蕴含,层叠布局中没有其余元素。悬浮布局中:A、B逻辑上不是整体,只是碰巧穿插了,最终DSL中A、B别离在不同的层级中。 因而,对于图层相交时可能有两种类型的布局构造,别离是成组布局和悬浮布局。从上图能够看出应用成组布局还是悬浮布局是由图层内容决定的,那么就须要算法了解图层内容了,比方基于AI构建样本库,记住所有的角标款式(下面表格中4形容的),下次遇到角标相交时就生成成组布局。思考到AI模型也是对规定的形象,咱们先搭建一套自定义辨认规定。成组布局其地位信息是有法则可循的,例如:角标经常出现在右上角,标签经常出现在左上角,头像常常横向或者纵向穿插等,因而咱们针对图层之间的地位关系构建了穿插模型,如下图所示: 上图的穿插模型能够记住历史模板中成组布局图层之间的地位关系,下次遇到相交布局时判断是否在历史规定库中即可实现辨认,如果在就按成组布局解决否则依照悬浮布局解决。下图是通过历史模板构建的成组规定库。 下面介绍了本计划中波及的5种布局类型,目前来看这五种布局类型能够形容所有的模板布局,并且生成代码合乎RD的预期。上面展现两个设计稿DSL实例: ...

March 26, 2021 · 1 min · jiezi

关于设计:由近期设计的心理测试小程序所引发的关于产品设计的思考

随着互联网的倒退,工种变得越来越多,职责划分也越来越细,面向产品方向的也不只有产品经理了,还有用户体验、产品设计等等。 在作为小程序开发者,在设计与开发制作了不同行业和主题的小程序的过程中,我产生了一些对于产品设计的思考。其中最具代表性的是: 什么是产品设计? 什么是产品设计流程? 作为一个小程序创作者我须要有什么技能? 碰巧最近,我又设计与制作了一款小而美的心理测试小程序。于是,我把过后的内容整顿到了这一篇文章里了,心愿能够帮忙到更多的人。 产品设计的定义 产品设计是辨认市场机会、明确定义问题、为问题制订适当的解决方案并与理论用户一起验证解决方案的过程。 什么是产品设计流程 作为一名小程序开发者,你可能会表演问题解决者、钻研人员、设计师、产品经理、数据分析师和营销人员,但从另一方面想这意味着你的工作永远不会反复。 根本流程:筹备工作——需要剖析——根底调研——将计划制作成原型——界面设计——开发实现——可用性测试 最初要记住的最重要的事件是,咱们最终要设计的产品是要供人应用。所以,无论是从视觉上还是交互体验上,力求完满,打造小而美的产品。 那对于产品设计和产品设计流程你有什么见解呢?欢送在留言区与咱们一起分享哦。 作者:meng 原文:由近期设计的心理测试小程序所引发的对于产品设计的思考 | 微信凋谢社区

January 29, 2021 · 1 min · jiezi

关于设计:3D可视化管理推进能源革命打破常规运营手法效率提高95

在最近召开的十四五打算会议中,明确出要:“推动能源反动”、“构建生态文化体系,促成经济社会倒退全面绿色转型”和“放慢推动绿色低碳倒退”、“全面提高资源利用效率”等要求,为能源产业的继续衰弱倒退指明了方向。 为在能源行业输入一份力量,由此图扑软件(Hightopo)退出了3D可视化模块,通过3D可视化技术齐全还原能源管理中心全貌,进一步实现对泛滥子系统的集中配置管理。实时在线查看,操作简略,升高治理难度,缩小设施运行保护压力。 应用以信息化、自动化、智能化为根底,能够齐全取代粗放式、低效率的现场人工调节的传统经营模式;能够在应用期间,通过零碎实时监督各干线的运行参数,及时对生产运行状况进行剖析、管控。进步工人生产的精细化治理,实现疾速响应、疾速解决、业务全流程监管,晋升了服务口碑,以达到良好的社会效益。 当然 2/3D 仿真零碎更靠近于事实中的实在的楼宇、设施,用户易于承受;能够让用户看到零碎整体的同时,还能观测部分细节数据,兼顾整体与细节。能够提供丰盛的人机交互伎俩,便于操作。 拿图扑的换热站零碎举个例子:图扑为根底,以节能、降耗、节费为登程,为供热企业量身定做三维可视化零碎。可实现: 1、可实现整个零碎的监控; 2、可实现整个零碎的过程治理和运行治理,进步了零碎的管理效率,实现零碎的整体节能; 3、实现近程监控、无人值守,通过近程智慧管制,只需在调度核心就能实现平衡输送、准确调节,并能及时发现漏损状况,及时止损; 4、实现主动反馈生产运行大数据,精准预测将来时段所需参数,造成生产剖析报告,给调配供给量及运行参数提供领导值,并实现在简单工况下能源切换的无缝对接,大大降低能源切换给热用户带来的影响。 2020 年来,能源产业也要向数据可视化的方向进行转型,并一直寻找数据可视化的最佳计划。改善现有智能监控零碎可视化办法的缺点,从交互式、可视化的数据分析中开掘深层的技术问题。以后能源管理配合上图扑软件(Hightopo )可视化计划能直观地感触数据和提出最正当的解决方案。 利用 3D 数据可视化治理计划对能源进行治理可满足的性能有: · 缩小资源节约,优化资源配置。 · 革除治理破绽,实时无效的检测,为保护人员进步无效有序的信息,近程运维诊断,设施衰弱治理。 · 使能源产业运行效率最大化。 · 方便管理,无需更多人力参加,可近程监控操作。 · 将宏大的构造优化,更为直观的展示进去,有助于剖析并做出决策。 · 放大平安能源事变产生的可能性。 · 多维度,综合性进行治理 在网络迅速倒退的明天,工业管控叠加加上现如今曾经启动许久的 工业4.0 衍生出的新一代 工业互联网 和不久才面世于众的 5G 新时代,激发出了一代数据可视化监管的倒退。而 图扑物联 的 web 组态 提供了丰盛的组态成果,能够依据需要疾速实现一套残缺的数据可视化零碎。上面是将通过图扑的组态实现一个可视化分布式能源站零碎,带你走进丰盛的组态的大门。

January 29, 2021 · 1 min · jiezi

关于设计:GrowingIO-Design-组件库搭建之开发工具

作者:潘杰GrowingIO 工程经理,目前次要负责 GrowingIO Design 组件库搭建和微前端建设。前言在 20 世纪 60 年代,计算机技术开始超过软件编程的速度。计算机变得更快、更便宜,然而软件开发依然迟缓,难以保护,并且容易出错。这种差距,以及如何应答,被称为“软件危机”。 1968 年,在北约软件工程会议上,Douglas McIlroy 提出了基于组件的开发作为解决这一窘境的可能办法。基于组件的开发提供了一种通过使代码可重用来放慢编程后劲的办法,从而使其更高效且更易于扩大。这升高了工作量,进步了软件开发的速度,使软件可能更好地利用古代计算机的力量。 当初,50 年后,咱们正经验着相似的挑战,但这次是在设计方面。设计正在致力扩大它所反对的应用程序,因为设计依然是针对单个问题的定制解决方案。你是否已经执行过用户界面审计,发现你应用了几十种类似的蓝色色调,或者雷同按钮的排列?将其乘以应用程序中的每个 UI,您就会开始意识到设计变得如许不统一、不残缺和难以保护。 设计零碎通过使设计可重复使用,使团队可能更快地制作更好的产品成为可能。这是设计零碎的外围和次要价值。设计零碎是可重用组件的汇合,遵循明确的规范,能够将其组装在一起以构建任意数量的应用程序。 GrowingIO 产品研发团队也开始通过搭建本人的设计零碎—— GrowingIO Design System,来提供交互体验统一的产品和晋升研发效率。组件库做为设计零碎的重要组成部分,前端团队通过系列文章来介绍如何一步步搭建组件库。本篇文章次要介绍组件库 GrowingIO Design 应用的开发工具,正所谓:工欲善其事,必先利其器。 TL;DR本文依照工具的作用把工具分为:代码标准和代码治理两类,这两类次要用到的工具有: 代码标准工具 a. Prettier:用于代码格式化 b. stylelint:对款式文件( CSS 和 Less )进行标准查看 c. ESLint:对 ECMAScript/JavaScript 代码进行标准查看 代码管理工具 a. Commitzen:帮忙编写标准的 commit message b. commitlint:对 commit message 格局进行查看 c. lint-stage:只对 git 缓存的代码文件进行标准查看,进步速度 d. husky:整合所有的查看工具 husky 如何把查看工具都整合的,如下图所示: 其中: pre-commit 阶段:执行 lint-staged ,会对暂存的文件执行 prettier 、stylelint 和 eslint 三个命令。commit-msg 阶段:执行 commitlint,查看 commit message 是否符合规范。接下来,对这两类用到的工具进行具体介绍。 ...

January 13, 2021 · 3 min · jiezi

关于设计:进来抄作业分布式系统中保证高可用性的常用经验

摘要:高可用性对于咱们来说应该属于常常提到的名词,本文咱们将介绍在分布式系统中保障高可用性的一些罕用教训。高可用性对于咱们来说应该属于常常提到的名词,本文咱们将介绍在分布式系统中保障高可用性的一些罕用教训。 零碎可用性指标零碎可用性指标简略来将就是零碎可用工夫与总运行工夫之比 Availability=MTTF/(MTTF+MTTRMTTF) MTTF 是 Mean Time To Failure,指均匀故障前的工夫,即零碎均匀可能失常运行多长时间才产生一次故障。零碎的可靠性越高,MTTF 越长(简略了解MTTF 就是指零碎失常运行的工夫)。MTTR 是 Mean Time To Recovery, 均匀修复工夫,即从故障呈现到故障修复的这段时间,也就是零碎不可用的工夫,这段时间越短越好。零碎可用性指标能够用通过下表的999规范掂量,当初广泛要求至多2个9,最好4个9以上: 故障不可避免高可用性是指零碎提供的服务要始终可用,然而故障不可避免,特地是在分布式系统,面对不可控的用户流量和机房环境,系统故障将会显得更加简单和不可预测。在大规模的分布式系统中,各个模块之间存在盘根错节的依赖,任一一个环节呈现问题,都有可能导致雪崩式、多米诺骨牌式的故障,甚者能够断言呈现故障成了常态。 如上图的分布式系统中,用户申请零碎中的某个服务接口,申请须要通过长长的调用链能力解决返回。咱们起码要保障网络连接失常,服务网关失常、前端服务失常、后盾服务失常、数据库失常,申请能力被失常解决,如果调用链中的任一环节呈现问题,都会间接反馈到用户体验上。 零碎呈现故障的起因多种多样,次要有以下这些: 网络问题,网络连接故障,网络带宽呈现超时拥塞等;性能问题,数据库慢查问、Java Full GC、硬盘 IO 过大、CPU 过高、内存不足等平安问题,被网络攻击,如 DDoS 等、异样客户端申请,如爬虫等。运维问题,需要变更频繁不可控,架构也在一直地被调整,监控问题等;治理问题,没有梳理出要害服务以及服务的依赖关系,运行信息没有和控制系统同步;硬件问题,硬盘损坏、网卡出问题、交换机出问题、机房掉电、挖掘机问题(前一阵子机房电缆就常常被挖断)等面对如此多的天下大乱,可控和不可控的故障因素,仿佛零碎的高可用性变成不可能实现的工作,然而在日常开发运维中,咱们能够采纳一些无效的设计、实现和运维伎俩来进步零碎的高可用性,尽量交付一个在任何时候都根本可用的零碎。 冗余设计分布式系统中单点故障不可取的,而升高单点故障的不二法门就是冗余设计,通过多点部署的形式,并且最好是部署在不同的物理地位,防止单机房中多点同时失败。冗余设计不仅能够进步服务的吞吐量,还能够在呈现劫难时疾速复原。目前常见的冗余设计有主从设计和对等治理设计,主从设计又能够细分为一主多从、多主多从。 冗余设计中一个不可避免的问题是思考分布式系统中数据的一致性,多个节点中冗余的数据谋求强一致性还是最终一致性。即便节点提供无状态服务,也须要借助内部服务,比方数据库、分布式缓存等保护数据状态。依据分布式系统下节点数据同步的基本原理CAP(Consistency (一致性)、Availablity (可用性)、Partition tolerance (分区容忍性)三个指标不可同时满足),数据强一致性的零碎无奈保障高可用性,最典型的例子就是 Zookeeper。 Zookeeper 采纳主从设计,服务集群由 Leader、Follower 和 Observer 三种角色组成,它们的职责如下: Leader: Zookeeper 集群应用 ZAB 协定通过 Leader 选举从集群中选定一个节点作为 Leader。Leader 响应客户端的读写申请;Follower:只提供数据的读服务,会将来自客户端的写申请转发到 Leader 中。在 Leader 选举的过程中参加投票,并与 Leader 维持数据同步;Observer:与 Folllower 的性能雷同,但不参加 Leader 选举和写过程的"过半写胜利"策略,单纯为了进步集群的读能力。在 Zookeeper 集群中,因为只有 Leader 角色的节点具备写数据的能力,当 Leader 节点宕机时,在新的 Leader 节点没有被选举进去之前,集群的写能力都是不可用的。尽管 Zookeeper 保障了集群数据的强一致性,然而放弃了集群的高可用性。 ...

January 13, 2021 · 1 min · jiezi

关于设计:如何画好IT项目中的各种架构图

在上篇文章,给大家分享了一篇我的项目如何做架构设计 程序员架构修炼:架构设计概要、业务、利用、技术、数据架构,这篇文章教大家如何画这些架构图。在日常软件我的项目开发与施行中,常常会波及到各种架构图,如利用架构、技术架构、平安架构、部署架构。明天特意将这些架构图整顿如下,提供给大家进行学习参考。 一、利用架构 举荐在线作图工具(收费、实时合作): https://www.processon.com/i/5... 二、技术架构 三、平安架构 各源文件下载链接可拜访:https://www.yuque.com/itman/w... 四、部署架构 举荐在线作图工具(收费、实时合作): https://www.processon.com/i/5... 混合云服务器部署架构图: 五、分享有须要的同学,能够拜访上面地址进行克隆,学习更多内容请拜访: https://www.processon.com/u/5... 各源文件下载链接可拜访语雀:https://www.yuque.com/itman/w... 相干文章:如何画好IT我的项目中的各种架构图

December 22, 2020 · 1 min · jiezi

关于设计:移动端UI设计规范

边距、间距准则:边距(左右)要大于间距(高低)。 模块边距10px、12px、15px、16px 15px 罕用 10px 最小,要展现更多的内容才用 模块间距8px、10px、15px、16px、20px 罕用 10px 15px 20px 内容间距5px 10px 15px 内容边距5px 10px 15px 列表最小高度 40px 单行 53px 55px 66px 全局规定图片比例16:9、4:3、3:2、1:1 和 1:0.618(黄金比例)。 字体准则:在同一个零碎的 UI 设计中先建设体系化的设计思路,对主、次、辅助、题目、展现等类别的字体做对立的布局,再落地到具体场景中进行微调。少即是多,在视觉展示上用尽量少的款式去实现设计目标。防止毫无意义的应用大量字号、色彩、字重强调视觉重点或比照关系。 字重,只呈现 regular 以及 medium 的两种字体分量,别离对应代码中的 400 和 500,在英文字体加粗的状况下采纳 semibold 的字体分量,对应代码中的 600。 字号抉择在 3-5 种之间,放弃克服的准则。 行高 1.4 12px 提醒语14px 主文字16px 题目18px 大题目20px 最大题目色彩确定主题色,定义好字体、背景、禁用、线条边框、红橙黄绿蓝等色值。 每种色值最多配有 2~3 种浅谈变动,比方文字可有主、次、提醒等三种(#333 #666 #999)。 应用的大色彩品种不可过多,罕用的有黑、白、主题色、绿-胜利、红-失败、黄-正告。 暗影离高空越远的物体,产生的暗影色彩越淡、含糊度越高、面积越大;反之则色彩更深、含糊度越低、面积越小。 暗影向下:次要利用于组件外部或组件自身,是比拟惯例场景的用法 暗影向上:次要利用于底部导航或工具栏等 暗影向左:次要利用于左边导航栏、抽屉组件或固定表格栏 暗影向右:次要利用于右边导航栏、抽屉组件或固定表格栏 一级暗影 @shadow_1_down:0px 1px 2px -2px rgba(0, 0, 0, 0.16),0px 3px 6px 0px rgba(0, 0, 0, 0.12),0px 5px 12px 4px rgba(0, 0, 0, 0.09);二级暗影 ...

November 1, 2020 · 1 min · jiezi

KiCAD交互式BOM插件

KiCAD交互式BOM插件InteractiveHtmlBom仅供参考,具体操作请结合自身软件版本 KiCAD自带的BOM导出功能并不好用——而且最多也就是导出一个excel表格之类的东西而已。但是,开源软件火起来之后总会有大神想办法解决各种痛点的,InteractiveHtmlBom就是一款负责搞定BOM相关问题的插件。 先来看看演示吧,传送门 比AD的BOM好看多了是不是?而且还能看到元件在PCB上的位置。 So,这么好用的插件赶紧安排上啊! 安装步骤 KiCAD的插件存放在安装目录下一个固定的位置,不过不同版本可能略有区别,所以推荐用指令查询一下,具体如下: 首先,在PCB绘制界面下,点击“工具 --> 脚本控制台” 然后,在打开的控制台界面中输入以下指令: import pcbnewprint(pcbnew.PLUGIN_DIRECTORIES_SEARCH)然后,显示如下: 安装路径下的“.../scripting/plugins”这个文件夹就是插件应该存放的地方。 知道了插件该放哪以后,就该去下载、安装了。 首先去github上下载这个项目,传送门然后,把项目当中的InteractiveHtmlBom这个文件夹整体放到之前查询到的目录下。重新打开KiCAD,这时“工具 --> 外部插件”这一条目下应当能看到InteractiveHtmlBom这个插件了,如果没有,点击“刷新插件” 至于插件的使用就不做讲解了,打开插件点击“Generate BOM”就行。

June 27, 2020 · 1 min · jiezi