分类: 默认

  • 使用Docker构造Jenkins集群

    使用Docker构造Jenkins集群

    Jenkins作为常用的CI功能自然是不用说了,如果运行在上面的项目有很多,而且对于环境的要求各不相同就稍微有点复杂了。

    比如一个Java项目,使用maven构建,Java语言等级为8,但是有部分代码又希望保有java7的语言等级,那么环境上的配置就稍微复杂了一点。

    如果还有其他比如Python,NodeJs项目,那么这个机器的环境就极为复杂了。

     

    Jenkins本身是支持主从节点的,也就是说具体的构建是可以指定由某个节点完成的。

    也就意味着我们只需要提供一个由所需环境的从机即可。当然,由一个独立的主机来提供是最好的,但是很多时候并没有那么多资源,而且环境需求也多变。

    这种情况下Docker就是一个很好的选择了,我们来尝试用Docker提供一个Java8带maven的环境。

    Jenkins主从模式可以有四种方式实现,我们选择最简单的,从ssh登录。

    整体配置如下

    FROM maven:3-jdk-8
    RUN apt-getupdate && apt-get install -y openssh-server
    RUN mkdir /var/run/sshd
    RUN mkdir /var/jenkins
    
    RUN echo'root:jenkins' | chpasswd
    RUN sed -i's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
    
    RUN sed's@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
    
  • 使用RxJava简化编程

    使用RxJava简化编程

    最近在做一个很有趣的项目,需求明确应用界面是console的gui。

    长成这样的

    在现在这个年代,这种朴素的需求实在少见。

    项目大量消费自有的或者外部的API,自身逻辑还是很简单。但是其中大量的异步消费远程API,解析数据,更新UI还是让人很烦。

    想起来了RxJava,代码上得到了很多简化,不敢说是最佳实践,但是换一种风格总有一些新鲜的体验。

    普通方法

    先来个简单的,一个和比特币有关的API,https://blockchain.info/ticker
    这个API返回的是当前比特币交易价格,返回内容如下:

    {
    USD: {
    15m: 246.7,
    last: 246.7,
    buy: 246.65,
    sell: 246.7,
    symbol: "$"
    },
    ISK: {
    15m: 32551.57,
    last: 32551.57,
    buy: 32544.97,
    sell: 32551.57,
    symbol: "kr"
    },
    HKD: {
    15m: 1912.37,
    
  • Java web容器中load-on-startup

    昨天一同事提到load-on-startup的问题,虽然知道它在标准中有提到,但是具体的细节又有点记不清楚了。

    刚才想到看了一下JSR 315: JavaTM Servlet 3.0 Specification

    load-on-startup的作用

    load-on-startup是servlet tag下的一个值。它告诉容器加载顺序,如果不声明这个值那么容器只会在它认为需要的时候才加载它。

    这样有时会出现一个问题,如果Servlet启动时会初始化数据库连接或者加载其他信息,如果这些耗时较长的处理不在容器启动时完成,那就会在容器认为必要时加载Servlet是完成,也就是说会出现响应问题。

    所以有load-on-startup这个设置来允许你指定servlet需要在部署到容器时就加载。

    load-on-startup的值

    load-on-startup的应该是数字,有时会出现以下几种情况:

    • 如果两个Servlet的load-on-startup的值相同,那么加载顺序是在web.xml中的声明顺序。
    • 如果值为零或者负数,那么在需要时才加载。
    • 如果没有,那么加载由容器决定。
  • 新的一个cn域名备案中

    昨天万网搞活动,送了一张20元代金券,算下来com和cn域名首年购买都是29元。

    之前有个网站做的很简陋,但是流量出奇的不错。

    最近也在用Grails做东西,正好整理一下,做个新网站出来。

    选来选去还是买了cn域名,cn域名需要上传身份证做实名认证,昨天上传,今天就审核完成了。

    备案自然是在阿里云上,流程走过了一次自然觉得简单了不少,不过没想到的是cn备案需要邮寄资料…

    所以域名的选择还是com为好呀。…

  • 备案完成

    备案完成

    今天上午十点的时候收到的管所的短信通知,提示备案通过。

    大约一个小时以后博客就可以正常访问了。

    备案从8号开始,一直到今天24号,总共耗时16天。

    这其中不得不赞一下阿里云的服务,备案的审核只要在阿里云那边的都是一天过。

    其中照相的时候还邮寄了幕布,中午发出,第二天就到了,照了相,当天下午就提交管所了。

    备案时间

    这十几天的闭站的损失没有想象中那么大。主要是DNS那边支持针对搜索引擎做专门的处理,所以对于蜘蛛来说网站还是原来的地址,原来的内容。

    只是正常的用户访问受到了影响。

    当然,现在的速度那是极快的,360监控给出的数据如下:

    网站响应速度

    而之前的速度一直是2000毫秒以上。…

  • 准备开始备案

    前思后想,还是决定给博客备个案,重新移动到国内服务器上。

    选用的阿里云,售前客服也很靠谱的感觉,唯一不爽的就是首次备案需要闭站。

    我觉得今天晚些时候就会暂时关闭博客,希望备案不会花太久时间。…

  • 简洁的Formula

    之前为Homebrew添加了一个Moco的Formula,提交PR以后一直没有回应,还以为项目组不接受这个提交呢。

    今天收到提示已经merge了,代码也作为一些修改,感觉代码好了不少。

    其实这个Formula是我第一个写ruby,基本是边看边学,感觉需要了解的还很多。

    require

    Ruby中的require和java的import很像,可以加在标准类库里面的文件,当然也可以是已安装的gems文件。

    因为测试中使用了ruby的http库,所以我把require写在文件开头

    require"formula"
    require'net/http'

    而McQuaid修改后将http的引用移动到测试中

    testdo
    require"net/http"

    字符串

    因为moco的启动会有一个端口,我用一个变量表示,然后直接拼接

    actualResponse=Net::HTTP.get(URI('http://localhost:'+port.to_s))

    修改以后直接用占位符表示

    response =Net::HTTP.getURI"http://localhost:#{port}"

    断言

    因为返回的结果需要判断,我使用的是if判断,不相符直接报错

    if(actualResponse!='Hello, Moco')
    onoe"Error! The response is not right."
    end

    可以直接用一句话操作

    assert_equal"Hello, Moco", response

    参考

    修改前
    修改后

  • Java中支持深浅拷贝的第三方库

    最近项目上用到了一些Deep Clone的库,但是原来使用的库速度略慢,直接拖累了应用。

    今天有空看了一下相关的可用的第三方库。

    深拷贝

    Apache旗下的Commons-Lang3包有一个序列化的工具SerializationUtils,可以做深拷贝。

    当然前提是你的类实现了序列化接口。

    Java Deep Cloning Library是我觉得最好用的一个。它的深拷贝通过反射实现,适合用于你
    不能控制的第三方类或者没有实现序列化的类。

    浅拷贝

    还是Apache旗下,不过不是Commons-Lang3,而是Commons-Beanutils。其中BeanUtils提供了一个cloneBean方法。
    可以直接简单的操作。

    如果项目依赖了Spring的库,那么直接使用BeanUtils即可。

    参考文献

    Common-Lang3
    Java Clone
    Spring BeanUtls

  • Intelli IDEA 14隐藏被排除的文件夹

    Intelli IDEA 14隐藏被排除的文件夹

    花了99刀升级到Idea最新版,14.0.1,然后发现了一个问题。

    被排除的文件和文件夹以红色显示了。

    看着这东西,人一下子就不好了。

    还好设置可以改回来。

    右上角,关闭“Show Excluded Files”即可。

    不显示被排除的文件

  • 使用moco的global设置功能拆分配置文件

    Moco是一个很方便的小工具,可以作为开发时临时的虚假服务端。

    Moco的响应方式主要通过config.json来控制。有新的需要时直接在文件中添加删除就行了。

    不过长此以往这个文件就越来越大了,比如1000+行。

    还好的是moco提供了global setting这个功能可以做到配置文件拆分。

    配置修改

    之前的配置文件看起来应该是这样的:

    [
    {
    "request":{
    "uri":"/foo"
    },
    "response":{
    "text":"foo"
    }
    },
    {
    "request":{
    "uri":"/bar"
    },
    "response":{
    "text":"bar"
    }
    }
    ]

    我希望将这两个请求拆分到两个不同的文件中。

    [
    {
    "include":"foo.json"
    },
    {
    "include":"bar.json"
    }
    ]

    然后在foo.json文件中添加:

    [
    {
    "request":{