自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 收藏
  • 关注

原创 借助jTessBoxEditor工具训练tesseract识别库

ocr训练

2022-11-10 17:00:57 884 1

原创 tesserocr识别图片

图片识别

2022-11-09 16:57:52 616

原创 uibot连接infromix数据库

备注:将infromix驱动和fastjson存放到\jdk1.7.0_80\jre\lib\ext。备注:将class放入UiBot Community\5.6.0\extend\java中。infromix驱动4.10.10.0。

2022-08-19 17:26:20 588

原创 二叉树的介绍

什么是二叉树二叉树。二叉树是一种特殊的树。它的每个结点至多只有两棵子树二叉树的性质二叉树中,第 i 层最多有 2i-1 个结点。如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。满二叉树如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。满二叉树除了满足普通二叉树的性质,还具有以下性质:满二叉树中第 i 层的节点数为 2^(n-1)个。深度为 k 的满二

2022-03-22 11:13:43 849

原创 查找算法-插值查找

插值查找原理:插值查找算法类似于二分查找, 不同的是插值查找每次从自适应 mid 处开始查找改变二分查找的区间缩减策略,根据搜索的值来确定区间缩减幅度,使其不再是固定的1/2,这种想法就是“插值查找”如果目标值key和左边界值a[low]差的多,则中间位置mid更靠右;如果目标值key和左边界值差的少,则中间位置mid更靠左。也就是说,插值查找算法的中间位置mid不是真的在中间了,而是根据目标值和边界值的关系动态的确定package com.picc.http;public class

2022-03-16 16:49:42 213

原创 查找算法-斐波那契

1.黄金分割法基本介绍黄金分割点是指把一条线段分割为两部分, 使其中一部分与全长之比等于另一部分与这部分之比。 取其前三位数字的近似值是 0.618斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例, 无限接近黄金分割值0.6182.黄金分割法原理斐波那契思想与二分法相类似,不过中间点不再是中点,而变成了黄金分割点的附近mid=low+F(k-1)-1,F代表斐波那契数列对于F(k-1)-1的含义的理解F代表的斐

2022-03-16 10:20:10 473

原创 查找算法-二分查找法

核心思想二分查找算法的前置条件是,一个已经排序好的序列。这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止public class BinarySearch { private static int i=0; public static void main(String[] args) { int[] arr={10,

2022-03-08 14:20:09 168

原创 排序算法-基数排序

添加链接描述

2022-03-02 14:15:36 326

原创 排序算法--快速排序

快速排序的基本思想:快速排序所采用的思想是分治的思想。所谓分治,就是指以一个数为基准,将序列中的其他数往它两边“扔”。比它小的都“扔”到它的左边,比它大的都“扔”到它的右边,然后左右两边再分别重复这个操作,不停地分,直至分到每一个数的左边的数都小于或等于这个数,右边都等于或大于这个数。这时排序也就完成了。import java.util.Arrays;public class QuickSort { public static void main(String[] args) {

2022-02-24 10:39:59 304

原创 排序算法--希尔排序

希尔排序核心思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序; 随着增量逐渐减少,每组包含的关键词越来越多, 当增量减至1时,整个文件恰被分成一组,算法便终止...

2022-02-22 15:10:38 274

原创 排序算法--选择排序

选择排序的核心思想第一次从 arr[0]-arr[n-1]中选取最小值,与 arr[0]交换, 第二次从 arr[1]-arr[n-1]中选取最小值, 与 arr[1]交换, 第三次从 arr[2]-arr[n-1]中选取最小值, 与 arr[2]交换, …, 第 i 次从 arr[i-1]-arr[n-1]中选取最小值, 与 arr[i-1]交换, …, 第 n-1 次从 arr[n-2]-arr[n-1]中选取最小值,与 arr[n-2]交换, 总共通过 n-1 次, 得到一个按排序码从小到大排列的有

2022-02-22 13:44:26 205

原创 排序算法--插入排序

插入排序的核心思想把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表只包含一个元素,无需表包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表的适当位置,使之成为新的有序表import java.util.Arrays;/** * 插入排序 */public class InsertSort { public static int[] insertSort(int[] arr){ int

2022-02-22 11:20:49 276

原创 javascript网络请求

1.所有现代浏览器都通过 XMLHttpRequest 构造函数原生支持 XHR 对象:let xhr = new XMLHttpRequest();2.使用 XHR 对象首先要调用 open()方法。调用 open()不会实际发送请求,只是为发送请求做好准备// 1.请求方式// 2.url// 3.是否异步xhr.open("get", "example.php", false);3.要发送定义好的请求,必须像下面这样调用 send()方法:send()方法接收一个参数,是作为请求体发

2022-01-09 17:54:49 1904 1

原创 用户界面事件

用户界面事件1.load:在 window 上当页面加载完成后触发,在窗套frameset上当所有窗格frame都加载完成后触发,在img元素上当图片加载完成后触发,在object元素上当相应对象加载完成后触发2.unload:在 window 上当页面完全卸载后触发,在窗套上当所有窗格都卸载完成后触发,在object元素上当相应对象卸载完成后触发3.abort:在object元素上当相应对象加载完成前被用户提前终止下载时触发4.error:在 window 上当 JavaScript 报错时触发,

2021-12-25 19:39:12 332

原创 事件处理程序

事件意味着用户或浏览器执行的某种动作。比如,单击( click)、加载( load)、鼠标悬停。为响应事件而调用的函数被称为事件处理程序(或事件监听器)。1.HTML事件处理程序方式一:<input type="button" value="点击" onclick="alert('HTML事件处理程序')"/>方式二:调用在其他地方定义的脚本<input type="button" value="点击" onclick="showMessage()"/><sc

2021-12-22 20:31:53 753

原创 javascript中json解析和序列化

JSON.stringify()把一个 JavaScript 对象序列化为一个 JSON 字符串。第一个参数是过滤器,可以是数组或函数;第二个参数是用于格式化缩进结果let book = { title: "Professional JavaScript", authors: [ "Nicholas C. Zakas", "Matt Frisbie" ], edition: 4, year: 2017};let jsonText

2021-12-19 21:05:43 564

原创 BOM用法详解

因为 window 对象被复用为 ECMAScript 的 Global 对象,所以通过 var 声明的所有全局变量和函数都会变成 window 对象的属性和方法。var age=29;var sayAge=function(){ alert("我是window方法")}alert(window.age);window.sayAge()如果在这里使用 let 或 const 替代 var,则不会把变量添加给全局对象:let age = 29;const sayAge = fun

2021-12-16 21:05:24 354

原创 javascript迭代器

迭代器(Iterator)是一种机制(接口):为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成遍历操作[for of 循环]1.拥有next方法用于依次遍历数据结构的成员2.每次遍历返回的结果是一个对象{done:false,value:xxx}done:记录遍历是否完成value:当前遍历的结果必须暴露一个属性作为“默认迭代器”,而且这个属性必须使用特殊的 Symbol.iterator 作为键。这个默认迭代器属性必须引用一个迭代器工厂函数,调用这个工

2021-12-08 20:09:41 3311 1

原创 经典的闭包问题

这里使用 var 关键字声明了循环迭代变量 i,但这个变量并不会被限制在 for 循环的块级作用域内。因此,渲染到页面上之后,点击每个div都会弹出元素总数。这是因为在执行单击处理程序时,迭代变量的值是循环结束时的最终值,即元素的个数。而且,这个变量 i 存在于循环体外部,随时可以访问。<html> <body> <div style="width: 100px; height: 100px; background-color: red;">

2021-12-07 19:00:42 313

原创 Promise的介绍

异步处理方案回调处理未来值function add(getX, getY, cb) { var x, y; getX(function (xVal) { console.log('xxxxxxxx',x,y,xVal) x = xVal; // 两个都准备好了? if (y != undefined) { cb(x + y); // 发送和 } }); getY(function (yVal) {

2021-11-30 16:22:44 630

原创 JS中的事件循环

javascript 单线程指的是浏览器中负责解释和执行 javascript 代码的只有一个线程,即为 js 引擎线程,但是浏览器的渲染进程是提供多个线程的,如下:js 引擎线程事件触发线程定时器触发线程异步 http 请求线程GUI 渲染线程事件循环和事件队列的维护是由事件触发线程控制的。事件触发线程线程同样是由浏览器渲染引擎提供的,它会维护一个事件队列。js 引擎遇到上文所列的异步任务后,会交个相应的线程去维护异步任务,等待某个时机,然后由事件触发线程将异步任务对应的回调函数加入到

2021-11-21 12:48:25 312

原创 原型链机制

js中的对象有一个特殊的Prototype内置属性,其实就是对于其他对象的引用。var anotherObject={ a:2}//创建一个关联到 anotherObject 的对象var myObject=Object.create(anotherObject);console.log(myObject.a) // 2当你试图引用对象的属性时会触发[[Get]]操作,首先是检查对象本身是否有这个属性。如果有的话就使用它。但如果属性不在对象中,就会继续访问对象的[[Prototype

2021-11-18 19:01:06 483

原创 js对象介绍

对象可以通过两种形式表示1.声明文字形式var myObj={ key:value}2.构造形式var myObj=new Object();myObj.key=value;类型简单基本类型string,boolean,number, null,undefined内置对象 String,Number,Boolean,Object,Function,Array,Date,RegExp,Errorvar str='i am a string';console.log(typeof s

2021-11-18 10:10:24 518

原创 this绑定规则

默认绑定function foo(){ console.log(this.a)}var a=2;foo(); // 2声明在全局作用域中的变量(var a=2)就是全局对象的一个同名属性。在调用foo()时,this.a被解析成了全局变量a。因为在本例中,函数调用时应用了this的默认绑定,因此this指向全局对象。在代码中,foo()是直接使用不带任何修饰的函数引用进行调用的,因此只能是默认绑定function foo(){ console.log(this.a)}va

2021-11-09 16:51:30 256

原创 作用域闭包

闭包有3个特性:①函数嵌套函数②函数内部可以引用函数外部的参数和变量③参数和变量不会被垃圾回收机制回收function outter(){ var name='dov' function innter(){ return name; } return innter}var innter=outter();console.log(innter())outter()返回了一个具名函数inner,这个函数在outter()作用域内部,所以它可以获取

2021-11-08 19:31:19 375

原创 变量和函数声明提升

引擎会在解释javascript代码之前首先对其进行编译,编译阶段中的一部分就是找到所用的声明,并用合适的作用域将它们关联起来。因此,包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。a=2;var a;console.log(a); // 2很多人会认为是undefinedvar a;这个声明是在编译阶段进行的,a=2会被留在原地等待执行阶段console.log(a)var a=2; // undefined只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。f

2021-11-08 18:12:18 363

原创 函数和块作用域

函数声明和函数表达式最重要的区别是它们的名称标识符将会绑定在何处函数声明var a=2;// 具名函数声明function foo(){ var a=3; console.log(a) // 3}// 具名函数调用foo();console.log(a) // 2上面的片段foo被绑定在作用域中,直接通过foo()来调用var a=2;(function foo(){ var a=3; console.log(a)})();// ()

2021-11-06 13:47:06 146

原创 词法作用域

作用域嵌套引擎从当前的执行作用域开始查找变量,如果找不到,就向上一级继续查找。当抵达最外层的全局作用域时,无论是否找到,查找过程都会停止function foo(a) { console.log(a+b); b=2;}foo(2)第一次对b进行RHS查询时是无法找到该变量的,这是一个未声明的变量,在任何相关作用域都找不到。引擎会抛出ReferenceError: b is not definedfunction foo(a) { var b=a*2; funct

2021-11-05 20:16:34 51

原创 docker初识

Docker环境搭建下载get.docker.com并命名为get-docker.shcurl -fsSL get.docker.com -o get-docker.sh运行脚本sh get-docker.sh --mirror Aliyun //指向源重启配置文件systemctl daemon-reload启动dockersystemctl restart docker查看docker版本docker versionDocker容器生命周期管理切换镜像源{"re

2021-05-29 13:09:09 134

原创 数据库读写分离,分库分表

海量数据的存储与访问瓶颈解决方案-数据切分垂直切分垂直切分就是按照不同的表或者Schema切分到不同的数据库中,如:订单表和商品表在同一个数据库中,而我们现在要对其切分,使得订单表和商品表分别落在不同的数据库中,使其完全隔离,从而达到降低数据库负载的效果。优点:拆分之后业务清晰,拆分规则明确;系统之间容易扩展和整合数据维护简单缺点部分业务表无法join,只能通过接口调用,提升了系统的复杂度跨事务难以处理垂直切分后,某些业务数据过于庞大,仍然存在单体性能瓶颈水平切分它需要将一

2021-05-16 16:43:47 435 2

原创 接口幂等性

什么是幂等性幂等性设计的核心思想select,update,delete,insert和混合操作的接口幂等性提交订单按钮如何防止重复提交表单录入页如何防止重复提交微服务接口,客户端重试时,会对业务数据产生影响吗幂等性:f(f(x))=f(x)幂等元素运行多次,还等于它原来的运行结果在系统中,一个接口运行多次,与运行一次的效果是一致的什么情况下需要幂等性重复提交,接口重试,前端操作抖动等业务场景:多次点击提交订单,后台应只生成一个订单支付时,由于网络问题重发,应该只扣一次前幂等性的

2021-05-13 21:40:16 124 3

原创 基于zookeeper的瞬时节点实现分布式锁

zookeeper的数据结构zookeeper的观察器可设置观察器的3个方法:getData();getChildren();exists();节点数据发生变化,发送给客户端观察器只能监控一次,再监控重新设置zookeeper分布式锁原理利用zookeeper的瞬时有序节点的特性多线程并发创建瞬时节点时,得到有序的序列序号最小的线程获得锁其他的线程则监听自己序号的前一个序号前一个线程执行完成,删除自己序号的节点下一个序号的线程得到通知,继续执行以此类推创建节点时,已经确定了

2021-05-09 21:02:55 170

原创 基于分布式锁解决定时任务重复问题

在任务执行之前去获取锁,哪个服务获取到锁,哪个服务去执行任务@Service@Slf4jpublic class SchedulerService { @Autowired private RedisTemplate redisTemplate; @Scheduled(cron = "0/5 * * * * ?") public void sendSms(){ try(RedisLock redisLock = new RedisLock(redis.

2021-05-09 10:40:17 190

原创 基于Redis的Setnx实现分布式锁

实现原理获取锁的Redis命令set resource_name my_random_value NX PX 30000resource_name:资源名称,可根据不同的业务区分不同的锁my_random_value:随机值,每个线程的随机值都不同,用于释放锁的校验。NX:key不存在时设置成功,key存在则设置不成功PX:自动失效时间,出现异常情况,锁可以过期失效利用NX的原子性,多个线程并发时,只有一个线程可以设置成功设置成功获得锁,可以执行后续的业务处理如果出现异常,过了锁的有效期

2021-05-09 09:46:03 623 5

原创 基于数据库实现分布式锁

基于数据库实现分布式锁多个进程/多个线程访问共同组件数据库通过select…for update 访问同一条数据,for update锁定数据,其他线程只能等待Select For update语句该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。mysql默认是自动提交事务的,将窗口1设置为手动提交事务在窗口1中执行select

2021-05-07 08:34:23 108

原创 mysql提交事务的方式

查看 MySQL 客户端的事务提交方式命令:select @@autocommit;修改 MySQL 客户端的事务提交方式为手动提交命令:set @@autocommit = 0;(注:0 表示手动提交,即使用 MySQL 客户端执行 SQL 命令后必须使用commit命令执行事务,否则所执行的 SQL 命令无效,如果想撤销事务则使用 rollback 命令。1 表示自动提交,即在 MySQL 客户端不在需要手动执行 commit 命令。)MySQL 在自动提交模式下,每个 SQL 语句都是一个独立的

2021-05-07 07:57:34 1773

原创 分布式一致性 Session

单机部署的时候,登录之后将会把用户登录信息放在 Session 中, 用户每次操作首先先校验 Session 是否存在用户信息,如果不存在 将会强制让用户先去登录。 所有操作都在一台 Tomcat 上,这当然没有什么问题。 集群部署之后,由于 Nginx 使用默认负载均衡策略(轮询),请求将 会按照时间顺序逐一分发到后端应用上。也就是说刚开始我们在 Tomcat1 登录之后,用户信息放在 Tomcat1的 Session里。过了一 会...

2021-04-15 22:13:55 79

原创 Logstash数据同步

将数据库表中的数据同步到elasticsearch中环境准备logstash-7.4.2jdk1.8logstash-db-sync.conf配置文件input { jdbc { # 设置 MySql/MariaDB 数据库url以及数据库名称 jdbc_connection_string => "jdbc:mysql://192.168.2.252:3306/shop?useUnicode=true&characterEncoding=UT

2021-04-10 13:51:55 328

原创 springboot整合Elasticsearch

pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org

2021-04-05 09:16:03 102 1

原创 elasticsearch读写原理

elasticsearch写原理客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)。coordinating node 对 document 进行路由,将请求转发给对应的 node(有 primary shard)。实际的 node 上的primary shard 处理请求,然后将数据同步到 replica node。 coordinating node 如果发现primary node 和所有 replica node 都搞定之后,就返回

2021-04-03 22:17:50 139

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除