Akka开发手册

背景

  1. 保证多人协作也只写出一种代码, 而非多种代码; 例如: 保证10人只写出一套代码, 避免10人写出100种代码.
  2. 有利于与异构系统进行交互
  3. 有利于工作交接
  4. 系统做大做强的基础

命名规范

交互协议

  • 交互协议根据业务类型封装在object中, 例如: DeviceProtocol
  • 与外围系统交互封装在包protocol/api
  • 内部系统交互封装在包protocol/service
阅读全文 »

理解本真的AKKA架构风格

背景

传统编程模型认为写一个变量就是直接写了相应的内存地址,但是在现代计算机架构,简单点说CPU写的是cache lines而不是直接写内存,这些缓存大部分是L1一级缓存,也就是说CPU的一个核写的内容另外的核看不见,为了把变化广播给别的核(这样才能同样广播到别的线程),需要(做额外动作)把cache line的变化同步到其他核的cache.

JVM运行环境下,要做到上述的线程间共享,需要显式地给变量(memory locations)打上volatile 标记 或者使用Atomic原子包装数据结构,否则,一般变量值的变化不保证能实时同步给其它线程可见,要么就使用锁,你可能会问为什么不标记所有变量都是volatile的呢?因为在CPU的多个核之间同步cache lines是很昂贵的操作!会拖慢CPU内核速度并且导致cache coherence protocol (the protocol CPUs use to transfer cache lines between main memory and other CPUs) 瓶颈,结果就是明显的拖慢运行.

当你看源码时你以为的方法调用

阅读全文 »

Flyway规范

背景

Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。

Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。

https://flywaydb.org/documentation/migrations

阅读全文 »

打造一劳永逸的word常规模板

背景

word作为office的一部分,是微软提供的办公文档写作软件.除了文字编辑的功能之外,它还包含很多提高写作效率的自动化功能,目前已成为办公文档、专业论文写作等必不可少的利器.本文内容涵盖了word自动化列表、段落文字样式批量设置、图表名称和编号设置、目录设置、制表位等等功能,并一步步教大家打造一个word常规模板,阅读完本文后,大家可以自己配置专属的文本模板,并应用到以后的工作中,提高文档写作、格式调整等工作的效率.

样例和模板下载地址

阅读全文 »

git通用操作集锦

背景

Git目前已成为比较流行的版本管理工具, 该文档记录使用Git过程中碰到的相关问题和解决方案.

问题集锦

将远程仓库回退到指定版本

1
2
3
4
# --hard 参数会抛弃当前工作区的修改 
# --soft 参数会会退到之前的版本, 但保留当前工作区的修改, 可以重新提交
git reset --hard <版本号>
git push origin <分支名> --force

阅读全文 »

git修改提交者用户名和邮箱

背景

开发过程中, 我们会经常混迹与不同的代码仓库,时常不同仓库会有作者信息验证。比如公司内建的gitlab一般会要求统一使用公司内部的域账号签名;github要求使用github账号签名等。因此,很容易犯在不同库中提交代码发现默认配置(全局)的author信息没有变更,结果push被拒绝或泄漏了姓名。

下面介绍几种常用的解决方式,当然最终还是需要养成切换代码库检查author信息的习惯,主动配置

1
2
3
4
5
6
7
// 设置全局
git config --global user.name "Author Name"
git config --global user.email "Author Email"

// 设置当前项目库配置
git config user.name "Author Name"
git config user.email "Author Email"
阅读全文 »

发布Scala构件至Maven中央库

背景

本文接上文发布构件至Maven中央库, 详细讲解SBT如何发构件至本地, 如何发布构件至Maven中央库.

样例项目

该项目的项目目录结构, build.sbt相关配置符合发布要求, 且已发布成功, 并会进行不定期更新, 首次发布的同学可参考对比.

阅读全文 »

Java日期详解

背景

在 Java 8 之前,我们最常见的时间与日期处理相关的类就是 Date、Calendar 以及 SimpleDateFormatter 等等。不过 java.util.Date 也是被诟病已久,它包含了日期、时间、毫秒数等众多繁杂的信息,其内部利用午夜 12 点来区分日期,利用 1970-01-01 来计算时间;并且其月份从 0 开始计数,而且用于获得年、月、日等信息的接口也是太不直观。除此之外,java.util.DateSimpleDateFormatter 都不是类型安全的,而 JSR-310 中的 LocalDateLocalTime 等则是不变类型,更加适合于并发编程。JSR 310 实际上有两个日期概念。第一个是 Instant,它大致对应于 java.util.Date 类,因为它代表了一个确定的时间点,即相对于标准 Java 纪元(1970年1月1日)的偏移量;但与 java.util.Date 类不同的是其精确到了纳秒级别。另一个则是 LocalDate、LocalTime 以及 LocalDateTime 这样代表了一般时区概念、易于理解的对象。

Java8中, java.time包下包含下面几个主要的类:

1
2
3
4
5
6
7
8
9
Instant:时间戳
Duration:持续时间,时间差
LocalDate:只包含日期,比如:2016-10-20
LocalTime:只包含时间,比如:23:12:10
LocalDateTime:包含日期和时间,比如:2016-10-20 23:14:21
Period:时间段
ZoneOffset:时区偏移量,比如:+8:00
ZonedDateTime:带时区的时间
Clock:时钟,比如获取目前美国纽约的时间
阅读全文 »

HTTP协议状态码

背景

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

HTTP状态码的英文为HTTP Status Code。

1xx 信息/临时响应

表示临时响应并需要请求者继续执行操作的状态代码。

这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。

阅读全文 »

MySql问题集锦

背景

以前mysql的相关问题较散, 自此以后小问题均聚合到该文进行记录.

问题

1. v5.7.5后, group by报错问题

问题描述

升级mysql后, 之前的sql语句报错, 报错信息如下:

阅读全文 »