使用nexus发布和获取依赖包

背景

开发分布式服务, 各服务会根据命名规范定义各自的消息协议, 某一服务A调用指定服务B时, 服务A需要依赖服务B的消息协议, 使用构建工具(maven/sbt/gradle)+nexus私服可以满足多服务并行开发时, 服务间消息协议构件(artifact)最新版本的发布和获取.

搭建nexus私服

详见参考文章.

仓库

仓库类型

  • group:组仓库,用于方便开发人员自己设定仓库, 该类型可以引用多个已有仓库.
  • hosted: 内部项目的发布仓库
    • maven-releases: 内部发布的正式版本, 即版本不带-SNAPSHOT标识.
    • maven-snapshots: 内部发布的快照版本, 发布上去的构件会自带实践戳, 当有客户端获取时, nexus会取最近生成的进行返回,版本带-SNAPSHOT标识
  • proxy: 从远程仓库中寻找数据的仓库, 例如: 中央库

配置多仓库

创建类型为group的仓库(命名为xxx-central), 同时把需要的远程仓库纳入其中, 目前纳入的仓库有maven-central, maven-releases, maven-snapshots

阅读全文 »

理解本真的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) 瓶颈,结果就是明显的拖慢运行.

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

阅读全文 »

打造一劳永逸的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的相关问题较散, 自此以后小问题均聚合到该文进行记录.

问题

5.7.5后, group by报错问题

问题描述

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

阅读全文 »

Scala调用Matlab(MCR)进行数据拟合并获取结果

背景

硬件设备产生大量传感数据, 需要根据这些原始数据拟合出人能看懂并应用于生活的数据; 公司一直使用Matlab进行数据分析, 本文将介绍如何搭建环境, 并在Akka中调用相关库进行分析.

安装 Matlab

Matlab 编写的文件后缀为m(如: filterF.m), 但可以使用Matlab将其打包生成jar包, 提供给Java生态进行调用.

导出过程很简单, 命令行键入 deploytool → Library Compiler → Java Package → 选择m文件(可以多个) → 填写jar名称, 类名 → Package

如下几点需要特别关注下:

阅读全文 »