TinyLayer 是一个使用 Vue 开发的桌面端轻量级弹窗组件。特点:可同时兼容 vue2 和 vue3,无需为不同版本的 vue 安装不同的依赖包;提供了 5 种弹窗模式,包括:Alert、Confirm、Prompt、全屏 Loading、默认模式;丰富的配置功能,默认模式提供了多达 33 个可选配置项和 9 个可选事件,可满足各种开发需求。
水灵 发布的帖子
-
桌面端轻量级弹窗组件TinyLayer
-
数据集处理框架Datrashim
Datrashim 是一个 Kubernetes 框架,它支持在 pod 中轻松访问 S3 和 NFS 数据集,以协调每个数据集所需的持久卷声明和 ConfigMap 的配置。Datashim 框架引入了 Dataset CRD,它是指向现有 S3 和 NFS 数据源的指针,包括将这些数据集映射到用户可以在其 pod 中引用的持久卷声明和 ConfigMap 的必要逻辑,让他们专注于工作负载开发,而不是配置 / 安装 / 调整数据访问。
-
在 Jenkins 中管理 secret
接下来我们将讨论在 Jenkins 中保护 secret 的一些可用选项。一起来看看将 secrets 安全地注入 Jenkins 流水线的一些最佳实践。
一次性密码 (OTP):一次性密码通过确保用户名/密码组合不能多次使用来帮助防止用户帐户被盗用。虽然该帐户始终保留用户名,但用户每次登录时都会收到一个 OTP。这可以保证 Jenkins 管理员和用户帐户的安全,防止密钥信息泄露。
避免硬编码密钥:删除已硬编码到 CI/CD 配置和 Jenkinsfiles 中的密钥。这样能够让敏感凭证信息不出现在流水线中,避免恶意行为者访问和利用。
将密钥存储在多个 Jenkins 文件:将密钥存储在多个文件中有助于实施凭据最少暴露原则。这样可以让凭据用于尽可能少的应用程序和用户。
使用授权控制来管理密钥权限:开发团队应配置安全检查,以确保请求资源访问的应用程序具有有效应用程序的属性。这些应用程序需要根据 RBAC (Role-based Access Control)策略中分配的权限访问各种资源。
遵循最小权限原则:仅将权限授予需要访问流水线内密钥的应用程序。团队应始终如一地审核权限,确保在流水线的整个生命周期中最小权限原则得以实施和维护。
管理和存储密钥这一节我们将会介绍3个实际使用密钥的Jenkins和Akeyless密钥管理平台的基本例子:第一个例子是完全不安全的示例:使用纯文本环境变量来存储敏感凭据;第二个例子则是使用原生的Jenkins功能和插件来进行密钥管理;第三例子将会展示使用第三方工具来进行密钥管理的好处。 -
NU Radio 是什么
GNU Radio 是一个免费、开源的软件开发工具包,通过提供信号处理 “块” 以帮助开发者实施软件无线电。
它易于和一些低成本的RF硬件外设一起使用,也可以纯模拟使用。它广泛应用于研究、行业、学术界、政府和业余爱好者中,大大推动无线电技术的发展。
下面显示了 GNU Radio Companion 可视化编辑器中的示例流程图:
GNU Radio 是一个方便用户设计、仿真、及部署功能强大现实世界无线电系统的框架。
它是高度模块化的,将各种信号处理功能做成丰富的 “块” 库;
它具备面向 “流程图” 的设计模式,用户可像画流程图的方式,将 “块” 有序连起来,构成复杂的信号处理应用程序;
GNU Radio 已大量用于现实世界中,包括:音频处理、移动通信、卫星跟踪、雷达系统、GSM 网络、世界数字广播。
就其本身而言,GNU Radio 没有限制说只能和某一特定硬件配合使用,它也不提供特定无线电通信标准(例如:802.11,Zigbee,LTE...)的开箱即用服务,但它可以用于开发基本上任何频段的通信标准的实现。 -
串口调试助手OSDA
OSDA 是一个采用 WPF Microsoft .NET Framework 4.6.1 框架、MVVM 模型开发,以 MIT 协议授权的串行端口调试助手。基础功能(打开、关闭、接收、发送、清接收区、清发送区和清空计数)、十六进制(HEX)接收,十六进制(HEX)发送、自动发送,保存接收,路径选择及编码方式、流控制(握手协议、控制协议)信号控制、信号检测、暂停接收、发送信号。
-
axios&spring前后端分离传参规范总结
前后端分离开发的场景下,开发人员的工作内容更加专注与专业,但是也产生了一些额外的沟通成本。比如:本文中为大家说明的前后端参数传递与接受方法。
本文主要是面对前端使用axios,后端使用Spring进行参数接受的情况进行说明。在使用spring的时候,与前端配合开发,容易出现传参歧义的2个注解是:
- @RequestParam注解,默认接收Content-Type: application/x-www-form-urlencoded编码格式的数据;
- @RequestBody注解,默认接收JSON类型格式的数据。
- @RequestPar*am注解对应的axios传参方法:以下面的这段Spring java代码为例,接口使用POST协议,需要接受的参数分别是tsCode、indexCols、table。针对这个Spring的HTTP接口,axios该如何传参?有几种方法?我们来一一介绍。
@RequestBody的axios传参方法:java代码部分如下所示,DemoModel类是一个实体类,包含名称tsCode,indexCols,table三个字符串成员变量。接收到的JSON格式参数会自动为demo对象的成员变量赋值。
-
串口助手软件comNG
comNG 是一款具有现代化 UI 设计并且功能强大的串口助手软件。comNG 区别于其他串口助手的地方在于其强大的 “现场数据分析 “ 能力。简单来说就是 comNG 提供的多种功能以帮助用户更方便的分析打印输出文本。这些功能包括:内建的 comNGLang 高亮语法,内建的手动文本高亮功能(类似于 notepad++ 的 Style Token);搜索文本高亮 (类似于 vscode 的搜索文本高亮);选择文本高亮 (类似于 vscode 的选择文本高亮);基于文本内容的中断功能,全新的功能、日志文档的签名(时间和姓名);跨平台:Windows, Mac OS 以及 Ubuntu 等 Linux 系统
-
Spring Boot + K8S
如果不用 Spring Cloud,那就是使用 Spring Boot + K8S。Spring Boot 基础就不介绍了,推荐下这个实战教程:
这里就需要介绍一个项目,Spring Cloud Kubernetes,作用是把kubernetes中的服务模型映射到Spring Cloud的服务模型中,以使用Spring Cloud的那些原生sdk在kubernetes中实现服务治理。
具体来说,就是把k8s中的services对应到Spring Cloud中的services,k8s中的endpoints对应到Spring Cloud的instances。这样通过标准的Spring Cloud api就可以对接k8的服务治理体系。项目地址:
https://github.com/javastacks/spring-boot-best-practice -
从cpu谈Java 内存模型
Java 内存模型是并发编程的基础,只有对 Java 内存模型理解较为透彻,我们才能避免一些错误地理解。Java 中一些高级的特性,也建立在 Java 内存模型的基础上,例如:volatile 关键字。为了让大家能明白 Java 内存模型存在的意义,本篇文章将从计算机硬件出发,一路写到操作系统、编程语言,一环扣一环的引出 Java 内存模型存在的意义,让大家对 Java 内存模型有较为深刻的理解。
我们知道计算机有 CPU 和内存两个东西,CPU 负责计算,内存负责存储数据,每次 CPU 计算前都需要从内存获取数据。我们知道 CPU 的运行速度远远快于内存的速度,因此会出现 CPU 等待内存读取数据的情况。
由于两者的速度差距实在太大,我们为了加快运行速度,于是计算机的设计者在 CPU 中加了一个CPU 高速缓存。这个 CPU 高速缓存的速度介于 CPU 与内存之间,每次需要读取数据的时候,先从内存读取到CPU缓存中,CPU再从CPU缓存中读取。这样虽然还是存在速度差异,但至少不像之前差距那么大了。
随着技术的发展,多核 CPU 出现了,CPU 的计算能力进一步提高。原本同一时间只能运行一个任务,但现在可以同时运行多个任务。由于多核 CPU 的出现,虽然提高了 CPU 的处理速度,但也带来了新的问题:缓存一致性。在多 CPU 系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存,如下图所示。当多个 CPU 的运算任务都涉及同一块主内存区域时,可能导致各自的缓存数据不一致。如果发生了这种情况,那同步回主内存时以哪个 CPU 高速缓存的数据为准呢?
-
DataSource数据源配置
DataSource整体情况:SpringBoot为DataSource提供了两种最为常见的默认配置:面向TomcatT的JDBC;面向Apache的DBCP;至于具体使用哪一个,主要是看项目pom.xml中引入了哪个jar了。
对于使用SpringBoot默认配置的项目而言,SpringBoot默认使用的是Tomcat容器,所以默认情况也是使用的Tomcat的JDBC的DataSource及其连接池。
配置多数据源
在大型的项目中,可能会涉及到服务需要同时连接多个数据库进行数据操作的场景,这里就会涉及到多个DataSource的配置。 -
数据模型转换
因为既有MySQL,又有ES,所以有2种异构的数据模型。需要在代码中定义2种数据模型,并且实现类型互相转换的工具类。MySQL数据VO;ES数据VO;MySQL数据VO、ES数据VO互相转换工具;业务层BO;接口DTO。
ES之所以比MySQL,能胜任多维度查询、全文检索,是因为底层数据结构不同:
-
ES倒排索引:如果是全文检索字段:会先分词,然后生成 term -> document 的倒排索引,查询时也会把query分词,然后检索出相关的文档。相关度算法如TF-IDF(term frequency–inverse document frequency),取决于:词在该文档中出现的频率(TF,term frequency),越高代表越相关;以及词在所有文档中出现的频率(IDF,inverse document frequency),越高代表越不相关,相当于是一个通用的词,对相关性影响较小。
-
如果是精确值字段:则无需分词,直接把query作为一个整体的term,查询对应文档。因为文档中的所有字段,都生成了倒排索引,所以能处理多维度组合查询MySQL
-
B+树:B+树的非叶子节点记录了孩子节点值的范围,而叶子节点记录了真正的一组值,并且在同一层,形成了一个有序链表.
组合索引需要显式创建:选择需索引的字段、并且顺序是重要的,所以如果待查询的字段不在索引中,就无法高效查询,可能演变为全表扫描(对聚簇索引的叶子节点做一次遍历)
节点分为主节点、数据节点,一个节点上可以有多个分片,分片分为主分片、副本分片,1对多,主分片与副本分片分布在不同的节点,来实现高可用。
主分片数在创建时,就需要指定,在创建后不能随意更改(如果变化,路由就会出错);而副本分片可以增加,来提高ES集群的查询QPS路由算法:id % 主分片数,如果创建文档时不指定id,则ES会自动生成;一般会传自定义业务id
-
-
JoJo风格图像生成器JoJoGAN
JoJoGAN 是用于生成 JoJo 风格图像的工具,此项目基于 PyTorch 实现,对于眼睛的形状、线条的粗细等方面的细节表现非常出色。项目的大概运行过程是,给定参考样式图像,使用 GAN 逆映射近似配对真实数据,并使用该近似配对数据对预训练的 StyleGAN 进行微调。
-
通过SingleFlight学习go并发编程
我们通过通过SingleFlight模式学习go语言并发编程的作用是要做到将并发请求合并成一个请求,以减少对下层服务的压力。
应用于查询缓存时,合并请求,提升服务性能等性能。假设有一个 IP 查询的服务,每次用户请求先在缓存中查询一个 IP 的归属地,如果缓存中有结果则直接返回,不存在则进行 IP 解析操作。
n 个用户请求查询同一个 IP(8.8.8.8)就会对应 n 个 Redis 的查询,在高并发场景下,如果能将 n 个 Redis 查询合并成一个 Redis 查询,那么性能肯定会提升很多,而 SingleFlight就是用来实现请求合并的,能够防止缓存击穿。
缓存击穿问题是指:在高并发的场景中,大量的请求同时查询一个 key ,如果这个 key 正好过期失效了,就会导致大量的请求都打到数据库,导致数据库的连接增多,负载上升。
通过SingleFlight可以将对同一个Key的并发请求进行合并,只让其中一个请求到数据库进行查询,其他请求共享同一个结果,可以很大程度提升并发能力。
-
如何通过全埋点来实现手势的采集
苹果为了降低开发者在手势事件处理方面的开发难度,定义了一个抽象类 UIGestureRecognizer 来协助开发者。UIGestureRecognizer 是具体手势识别器的抽象基类,它定义了一组可以为所有具体手势识别器配置的常见行为。它还可以通过设置委托(即实现了 UIGestureRecognizerDelegate 协议的对象),来支持对某些行为进行更细粒度的定制。
手势识别器必须被添加在一个特定的视图上(比如 UILabel、UIImageView 等控件),即需要通过调用 UIView 类中的 - addGestureRecognizer: 方法进行添加。手势识别器也是用了 Target-Action 设计模式。当我们为一个手势识别器添加一个或者多个 Target-Action 后,在视图上进行触摸操作时,一旦系统识别了该手势,就会向所有的 Target 对象发送消息,并执行 Action 方法。
虽然手势识别器和 UIControl 类一样,都是使用了 Target-Action 设计模式,但是手势识别器并不会将消息交由 UIApplication 对象来进行发送。因此,我们无法使用与 UIControl 控件相同的处理方式,即通过响应者链的方式来实现对手势操作的全埋点。由于 UIGestureRecognizer 是一个抽象基类,所以它并不会处理具体的手势。因此,对于轻拍(UITapGestureRecognizer)、长按(UILongPressGestureRecognizer)等具体的手势触摸事件,需要使用相应的子类即具体的手势识别器进行处理。
常见的具体手势识别器有:
UITapGestureRecognizer:轻拍手势;
UILongPressGestureRecognizer:长按手势;
UIPinchGestureRecognizer:捏合手势或者缩放手势;
UIRotationGestureRecognizer:旋转手势;
UISwipeGestureRecognizer:轻扫手势;
UIPanGestureRecognizer:平移手势;
UIScreenEdgePanGestureRecognizer:屏幕边缘平移手势。给上面所有的具体手势识别器添加 Target-Action 的方法都是相同的,常见的主要是通过以下的两个方法进行添加。分别是:initWithTarget:target action方法和addTarget:action方法。
在数据采集中,一般只需要采集常见控件(UILabel、UIImageView)的轻拍和长按手势。
所以,我们分别介绍如何实现控件轻拍和长按手势的全埋点。为了采集控件的轻拍手势,我们可以通过 Method Swizzling 交换 UITapGestureRecognizer 类的添加 Target-Action 的方法,从而可以添加一个新的 Target-Action,并在新添加的 Action 方法中触发 $AppClick 事件,从而就可以达到采集控件轻拍手势全埋点的效果。
在 UITapGestureRecognizer 类中,用于添加 Target-Action 方法有两个: initWithTarget:action和 addTarget:action。
-
基于Vue3.0的桌面端组件库Element Plus
Element Plus,由饿了么大前端团队开源出品的一套为开发者、设计师和产品经理准备的基于 Vue 3.0 的组件库,提供了配套设计资源,帮助你的网站快速成型。Element Plus 使用 TypeScript + Composition API 进行了重构,主要有: 使用 TypeScript 开发,提供完整的类型定义文件;使用 Vue 3.0 Composition API 降低耦合,简化逻辑;使用 Vue 3.0 Teleport 新特性重构挂载类组件;使用 Lerna 维护和管理项目;使用更轻量更通用的时间日期解决方案 Day.js;升级适配 popperjs, async-validator 等核心依赖;完善 52 种国际化语言支持。
-
控制单元的功能和设计
首先我们来了解一下什么是指令周期、机器周期和时钟周期?三者有何关系?其实CPU每取出并执行一条指令所需的全部时间叫指令周期;而机器周期就是在同步控制的机器中,执行指令周期中一步相对完整的操作(指令步)所需时间,不过通常安排机器周期长度等于主存周期;
时钟周期则是指计算机主时钟的周期时间,它是计算机运行时最基本的时序单位,对应完成一个微操作所需时间,通常时钟周期等于计算机主频的倒数。
而不能说机器的主频越快,机器的速度就越快。因为机器的速度不仅与主频有关,还与数据通路结构、时序分配方案、ALU运算能力、指令功能强弱等多种因素有关,要看综合效果。
指令ADD R1,X完成将R1寄存器的内容和主存X单元的内容相加,结果存于R1的操作。
指令ISZ X完成将主存X单元的内容增1,并根据其结果若为0,则跳过下一条指令执行。设采用单总线结构的CPU数据通路如下图所示,且ALU输入端设两个暂存器C、D。并设采用同步控制,每周期3节拍:
-
全栈Web开发框架Remix
Remix 是一个新的全栈式 JavaScript 框架,它摆脱了静态网站的生成,并且在其他方面做了一些与我们常用的其他框架不同的事情。它依靠 React 来渲染用户界面,如果你熟悉 Next.js,你肯定能发现很多相似之处。但它也有自己的特点,比如嵌套路由、数据获取和数据保存的处理以及错误处理等。此前 Remix 并非开源项目,其个人和企业许可证的售价分别为每年 250 美元和每年 1000 美元。
-
Atom实时协作工具teletype
teletype 是一个 Atom 包,可让开发人员与团队成员共享工作区,并实时协作处理代码。该软件包由三个主要组件提供支持:teletype-crdt:启用协作编辑功能的字符串序列 CRDT。teletype-server:用于链接协作者的服务器端应用程序。teletype-client:管理与其他客户端交互的与编辑器无关的库。
-
强大的提要解析器gofeed
gofeed库是一个强大的提要(feed)解析器,支持解析 RSS、Atom 和 JSON 提要。该库提供了一个通用模型gofeed.Parser,它可以解析所有提要类型,并将其转换为混合gofeed.Feed模型。gofeed库由一个通用提要解析器 gofeed. Parser和几个特定类型解析器(rss.Parser 、atom.Parser、json. Parser)如果要同时处理 rss、atom 和 json 提要,那么使用gofeed. Parser,如果只解析一种提要类型,就使用对应的解析器,gofeed会尽最大努力解析损坏的和无效的 XML 提要。