西南IT社区
    • 注册
    • 登录
    • 搜索
    • 主页
    • 问答
    • 话题
    • 热门
    • 圈子
    • 工作机会
    • 活动
    • 项目
    1. 主页
    2. tarao616
    3. 帖子
    • 资料
    • 关注 0
    • 粉丝 0
    • 主题 48
    • 帖子 48
    • 最佳 0
    • 有争议的 0
    • 群组 0

    tarao616 发布的帖子

    • 图的表示方法

        所谓的搜索,就是在数据集合中寻找某种满足条件的数据结构。企业级系统的重要组成部分就是搜索,搜索逐渐在发挥着重要的作用,ES已经成为每一个互联网企业必备的工具集。而它作为搜索的一个最基础的部分,文本匹配的重要性就显得更为重要了。文本匹配不仅仅为精确搜索提供了方法,而且还为模糊匹配提供了算法依据。

      我们考虑实用情况,以有向图为例:我们假设可以以省会城市开始对顶点编号。如下图
      b58bdb1f-169a-4237-a925-1842891212f4-image.png
        邻接矩阵:表示图的一种简单的方法是使用一个二维数据,称为邻接矩阵表示法。有一个二维数组A,对于每条边(u,v),置A[u][v]等于true;否则数组元素就是false。如果边有一个权,那么可以置A[u][v]等于该权,而使用很大或者很小的权作为标记表示不存在的边。虽然这种表示方法的优点是简单,但是,它的空间复杂度为θ(|V|^2),如果图的边不是很多(稀疏的),那么这种表示的代价就太大了。代码如下:
      f351eb62-4a2e-47c8-81e0-be31a3f59347-image.png

      发布在 技术答疑 图的表示方法
      tarao616
      tarao616
    • 回归与分类

        机器学习的主要任务便是聚焦于两个问题:回归与分类。
        回归的定义:机器学习的过程就是寻找函数的过程,通过训练获得一个函数映射,给定函数的输入,函数会给出相应的一个输出,若输出结果是一个数值scalar时,即称这一类机器学习问题为回归问题。就如李宏毅老师所说:Regression就是找到一个函数function,通过输入特征x,输出一个数值scalar。例如:房价数据,根据位置、周边、配套等等这些维度,给出一个房价的预测。
        分类与回归的区别:分类是基于数据集,作出分类选择;分类与回归区别在一输出变量的类型。输出是离散的就可以做分类问题,即通常多个输出,输出i是预测为第i类的置信度;输出是连续的就可以做回归问题 ,即单连续值输出,跟真实值区别作为损失。
      模型步骤

      • step1:模型假设,选择模型框架(线性模型);step2:模型评估,如何判断众多模型的好坏(损失函数);step3:模型优化,如何筛选最优的模型(梯度下降);
        线性模型:step1 模型假设:给定n维输入 x = [x1,x2,....,xn]^T;线性模型有一个n维权重和一个标量偏差 即w与b;输出是输入的加权和 y = w1x1 + w2x2 + ... +wnxn +b
        向量版本 y = <w,x> + b

      • 假设1:影响房价的关键因素是卧室个数,卫生间个数,和居住面积,记为x1,x2,x3

      • 假设2:成交价是关键因素的加权和 则 y = w1x1 + w2x2 +w3x3 + b,权重和偏置的实际值在后面决定。

      • step2 模型评估(衡量预估质量);收集和训练数据;如何判断众多模型的好坏(根据损失函数判断):1.平方损失 y为真实值,y1为估计值(预测值):p(y,y1) = 1/2(y-y1)^2
        2.训练损失:p(X,y,w,b) = ∑(y[i] - (b + <w,x[i]>))^2

      • step3 选取最优模型(梯度下降):为了获得最优模型故要使L(w,b)损失函数值最小化,而对于L(w,b)实质上就是w,b的函数,因此可以通过求偏微分来寻找其最小化损失点。

      8c70f48f-03e9-4e0f-91dd-6f436d9ba305-image.png

      发布在 技术答疑 回归与分类
      tarao616
      tarao616
    • Service Mesh的价值

      无论是单体应用,还是分布式应用,都可以建立在Service Mesh上,mesh上的sidecar支撑了所有的上层应用,业务开发者无须关心底层构成,可以用Java,也可以用Go等语言完成自己的业务开发。
      当微服务架构体系越来越复杂的时候,需要将“业务服务”和“基础设施”解耦,将一个微服务进程一分为二:
      380dae46-f74a-403c-8fa8-25504151c1d1-image.png
      为什么代理会叫sidecar proxy?
      35680da3-2b94-43be-8d4d-51ce0271e54b-image.png
      看了上图就容易懂了,biz和proxy相生相伴,就像摩托车(motor)与旁边的车厢(sidecar)。
      未来,sidecar和proxy就指微服务进程解耦成两个进程之后,提供基础能力的那个代理进程。
      Istio的理论概念是Service Mesh(服务网络),我们不必纠结于概念实际也是微服务的一种落地形式有点类似上面的SideCar模式。

      它的主要思想是关注点分离,即不像SpringCloud一样交给研发来做,也不集成到k8s中产生职责混乱,Istio是通过为服务配 Agent代理来提供服务发现、负截均衡、限流、链路跟踪、鉴权等微服务治理手段。

      Istio开始就是与k8s结合设计的,Istio结合k8s可以牛逼的落地微服务架构。
      istio 超越 spring cloud和dubbo 等传统开发框架之处, 就在于不仅仅带来了远超这些框架所能提供的功能, 而且也不需要应用程序为此做大量的改动,开发人员也不必为上面的功能实现进行大量的知识储备。

      发布在 技术答疑 分布式应用 单体应用 service mesh
      tarao616
      tarao616
    • Popup控件的主要属性

      Popup控件是从FrameworkElement直接继承⽽来的,属于⾮常⾼的层级,我们在使⽤中使⽤的最多的属性就是下⾯这些属性:
      PlacementTarget 表⽰Popup控件的放置的位。
      Popup表示具有内容的弹出窗口,其主要属性为:Child:获取或设置 Popup控件的内容。
      IsOpen:获取或设置一个值,该值指示Popup 是否可见。
      Placement:获取或设置 Popup 控件打开时的控件方向,并指定Popup 控件在与屏幕边界重叠时的控件行为。
      PlacementTarget:获取或设置当打开 Popup 控件时该控件相对于其放置的元素。PopupAnimation:获取或设置Popup 控件的打开和关闭动画。
      StaysOpen:获取或设置一个值,该值指示当 Popup 控件焦点不再对准时,是否关闭该控件。
      Popup主要事件为:Opened:当IsOpen 属性更改为 true 时发生。
      fcd2ca20-deee-4bf7-8684-11bc0709ee28-image.png

      发布在 技术答疑 popup控件
      tarao616
      tarao616
    • 数据库技术

      01d0726a-0a2a-4acd-9952-d0f7a5db7ad0-image.png
       数据技术主要有InnoSQL和NTSDB,NTSDB是最近研发的新产品,预计明年将向外推荐此产品,InnoSQL属于MySQL分支方面的研究大概从2011年开始的,InnoSQL的主要目标是提供更好的性能以及高可用性,同时便于DBA的运维以及监控管理。
      8ef408d1-69d3-40a1-b51d-40d76eab63f2-image.png
       RocksDB是以树的形式组织数据的产品,MySQL有一个MyRocks产品,我们内部将其集成到InnoSQL分支上。这样做的原因是公司有很多业务,很多都是利用缓存保持其延迟,其规模会越来越大,这样就导致缓存、内存成本很高;其业务对延迟要求不是特别高,但要保持延迟稳定(小于50毫秒)。

       RocksDB能够很好地将缓存控制的很好,随着缓存越来越大,有的公司会将其放到HBase上,但是其延迟有时波动会很大,如小米HBase很强,但还是做了一个基于K-V模式的缓存处理,主要解决延迟波动问题。我们主要是基于开源产品来解决,如将RocksDB集成起来解决公司业务对延迟稳定的一些需求。

       InnoRocks由于是基于LSM,因此对写入支持非常好,后续有内部测试数据可以展示。还有就是LSM压缩比很高,网易一种是替换缓存,一种是普通数据库存储,目前还是用InnoDB存储,如果用InnoRocks存储会节省很多存储空间;还有一个就是结合DB做扩展,将其集成到公司内部。
      71aea032-d4cc-4aec-8aee-c783f116386b-image.png
       上图是写入对比,是一个普通的写入测试,其主介质是递增型的,对于两个都是一个顺序读写过程;如果要完全对比还要测试RFID写入测试,这样能够明显反应RocksDB和InnoDB的差距。图中RocksDB写入性能比InnoDB要好,读取性能InnoDB性能比RocksDB。300GB原始数据,分别导入到Inno DB(未压缩)和Inno Rocks后的存储容量对比,Inno DB为315GB左右,Inno Rocks为50 ~ 60GB,存储容量是Inno DB的20%到30%。

       InnoRock一般场景是替换InnoDB写入,因为其写入性能、压缩性能更好、成本也更低。另一方面能够解决InnoDB延迟不稳定,替换大量的缓存应用,只要其对相应时间没有特殊要求。

       大量数据写入场景,比如日志、订单等;需要高压缩以便存储更多的数据,Inno DB --> Inno Rocks;对写入延迟波动比较敏感,HBase --> Inno Rocks;相对较低的延迟要求(10 ~ 50ms)下替换缓存场景(延迟<5ms),节省内存成本, Redis --> Inno Rocks。
      433b2e37-45fb-40b3-8049-c2dd163498a9-image.png

      发布在 技术答疑 数据库技术
      tarao616
      tarao616
    • 订单机器状态机

      状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。
      有限状态机一般都有以下特点:
      第一:可以用状态来描述事物,并且任一时刻,事物总是处于一种状态;
      第二:事物拥有的状态总数是有限的。
      第三:通过触发事物的某些行为,可以导致事物从一种状态过渡到另一种状态;
      第四:事物状态变化是有规则的,A状态可以变换到B,B可以变换到C,A却不一定能变换到C;
      第五:同一种行为,可以将事物从多种状态变成同种状态,但是不能从同种状态变成多种状态。

      状态机这种描述客观世界的方式就是将事物抽象成若干状态,然后所有的事件和规则导致事物在这些状态中游走。最终使得事物“自圆其说”。很多通信协议的开发都必须用到状态机;一个健壮的状态机可以让你的程序,不论发生何种突发事件都不会突然进入一个不可预知的程序分支。
       
      状态机示例:
      503d598b-19ba-4126-b3d7-5ebde6f091a2-image.png
      信息系统是现实世界一种抽象和描述。而业务领域中那些已经发生的事件就是事实,信息系统就是将这些事实以信息的形式存储到数据库中,即:信息就是一组事实

      信息系统就是存储这些事实,对这些事实进行管理与追踪,进而起到提供提高工作效率的作用。
      信息系统就是记录已经发生的事实,信息系统中的状态机基本和事实匹配。即:标识某个事实的完成度。

      业务系统,根据实际业务,具体会有哪些发生的事实需要记录,基本这些事实就至少对应一个状态。需要记录的事实就是一种稳态,一种结果。

      发布在 技术答疑 订单机器状态机
      tarao616
      tarao616
    • 事务的一些操作

      事务的四个ACID特性:

      • 原子性(Atomicity):原子性即这个事务的任务要么全做了,要么全部没做,不能出现做一半这种情况。

      • 一致性Consistency:一致性即数据库中的数据必须满足数据满足数据库的约束。

      • 隔离性Isolation:即事务与事务之间相互不打扰,比如两个事务在实际过程中并不是原子的,两个事务中的语句是交替运行的,但是隔离性就是要保证两个事务之间状态转换不会互相影响。

      • 持久性Durability:就是一旦事务结束,就要将其保存到磁盘中防止丢失。

      • 事务的状态活跃的active:即事务正在运行其中的SQL语句。

      • 部分提交的partially commited:事务执行完成,但是其结果还在内存中保存着,没有刷新到磁盘中。

      • 提交的 commited : 结果成功刷新到磁盘,就从上面部分提交进入该状态。

      • 失败的 failed : 就是事务执行过程出现数据库或操作系统自身的错误,就导致了事务提交失败。中止

      • aborted : 就是事务提交失败,需要将已经修改的语句回滚到事务未执行以前。
        99093374-18eb-4273-a8d7-f2340f7e96fa-image.png

      发布在 技术答疑 事务的一些操作
      tarao616
      tarao616
    • MindSpore中的算子

        算子的调用是构建模型的基础,准确的找到能满足需求的算子并能正确的使用,可以有事半功倍的效果。本次就分享下MindSpore中算子的使用和遇到问题时的解决方法给大家。
      79d7c000-9c2e-4f3a-bcbe-c81022abe924-image.png
        一般情况下在自定义网络模型时会用到各种类型的算子,MindSpore中分为Primitive算子和nn算子,Primitive算子是开放给用户的最低阶算子接口,一个Primitive算子对应一个原语,它封装了底层的Ascend、GPU、AICPU、CPU等多种算子的具体实现,为用户提供基础算子能力。

        还可以继续分为计算算子和框架算子。计算算子主要负责具体的计算,而框架算子主要用于构图,自动微分等功能,都可以从mindspore.ops模块导入使用。同时mindspore.nn模块是对mindspore.ops模块的封装。所以在构建网络模型时建议使用mindspore.nn模块,优点是使用方便,当然如果想要探索更多算子的信息,建议使用mindspore.ops模块。
        需求大致可以分成两种,自定义网络模型时的算子需求和从第三方框架迁移模型时对标算子的需求。

        方法:在mindspore中,可以手动将embedding的padding_idx位置对应的权重初始化为0;并且在训练时通过mask的操作,过滤掉padding_idx位置对应的Loss。MindSpore中与Mask相关的算子有:nn.Dropout、RandomChoicWithMask、NMSWithMask。

        当然即使找到了符合需求的算子,并且单独运行时也没有问题,也不能够避免在加入到自己的项目代码中完全不报错。在算子使用中通常的报错原因是使用的MindSpore版本和参考的教程不一致、算子不支持目前的硬件环境以及传入的参数不符合算子要求,所以为了避免不必要的报错,下面给大家提供几个查看接口的正确姿势:
        根据自己安装的MindSpore版本查找对应版本的接口;第三方模型迁移时建议先通过API映射查找;查看算子是否支持自己的硬件平台以及内存大小;重点:到算子详情页查看参数和参数的类型。

      发布在 技术答疑 mindspore
      tarao616
      tarao616
    • 计算机控制单元的功能

        控制单元是中央处理器(CPU)的子部件,它管理着计算机中所有在这一区域执行的操作。它负责从计算机、指令和数据中获取各种输入,并告诉处理器如何处理它们。由于CPU被认为是计算机的大脑,它有时被称为大脑中的大脑。根据CPU结构的不同,控制单元可能有不同的任务要执行。
      0a0c4b6b-e71f-4122-844e-233b1f8119af-image.png
        什么是指令周期、机器周期和时钟周期?三者有何关系?CPU每取出并执行一条指令所需的全部时间叫指令周期;
      c56eee58-214e-4613-b440-d7c82d91ac9f-image.png
        机器周期是在同步控制的机器中,执行指令周期中一步相对完整的操作(指令步)所需时间,通常安排机器周期长度等于主存周期;

        时钟周期是指计算机主时钟的周期时间,它是计算机运行时最基本的时序单位,对应完成一个微操作所需时间,通常时钟周期等于计算机主频的倒数。

        那么能不能说机器的主频越快,机器的速度就越快,为什么呢?正确的答案是不能说机器的主频越快,机器的速度就越快。原因是因为机器的速度不仅与主频有关,还与数据通路结构、时序分配方案、ALU运算能力、指令功能强弱等多种因素有关,要看综合效果。
      2bd770fe-b2f5-4822-bdaa-3dd227ff8f45-image.png

      发布在 技术答疑 控制单元
      tarao616
      tarao616
    • 如何解构HE2E项目

      首先我们先来了解一下HE2E技术架构图:
      be854668-5e58-4671-8d64-fa7f2ada34df-image.png
      第一步:创建项目:在华为云DevCloud中创建项目时选择DevOps样例项目,即可创建出预置了代码仓库、编译构建、部署等任务的DevOps样例项目,此项目即HE2E项目。
      770458e5-bdec-4b7b-8eef-994759582607-image.png
      代码仓库,HE2E项目中预置了代码仓库phoenix-sample。
      在根目录下可以看到images、kompose、result、vote、worker五个文件夹,以及LICENSE、README.md和docker-compose-standalone、docker-compose两个yml文件。Images文件夹存了几张图片,LICENSE和README也与代码内容无关,docker-compose.yml文件是应用于本地开发时的测试文件。
      在进行代码解构时,对构建任务的部分内容已经进行过分析了,其中就包括如何通过指定Dockerfile文件制作镜像,即docker build(制作)的操作。除此之外,制作XX镜像并推送到SWR的步骤中还包括了推送镜像所需的信息。这里设置了推送区域、组织、镜像名字、镜像标签,其实就是我们进行docker tag(打标签)和docker push(推送)的操作。
      在vote、result、worker的镜像制作并推送的过程中,通过参数BUILDNUMBER定义镜像的版本号。BUILDNUMBER是系统预定义参数,随着构建日期及次数变化。
      worker镜像在制作之前,需要先对worker目录下的工程进行Maven构建,这样就会生成Dockerfile.j2中(制作镜像时)所需的target文件。

      发布在 极客生涯 he2e技术 如何解构he2e项目
      tarao616
      tarao616
    • 存储在计算器上的信息—数据

        自从计算机出现以来,我们一直在尝试寻找计算机存储一些信息的方法,存储在计算机上的信息(也称为数据)有多种形式,数据变得如此重要,以至于信息现在已成为触手可及的商品。多年来数据以多种方式存储在计算机中,包括数据库、blob存储和其他方法,为了进行有效的业务分析,必须对现代应用程序创建的数据进行处理和分析,并且产生的数据量非常巨大!有效地存储数PB数据并拥有必要的工具来查询它以便使用它至关重要,只有这样对该数据的分析才能产生有意义的结果。
        大数据是一门处理分析方法、有条不紊地从中提取信息或以其他方式处理对于典型数据处理应用程序软件而言过于庞大或复杂的数据量的方法的学科。为了处理现代应用程序产生的数据,大数据的应用是非常必要的,考虑到这一点,本文旨在提供一个关于如何创建数据湖的小教程,该数据湖从应用程序的数据库中读取任何更改并将其写入数据湖中的相关位置,我们将为此使用的工具如下:Debezium,MySQL数据库,Apache Kafka,Apache Hudi,Apache Spark等。
      我们将要构建的数据湖架构如下:
      0aa8c431-a4fa-4981-a667-95d091498b8a-image.png
        第一步是使用 Debezium 读取关系数据库中发生的所有更改,并将所有更改推送到 Kafka 集群。
        Debezium 是一个用于变更数据捕获的开源分布式平台,Debezium 可以指向任何关系数据库,并且它可以开始实时捕获任何数据更改,它非常快速且实用,由红帽维护。
        首先,我们将使用 docker-compose 在我们的机器上设置 Debezium、MySQL 和 Kafka,您也可以使用这些的独立安装,我们将使用 Debezium 提供给我们的 mysql 镜像,因为其中已经包含数据,在任何生产环境中都可以使用适当的 Kafka、MySQL 和 Debezium 集群。
        在创建容器后,我们将能够为 Kafka Connect 激活 Debezium 源连接器,我们将使用的数据格式是 Avro 数据格式,Avro 是在 Apache 的 Hadoop 项目中开发的面向行的远程过程调用和数据序列化框架。它使用 JSON 来定义数据类型和协议,并以紧凑的二进制格式序列化数据。
        Apache Hudi 是一个开源数据管理框架,用于简化增量数据处理和数据管道开发。 该框架更有效地管理数据生命周期等业务需求并提高数据质量。 Hudi 使您能够在基于云的数据湖上管理记录级别的数据,以简化更改数据捕获 (CDC) 和流式数据摄取,并帮助处理需要记录级别更新和删除的数据隐私用例。 Hudi 管理的数据集使用开放存储格式存储在云存储桶中,而与 Presto、Apache Hive 和/或 Apache Spark 的集成使用熟悉的工具提供近乎实时的更新数据访问Apache Spark 是用于大规模数据处理的开源统一分析引擎。 Spark 为具有隐式数据并行性和容错性的集群编程提供了一个接口。 Spark 代码库最初是在加州大学伯克利分校的 AMPLab 开发的,后来被捐赠给了 Apache 软件基金会,该基金会一直在维护它。

      发布在 极客生涯
      tarao616
      tarao616
    • Spring Cache缓存框架

        Spring内部支持的缓存,可实现无缝平滑迁移,无需修改业务逻辑。注解缓存的实现依赖于动态代理。
        大多数情况下使用的是注解版、少数情况下也能使用编程版。注解版与业务代码高度解藕,因其依托动态代理技术实现,使用场景上有一定的限制。编程版嵌入业务代码,代码顺序执行,无前置使用条件。
      92f1f7fe-1753-4ff4-91fa-5344b2553188-image.png

      • 核心概念:Spring有一个应用可以有多个缓存管理器,每个缓存管理器可以有多个缓存,每个缓存可以存储多条记录。
      • 缓存管理器:缓存的存储介质不同、缓存连接不同的数据库、缓存值序列化等由缓存管理器配置。缓存管理器有主次之分,默认情况下使用主(首要)缓存管理器。
        当服务内只有一个CacheManager时,默认使用此缓存管理器;当超过一个缓存管理器时,需要使用Primary注解指定默认缓存管理器。
      • 缓存:Cache是一组配置相同缓存的集合,可以理解为命名空间,Spring Cache体系下的缓存生命时间是以Cache为单位的,不支持以Key为单位设置生存时间。不同的业务对应不同的缓存配置,应在缓存处予以区分。

        CacheName应具有显著的业务区分度以及过期时间区分度,并且以全局常量的方式提供,采取集中化管理的方式,禁止采用魔术变量的方式指定CacheName。

      发布在 极客生涯 缓存框架 spring cache
      tarao616
      tarao616
    • Apache Hudi介绍

        Apache Hudi 是一种变更数据捕获 (CDC) 工具,可在不同时间线将事务记录在表中。 Hudi 代表 Hadoop Upserts Deletes and Incrementals,是一个开源框架。 Hudi 提供 ACID 事务、可扩展的元数据处理,并统一流和批处理数据处理。
        以下流程图说明了该过程。 使用安装在 Apache Spark 上的 Hudi 将数据处理到 S3,并从 Vertica 外部表中读取 S3 中的数据更改。
      e3f91fef-320e-427e-a3d7-5ec558e2b3db-image.png
        环境准备:首先需要Apache Spark 环境。 使用具有 1 个 Master 和 3 个 Worker 的 4 节点集群进行了测试。 按照在多节点集群上设置 Apache Spark 中的说明安装 Spark 集群环境。 启动 Spark 多节点集群。
        Vertica 分析数据库。 使用 Vertica Enterprise 11.0.0 进行了测试。AWS S3 或 S3 兼容对象存储。 使用 MinIO 作为 S3 存储桶进行了测试。
        需要以下 jar 文件。将 jar 复制到 Spark 机器上任何需要的位置,将这些 jar 文件放在 /opt/spark/jars 中。

      发布在 极客生涯 变更数据捕获 cdc 工具 apache hudi介绍
      tarao616
      tarao616
    • Master服务器

        从现在开始,我们进入到了 Master 角色对应的服务器。GrpcMasterService 运行的是 gRPC 服务,当收到 RunStepRequest 时候,系统会调用到 RunStepHandler。
      e358d335-9140-444e-9bf5-03cca2a8e9ff-image.png
        MasterGo是目前非常受欢迎的一款本土化的设计工具,它是一款专门为团队协作而诞生的一站式产品设计工具。MasterGo的高性能、高稳定性及安全性已经获得了众多国内设计师的认可。同时,它提供的多人实时协作服务,大大提升了团队协作效率。
      02393e0c-8fb8-4c4c-9021-2f287c100ee7-image.png
        期间,MasterGo使用的是国内服务器,设计师不必翻墙也可以享受到流畅、快速的上网体验。作为一款直接通过网页设计的在线协作设计工具,MasterGo的网页打开及浏览储存速度更快,与平时我们使用的图形设计软件并无差异。只要上网打开电脑网页就能设计,可以有效规避海外服务器网络不稳定的难题,为设计团队带来更流畅的体验。
        对于更多的大型企业来说,如果把设计的资产长期沉淀到海外服务器中,他们需要承担的风险无疑会更大,所以为了规避这个隐患,未来那些具有国内服务器及本地私有化部署优势的国产工具,将会成为这些企业更好的选择,MasterGo自然也不例外。

      发布在 极客生涯 master服务器
      tarao616
      tarao616
    • 增量式编码器原理

        增量式编码器是将设备运动时的位移信息变成连续的脉冲信号,脉冲个数表示位移量的大小。其特点如下:只有当设备运动时才会输出信号。
        一般会输出通道A和通道B 两组信号,并且有90° 的相位差(1/4个周期),同时采集这两组信号就可以计算设备的运动速度和方向。
        通道A和通道B的信号的周期相同,且相位相差1/4个周期,结合两相的信号值:当B相和A相先是都读到高电平(1 1),再B读到高电平,A读到低电平(1 0),则为顺时针转。
        当B相和A相先是都读到低电平(0 0),再B读到高电平,A读到低电平(1 0),则为逆时针转。
        除通道A、通道B 以外,还会设置一个额外的通道Z 信号,表示编码器特定的参考位置。传感器转一圈后Z 轴信号才会输出一个脉冲,在Z轴输出时,可以通过将AB通道的计数清零,实现对码盘绝对位置的计算。
        增量式编码器只输出设备的位置变化和运动方向,不会输出设备的绝对位置。
      9d17afbe-df49-4ba5-9167-820ea81bfa3a-image.png
        对于增量式编码器,其分辨率表示为编码器转轴旋转一圈所产生的脉冲数,即脉冲数/转(Pulse Per Revolution 或PPR)。由第一张图可知,我们的电机PPR为11,即旋转一圈产生11个脉冲。
        如何采集编码器的脉冲数据呢?恰好我们的STM32单片机定时器模式中有一个定时器的编码器模式,我们通常用它来测量脉冲变化值。通过访问计数器cnt的值(编码器模式中使用上下计数)来检测接收到的脉冲数。

      发布在 极客生涯 增量式编码器原理
      tarao616
      tarao616
    • 创建企业级地理数据库

      测试连接:首先打开ArcMap测试本机与Oracle是否可以正常连接,如下图,在右侧找到数据库连接,然后点击添加数据库连接。
      411d4a10-216d-4048-a59e-45d391c54ac8-image.png
      选择Oracle数据,输入实例名和数据库用户的账户密码。
      b4201a4b-b0e2-46cf-9355-549186c5e87e-image.png
      实例名是我们编辑tnsnames.ora时,等号前的名称,如下图:
      8c228eb9-386c-499e-8ffd-c38bf55d883d-image.png
      创建企业级地理数据库:因为企业级数据库是创建在Oracle实例上的,而不是创建在表空间上的,即一旦企业级地理数据库创建成功,数据库内所有表空间都可以存储空间数据,所以一个数据库只能创建一个企业级数据库,简单来说就是把某个Oracle数据库设置成企业级数据库。
      下面我们点击ArcToolBox—数据库管理工具—创建企业级数据库。
      9495aa38-128f-4860-a685-4d1d2eca73e2-image.png
      然后输入数据库实例,数据库管理员密码(sys默认密码是sys),然后创建一个地理数据库管理员(即数据库用户),然后设置用户的表空间,然后选择安装Desktop时使用的许可文件。
      49eab2e3-2677-4566-973d-31e11cfa4aa2-image.png
      创建时会弹出提示框显示创建进度(数据库管理员和表空间不为sde的情况下,创建会提示失败)。

      发布在 极客生涯 创建企业级地理数据库 oracle
      tarao616
      tarao616
    • Burp Scanner是什么

        Burp Scanner是一个进行自动发现 web应用程序的安全漏洞的工具。它是为渗透测试人员设计的,并且它和你现有的手动执行进行的 web应用程序半自动渗透测试的技术方法很相似。

        使用的大多数的 web扫描器都是单独运行的:你提供了一个开始 URL,单击”go”,然后注视着进度条的更新直到扫描结束,最后产生一个报告。Burp Scanner和这完全不同,在攻击一个应用程序时它和你执行的操作紧紧的结合在一起。让你细微控制着每一个扫描的请求,并直接反馈回结果。

        Burp Scanner可以执行两种扫描类型:Active scanning扫描器向应用程序发送大量的伪造请求,这些请求都是有一个基础请求衍生出来的,然后通过分析响应结果来查找漏洞特征。

        Passive scanning扫描器不发送他自己的任何新请求,只分析现有的请求和响应的内容,从这些信息中推断出漏洞。

        你可以在目标应用程序使用两种不同方式:Manual scanning你可以发送其他 Burp工具的一个或多个请求,来对这些特定的请求执行主动或被动的扫描。Live scanning as you browse你可以配置扫描器来自动执行主动或被动的扫描那些你浏览应用程序时经过代理的请求。

        这种自动探测漏洞的方法给渗透测试人员带来了几点好处:通过逐个的请求,能快速可靠地对常规的漏洞进行扫描,这很大程度地减少你的测试精力,还能使你对那些不能进行自动可靠地探测的漏洞直接使用个人经验来判断。每种扫描的结果会被立即显示出来,并通报出在这个请求中包含的其他的测试操作。Burp避免了其他扫描器的令人沮丧的问题,进行一次自动扫描需要 1年的时间,并还不能保证扫描是否有效,或者是否遇到了影响扫描效率的问题。

        Burp精准地控制着要扫描的内容,并对扫描结果和应用程序上的广范围的影响进行实时监控,Burp Spider让你把可靠自动化的优点和人类直观智慧结合起来,常常会得到压倒性的结果。
      adbac13d-94c2-46f0-b890-af9efdb0b7ff-image.png

      发布在 极客生涯 burp scanner 安全漏洞工具
      tarao616
      tarao616
    • Actor model的理解

      actor 是并发计算中的一个基本原语,actor 接收消息并对收到的消息做出响应。
      下面说说我个人对 actor 的理解吧,不一定对,有不对的地方欢迎指正!
      为什么 Actor model 可以解决并发问题?
      首先想想并发问题是如何产生的,对同一个数据进行同时写(或者同时读写)会产生并发问题。所以主需要破坏“同时”这个条件,并发问题就迎刃而解了。
      常用的互斥锁就是这是这种思路,它保证同一时刻只有一个线程可以访问到数据,在锁的保护下,多个线程对数据的访问变成有序的了。
      senders 给 actor 发送消息时,actor 将消息放在了它的邮箱 (Mail) 中,并从邮箱中一条条取出消息来处理。同一时刻,不会有两条消息被处理,这次消息的处理顺序是有序的,因此自然不会有并发问题。
      Actor model 与 CSP:这两者的概念极为相似,都符合生产者消费者模型。
      在 CSP 里面,Producer 往 channel 里投递消息,comsumer 从 channel 里取出消息来处理。
      在 Actor model 中,sender 往 actor 的 mail 里投递信息,actor 从 mail 里取出消息来处理。
      但是两者的关注点不同,CSP 里面生产者关注的是消息队列本身,生产者只负责往消息队列里面投递消息,至于这些消息被谁消费,甚至至可能被多个消费者一起消费,但是它不 care。
      但是 Actor model 中,生产者关注的是特定的消费者,生产者往特定的消费者投递消息,消息只能被之前所指定的消费者消费。
      任何事物都是有两面性的,message queue 的缺点也十分的明显:利用 message queue 可以有效的解决并发问题,但是它也有一个很明显的缺点,那就是调用方没法及时得到处理的结果。
      举个具体的例子:客户端发起一个请求,后端收到请求后,生成了一个对应的消息并放到了消息队列上,有一个消费者不停地从消息队列中取出消息并进行有序消费。但是消息者处理完消息后是无法将处理的结果告诉生产者的。
      这个问题一般有两种解决方法:第一:可以生产者不停对消费者进行轮询,询问消息的结果。第二种方法是消费者消费完消息后,通知生产者。但是这两种方式都会增加系统的复杂度。
      由于 Actor model 在我看来也是基于消费队列的,所以我很好奇它是如何做到将消息的处理结果实时地告诉 senders 的。
      7b91123b-fab7-40bf-afdf-96e25b067736-image.png

      发布在 极客生涯 actor actor model的理解
      tarao616
      tarao616
    • 使用 Citus 分片 PostgreSQL 数据库

        当垂直扩展失败时,我们不得不开始水平扩展我们的报告数据库。这意味着我们需要在多个数据库服务器之间拆分数据和处理。我们还必须缩小包含每个单独数据库实例中统计数据的庞大数据库表。

        这种将数据库数据切片成更小单元的方法称为数据库分片。我们的团队决定使用 PostgreSQL Citus 插件来处理分片。这不是唯一的选择 — 我们考虑使用自定义应用程序级分片,但决定使用 Citus 插件,因为:
      我们有大量复杂的查询,需要同时使用多个不同的分片。Citus 插件自动处理这些复杂的查询并在分片之间分配处理。 它还广泛支持我们运行复杂报告查询所需的 PostgreSQL 功能。该扩展使分片管理相对容易,因此我们不必花费太多精力来管理单独数据库实例中的分片表。

        Citus 基于 coordinator(协调器) 和 worker(工作器)PostgreSQL 数据库实例。worker 持有数据库表分片,coordinator 计划 SQL 查询,以便它们可以跨 worker 之间的多个分片表运行。 这允许将大型表分布在多个服务器上,并分布到更小、更易于管理的数据库表中。写入较小的表更有效,因为数据库索引维护成本降低。此外,写入负载是并行化的,并在数据库实例之间共享。Citus 解决了我们最大的两个痛点:写入效率低下和垂直扩展即将结束。

        Citus 的数据库分片带来了额外的好处,因为新架构加速了我们的报告查询。我们的一些查询命中了多个 worker 实例和分片,Citus 扩展可以对其进行优化以在不同的数据库实例中并行运行它们。 由于较小的表索引和更多资源可用于在单独的 worker 中进行查询处理,因此仅针对单个 worker 分片的查询也会加快速度。
      463eb057-df7c-41fb-91d1-4c9dc7aa5cb0-image.png

      发布在 极客生涯 postgresql citus 分片
      tarao616
      tarao616
    • netty的NIO技术

        netty技术为什么可以这么快呢?这是因为netty底层使用了JAVA语言的NIO技术,并在其基础上进行了性能的优化,取到了其精华成分,虽然netty不是单纯的JAVA nio,但是netty的底层还是基于的是nio技术来实现的。

        nio技术是JDK1.4中引入的,它存在的意义是用于区别于传统的IO,所以nio技术也可以称之为new io。

        nio技术的三大核心是Selector,channel和Buffer,本文我们将会深入探究NIO和netty之间的关系。
        在了解netty中的NIO实现之前,我们先来了解一下JDK中NIO的selector,channel是怎么工作的。对于NIO技术来说selector主要是用来接受客户端的连接,所以selector一般用在server服务端。

        selector中会有一些SelectionKey,而SelectionKey中有一些表示操作状态的OP Status,根据这个OP Status的不同可以区分这几种状态,selectionKey可以有四种状态,它们分别是isReadable状态,isWritable状态,isConnectable状态和isAcceptable状态。

        当SelectionKey处于isAcceptable状态的时候,表示ServerSocketChannel可以接受连接了,我们需要调用register方法将serverSocketChannel accept生成的socketChannel注册到selector中,这样就可以监听它的OP READ状态,后续也可以从中读取数据。
      ab3c2e3e-44c5-4ccd-a252-f6642caf79c0-image.png

      发布在 极客生涯 netty netty的nio技术
      tarao616
      tarao616