1.Vert.x 源码解析(4.x)——Context源码解析
2.YOLOX目标检测实战:LabVIEW+YOLOX ONNX模型实现推理检测(含源码)
3.arcgis 码下api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
4.PolarDB-X 源码解读(七):私有协议连接的一生(CN篇)
5.ThreadX系列 | 最新v6.1.6版本在MDK中的移植方法
6.如何在 CentOS 7 / RHEL 7 上安装 OpenSSL 1.1.x
Vert.x 源码解析(4.x)——Context源码解析
Vert.x 4.x 源码深度解析:Context核心概念详解 Vert.x 通过Context这一核心机制,解决了多线程环境下的码下资源管理和状态维护难题。Context在异步编程中扮演着协调者角色,码下确保线程安全的码下资源访问和有序的异步操作。本文将深入剖析Context的码下源码结构,包括其接口设计、码下拉源码是那个关键实现以及在Vert.x中的码下具体应用。Context源代码解析
Context接口定义了基础的码下事件处理功能,如立即执行和阻塞任务。码下ContextInternal扩展了Context,码下包含内部方法和功能,码下通常开发者无需直接接触,码下如获取当前线程的码下Context。在vertx的码下beginDispatch和endDispatch方法中,Context的码下切换策略取决于线程类型,Vertx线程会使用上下文切换,而非Vertx线程则依赖ThreadLocal。 ContextBase是ContextInternal的实现类,负责执行耗时任务,内部包含TaskQueue来管理任务顺序。WorkerContext和EventLoopContext分别对应工作线程和EventLoop线程的执行策略,它们通过execute()、runOnContext()和emit()方法处理任务,同时监控性能。 Context的创建和获取贯穿于Vert.x的生命周期,它在DeploymentManager的doDeploy方法中被调用,如NetServer和NetClient等组件的底层实现也依赖于Context来处理网络通信。额外说明
Context与线程并非直接绑定,而是根据场景动态管理。部署时创建新Context,非部署时优先获取Thread和ThreadLocal中的Context。当执行异步任务时,当前线程的Context会被暂时替换,任务完成后才恢复。源码中已加入详细注释,如需获取完整注释版本,可联系作者。 Context的重要性在于其在Vert.x的各个层面如服务器部署、EventBus通信中不可或缺,它负责维护线程同步与异步任务的执行顺序,是异步编程中不可或缺的基石。理解Context的实现,有助于更好地利用Vert.x进行高效开发。YOLOX目标检测实战:LabVIEW+YOLOX ONNX模型实现推理检测(含源码)
LabVIEW实现YOLOX目标检测 本文将介绍如何利用LabVIEW进行YOLOX目标检测的实战操作。YOLOX是由旷视科技开源的高性能实时目标检测网络,通过将解耦头、数据增强、无锚点及标签分类等领域的优秀进展与YOLO进行集成,实现了超越YOLOv3、YOLOv4和YOLOv5的性能,并保持了极高的推理速度。本文将主要关注如何在LabVIEW中部署YOLOX的ONNX模型进行推理。 一、环境搭建 部署环境:所需环境包括LabVIEW软件,以及YOLOX ONNX模型。 LabVIEW工具包:安装LabVIEW ONNX工具包,以实现与ONNX模型的交互。 二、模型的源码2021获取与转化 方式一:直接下载ONNX模型。访问GitHub仓库获取YOLOX的ONNX模型,链接如下:github.com/Megvii-BaseD... 方式二:将训练好的模型pth转换为ONNX。通过下载YOLOX源码、安装库、从基准表下载预训练模型,然后使用特定指令将pth模型转换为ONNX格式。具体步骤如下:1. 安装YOLOX:在YOLOX-main文件夹中执行命令行指令。
2. 安装pycocotools。
3. 下载预训练模型:使用指定链接下载模型文件至特定路径。
4. 将模型pth转换为ONNX:执行相关命令。
三、LabVIEW实现YOLOX ONNX推理检测 加载模型:将转换后的ONNX模型放置至LabVIEW项目中的model文件夹内,配置LabVIEW程序加载模型。 目标检测实现:使用LabVIEW ONNX工具包中的Create_Session.vi加载模型,并选择CPU、CUDA或TensorRT进行推理加速。通过查看模型结构、加载模型及实现目标检测,最终输出检测结果。 四、源码及模型下载 链接:访问百度网盘下载相关源码与模型,链接如下:pan.baidu.com/s/1FMRH1F... 总结:本文详细介绍了在LabVIEW中实现YOLOX目标检测的全过程,包括环境搭建、模型获取与转化、LabVIEW实现推理检测以及源码下载。希望对读者在LabVIEW与人工智能技术应用方面有所帮助。如有疑问或讨论,欢迎在评论区留言,同时也欢迎加入技术交流群。arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js: esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类的介绍,还有就是在线例子: esri 官网在线例子,这个也是学习 arcgis api 3.x 的好素材。
内容概览
基于arcgis api 的 Draw 工具基本绘制 拓展 Draw 工具的绘制 源代码 demo 下载
本篇实现地图态势标绘功能模块
截图如下
本篇核心的在于调用 arcgis api 的 Draw 工具: Draw
构造函数:
一般来说,传参 map 对象进来就行,其他参数可选的,用默认的就行,除非你想专门设置。 默认的可绘制图形类型常量 Constants:
可以设置绘制的符号样式:
其中,activate 函数可以激活触发绘制的行为,绘制结束之后在绘制结束事件里面获取 geometry:
地图态势标绘实现的思路:利用 arcgis api 的 Draw工具实现普通的点线面绘制,但是对于燕尾箭头、集结地、弧线、曲线、简单箭头等特殊的军事态势需要自定义来绘制了,所以需要拓展 Draw 工具才能实现,也是本篇的精华所在。
1是继承拓展 Draw 的文件目录;2是实现态势标绘模块的 js 文件。 首先,需要在 map.html 页面引用进来:
其中,paths 代表需要引用的路径。
其次,在 map.js 文件的初始化里面引用拓展的 js 文件 DrawEx 以及 DrawExt:
最后,在工具栏菜单的态势标绘菜单响应事件里面调用 plot.js 即可:
其次,触发调用 Draw 绘制:
最后,添加绘制图形在地图上展示:
demo源码下载 下载提取码:g5cy
PolarDB-X 源码解读(七):私有协议连接的欧美源码一生(CN篇)
通过前文的介绍,大家基本了解了一条SQL在polardbx-sql中的解析和执行流程。由于polardbx-sql是无状态的计算节点,真正数据需要从存储节点传输到计算节点,这部分工作由私有协议完成。本文将详细介绍从发送请求到存储节点,接收返回数据的完整流程,重点在于私有协议连接的生命周期和关键代码解析。
概述
为了提高数据节点本地计算能力,同时减少网络数据传输量,计算节点会尽可能下推计算内容。一个逻辑表可能需要多个物理分片,因此计算节点与存储节点的请求会话数量会随着分片数增加而增加。传统MySQL协议+连接池架构已不能满足PolarDB-X的需求,因此私有协议在这一需求场景下应运而生。
如图所示,私有协议采用连接与会话分离的RPC协议设计理念,支持多个会话在同一个TCP通道中并行运行,具备流控机制、全双工响应式工作模式和高吞吐、可扩展等特性。
更多关于私有协议解决上述问题的设计详情,可以参考《PolarDB-X私有协议设计》一文。本文主要从代码层面详细描述私有协议的工作流程。
我们将从计算节点和存储节点两个角度完整解析私有协议连接的生命周期。篇幅限制,本文仅关注计算节点上私有协议的处理,存储节点部分将在后续文章中详细说明。
计算节点
计算节点作为私有协议的客户端,负责发送下推请求,并接收返回的数据。
网络层框架
PolarDB-X私有协议网络层采用定制化Reactor框架实现,基于Java的NIO,改进自polardbx-sql中的Reactor框架。网络层初始化时,设置CPU核心数的2倍(上限为)作为NIOProcessor,每个Reactor使用独立的堆外内存池作为收发包缓冲,总缓冲内存大小限制为堆内存大小的%。
NIO接收的包直接调用注册的处理函数,发送数据仅写入send buf,网络写入由单独线程完成。线程优先写入TCP send buf,当无法写入时,注册OP_WRITE事件等待可写后再写入剩余内容。
数据包的编码和解码在NIOClient中实现。为实现最佳性能,解包流程直接在堆外内存上进行,使用protobuf对流直接解析,将结果放入堆内。堆外内存被切分为KB chunk,每个Reactor独占一个chunk,连续解析和复用,最大化接收、解析效率。对于特大包,额外构造堆内大buffer接收和解析,回退标志在定时任务中重置,连续s无超大包时释放堆内内存,恢复高性能堆外KB buffer接收。轻度源码
请求发送集成在NIOClient中,writer优先尝试写入发送缓冲队列尾部的buffer,不足时新申请buffer填充并追加到队尾。buffer来自预分配的堆外缓冲池,超过chunk大小时分配堆内buf进行序列化。
同时,NIOClient负责TCP连接的建立和断开资源释放,作为独立的底层网络资源管理实现。
连接及会话
网络层之后,我们聚焦连接与会话分离的具体实现。通过剥离连接及收发包的具体实现,连接和会话的管理变得更加清晰简洁。
首先,一个TCP连接的逻辑抽象结构在XClient中实现,为避免误解,取名为client与JDBC中的Connection区别。该类管理TCP连接和并行运行的会话,负责TCP完整生命周期的管理、认证鉴权,并维护公共信息。其中,workingSessionMap记录了连接上并行运行的所有会话映射关系,可快速通过会话ID找到对应的会话抽象结构XSession。
XSession提供了所有会话相关的请求函数和信息存储,包括执行计划请求、SQL查询请求、SQL更新请求、TSO请求、会话变量处理、数据包处理及异步唤醒等。
连接池及全局单例管理器
为了提高性能,TCP连接和会话的复用必不可少。由于连接和会话的解绑,连接池不仅缓存了到计算节点的TCP连接,也缓存了到计算节点的会话。
XClientPool管理到一个存储节点的连接池,通过IP,端口,用户名三元组唯一确定目标存储节点,同时存储该节点的全部TCP连接(XClient)和建立的会话(XSession)。
XClientPool实现存储节点会话获取,对应JDBC接口中的getConnection,同时实现连接和会话生命周期管理、连接探活、会话预分配等功能。实现单个存储节点连接池后,XConnectionManager维护目标存储节点三元组到实例连接池的映射,管理定时任务线程池,实现定时探活、会话&连接最长生命控制以及连接池预热等功能。
JDBC兼容层
新的SQL协议层对上层使用者要求较高,为了提高开发效率,私有协议提供兼容JDBC的使用方法,实现从JDBC平滑切换至私有协议,并支持协议热切换。
JDBC兼容层代码目录在compatible目录下,Connection继承在XConnection文件中。提供包括DataSource、bingsns源码Connection、Statement、PreparedStatement、ResultSet、ResultSetMetaData在内的大部分常用接口函数实现,不支持的函数会明确抛出异常避免误用。
整体关系
至此,私有协议计算节点端的大部分结构已说明完成。给出一个整体的关系图。
私有协议连接的一生(CN视角)
了解了私有协议各层实现后,我们以发到存储节点的请求为例,完整梳理执行流程。绕开计算节点复杂流程,直接运行代码示例(注:需将com.alibaba.polardbx.rpc.XConfig#GALAXY_X_PROTOCOL设置为true)。
直接运行playground看到预期的select 1的结果。接下来,我们深入跟踪说明。
数据源初始化
要使用私有协议,需要初始化对应存储节点的XDataSource。构造过程中,XDataSource会到XConnectionManager注册新的实例连接池,已存在的连接池引用计数加一。
获取Connection
当需要执行查询时,首先获取会话。无论是显式开启事务还是使用auto commit事务,会话都是执行请求的最小上下文。通过XDataSource的getConnection方法获取到对应存储节点的会话。XDataSource根据存储的IP,端口,用户名三元组查找到XConnectionManager中的连接池,在最高并发检查后,会话获取逻辑在XClientPool实现。首先尝试在空闲会话池中拿会话,通过重置检查和初始化后返回给调用者。大部分场景下,ConcurrentLinkedQueue提供较好的并发性能。
在代码场景下,数据源刚新建,后台定时任务未运行,流程进入连接创建流程。会有一把大锁锁住连接池,在TCP连接未达上限且没有超时的情况下,快速新建一个XClient占坑。若超限,则进入busy waiting循环。真正的TCP connect(waitChannel)在锁外被调用,首先client以阻塞模式带超时方式connect,然后切换为非阻塞模式,round robin策略注册到NIOProcesser上,返回时,TCP连接已建立。
为了兼顾安全和性能,连接鉴权在TCP建连后只用做一次,会话创建不需要鉴权。鉴权在initClient中完成,发送SESS_AUTHENTICATE_START_VALUE包,后续校验由回调完成。认证采用标准的MySQL认证流程,server端返回challenge值,库名、用户名和加盐hash后的密码返回给MySQL即可完成认证。
至此,到存储节点的TCP连接已建立,创建会话是一个异步流程。在创建新XClient时,XConnection已new好,通过下断点跟进去可看到newXSession流程,分配session id,设置状态为init,将XSession绑定到XConnection上。
最后,XConnection经过初始化(重置auto commit状态)、重置默认DB、默认字符集(lazy操作)和统计信息记录,返回给用户使用。
发送查询请求
拿到初始化好的兼容JDBC的Connection,为了简化流程,直接调用XConnection中的execQuery。XConnection的execQuery包装了XSession的execQuery,执行前执行了设置流式模式。
首先记录调用信息进行统计,进入关键的initForRequest流程。XSession初始化流程lazy,仅分配session id,设置状态为Init,真正创建session时发送SESS_NEW给server,绑定新session和session id。如果session已复用,则状态为Ready。
执行字符集更改的lazy操作,session可能在其他请求中切换字符集,根据目标字符集和当前字符集对比,决定是否发送额外的字符集更改请求。
经过一系列变量设置、lazy DB设置和protobuf包构造,请求发送到存储节点执行。发送后,同步生成XResult负责结果解析,同时XResult按照请求顺序依次拉链表,确保结果与请求一一对应。
请求流水线结构如下图所示,处理完成前序请求后,才能解析后续结果。
接收结果集
请求已发送到存储节点执行,拿到XResult,通过XResult收集查询结果集。XResult与发送请求一一对应,存储节点处理也是在会话上排队进行,不会影响流水线上其他请求的返回,保证流水线正常工作。
首先,查看结果集处理的状态机,主要状态包括获取元数据、获取数据行、获取额外信息等,顺序固定,根据请求类型,部分环节可能被省略。报错处理贯穿整个状态机,任何报错信息都会导致状态机进入错误处理环节。
对于非流式数据读取,请求结束时主动调用finishBlockMode将所有数据读出并缓存到rows中。对于流式执行的情况,结果集状态机消费数据包队列由XResult的next函数推动,内部函数internalFetchOneObject递归调用前序XResult,消费前序请求结果,从数据包队列中消费并推动状态机流转。
对于查询,首先收到RESULTSET_COLUMN_META_DATA包,表示返回数据列定义,一个包表示一列。元数据包后,收到包含数据行的RESULTSET_ROW包,一个包对应一行。数据行传输完成后,server端发送RESULTSET_FETCH_DONE标示数据发送完成。请求结束前,NOTICE包用于告知客户端rows affected等信息。最后,SQL_STMT_EXECUTE_OK包标示请求结束。
至此,完整请求处理完成,控制台应显示查询结果。
总结
本文详细描述了私有协议连接流程中的关键点和关键数据结构,相信通过本文描述,大家掌握了私有协议连接流程的基本点,在调试和修改使用中能够更加得心应手。虽然本文篇幅较长,但实际使用中涉及更多高级特性的使用,如多请求流水线、流控、执行计划传输、chunk结果集传输等。通过本文,我们对私有协议连接流程有了深入理解,为在实际场景中应用提供坚实基础。
ThreadX系列 | 最新v6.1.6版本在MDK中的移植方法
本文分享了在MDK中移植ThreadX系列最新v6.1.6版本的方法,特别强调了更新过程及与之前的移植体验的比较。移植的开发板为小熊派IoT开发板,主控为STMLRCT6。首先,用户需要准备一份包含「正常使用printf串口输出的裸机工程」,推荐使用cubemx生成。
接着,从GitHub开源仓库获取ThreadX源码,将源码添加到MDK工程中。具体步骤包括创建threadX/common分组,将threadX/common/src下的所有c文件添加到此分组,以及新建threadX/ports分组,根据编译环境(例如使用AC5编译器)添加相应的.s文件。设置编译器为AC5,并添加头文件路径,以确保移植过程的顺利进行。
在移植过程中,用户可能会遇到ThreadX官方提供的底层适配文件tx_initialize_low_level.s,该文件中的函数用于处理器的底层初始化。然而,ThreadX在v6版本及其后续版本中对这个文件进行了修改,试图接管处理器的底层初始化,包括设置堆栈环境、重新定义向量表以及接管复位程序,这引起了一些争议。尽管ThreadX的意图可能是为了提供更全面的系统支持,但这种做法在某些方面可能并不合适,因为它直接接管了系统中断,而中断管理通常是操作系统的责任。尽管如此,移植工作仍需继续,用户可以通过创建自定义的适配文件来解决与原始文件的不兼容问题。
具体步骤包括复制tx_initialize_low_level.s文件,并创建自定义适配文件tx_initialize_low_level_bearpi.S,其中包含了对原有代码的修改以适应特定的移植需求。例如,修改与STM启动文件相关的代码,如设置时钟频率、初始化Systick定时器、处理堆栈环境等。在适配文件中,用户需要注释掉ThreadX定义的中断向量表和复位处理程序,并根据实际需求调整底层初始化函数。
此外,为了兼容现有代码,用户需要注释掉HAL库提供的中断服务函数,如PendSV和Systick中断服务函数。完成这些步骤后,用户可以编写应用代码,包括创建任务和启动内核。在main.c中包含ThreadX头文件,并在main函数中初始化内核,以完成整个移植过程。通过编译和下载,用户可以在串口终端观察到系统运行结果。
本文分享的移植过程提供了对最新ThreadX版本在特定环境中的应用指南,以及在遇到官方修改时的调整策略。虽然在某些方面存在争议,但通过适当的适配和调整,用户仍能成功地将ThreadX移植至其目标开发板,实现稳定且高效的操作系统功能。
如何在 CentOS 7 / RHEL 7 上安装 OpenSSL 1.1.x
OpenSSL 是一个开源软件库,包含用于实现传输层安全 (TLS) 和安全套接字层 (SSL) 协议以及其他加密功能的工具和库。在 CentOS 7 / RHEL 7 上,可用的 OpenSSL 版本可能较旧,导致某些应用程序在编译时出错。为了更新到 OpenSSL 1.1.x,首先确认已卸载旧版本。
通过以下步骤在 CentOS 7 / RHEL 7 上安装 OpenSSL 1.1.x:
1. 安装构建 OpenSSL 所需的依赖项。
2. 下载 OpenSSL 1.1.x 的源代码,其中“x”替换为实际版本。
3. 提取下载的文件。
4. 导航至提取文件的目录。
5. 配置 OpenSSL,可能指定安装位置。
6. 使用 make 命令构建 OpenSSL 1.1.x。
7. 在 CentOS 7 / RHEL 7 上安装 OpenSSL 1.1.1。
8. 更新共享库缓存。
9. 更新系统范围的 OpenSSL 配置。
. 重新加载 shell 环境。
. 注销当前的 shell 会话。
. 重新登录并验证 CentOS 7 / RHEL 7 上是否安装了 OpenSSL 1.1.1。
完成这些步骤后,CentOS 7 / RHEL 7 将拥有 OpenSSL 1.1.x 的最新版本,从而解决因旧版本引起的编译问题,并提供更强大的加密功能。保持 OpenSSL 更新并遵循安全实践对于保护网络通信至关重要。
ERP系统源码-云进销存(web+app)搭建附源码(PC+APP+H5+小程序)
企业资源规划(ERP)软件解决方案帮助企业高效管理资源,包括员工、财务和材料。ERP系统通常被称为企业管理系统(EMS)。常见ERP解决方案包括制造执行系统(MES)、客户关系管理(CRM)、供应链管理(SCM)、人力资本管理(HCM)、财务会计与报告(FAR)、项目管理、采购、仓库管理、资产跟踪和库存管理。ERP系统包含多个模块,如会计、销售、市场营销、人力资源、制造、采购、财务、质量保证、供应链、客户关系管理、项目管理等。 源码及演示:x.csymzs.top 安装ERP源码步骤:确保服务器满足ERP系统需求,包括操作系统、数据库、运行环境等。
下载ERP源码,解压至服务器的合适目录。
创建数据库并导入ERP系统所需数据库文件。
配置ERP系统数据库连接信息,包括地址、用户名、密码等。
配置系统基本参数,如网站域名、管理员账号。
配置系统权限和角色,包括用户权限、角色权限。
启动ERP系统,访问网站,按安装向导进行系统初始化。
ERP源码系统常见要求:权限控制、数据管理、采购管理、销售管理、库存管理、财务管理、生产管理、统计分析、接口集成、安全性。 ERP系统在企业中的作用:自动化流程,简化操作,基于数据决策,提高生产力。ERP系统管理销售、市场营销、客户关系和财务等各个方面,跟踪库存、工资、采购、运输等。 ERP系统历史:从制造公司管理工具发展到零售、医疗保健和金融服务等行业的解决方案,从简单系统到集成多应用、多数据源的系统。 ERP系统的好处:提高准确性和生产率、改善报告、增加效率、促进合作。ERP实施可以提高%的效率,提供跨部门数据的单一真实来源,提升决策质量,增强团队协作。 基于云的ERP系统:提供在线金融交易访问和管理,成本低、部署快、维护少。包括供应链管理、人力资源、客户关系管理、会计、项目管理和资产跟踪。 总结:ERP系统在数字化转型中越来越重要,开源ERP源码具有高灵活性、可定制性,降低成本。云计算、大数据技术推动ERP系统向云端、数据驱动转型,引入AI、物联网、区块链等新兴技术。未来ERP源码发展将与新兴技术紧密相关。