安装Gitlab-Development-Kit

Gitlab-CE是开源项目,意味着我们可以针对官方的Gitlab源码进行二次开发,从而定制出符合自己的开发习惯或开发流程的代码管理工具。

一般来说只要把Gitlab-CE的代码仓库clone到本地,就可以在上面修改代码了。Gitlab-CE的地址:https://gitlab.com/gitlab-org/gitlab-ce/ 。但是,只有源代码是不能够直接在本地上跑起来的,整个开发环境还需要安装很多依赖,以及配置数据库。Gitlab为了方便开发者,提供了一个Gitlab开发工具Gitlab-Development-Kit,其地址是:https://gitlab.com/gitlab-org/gitlab-development-kit 。Gitlab-Development-Kit可以帮助开发者很方便地在本地搭建起开发环境,并且把Gitlab运行起来。

  • 系统环境

    ubuntu-16.04.3-desktop-amd64

阅读全文 »

Gitlab调研

最近公司想要替换原来的代码管理工具Starteam,一方面是这个 Starteam bug不少,用起来有不少问题,随着开发团队的扩大,工具跟不上现在的开发节奏了;另一方面近几年 Git 已经成为趋势,作为开发人员,总应该顺应潮流…所以调研了一下 Gitlab 这个开源的项目管理工具。我觉得有必要把一些理解记下来,以备不时之需。

Gitlab Github Git

  • Github

提起开源,我们总能想到鼎鼎有名的 Github。Github 是一个代码托管网站,提供源代码托管服务。简单点来说,就是你可以把自己的代码上传到 Github 进行保存,然后在别的地方下载下来进行修改。当然,Github 不仅仅可以托管代码,你可以把他类比成网盘,存放你想存的任何东西,Github 还提供了一些其他的服务,比如写文档、生成电子书、托管博客等等。

GitHub 同时提供付费账户和免费账户。这两种账户都可以创建公开的代码仓库,但是付费账户还可以创建私有的代码仓库。

阅读全文 »

Java同步工具类

CountDownLatch

CountDownLatch(闭锁)的用法:

CountDownLatch在实例化的时候需要传入一个int类型的计数器,表示需要等待事件的数量。CountDownLatch.countDown()方法递减这个计数器,表示一个事件已经发生了;而调用了CountDownLatch.await()方法的线程等待计数器值达到零,表示所有需要等待的事件已经发生了。若计数器值非零,那么await()方法会一直阻塞到计数器的值为零,或者等待超时。

CountDownLatch的应用场景:

  • 确保某个计算在其所需要的所有资源都已经初始化后再继续执行。

  • 确保某个服务在其依赖的所有其他服务都已经启动之后再启动。

  • 等待某个操作的所有参与者都就绪后再执行。比如《荒野行动》,小队所有玩家点击“准备”之后房主才可以开始游戏。

阅读全文 »

Java-ForkJoin框架

分治思想

分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。

分治法在每一层递归上都有三个步骤:

  • 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

  • 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

  • 合并:将各个子问题的解合并为原问题的解。

阅读全文 »

Java基础-字节

这两天在实施一个加密通信方案时,涉及到了字节的读写和转换,有一些知识点需要学习和记录下来…

原码 反码 补码

原码:第一位表示符号,其余位表示数值。比如8位2进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位,8位2进制的取值范围:

[11111111, 01111111] = [-127, 127]

反码:正数的反码是等于原码,负数的反码是在其原码的基础上,符号位不变,其余位取反:

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

补码:正数的补码等于原码,负数的补码是在其原码的基础上,符号位不变,其余位取反,然后加1:

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

在Java中,存储的数值都是有符号的,同时也是使用补码存储的。

阅读全文 »

理解Java-Reference

最近重读《深入理解Java虚拟机》,讲到Java中的几种引用类型,结合源码总结梳理一遍。

引用类型

JDK1.2之后,Java扩充了引用的概念,将引用分为强引用、软引用、弱引用和虚引用四种。

  • 强引用

    类似于”Object a = new Object()”这类的引用,只要垃圾强引用存在,垃圾回收器就不会回收掉被引用的对象。

  • 软引用

    对于软引用关联的对象,在系统将要发生内存溢出异常之前,会把这些对象列入垃圾回收范围中进行回收。如果这次回收还没有足够内存,则抛出内存异常。

    使用SoftReference类实现软引用

  • 弱引用

    强度比软引用更弱,被弱引用关联的对象只能存活到下一次垃圾回收发生之前。当发生GC时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

    使用WeakReference类实现弱引用

  • 虚引用

    一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能够在这个对象被垃圾回收器回收掉后收到一个通知。

    使用PhantomReference类实现虚引用

阅读全文 »

如何执行一个延迟任务?

背景

前段时间做到临时版本管理系统的项目中有这样一个需求:

最新发布的版本发布记录状态为未处理,用户手动确认后状态修改为已处理。超过七天后状态为未处理的记录状态自动修改为过期提醒,同时向用户发送一封邮件。

“修改状态为过期提醒” 的任务就是一个延迟任务,如何执行这样一个任务呢?思考了两种方案:

轮询

启动一个定时任务,每隔一天执行一次,执行的内容如下:

  1. select id from release where status = 2 and release_time > 7days

  2. update release set status = 3 where id in (…)

  3. 向用户发送过期通知邮件(可以交给专门的线程去做)

阅读全文 »