自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(148)
  • 资源 (1)
  • 收藏
  • 关注

原创 MyBatis Plus自定义BaseTypeHandler No value specified for parameter

调试发现接收到的jdbcType类型为null,因此在使用。

2025-04-28 18:51:38 270

原创 AmazonS3忽略SSL验证

引用自:https://www.jianshu.com/p/df9e33792ca5。

2025-03-06 15:29:55 497

原创 归并排序(借助额外空间)

【代码】归并排序(借助额外空间)

2024-08-07 10:27:53 373

原创 Redis和数据库一致性如何保证

这个休眠时间 = 读业务逻辑数据的耗时 + 几百毫秒。为了确保读请求结束,写请求可以删除读请求可能带来的缓存脏数据。防止有请求从数据读入脏数据到缓存,造成数据不一致。

2024-08-06 10:13:07 409

原创 常见 Java 代码缺陷及规避方式

equals方法是 NPE 的高发地点,用 Objects.euqals来比较两个对象,能够避免任意对象为 null 时的 NPE。空对像模式通过一个特殊对象代替不存在的情况,代表对象不存在时的默认行为模式。

2024-06-25 10:00:41 335 1

原创 Java与Golang中运算符优先级区别

【代码】Java与Golang中运算符优先级区别。

2024-03-15 01:05:16 655

原创 条件判断的模式

表驱动方法是一种编程模式(Scheme),其的核心思想是将数据代码如控制变量、参数等从逻辑代码中分离出来,并以模块化形式存放于外部表中,以此来概括逻辑、简化变更。改进后,逻辑与数据分离,可单独维护数据或者逻辑,数据有数据的组织方法,逻辑也有逻辑的维护方式。策略模式在一般OOP语言的实践中大多以多态 (Polymorphism) 形式出现。

2024-01-31 10:33:15 462

原创 VSCode主题和图标方案

Atom one Dark Theme加配置。

2023-04-19 20:31:06 464

原创 vscode + golang开发实践

如果我们使用版本管理工具(Version Control System,VCS。常用如Git)来管理我们的项目代码时,我们只需要添加。GOPATH路径最好只设置一个,所有的项目代码都放到GOPATH的src目录下。bin和pkg目录的内容无需版本控制。是一个环境变量,用来表明你写的go项目的存放路径。在进行Go语言开发的时候,我们的代码总是会保存在。等指令后,会将下载的第三方包源代码文件放在。目录下,生成的中间缓存文件会被保存在。目录下,产生的二进制可执行文件放在。

2022-10-28 18:48:58 520

原创 centos通过yum安装最新docker

docker

2022-08-06 13:50:10 603

原创 Java中SPI机制

SPI

2022-08-06 13:40:58 141

原创 常用Idea插件

插件推荐

2022-07-21 11:11:29 174

原创 vscode远程linux开发报错The Language Support for Java server crashed 5 times in the last 3 minutes.

按 CTRL + SHIFT + P,然后键入 Java:清理 Java 语言服务器工作区。

2022-04-14 13:52:27 830

原创 python gdal迭代写为ENVI的dat格式

def writeTiff(im_data, im_geotrans, im_proj, path): ''' 保存tif文件函数 ''' if 'int8' in im_data.dtype.name: datatype = gdal.GDT_Byte elif 'int16' in im_data.dtype.name: datatype = gdal.GDT_Int16 else: datatype = g

2022-01-11 14:14:21 2478 1

原创 TIMESAT 无格式文件迭代转tif

%% timesat二进制结果转换为tifclearinput_name='2014_01_01.tif'; %设置参考影像[~,R]=geotiffread(input_name); % 读取参考影像的投影信息rows = R.RasterSize(1);cols = R.RasterSize(2);info=geotiffinfo(input_name);maindir = '.\DL_result';subdir = dir( maindir );for i = 1 : len

2022-01-11 14:11:10 1493 1

转载 DDD系列-3

为什么要用Repository实体模型与贫血模型Entiry(实体)-ER模型:用来描述实体之间的关系,而后演变为一个数据模型,在关系数据库中代表了数据存储的方式。许多ORM框架,忽略了Entiry本身行为,导致许多模型仅包含了实体数据(属性),而实体的业务逻辑被分散在多个服务、Controller、Utils工具类中–贫血模型贫血模型特征大量的XxxDo对象:是数据库表结构的映射,里面没有包含(或包含了很少的)业务逻辑服务和Controller里有大量的业务逻辑:校验逻辑、计算逻辑、格式

2021-10-05 00:37:46 476

转载 DDD系列-2

架构软件系统中固定不变的代码结构、设计模式、规范和组件间的通信方式。做架构时应实现:独立于框架:架构不依赖具体某个外部的库或者框架独立于UI:底层架构不应该随展示样式发生变化独立于底层数据源:无论使用MySQL、Oracle还是其他独立于外部依赖:无论外部依赖如何变更、升级、业务的核心逻辑不随之变化可测试性:业务逻辑可以快速验证正确性但是在做业务研发时,更多的会去关注一些宏观的架构,比如SOA架构、微服务架构,而忽略了应用内部的架构设计,很容易导致代码逻辑混乱,很难维护,容易产生bu

2021-09-29 20:53:35 582 1

转载 DDD架构-1

Domain PrimitivePrimitive 定义:不从任何其他事物发展而来,初级的形成或生长的早期阶段案例分析1一个新应用在全国通过 地推业务员 做推广,需要做一个用户注册系统,同时希望在用户注册后能够通过用户电话(先假设仅限座机)的地域(区号)对业务员发奖金。public class User { Long userId; String name; String phone; String address; Long repId;}pub

2021-09-28 00:07:58 175

原创 架构整洁之道--第四部分(组件原则)

一、组件组件是部署的单元,组件是可被作为系统一部分部署的最小项。例如:java中的jar等。组件可以连接,成为单个可执行文件,或者他们聚合起来,成为一个包。二、组件聚合REP: 复用/发布等效原则CCP: 共同封闭原则CRP: 共同重用原则1. 复用/发布等效原则(REP)细粒度的重用是细粒度的发布复用/发布等效原则(REP)至少字面上看起来很明显,人们想重用软件组件的话,这些组件应当有发布的历史记录,每个记录都有发布号。没法保证所有的可重用组件是相互兼容的发布过程应当生成适

2021-08-11 18:02:38 790

原创 git切换远程分支并名别名

1.切换到master分支2.确保远程创建了分支3.git fitch --all4.找到自己创建的分支5.git checkout -b [别名] [不要remotes后的分支名称]

2021-08-02 12:40:09 501

转载 字符串匹配--sunday算法

实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。输入:haystack = “hello”, needle = “ll”输出:2class Solution { public int strStr(String haystack, String needle) { // 各种边界情况 if (.

2021-07-26 21:19:15 112

原创 leetcode 三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]class Solution { public List<List<Integer>> threeSum(int[] nums) { List<.

2021-07-24 23:41:15 124

原创 数组常用方法

二分法使用二分查找法的前提是数组中无重复元素写二分法,区间一般为2种:[left, right] 或者 [left, right)定义区间[left, right]while(left <= right)当nums[mid] > target时,说明target在[left, mid - 1]之间当nums[mid] < targe时,说明target在[mid + 1, right]之间当nums[mid] == target时,return mid;模板代码

2021-07-17 22:05:58 137 2

原创 重构改善既有代码设计--封装向下转型

封装向下转型动作某个函数返回的对象,需要由函数调用者执行【向下转型】动作将向下转型动作移到函数中动机由于「 计算对象型别」 的动作往往比较麻烦, 你还是常常需要亲自告诉编译器「 对象的确切型别」 。 向下转型在Java 特别盛行, 因为Java 没有template( 模板) 机制, 因此如果你想从群集( collection) 之中取出一个对象, 就必须进行向下转型。【常会在「 返回迭代器( iterator) 或群集( collection) 」 的函数身上发生。 】方法找到【必须对函数调

2021-07-16 22:57:24 417

原创 重构改善既有代码设计--以工厂函数取代构造函数

以工厂函数取代构造函数Employee (int type) { _type = type;}=======================>static Employee create (int type) { return new Employee(type);}动机你可能常常需要根据type code 创建相应的对象, 现在, 创建名单中还得加上subclasses, 那些subclasses 也是根据type code 来创建。你也可以令你的factory method 根

2021-07-07 23:58:35 386

原创 重构改善既有代码设计--隐藏某个函数

隐藏某个函数有一个函数,从来没有被其他任何class用到,将这个函数修改为private动机重构往往督促修改函数的可见效只有另一个class需要用到某个函数,才有必要提高该函数的可见度。情景:过于丰富、过多行为的接口、只不过做了点简单封装的容器、添加越来越多行为的class对象:取值函数、设置函数隐藏起来作法多检查使用lint-style工具设值函数应该多关注应尽可能降低所有函数的可见性修改后编译测试...

2021-07-06 20:23:55 255

原创 单任务多次多分支开发

当某个代码功能被分块开发时,我们需要创建许多的分支,有些分支在发起merge请求后,需要同行代码评议完成后才能狗merge到远程master,此时新建的分支是没有需要提交的代码的,可以通过git checkout -b 远程分支上,而后git merge 未合入分支,然后在新建的分支上继续开发如果在前一个分支合入master之前有修改,在本地git merge 一下前一个分支...

2021-07-05 15:35:15 161

原创 重构改善既有代码设计--移除设置函数

移除设置函数你的class中的某个值域,应该在对象初创时设置值,然后就不再改变。动机如果你为某个值域提供了设值函数(setter),这就暗示这个值域值可以被改变.不希望在对象初创之后此值域还有 机会被改变,那就不要为它提供设值函数 (同时并将该值域设为final )做法是否只被构造函数调用,或者被构造函数所调用的另一个函数调用修改构造函数,使其直接访问设值函数所针对的那个变量如果某个subclass 通过设值函数给superclass 的某个private 值域设了值,那么你就不能这

2021-07-05 15:01:14 197

原创 重构--引入参数对象

引入参数对象某些参数总是很自然地同时出现。

2021-07-03 23:58:05 804

原创 重构改善既有代码设计--以函数取代参数

以函数取代参数对象调用某个函数,并将所得结果作为参数,传递给另一个函数。动机如果函数可以通过其他途径(而非参数列)获得参数值,那么它就不应该通过参数获得该值,过长的参数会增加阅读难道。看看参数接收端是否可以通过与调用端相同的计算来取得参数携带值通过所属对象内部的另一个函数来计算参数,可以将这个计算过程转移到调用端内,从而去掉参数。调用的函数隶属另也给对象,让该对象拥有一个reference指向调用端所属对象。如果参数计算过程依赖调用端某个参数,那么就无法去掉被调用端的那个函数。作

2021-07-03 22:18:10 369

转载 git如何基于已有的远程分支新建本地分支开发

假设远程有个normal常规分支而你只是改一个bug或者做一个小需求一般情况下这完全可以不用新建远程分支我们可以基于normal常规分支创建一个本地分支在本地分支开发然后将本地分支绑定到normal分支再从本地分支提交代码到normal分支新的本地分支以dev开头taskId结尾例如dev_96064从建立到绑定到提交步骤如下:$git checkout normal$git pull新建:$git checkout -b dev_96064git pull绑定:git

2021-07-01 20:24:31 899

原创 重构改善既有代码设计--保持对象完整

保持对象完整动机有时候,你会将来自同一对象的若干项数据作为参数,传递给某个函数存在的问题:万一将来被调用函数需要新 的数据项,你就必须查找并修改对此函数的所有调用。解决办法:把这些数据所属的整个对象传给函数,会提高代码的可读性,降低重复代码。但参数对象和被调用函数所在的对象之间,就有了依存关系。如果被调用函数使用了来自另外一个对象的许多项数据,应该将整个方法移到另外一个对象中。...

2021-06-30 21:29:10 419

原创 架构整洁之道--依赖倒置原则

稳定的抽象反之,改变具体实现并不总是,或者非常少会要求他们实现的接口改变。因此接口比实现更加不易变,稳定得软件架构避免依赖易变得具体类,倾向于使用稳定的抽象接口。**被引用异变的具体实现类:**请引用抽象接口类,使用抽象工厂模式创建对象。**别从易变的具体实现类派生:**继承是所有代码依赖关系里最强,最死板的。**别覆盖具体实现的函数:**你覆盖这些函数时,你无法消除这些源码依赖,应该把这个函数声明成抽象的,然后可以写多个实现。别提任何的具体实现和易变类的名字工厂在Java中,我们可

2021-06-27 00:13:30 262

原创 架构整洁之道--接口隔离原则

接口隔离原则User1的源码无意义的依赖于op2,op3,即使User1没有调用他们。这里的依赖意味着op2,op3源码的改变将迫使User1重新编译,重新部署,即使这里的改变跟User1没有任何关系。User1的源码得依赖与U1Ops接口,和op1,但不依赖与OPS类了。因此OPS的改变,User1并不关系,也不会造成User1被重新编译,重新部署。ISP和架构大多时候,模块依赖于更多它并需要的东西是很不利的。在源码层面很好解释,你得重新编译,重新部署,但在架构层面上也是很不利的。设想D包

2021-06-26 23:46:09 134

原创 架构整洁之道--开闭原则

开闭原则软件工件的行为应该是不必修改工件而可扩展的想法实验有个财务汇总的web页面的系统,假设利益相关者想把这些同样的信息在黑白打印机打印成报告。一个好的软件架构将会把改变得代码总量尽可能降到最低,理论上,一行不变。通过把会由于不同原因变化得事情分割开来(单一职责原则SRP),恰当地组织这些事情得依赖(依赖倒置原则DIP)。1.信息隐藏确保类A用到B的名字,但类B没有用到类A的名字。这样A知道B的存在,但是B就不知道A的存在。2.方向控制所有的函数和类的关系都是单向的。Interac

2021-06-26 23:05:14 153

原创 整洁架构之道-设计原则(单一职责)

单一职责原则(SRP)概念:一个模块有且只能由于一种原因被改变,一个模块有且只能对一个角色负责。模块:一组内聚的函数和数据结构症状:意外的重复对某个角色所用到的公用代码进行修改时,会影响其他角色调用该代码的结果。SRP原则讲:分割不同角色依赖的代码。解决方法这问题有很多不同的解决方法,每种都把这些函数移到不同的类中。这种方案的缺点是开发者现在有三个需要实例化和跟踪,可以通过门面模式。一些开发者倾向于把重要的业务规则写得离数据更近。把重要的方法保留到之前的Employee类里,然后用

2021-06-26 12:02:04 221

原创 重构 改善既有代码设计(第9章-简化条件表达式)

分解条件式if (data.before(SUMMER_START) || data.after(SUMMER_END)) charge = quantity * _winterRate + _winterServiceCharge;else charge = quantity * _summerRate;========================>if (notSummer(data)) charge = winterCharge(quantity);else charge

2021-06-20 22:24:50 234 1

原创 Go 反射

反射Go 提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,但是在编译时并不知道这些变量的具体类型。用途:设计一类并不满足普通公共接口的类型的值它们没有明确的表示方式设计该函数时这些类型还不存在reflect.Type和reflect.Valuereflect.Type和reflect.TypeOf()函数reflect.TypeOf接收任意的interface{}类型,并返回对应动态类型的reflect.Type:t := reflect.Type

2021-06-15 16:23:34 448 1

原创 重构改善既有代码的设计(第三章))

重构的难题数据库绝大多数的商用程序都与其背后的DataBase schema(数据库表格结构)紧密耦合在一起,DataBase schema如此难以修改的原因。数据迁移,常用手段是:系统分层–将DataBase schema和对象模型间的依赖降到最低,但是对数据库表的更改,这可能是一件漫长的工作。在非对象数据库中,解决办法是:在对象模型和数据库模型之间插入一个分隔层,可以隔绝两个模型各自的变化。修改接口对于对象:允许分开修改软件模块的实现(implementation)和接口(inter

2021-06-14 20:19:48 168

原创 Golang 接口类型

接口多态是指代码可以根据类型的具体实现采取不同的行为实现接口是用来定义行为的类型。所定义的行为不由接口直接实现,而是通过自定义类型的方法来实现。接口内部布局:方法集方法集定义了接口的接收规则,是有接收者的函数。方法集定义了一组关联到给定类型(struct)的实例类型所对应的方法。(类似与java中new出来的对象)// I 定义接口,仅仅是方法的集合type I interface { Get() int Put(v int)}// S 定义了一个类型type S s

2021-06-14 14:22:46 435

Zookeeper 分布式过程.pdf

Zookeeper 分布式过程.pdf

2021-05-18

空空如也

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

TA关注的人

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