<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[sparrowxin的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sparrowxin</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sparrowxin]]></copyright><item><title><![CDATA[【Docker实践】Docker中使用 Dockerfile 构建自己的镜像并运行redis]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/123317026</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/123317026</guid><author>sparrowxin</author><pubDate>Sun, 06 Mar 2022 20:59:14 +0800</pubDate><description><![CDATA[【Docker实践】Docker中使用 Dockerfile 构建自己的镜像并运行redis]]></description><category></category></item><item><title><![CDATA[使用 Scala 实现 sbt.boot.properties 的函数式解析]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/114182887</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/114182887</guid><author>sparrowxin</author><pubDate>Sat, 27 Feb 2021 19:39:03 +0800</pubDate><description><![CDATA[使用 Scala 实现 sbt.boot.properties 函数式解析前言sbt.boot.properties 文件格式实现AST解析解析 `Paragraph`解析  `SBTProperties`插入/删除配置的操作搜索结论
前言
之前在实现构建工具自动配置的小工具的时候, 需要解析 sbt.boot.properties 的内容, 看一下如何实现一个解析器
sbt.boot.properties 文件格式
在官网 有个配置示例, 文件格式还是比较清晰的, 上面有个分块的标签, 然后每个分块里面每]]></description><category></category></item><item><title><![CDATA[【如何进行 Scala 代码设计 -- 大道至简】 -- 以自动配置构建工具的小工具为例 （三）]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/113801856</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/113801856</guid><author>sparrowxin</author><pubDate>Sun, 14 Feb 2021 00:38:03 +0800</pubDate><description><![CDATA[如何进行 Scala 代码设计 -- 大道至简】 -- 以自动配置构建工具的小工具为例 （三）前言程序流程SBT 相关配置的逻辑sbtJarLauncherReader -- 读取配置配置转换部分组合相关的逻辑组装程序总结
前言
【如何进行 Scala 代码设计 – 类型划分定基调】 – 以自动配置构建工具的小工具为例 （一）
【如何进行 Scala 代码设计 – 接口粒度见功夫】 – 以自动配置构建工具的小工具为例 （二）
之前两篇代码设计的跟粑粑一样… 净整一些花里胡哨没用的东西, 搞得代码很复杂, 引]]></description><category></category></item><item><title><![CDATA[Plain Functional Programming by Martin Odersky - 笔记]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/113788715</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/113788715</guid><author>sparrowxin</author><pubDate>Fri, 12 Feb 2021 11:56:21 +0800</pubDate><description><![CDATA[Plain Functional Programming by Martin Odersky - 笔记前言软件工程中最大的挑战是什么?为什么需要函数式编程?为什么 Scala 和 Haskell 看起来不像是简单的语言?函数式编程家族函数式编程的好处例子: 配置当参数的太多的时候, 使用隐式参数来简化构建者模式总结
前言
来自 @演讲: Plain Functional Programming by Martin Odersky
软件工程中最大的挑战是什么?
最大的挑战是复杂性, 复杂性可能来源于需求的变化]]></description><category></category></item><item><title><![CDATA[JAVA8-HashMap源码阅读]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/109963204</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/109963204</guid><author>sparrowxin</author><pubDate>Sat, 30 Jan 2021 15:21:07 +0800</pubDate><description><![CDATA[HashMap源码分析框架基础操作, 基础结构Node extends Entry工具方法线程安全FastFail性能衍生结构算法寻找大于某数的最小2次幂数
分析框架

基础操作, 基础结构
线程安全, 线程安全的各个版本
使用场景, 优缺点
衍生结构
性能
算法

基础操作, 基础结构
内部使用的是 数组 + 链表, 红黑树

Node extends Entry

hashCode 是 Entry 的方法, Node类中实现了 hashCode 方法, 综合了 key 和 value 的 hashCod]]></description><category></category></item><item><title><![CDATA[sbt调试插件]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/112972974</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/112972974</guid><author>sparrowxin</author><pubDate>Sat, 23 Jan 2021 12:22:20 +0800</pubDate><description><![CDATA[sbt调试插件毒性sbt开启远程调试日志级别sbt是如何使用自己的插件的?需要自己发布插件
毒性
无法生成客户端

sbt开启远程调试
sbt -jvm-debug 5005
源码里面有测试用例, 启动的时候需要执行插件版本:
sbt -Dplugin.version=21.1.1
否则会报错

日志级别
‘-l debug’ 可以设置 airframe 的日志级别
sbt是如何使用自己的插件的?
测试工程的 plugins.sbt 是这样声明的

sbt 包的 Defaults.scala 中有这个

需]]></description><category></category></item><item><title><![CDATA[源码 - 同步障栅 CyclicBarrier]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/112688286</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/112688286</guid><author>sparrowxin</author><pubDate>Fri, 15 Jan 2021 23:10:12 +0800</pubDate><description><![CDATA[源码 - 同步障栅 CyclicBarrier术语设计源代码注释等待/唤醒的逻辑
术语

障栅动作: 实例化CyclicBarrier 的时候传进去的, 所有parties线程数都await 之后的要执行的操作.(实例化的时候可以传null的)
障栅点: CyclicBarrier 调用await() 的代码位置
成员数(parties): 参与的线程的数目
索引 : 线程调用 await 时候, 剩余的成员数
世代 (generation): CyclicBarrier 会在实例化的时候开始一个世代(ge]]></description><category></category></item><item><title><![CDATA[java 线程池中的状态转换 - 使用位运算表示状态]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/111875851</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/111875851</guid><author>sparrowxin</author><pubDate>Mon, 28 Dec 2020 22:48:23 +0800</pubDate><description><![CDATA[java 线程池中的状态转换
需要表示2种类型的状态, 1种是线程池是否在运行中, 1种是线程池中的有效线程数目.
java源代码中, 并不使用2个变量来分别表示上面的状态, 而是使用1个整数来表示. 为此, 线程池限制了最大的线程数目为 (2^29)-1 而不是 (2^31)-1. 这样做的目的是使代码更快, 更简单.
线程有以下的状态:

RUNNING: 接受新的任务并处理队列中的任务
SHUTDOWN: 不接受新的任务,但是继续处理队列中的任务
STOP: 不接受新的任务,也不处理队列中的任务,并中]]></description><category></category></item><item><title><![CDATA[【如何进行 Scala 代码设计 -- 接口粒度见功夫】 -- 以自动配置构建工具的小工具为例 （二）]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/111600301</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/111600301</guid><author>sparrowxin</author><pubDate>Wed, 23 Dec 2020 23:58:28 +0800</pubDate><description><![CDATA[【如何进行 Scala 代码设计】 -- 以自动配置构建工具的小工具为例 （二）前言重新定义接口根据 ConfigType 实现不同的逻辑测试拆分接口美化调用 api缺点总结
前言
上一篇文章我们尝试了一种代码的设计方式, 按照步骤分解接口, 然后逐步实现. 但是最后的结果却不尽人意:

接口太多
接口类型参数太多
调用接口不够优雅

这一次我们就从这几个方面入口, 重构代码
重新定义接口
这次我们直接把整个程序的所有操作定义成一个接口,类型参数我们依然用两个类型, BuildTool 和 ConfigTy]]></description><category></category></item><item><title><![CDATA[【如何进行 Scala 代码设计 -- 类型划分定基调】 -- 以自动配置构建工具的小工具为例 （一）]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/111568365</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/111568365</guid><author>sparrowxin</author><pubDate>Wed, 23 Dec 2020 00:33:45 +0800</pubDate><description><![CDATA[一种 Scala 代码组织方法前言第一次尝试最终的api构想接口定义定义类型定义行为接口
前言
scala 是一种多范式的语言, 可以使用面向对象的方式 或者是使用函数式的方式进行编程。
本文以 5分钟搞定构建工具仓库配置 一文中的工具为例, 尝试探讨一种 scala 的代码组织方式, 抛砖引玉。
首先介绍一下这个工具的功能, 自动配置 SBT 和 Maven 工具的本地仓库, 和国内镜像。目标非常简单， 但是要求代码的设计要优雅，可扩展，而不是像写脚本文件一样一个文件写完。
第一次尝试
首先我们分解一下程]]></description><category></category></item><item><title><![CDATA[5分钟完成构建工具仓库配置(国内镜像, 本地仓库地址)-附带小工具]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/111053182</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/111053182</guid><author>sparrowxin</author><pubDate>Sat, 19 Dec 2020 21:00:09 +0800</pubDate><description><![CDATA[5分钟搞定本地仓库配置Maven本地仓库镜像配置SBT本地仓库镜像Gradle本地仓库镜像
通常来说, 在 windows 上, 各种构件工具都是会默认将数据保存到 C 盘, 懂不懂就撑爆系统盘, 所以我们需要改变下载依赖的存储位置.
同时因为渣渣网络, 通常我们需要修改仓库的镜像, 使用国内镜像下载会更快.
Maven
本地仓库
在 maven 的安装目录下 %MAVEN_HOME%\conf\settings.xml 中的 &lt;localRepository&gt;节点可以指定对应的文件路径.
镜像]]></description><category></category></item><item><title><![CDATA[10分钟搞定Spring Boot Actuator]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/110962804</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/110962804</guid><author>sparrowxin</author><pubDate>Thu, 10 Dec 2020 23:40:01 +0800</pubDate><description><![CDATA[5分钟搞定Spring Boot Actuator什么是 Spring Boot Actuator怎么使用?什么是端点(Endpoint)?如何使用端点启用暴露实现自定义 bean接受输入匹配方法 = http类型 + 参数响应 类型=================到这里五分钟入门结束=================安全考虑访问控制CORS 配置
什么是 Spring Boot Actuator
Spring Boot 包含许多附加特性，以帮助您在将应用程序推向生产环境时监视和管理它。您可以选择使用 H]]></description><category></category></item><item><title><![CDATA[ZK 清单和解决方案(ZooKeeper Recipes and Solutions)]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/110524163</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/110524163</guid><author>sparrowxin</author><pubDate>Fri, 04 Dec 2020 21:29:38 +0800</pubDate><description><![CDATA[ZK 清单和解决方案前言ZK高级结构创建指南关于异常处理的注意事项开箱即用应用: 命名服务, 配置, 集群关系管理障栅(Barrier)双重障栅(Double Barriers)队列 (Queue)优先队列 (Priority Queues)锁 (Lock)可撤销的错误 和 GUID共享锁可撤销的共享锁两阶段提交领导选举总结
前言
翻译自: 官网文档
ZK高级结构创建指南
这篇文章描述了如何实现高级功能.
ZK最有趣的地方之一就是 尽管 ZK 使用异步通知, 你仍可以使用它来构建同步一致性原语, 比如 队列]]></description><category></category></item><item><title><![CDATA[Scala Cats - Functor]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/110409735</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/110409735</guid><author>sparrowxin</author><pubDate>Mon, 30 Nov 2020 23:25:32 +0800</pubDate><description><![CDATA[cats - FunctorFunctor不同的角度用 Functor 来管理效果(effect)Functor 的组合参考
Functor
Functor 是用来表示抽象化出可以调用 map 方法的结构 的 类型类. 这种结构比如说有 List, Option, 和 Future.

实现了 Functor 的类型, 可以看成是某种容器 或者是上下文, 而 map 方法就是表示要把容器中的东西变换成另外一种东西. map 方法的参数是 一个函数, 用来将 容器中的 A 类型转换成 B类型. 所以对于要实现]]></description><category></category></item><item><title><![CDATA[Scala Cats - Type Class 类型类]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/109825956</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/109825956</guid><author>sparrowxin</author><pubDate>Thu, 19 Nov 2020 23:06:30 +0800</pubDate><description><![CDATA[Scala Cats - Type Class 类型类前言例子类型类 vs 子类型隐式推导(Implicit derivation)语法笔记规则(Laws)Cats 中的类型类Cats中未完成类型类实例
前言
参考自 cats 官网文档
类型类(Type Class) 是函数式编程里面用来实现 特设多态 (ad hoc polymorphism)  (或者说成是众所周知的重载) 的强力工具.

换言之，参数多态对各模板参数的实现，是根据模板的通用（generically）的行为的抽象，即泛型的语义；而特设多]]></description><category></category></item><item><title><![CDATA[ZK编程 - 基础教程 - 使用 ZooKeeper 实现Queue 和 Barrier]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/109825402</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/109825402</guid><author>sparrowxin</author><pubDate>Thu, 19 Nov 2020 20:58:01 +0800</pubDate><description><![CDATA[ZK编程 - 基础教程 - 实现Queue 和 BarrierZK编程 - 基础教程前言介绍Barriers生产者-消费者队列测试Queue 测试Barrier 测试源代码
ZK编程 - 基础教程
前言
翻译自官网
介绍
这个教程实现了 障栅(barriers) 和 生产-消费者队列(producer-consumer queues). 分别对应代码里面的 Barrier  和 Queue类, 运行这个例子需要至少一个 ZK 服务器.
两个类都使用下面这个基类:
static ZooKeeper zk = ]]></description><category></category></item><item><title><![CDATA[ZK官网 - ZooKeeper Java 示例]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/109660912</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/109660912</guid><author>sparrowxin</author><pubDate>Sun, 15 Nov 2020 20:37:47 +0800</pubDate><description><![CDATA[ZooKeeper Java 例子前言一个简单的监控客户端需求程序设计`Executor` 类DataMonitor 类
前言
参考ZK官方文档
一个简单的监控客户端
需求


输入参数

zk 服务的地址
znode 的名称 - 要监视的节点
输出的文件名
可执行的程序



获取到znode数据之后启动程序


如果znode发生变化, client 重新获取内容并重启执行程序


如果znode消失, 关闭 可执行程序


程序设计
通常, ZL应用会被分成2个部分, 一部分负责维护连接, 另一部分负]]></description><category></category></item><item><title><![CDATA[ZooKeeper管理员指南--基于3.6.2版本]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/109438695</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/109438695</guid><author>sparrowxin</author><pubDate>Thu, 05 Nov 2020 15:27:54 +0800</pubDate><description><![CDATA[ZooKeeper管理员指南前言部署系统要求支持的平台依赖软件集群搭建
前言
翻译自ZK官网
原文
部署
系统要求
支持的平台

客户端 : Java 库, 客户端
服务端 : Java 库, 服务端
本地客户端:  C语言绑定的客户端
第三方贡献:  一些插件
基本上就是说, GNU/ Linux 支持上面全部4种, 前面两种Java库的全平台支持, 毕竟跨平台嘛, 最后两种只有 GNU/Linux 支持, 其他平台都不支持


依赖软件
需要Java 8 或者以上 (JDK8 LTS, JDK 11 L]]></description><category></category></item><item><title><![CDATA[ZooKeeper程序员指南]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/109178102</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/109178102</guid><author>sparrowxin</author><pubDate>Mon, 26 Oct 2020 16:11:20 +0800</pubDate><description><![CDATA[ZooKeeper程序员指南前言ZooKeeper 数据模型ZNodes
前言
基于 3.6.2 版本 的 官方文档
ZooKeeper 数据模型
ZooKeeper(以下称 ZK) 使用了层级的命名空间, 跟我们的文件系统非常类似. 唯一不同的是每个命名空间内的节点可以同时拥有数据 和 子节点. 有点像文件系统, 但是其中的文件既可以是普通文件也同时可以是目录. 节点的路径通常就是规范的, 斜杆分隔的绝对路径; 没有相对路径的形式. 任何unicode字符只要符合以下的形式就可以使用:

null 字符(]]></description><category></category></item><item><title><![CDATA[如何调试自己的shell脚本]]></title><link>https://blog.youkuaiyun.com/sparrowxin/article/details/108654582</link><guid>https://blog.youkuaiyun.com/sparrowxin/article/details/108654582</guid><author>sparrowxin</author><pubDate>Sat, 19 Sep 2020 16:50:57 +0800</pubDate><description><![CDATA[https://www.cyberciti.biz/tips/debugging-shell-script.html

]]></description><category></category></item></channel></rss>