自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Docker实践】Docker中使用 Dockerfile 构建自己的镜像并运行redis

【Docker实践】Docker中使用 Dockerfile 构建自己的镜像并运行redis

2022-03-06 20:59:14 1877

原创 使用 Scala 实现 sbt.boot.properties 的函数式解析

使用 Scala 实现 sbt.boot.properties 函数式解析前言sbt.boot.properties 文件格式实现AST解析解析 `Paragraph`解析 `SBTProperties`插入/删除配置的操作搜索结论前言之前在实现构建工具自动配置的小工具的时候, 需要解析 sbt.boot.properties 的内容, 看一下如何实现一个解析器sbt.boot.properties 文件格式在官网 有个配置示例, 文件格式还是比较清晰的, 上面有个分块的标签, 然后每个分块里面每

2021-02-27 19:39:03 250

原创 【如何进行 Scala 代码设计 -- 大道至简】 -- 以自动配置构建工具的小工具为例 (三)

如何进行 Scala 代码设计 -- 大道至简】 -- 以自动配置构建工具的小工具为例 (三)前言程序流程SBT 相关配置的逻辑sbtJarLauncherReader -- 读取配置配置转换部分组合相关的逻辑组装程序总结前言【如何进行 Scala 代码设计 – 类型划分定基调】 – 以自动配置构建工具的小工具为例 (一)【如何进行 Scala 代码设计 – 接口粒度见功夫】 – 以自动配置构建工具的小工具为例 (二)之前两篇代码设计的跟粑粑一样… 净整一些花里胡哨没用的东西, 搞得代码很复杂, 引

2021-02-14 00:38:03 336 2

原创 Plain Functional Programming by Martin Odersky - 笔记

Plain Functional Programming by Martin Odersky - 笔记前言软件工程中最大的挑战是什么?为什么需要函数式编程?为什么 Scala 和 Haskell 看起来不像是简单的语言?函数式编程家族函数式编程的好处例子: 配置当参数的太多的时候, 使用隐式参数来简化构建者模式总结前言来自 @演讲: Plain Functional Programming by Martin Odersky软件工程中最大的挑战是什么?最大的挑战是复杂性, 复杂性可能来源于需求的变化

2021-02-12 11:56:21 233 1

原创 JAVA8-HashMap源码阅读

HashMap源码分析框架基础操作, 基础结构Node extends Entry工具方法线程安全FastFail性能衍生结构算法寻找大于某数的最小2次幂数分析框架基础操作, 基础结构线程安全, 线程安全的各个版本使用场景, 优缺点衍生结构性能算法基础操作, 基础结构内部使用的是 数组 + 链表, 红黑树Node extends EntryhashCode 是 Entry 的方法, Node类中实现了 hashCode 方法, 综合了 key 和 value 的 hashCod

2021-01-30 15:21:07 126

原创 sbt调试插件

sbt调试插件毒性sbt开启远程调试日志级别sbt是如何使用自己的插件的?需要自己发布插件毒性无法生成客户端sbt开启远程调试sbt -jvm-debug 5005源码里面有测试用例, 启动的时候需要执行插件版本:sbt -Dplugin.version=21.1.1否则会报错日志级别‘-l debug’ 可以设置 airframe 的日志级别sbt是如何使用自己的插件的?测试工程的 plugins.sbt 是这样声明的sbt 包的 Defaults.scala 中有这个需

2021-01-23 12:22:20 295

原创 源码 - 同步障栅 CyclicBarrier

源码 - 同步障栅 CyclicBarrier术语设计源代码注释等待/唤醒的逻辑术语障栅动作: 实例化CyclicBarrier 的时候传进去的, 所有parties线程数都await 之后的要执行的操作.(实例化的时候可以传null的)障栅点: CyclicBarrier 调用await() 的代码位置成员数(parties): 参与的线程的数目索引 : 线程调用 await 时候, 剩余的成员数世代 (generation): CyclicBarrier 会在实例化的时候开始一个世代(ge

2021-01-15 23:10:12 210

原创 java 线程池中的状态转换 - 使用位运算表示状态

java 线程池中的状态转换需要表示2种类型的状态, 1种是线程池是否在运行中, 1种是线程池中的有效线程数目.java源代码中, 并不使用2个变量来分别表示上面的状态, 而是使用1个整数来表示. 为此, 线程池限制了最大的线程数目为 (2^29)-1 而不是 (2^31)-1. 这样做的目的是使代码更快, 更简单.线程有以下的状态:RUNNING: 接受新的任务并处理队列中的任务SHUTDOWN: 不接受新的任务,但是继续处理队列中的任务STOP: 不接受新的任务,也不处理队列中的任务,并中

2020-12-28 22:48:23 429 1

原创 【如何进行 Scala 代码设计 -- 接口粒度见功夫】 -- 以自动配置构建工具的小工具为例 (二)

【如何进行 Scala 代码设计】 -- 以自动配置构建工具的小工具为例 (二)前言重新定义接口根据 ConfigType 实现不同的逻辑测试拆分接口美化调用 api缺点总结前言上一篇文章我们尝试了一种代码的设计方式, 按照步骤分解接口, 然后逐步实现. 但是最后的结果却不尽人意:接口太多接口类型参数太多调用接口不够优雅这一次我们就从这几个方面入口, 重构代码重新定义接口这次我们直接把整个程序的所有操作定义成一个接口,类型参数我们依然用两个类型, BuildTool 和 ConfigTy

2020-12-23 23:58:28 160

原创 【如何进行 Scala 代码设计 -- 类型划分定基调】 -- 以自动配置构建工具的小工具为例 (一)

一种 Scala 代码组织方法前言第一次尝试最终的api构想接口定义定义类型定义行为接口前言scala 是一种多范式的语言, 可以使用面向对象的方式 或者是使用函数式的方式进行编程。本文以 5分钟搞定构建工具仓库配置 一文中的工具为例, 尝试探讨一种 scala 的代码组织方式, 抛砖引玉。首先介绍一下这个工具的功能, 自动配置 SBT 和 Maven 工具的本地仓库, 和国内镜像。目标非常简单, 但是要求代码的设计要优雅,可扩展,而不是像写脚本文件一样一个文件写完。第一次尝试首先我们分解一下程

2020-12-23 00:33:45 180

原创 5分钟完成构建工具仓库配置(国内镜像, 本地仓库地址)-附带小工具

5分钟搞定本地仓库配置Maven本地仓库镜像配置SBT本地仓库镜像Gradle本地仓库镜像通常来说, 在 windows 上, 各种构件工具都是会默认将数据保存到 C 盘, 懂不懂就撑爆系统盘, 所以我们需要改变下载依赖的存储位置.同时因为渣渣网络, 通常我们需要修改仓库的镜像, 使用国内镜像下载会更快.Maven本地仓库在 maven 的安装目录下 %MAVEN_HOME%\conf\settings.xml 中的 <localRepository>节点可以指定对应的文件路径.镜像

2020-12-19 21:00:09 925

原创 10分钟搞定Spring Boot Actuator

5分钟搞定Spring Boot Actuator什么是 Spring Boot Actuator怎么使用?什么是端点(Endpoint)?如何使用端点启用暴露实现自定义 bean接受输入匹配方法 = http类型 + 参数响应 类型=================到这里五分钟入门结束=================安全考虑访问控制CORS 配置什么是 Spring Boot ActuatorSpring Boot 包含许多附加特性,以帮助您在将应用程序推向生产环境时监视和管理它。您可以选择使用 H

2020-12-10 23:40:01 391

翻译 ZK 清单和解决方案(ZooKeeper Recipes and Solutions)

ZK 清单和解决方案前言ZK高级结构创建指南关于异常处理的注意事项开箱即用应用: 命名服务, 配置, 集群关系管理障栅(Barrier)双重障栅(Double Barriers)队列 (Queue)优先队列 (Priority Queues)锁 (Lock)可撤销的错误 和 GUID共享锁可撤销的共享锁两阶段提交领导选举总结前言翻译自: 官网文档ZK高级结构创建指南这篇文章描述了如何实现高级功能.ZK最有趣的地方之一就是 尽管 ZK 使用异步通知, 你仍可以使用它来构建同步一致性原语, 比如 队列

2020-12-04 21:29:38 264

翻译 Scala Cats - Functor

cats - FunctorFunctor不同的角度用 Functor 来管理效果(effect)Functor 的组合参考FunctorFunctor 是用来表示抽象化出可以调用 map 方法的结构 的 类型类. 这种结构比如说有 List, Option, 和 Future.实现了 Functor 的类型, 可以看成是某种容器 或者是上下文, 而 map 方法就是表示要把容器中的东西变换成另外一种东西. map 方法的参数是 一个函数, 用来将 容器中的 A 类型转换成 B类型. 所以对于要实现

2020-11-30 23:25:32 395

翻译 Scala Cats - Type Class 类型类

Scala Cats - Type Class 类型类前言例子类型类 vs 子类型隐式推导(Implicit derivation)语法笔记规则(Laws)Cats 中的类型类Cats中未完成类型类实例前言参考自 cats 官网文档类型类(Type Class) 是函数式编程里面用来实现 特设多态 (ad hoc polymorphism) (或者说成是众所周知的重载) 的强力工具.换言之,参数多态对各模板参数的实现,是根据模板的通用(generically)的行为的抽象,即泛型的语义;而特设多

2020-11-19 23:06:30 603

翻译 ZK编程 - 基础教程 - 使用 ZooKeeper 实现Queue 和 Barrier

ZK编程 - 基础教程 - 实现Queue 和 BarrierZK编程 - 基础教程前言介绍Barriers生产者-消费者队列测试Queue 测试Barrier 测试源代码ZK编程 - 基础教程前言翻译自官网介绍这个教程实现了 障栅(barriers) 和 生产-消费者队列(producer-consumer queues). 分别对应代码里面的 Barrier 和 Queue类, 运行这个例子需要至少一个 ZK 服务器.两个类都使用下面这个基类:static ZooKeeper zk =

2020-11-19 20:58:01 480

翻译 ZK官网 - ZooKeeper Java 示例

ZooKeeper Java 例子前言一个简单的监控客户端需求程序设计`Executor` 类DataMonitor 类前言参考ZK官方文档一个简单的监控客户端需求输入参数zk 服务的地址znode 的名称 - 要监视的节点输出的文件名可执行的程序获取到znode数据之后启动程序如果znode发生变化, client 重新获取内容并重启执行程序如果znode消失, 关闭 可执行程序程序设计通常, ZL应用会被分成2个部分, 一部分负责维护连接, 另一部分负

2020-11-15 20:37:47 879

翻译 ZooKeeper管理员指南--基于3.6.2版本

ZooKeeper管理员指南前言部署系统要求支持的平台依赖软件集群搭建前言翻译自ZK官网原文部署系统要求支持的平台客户端 : Java 库, 客户端服务端 : Java 库, 服务端本地客户端: C语言绑定的客户端第三方贡献: 一些插件基本上就是说, GNU/ Linux 支持上面全部4种, 前面两种Java库的全平台支持, 毕竟跨平台嘛, 最后两种只有 GNU/Linux 支持, 其他平台都不支持依赖软件需要Java 8 或者以上 (JDK8 LTS, JDK 11 L

2020-11-05 15:27:54 1506 1

翻译 ZooKeeper程序员指南

ZooKeeper程序员指南前言ZooKeeper 数据模型ZNodes前言基于 3.6.2 版本 的 官方文档ZooKeeper 数据模型ZooKeeper(以下称 ZK) 使用了层级的命名空间, 跟我们的文件系统非常类似. 唯一不同的是每个命名空间内的节点可以同时拥有数据 和 子节点. 有点像文件系统, 但是其中的文件既可以是普通文件也同时可以是目录. 节点的路径通常就是规范的, 斜杆分隔的绝对路径; 没有相对路径的形式. 任何unicode字符只要符合以下的形式就可以使用:null 字符(

2020-10-26 16:11:20 216

原创 如何调试自己的shell脚本

https://www.cyberciti.biz/tips/debugging-shell-script.html

2020-09-19 16:50:57 596

原创 阅读AQS -- AbstractQueuedSynchronizer源码

什么是AQS?具体的类位于 : java.util.concurrent.locks.AbstractQueuedSynchronizerAQS是基于FIFO等待队列的,用来实现阻塞锁和相关同步机制的框架, 比如信号量(semaphroe), 事件(events), 可重入读写锁之类的,都是用这个实现的。其内部是使用原子int来表示状态的。子类需要覆盖其中的protected方法来实现同步机制。AQS同时支持排他模式和共享模式。排他模式情况下,如果一个线程已经有锁了,其他线程是无法获取到锁的。共享模式

2020-09-16 23:21:37 127

原创 IDEA 不同项目间复制 tomcat 运行配置 和 数据库配置

项目代码有不同的分支, 每次重新checkout代码导入idea之后, 都需要重新配置 tomcat 的 run configuration 和 sql 的配置,经摸索,有以下方法可以复制配置:复制 tomcat 的 run configure1. 在 run configure 的右上角, 勾选 share through VCS, 这个选项可以让idea生成独立的run configure配置2. 将生成的目录和配置文件复制到新的项目, 进到旧项目目录中的 .idea 目录中, 如.

2020-08-24 22:17:04 987

原创 SBT发布本地类库

自己写的库如何发布使得其他的项目可以依赖?首先是某个类库要定义好name, organization这些属性(在build.sbt中), 然后指定 publishTo 的值我这里是发布到的本地的仓库, 所以Resolver使用的是文件路径, 也可以是URL,具体参考官网的文档https://www.scala-sbt.org/1.x/docs/Publishing.html下...

2020-02-16 18:06:25 1116

原创 SBT任务定义 - 如何使Task 在 Compile 之后触发

参考链接https://stackoverflow.com/questions/17045860/sbt-apply-task-after-compile/17243926在SBT任务定义中, 很容易定义一个在某个任务之前先执行什么, 使用 dependsOn 即可.但是有个坏处就是调用的话, 需要调用新的定义后的任务名. 比如我定义task, copyWebResource.depen...

2020-02-16 17:37:36 383

原创 SBT V1.x 速度慢的问题

国内使用SBT, 简直是砸电脑的心都有了... 更新个project要更新半天, 经过探索之后, 发现了一些有用的建议:以下建议基于SBT 的 1.2.8 版本1 首先是自定义仓库, 配置一个国内的镜像 1-1 在windows下的用户目录下(Linux类似), 有个 .sbt 目录, 在该目录下创建 repositories 文件, 配置如下:[repositories]...

2019-08-26 22:19:32 1034

原创 LeetCode 105 从先序和中序遍历构建二叉树

这道题目在 《剑指Offer》一书中有提到过,也有解析的过程,不过时间隔得久,大概只有潜意识的印象了。初看这道题有点让人摸不着头脑,虽然一直强调树的算法一般是递归的算法,就算是递归算法,也无从下手那就先举个例子先画几个图看看情况, 以这棵树为例我们先把前序遍历和中序遍历列在一起, 然后将对应关系用箭头连接起来首先是 红色的箭头, 前序遍历的第0个元素对应中序遍历的第1个...

2019-05-18 20:21:00 206

原创 LeetCode 114 二叉树展开为链表

从题目的例子中看, 它是这样的一个转换过程:1 左子树经过转换后放到父节点的右节点上2 原来的右节点进行相同的转换, 然后接到 1 中的最后一个节点上去还是一个递归的过程除了过程中的判断有点繁琐之后, 思路上并不困难 def flatten(root: TreeNode): Unit = { def go(node:TreeNode): TreeNode ...

2019-05-18 16:01:56 164

原创 LeetCode 112 路径总和 / LeetCode 113 路径总和II

递归还是递归呀, 真的是 递归写到吐, 112 就是简单判断是与不是咯, 递归地返回布尔值就行了113的话, 思路类似,就是用一个List去保存结果, 不怎么怎么就变成中等难度了, 大概是有新的解法?源代码:https://gitee.com/sparrowxin/AlgoTemp...

2019-05-18 15:34:07 187

原创 LeetCode 111 二叉树的最小深度

还是递归, 简单难度, 本质上是一种遍历, 唯一要注意的就是 只有 node 的左右结点均为 null 的时候才需要去更新最小值 def minDepth(root: TreeNode): Int = { var min : Option[Int] = None def go(node: TreeNode, level: Int = 0): Unit = { ...

2019-05-18 15:26:11 267

原创 LeetCode 110 平衡二叉树的判断

树的算法大多都是递归的, 树本身就是一种非常递归的结构.要判断是不是平衡二叉树, 题目也说了, 左右两个子树的高度差绝对值不超过1, 那我们非常朴素的, 每次都计算子树的最大高度,然后相减就看看符不符合标准就行了.从结构上看好像是有两层递归在里面, em.. 估计特别容易爆栈 def isBalanced(root: TreeNode): Boolean = { ...

2019-05-18 15:19:03 221

原创 LeetCode 109 有序链表转换成二叉搜索树

相比于LeetCode 108 , 这道题变成了中等难度的题目, 在 107 中, 我使用的是以中心点作为分割, 然后数组左右两部分分别作为左子树和右子树去进行递归, 这道题我也打算使用这个思路, 步骤为:1. 找到链表的中心位置.2. 构造子树3. 递归问题在于如何找到链表的中心节点?LeetCode 前面的有关于链表的题目, 经常是会使用"快慢指针"的方法:...

2019-05-18 15:10:03 327

原创 LeetCode 108 有序数组转换成二叉搜索树

其实也是一个递归的问题, 将有序数组从中间拿一个元素作为中心结点, 然后两边又是相同的子问题 def sortedArrayToBST(nums: Array[Int]): TreeNode = { def go(from: Int, to:Int) :TreeNode = { if(to < from) { null } e...

2019-05-18 14:44:25 145

原创 Java接口的意义

公司开发的时候, service和dao层都提炼为接口和对应的实现类, service 的引用之间自然都是对接口的引用.但是实际上, 我感觉有一层接口似乎并没有什么用, 倒是徒增了一些冗余的模板代码. 从修改的角度来说, 如果是实现类之间的相互引用, 那么使用修改实现类的话, 在不修改签名的情况下, 不也是可以修改实现吗, 那么接口(抽象类)存在的意义是什么呢?"一般情况下我们构建一个简...

2019-04-27 13:35:45 1307

空空如也

空空如也

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

TA关注的人

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