摘要: Flink的特点是高吞吐低延迟。但是Flink中的某环节的数据处理逻辑需要和外部系统交互,调用耗时不可控会显著降低集群性能。这时候就可能需要使用异步算子让耗时操作不需要等待结果返回就可以继续下面的耗时操作。下面我们一起来看一下异步算子的源码及其实现吧! 阅读全文
posted @ 2022-10-14 08:35 码小D 阅读(1060) 评论(0) 推荐(0) 编辑
 
摘要: 最近有个需求,需要使用flinksql读写redis,由于官网上并没有redis的connector,在网上找了很久,开源的几个connector又没法满足要求,所有这里就自己动手实现了一个。已经适配了各个版本的flink,从flink1.12到flink1.15 阅读全文
posted @ 2022-10-10 22:35 码小D 阅读(1752) 评论(0) 推荐(1) 编辑
 
摘要: 本文应该是全网唯一一篇自己实现springboot扩展外部接口的文章。包括加载外部扩展jar包中的新接口,多次加载需要能完全更新,加载mybatis、mybatis-plus中放sql的xml文件,加载@Mapper修饰的mybatis的接口资源,加载其它被spring管理的Bean资源,加载完成后更新swagger文档等。绝对黑科技,走过路过不要错过! 阅读全文
posted @ 2021-03-08 09:35 码小D 阅读(3128) 评论(11) 推荐(5) 编辑
 
摘要: 本篇文章主要实现spring/springboot运行时将源码先编译成class字节码数组,然后字节码数组再经过自定义类加载器变成Class对象,接着Class对象注册到spring容器成为BeanDefinition,再接着直接获取到对象,最后调用对象中指定方法,保证硬核! 阅读全文
posted @ 2021-02-08 12:48 码小D 阅读(4273) 评论(6) 推荐(3) 编辑
 
摘要: 又是好久没写博客了,最近好多人,好多公司都在做apaas这种低代码的配置平台,加快软件的研发效率,通过配置和少量代码,生成前后端应用。这种应用既然要写代码,就少不了在自己系统进行断点、单步等调试了,本篇主要是提供一种可以直接拿来即用的线上断点调试的完整实现,同样可以保证是硬核的原创作品,一如既往的声明,看了本篇没有收获,可以评论区骂我 阅读全文
posted @ 2021-02-02 09:57 码小D 阅读(4432) 评论(4) 推荐(2) 编辑
 
摘要: 最近一直没啥时间写点东西,坚持分享真的好难,也不知道该分享点啥,正好有人要问我这些东西,所以腾出点时间,写一下这个主题。同样本篇可以给读者承诺,听不懂或者没收获算我输,哈哈! 众所周知,mysql中读取方式按照是否需要传统意义的锁,分为锁定读和非锁定读两种。锁定读不用多说,那就一堆算法了,行锁,间隙 阅读全文
posted @ 2020-07-27 09:27 码小D 阅读(6471) 评论(12) 推荐(6) 编辑
 
摘要: 之前写过一篇:自己动手实现分布式任务调度框架本来是用来闲来分享一下自己的思维方式,时至今日发现居然有些人正在使用了,本着对代码负责任的态度,对代码部分已知bug进行了修改,并增加了若干功能,如立即启动,实时停止等功能,新增加的功能会在这一篇做详细的说明。 提到分布式任务调度,市面上本身已经有一些框架 阅读全文
posted @ 2019-11-27 10:42 码小D 阅读(2001) 评论(5) 推荐(2) 编辑
 
摘要: 自从上一篇:一个普通类就能干趴你的springboot,你信吗?后,很巧的是这次又发现一个问题,所以有了这篇文章,还是想沿用上篇的”流水帐“的方式查找问题和解决问题。这篇文章主要是因为使用POI导入一个20M的excel发生了OOM(OutOfMemoryError)异常。说来也惭愧,工作了这么多年 阅读全文
posted @ 2019-11-18 09:55 码小D 阅读(3909) 评论(10) 推荐(3) 编辑
 
摘要: 先声明本人并不是标题党,如果看了本篇文章并且认为没有得到任何收获,请您随便留言骂我,本人绝不还口,已经对springboot了如指掌大大神,求放过! 不BB了,直接上代码,请各位在自己的springboot项目随便一个包下复制进去如下类(不要修改什么东西),如果你的springboot还能站起来算我 阅读全文
posted @ 2019-11-04 09:52 码小D 阅读(2587) 评论(18) 推荐(10) 编辑
 
摘要: 好久没写博客了,这段时间主要是各种充电,因为前面写的一些东西,可能大家不太感兴趣或者是嫌弃没啥技术含量,所以这次特意下了一番功夫。这篇博客其实我花了周末整整两天写好了第一个版本,已经开源出去了,同样是像以前那样用来抛砖引玉。下面进入正题! 当我们想在springboot实现一个配置集中管理,自动更新 阅读全文
posted @ 2019-09-23 09:37 码小D 阅读(1958) 评论(2) 推荐(3) 编辑
 
摘要: 前段时间,公司要改造现有的单节点调度为分布式任务调度,然后就研究了目前市面上主流的开源分布式任务调度框架,用起来就一个感觉:麻烦!特别是之前在一个类里写了好多个调度任务,改造起来更加麻烦。我这人又比较懒,总感觉用了别人写好的工具还要改一大堆,心里就有点不舒服。于是我就想自己写一个框架,毕竟自己觉得分 阅读全文
posted @ 2019-03-18 11:37 码小D 阅读(15460) 评论(4) 推荐(4) 编辑
 
摘要: 工作中用到了springboot的缓存,使用起来挺方便的,直接引入redis或者ehcache这些缓存依赖包和相关缓存的starter依赖包,然后在启动类中加入@EnableCaching注解,然后在需要的地方就可以使用@Cacheable和@CacheEvict使用和删除缓存了。这个使用很简单,相 阅读全文
posted @ 2018-05-23 10:14 码小D 阅读(1354) 评论(6) 推荐(2) 编辑
 
摘要: 突然发现之前写的自己实现XXX的话题不是很被大众关注,可能是真的写的不行,也可能是大多都是一些吃了饭没事做瞎写的一些东西,大家都没兴趣,之后可能会尽量写一些真正实用的东西,大家一起学习。言归正传,促使我研究这个话题的原因是在工作中遇到需要自己实现多级缓存的情况。比如在springboot中我们虽然可 阅读全文
posted @ 2018-05-14 11:12 码小D 阅读(1540) 评论(3) 推荐(2) 编辑
 
摘要: 好久没写博客了,依然是按照我喜欢的风格,写一篇自己实现解释型语言。看过我之前的博客应该知道,我写的东西大多只是起到一个抛砖引玉的功能,实际上自己要实现一个框架,语言啥的,都有太多需要考虑的东西,能力有限,精力有限,只能实现一个最基本的框框出来,有兴趣的朋友自己去扩展。 刚学开发语言的时候,那些大牛们 阅读全文
posted @ 2018-04-13 09:43 码小D 阅读(1290) 评论(0) 推荐(2) 编辑
 
摘要: 用过springmvc的可能都知道,要集成springmvc需要在web.xml中加入一个跟随web容器启动的DispatcherServlet,然后由该servlet初始化一些东西,然后所有的web请求都被这个servlet接管。所以自己写mvc的关键就是弄懂这个servlet干了啥。先分析一下s 阅读全文
posted @ 2017-12-10 15:34 码小D 阅读(1216) 评论(0) 推荐(0) 编辑
摘要: 发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客。本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧。 用过mybatis的人,估计对动态sql都不陌生,如果没有用过,就当看看热闹吧。我第一次接触mysql是在大四的时候,当时就觉得 阅读全文
posted @ 2017-12-10 00:29 码小D 阅读(4041) 评论(2) 推荐(1) 编辑
 
摘要: 终于到了激动人心的时刻了,首先感谢小伙伴们的阅读,如果能多点评论,多点探讨就更好了,没有交流让我觉得我写的东西只有标题有点价值,内容只是在浪费大家的时间。为了泪滴下周能写下一个框架orm,请小伙伴们能给点信心。前面3篇中介绍的大都是完成某一个层面的工具式的类,看起来就像是一盘散沙。原因就是缺少一... 阅读全文
posted @ 2014-11-26 08:50 码小D 阅读(2512) 评论(9) 推荐(8) 编辑
  2024年6月4日

1、工具介绍

1.1、应用场景

  • 重复性鼠标键盘操作
  • 少儿编程

1.2、界面介绍

1.3、脚本操作介绍

新增脚本后,选择脚本后,鼠标右键出来一个菜单,有如下几种操作

2、脚本操作

2.1、选择区域

2.1.1、简介

  • 选择区域操作是全局的,一般在脚本最上面使用,选择区域后,该脚本的所有鼠标操作都是在这个区域里面进行的。选择区域操作可以提升性能,不用每次在整个图片范围内搜索图片,当然针对现在个人电脑普遍配置过剩的情况下,其实也无所谓。
  • 如果脚本里不使用选择区域,则所有鼠标操作是在整个屏幕内进行

2.1.2、使用起始图片确定范围

  • 使用左上角右下角两张图片确定一个范围
  • 一般用于区域不绝对固定的情况下,也就是操作的区域会移动,比如:使用模拟器运行游戏,用户可能指不定把模拟器拖动屏幕的哪个位置
  • 向左偏移表示相对于左上角的图片的左上那个点的位置,向左为正,向右为负,向左偏移后区域的右下同样会向右增大2倍的偏移量
  • 向右偏移表示相对于左上角的图片的左上那个点的位置,向上为正,向下为负,向上偏移后区域的右下同样会向下增大2倍的偏移量
  • 向左向右偏移一般用在,找不到合适的左上和右下的标志性的图片,则使用附近的图片加上偏移来确定范围

2.1.3、直接框选确定范围

直接框选常常用于操作的区域位置固定的情况下

2.2、鼠标操作

2.2.1、简介

鼠标操作有如下几种

  • 单击鼠标左键
  • 双击鼠标左键
  • 单击鼠标右键
  • 鼠标移动
  • 鼠标拖动
  • 鼠标滚轮滚动

所有鼠标操作都可以基于图片定位鼠标操作的位置,也可以直接基于绝对坐标定位位置

  • 如果有选择图片,则向右偏移、向下偏移都是针对图片中心点的偏移
  • 如果没有选择图片,则向右偏移、向下偏移都是针对屏幕左上角的原点进行的偏移

注意:每个操作新增后,右侧的配置详情界面都有一个保存,配置后一定要记得保存,不然不生效

前四个鼠标操作都有三种点击目标:图片、文字和相对位置,如下

2.2.2、单击鼠标左键

2.2.2.1、点击图片

如果选择图片:基于图片加上偏移去点击,如果不选择图片,则基于电脑屏幕左上角为(0,0)点做偏移点击

2.2.2.2、点击文字

如果选择图片:基于图片和偏移,确定文字识别范围的左上角的点,加上宽度和高度确定文字识别的整体范围,如果不选择图片,则基于屏幕左上角的点加上宽高确定文字识别范围

2.2.2.3、点击相对位置

如果选择相对位置:基于当前鼠标所在的位置加上偏移确定最终要操作的鼠标位置

2.2.3、双击鼠标左键

双击鼠标左键同单击鼠标左键配置完全一样,只是一个做鼠标单击,一个做鼠标双击

2.2.4、单击鼠标右键

单击鼠标右键同单击鼠标左键配置完全一样,只是一个做鼠标左键单击,一个做鼠标右键单击

2.2.5、鼠标移动

鼠标移动同单击鼠标左键配置完全一样,只是一个做鼠标左键单击,一个只移动过去但是不点击

2.2.6、鼠标拖动

鼠标拖动就是按照鼠标左键进行移动,上半部分配置同单击鼠标左键点击图片的配置完全一样,下半部分体现拖动的距离和方向

2.2.7、鼠标滚动

鼠标滚动上面配置和点击鼠标的点击图片目标是一致的,下面部分确定滚动的方向和滚动强度,其中滚动方向是滚动的目标内容向上或者向下移动,滚动强度是每次移动的强度大小

2.3、键盘操作

2.3.1、简介

键盘操作分为快捷键和文字输入两个操作

2.3.2、快捷键操作

快捷键就是平时使用的那些快捷键,比如ctrl + c、ctrl + v表示复制粘贴,多个按键使用英文逗号分隔就行了,如下win + r打开运行窗口

2.3.3、输入文字

输入文字,还可以用后面会介绍的变量

2.3.4、案例:打开记事本写"hello广州"

整个流程:打开运行窗口->输入notepad命令->回车确认->等待1s弹出记事本->输入文字"hello广州"

2.4、等待操作

2.4.1、简介

等待操作有如下5种

  • 时间等待
  • 定时等待
  • 等待图片
  • 等待文字
  • 全局等待

2.4.2、等待时间

等待指定时间间隔,单位秒,可以使用小数,时间可以使用范围,如1-3秒最终等待时长就是随机取大于等于1小于等于3的一个时长

2.4.3、定时等待

可以通过定时等待,等待到指定的时间

2.4.4、等待图片

通过截图工具选择需要等待的图片,可以选择等待图片出现或者消失,也就是图片存在或者不存在,同时可以指定最多等待的时长,时长单位秒,可以使用小数

2.4.5、等待文字

等待文字的出现或者消失,这里先选择图片和偏移是为了确定文字识别范围的左上角的点,然后指定宽度和高度确定最终文字识别的具体区域,如果不选择图片定位,只指定偏移,则会以屏幕左上角作为文字识别的左上角的点结合宽高确定最终文字识别的区域

2.4.6、全局等待

如果我们整个脚本或者脚本中某些部分都需要在具体操作后加上时间等待,等一小段时间,我们可以直接在最上面加一个全局等待操作,这样之后所有的操作都会自动等待指定的时长,这样简化脚本配置。

2.5、变量操作

2.5.1、简介

变量就是可以改变的数据,变量操作有4种,设置变量、修改变量、文字识别和变量提取。

2.5.2、设置变量

如上配置,设置了变量n,初始值为0,这种变量的值只能是整数

2.5.3、修改变量

如上配置,将n的值加1

2.5.4、文字识别

文字识别首先通过图片、偏移和宽高确定文字识别的区域范围,然后可以选择指定识别文字之后的分隔符,比如识别到文字为:"广州,中国",指定分隔符为:",",分隔后取第1个,保存变量填"city",则运行之后结果为初始化了一个变量:"city",变量值为:"广州"

2.5.5、变量提取

由于文字识别,识别后的文字格式多种多样,自带只有按照分隔符分隔获取文字,这里为了丰富获取文字的方式,才有了变量提取操作。变量提取就是将文字识别之后的文字按照分隔符、固定长度截取和正则提取3中方式提取出自己想要的文字然后保存在变量中

2.5.5.1、分隔符提取

这里和文字识别那里一样,比如先使用文字识别直接将识别到的文字保存到变量:"content"中

然后再使用变量提取,将上面识别到的content变量"广州,中国",按照分隔符:","分隔后,取第一个也就是"广州",保存在变量:"city"中,后续操作中就可以正常使用到整个city变量了

2.5.5.2、固定截取

同样,content变量内容为:"广州,中国",我们也可以使用固定长度截取拿到city,如下:

2.5.5.3、正则提取

我们可以使用正则表达式提取,比如:提取内容:"123aaa456",提取内容中的第一个数值

2.5.4、变量作用域

说人话:一个变量设置之后在哪些范围内可以使用到

结论:变量作用范围为:新产生变量操作(设置变量、文字识别和变量提取操作)之后的(同级操作节点和同级节点的子孙节点)

2.6、日志输出

可以使用英文大括号来使用变量,如{n}表示显示n的值

注意:有一个代表当前时间的内置变量curr_date,使用如下

2.7、条件判断

2.7.1、简介

条件判断就是判断某个或者某些条件满足之后才执行条件判断节点里面的操作,需要注意的是之前学到的所有操作都是从上到下按顺序执行下来的,在程序中属于顺序执行,这里的条件判断只有满足条件才执行条件节点的子孙节点,在程序中属于条件分支执行,也就是可以有很多条件判断,满足不同的条件执行不同的操作。

条件判断操作的有4种方式

  • 图片判断
  • 整数判断
  • 文字判断
  • 按键判断

条件判断操作里面可以放除了选择区域之外的所有操作,当然也可以放条件判断自己(条件嵌套)

2.7.2、图片判断

判断图片存在或者不存在,如果存在就执行条件操作里面的子操作

2.7.3、整数判断

整数判断是判断整数变量是否符合,如果符合就执行条件操作里面的子操作

2.7.4、文字判断

文字判断可以判断文字识别之后的文字,是否符合要求,如果符合要求则执行条件判断操作里的子操作

2.7.5、按键判断

按键判断可以判断键盘中的指定按键按下或者松开,按键名称为:键盘上标识的英文或者数字的小写形式,如删除键为:"delete",回车键为:"enter"

注意:按键按下和按键松开的区别在于,按键按下是一个持续的动作,可以按几秒才松开,这时候如果在循环中使用按键按下判断,可能在一段时间这个条件一直是满足的,但是如果使用按键松开判断,则只会等待按键先按下然后再松开之后条件才满足

2.8、循环执行

2.8.1、简介

循环执行见名知意,将同一个或者多个操作重复执行,比如一段操作:点击A、点击B、点击C,加上循环执行10次后,就会一直按顺序点击A、B、C重复十次,就像我们每天起床、刷牙、吃早餐、工作、下班、吃晚饭、睡觉、每天都重复这些动作直到生命结束。

循环操作操作里面可以放除了选择区域之外的所有操作,当然也可以放循环操作自己(嵌套循环)

循环操作有两种:

  • 循环执行
  • 跳出循环

2.8.2、案例:按顺序点击三个图标,重复三次

2.8.3、案例:按顺序点击三个图标,重复三次,第二次跳出循环

如上配置,首先初始化一个变量N为0,然后循环执行3次,每一轮循环先给N加1,再点击A、B、C,判断当前N等于2,就跳出循环,实际上最终结果依次点击A、B、C,重复了2次

2.9、乱序执行

2.9.1、简介

在某些特殊场景下,我们需要操作不按照特定顺序执行,就需要使用乱序执行操作,乱序执行操作每次执行时会将其下的直接子节点随机打乱顺序执行

注意:乱序执行新增操作新增之后只需要将需要乱序的操作放在其中即可,不需要其它配置

2.9.2、案例:乱序打印1、2、3

如下:多次执行如下

2.10、调用脚本

2.10.1、简介

有时候我们需要在新脚本里的某个地方直接调用现有的脚本,被调用的脚本可以直接共享使用当前脚本的变量

2.10.2、调用脚本

先准备一个被调用的脚本

这个时候,因为没有设置变量n,所以单独运行这个脚本打印的n肯定是空,执行如下:

再配置一个调用脚本

如上,使用调用脚本操作,选择调用之前准备的“被调用脚本”,然后执行”调用脚本操作“如下

可以看出,调用脚本的变量可以传递给被调用脚本

3、迁移学习(可选)

知识点

小D助手

Java

Python

变量

变量操作/设置变量

int n = 0

n = 0

变量作用域

节点之后的同级节点和同级节点的子孙节点

变量声明所在的{}之内

函数、类里面

方法/函数

脚本/新增脚本

public int add(int x,int y) {

return x + y

}

def add(x,y):

return x + y

方法函数调用

调用脚本操作

add(1,2)

add(1,2)

方法函数调用传参

调用脚本操作直接共享当前脚本的所有作用范围内的变量

add(1,2)

add(1,2)

顺序执行

同级节点按顺序执行

不同行的代码按顺序执行

不同行的代码按顺序执行

条件分支

条件判断操作

if(n == 2) {

doThings();

}

if n == 2

do_things();

 

条件嵌套

条件判断操作

条件判断操作

if(n == 2) {

if(m == 2){

doThings();

}

}

if n == 2

if m == 2

do_things();

循环语句

循环执行操作

int n = 0

while(n < 10) {

doThings();

n++;

}

n = 0

while n< 10:

do_things()

n += 1

跳出循环

跳出循环操作

int n = 0

while(n < 10) {

if(n == 5) {

break;

}

doThings();

n++;

}

n = 0

while n< 10:

if n== 5:

break

do_things()

n += 1

循环嵌套

循环执行操作

循环执行操作

int n = 0

int m = 0

while(n < 10) {

while(m < 10) {

doThings();

m++;

}

n++;

}

n = 0

m = 0

while n< 10:

while m< 10:

do_things()

m += 1

n += 1

时间等待

时间等待操作

Thread.sleep(1000)

time.sleep(1)

 

posted @ 2024-06-04 11:14 码小D 阅读(148) 评论(10) 推荐(1) 编辑
摘要: 本文介绍了国产大语言模型ChatGLM3从零开始的本地部署、使用及功能扩展 阅读全文
posted @ 2024-06-04 10:24 码小D 阅读(3532) 评论(0) 推荐(2) 编辑
  2024年5月21日
摘要: 在工作、生活和娱乐中,我们经常遇到一些重复性的鼠标点击操作,我们可能会首先想到使用按键精灵类软件来解放双手,但是它们的使用门槛比较高,还要专门学一门脚本语言。本文介绍的软件完全不需要编程和脚本开发经验,看完就能配置出自己想要的辅助类脚本 阅读全文
posted @ 2024-05-21 10:38 码小D 阅读(3028) 评论(23) 推荐(17) 编辑
  2021年2月5日
摘要: 本篇继续接着《自己动手实现java断点/单步调试(一)》实现断点调试中的单步调试,包括执行下一条,进入方法,跳出方法。 阅读全文
posted @ 2021-02-05 09:23 码小D 阅读(1328) 评论(1) 推荐(0) 编辑
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示