Zacard's Notes


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 搜索
close
Zacard's Notes

Docker学习系列二:Dockerfile

发表于 2016-05-11 | 分类于 软件技术 | | 阅读次数

前言

构建或者修改Docker image建议都使用Dockerfile。因为通过Dockerfile构建image或者修改image是透明的、可记录的,且无需重复的镜像和容器的创建过程。甚至可以使用版本控制(如:git)来保存Dockerfile的修改记录,以保留docker image完整的生命周期。

参考:官方Dockerfile说明

Dockerfile基本语法

Dockerfile支持的语法命令如下:

INSTRUCTION argument

指令不区分大小写。但是,命名约定全部为大写。

所有Dockerfile都必须以FROM命令开始。FROM命令会指定基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像。FROM命令可以多次使用,表示会创建多个镜像。集体突发如下:

FROM <IMAGE NAME>

例如:

FROM ubuntu

上面的指定告诉我们,新的镜像将基于Ubuntu的镜像来构建。

继FROM命令,Dockerfile还提供了一些其他的命令以实现自动化。这些命令的顺序就是他们的执行顺序。

阅读全文 »
Zacard's Notes

Docker学习系列一:为何要用Docker

发表于 2016-05-11 | 分类于 软件技术 | | 阅读次数

前言

强烈建议先看下官方的文档:传送门

同时建议看下Flux7的Dock入门教程:传送门

本系列需要了解Docker的一些基本命令为前提。

什么是Docker

Docker是一个开源的应用容器引擎。基于Namspaces、Control Groups和UnionFS,保证容器了的轻巧、隔离和易移植。

为何要用Docker

build once, configure once and run anywhere

  • 速度飞快
  • 优雅的隔离架构
  • cpu/内存消耗低
  • 快速启动/关闭/销毁
  • 开源

种种优点契合了目前主流的一些需求:

  • 简化了大规模的集群部署步骤
  • 方便的持续集成和持续部署
  • 微服务架构
  • 一次性的/定时的任务
  • 快速部署
  • 一致的开发测试环境
  • 演示、使用环境
  • 解决设备成本,充分利用资源
  • 技术方案快速验证
  • 更多…
Zacard's Notes

JSqlParser使用示例

发表于 2016-05-10 | 分类于 软件技术 | | 阅读次数

背景

由于业务需要,需要编写一个mybatis插件来统一处理一类sql,并且需要对sql动态处理。然而解析sql成为一件繁琐的工作,果断github上查找是否有sql解析的项目。一个300多star的sql解析构建项目:JSqlParser。

由于JSqlParser的github主页的使用说明略简单,查看测试类,也没有覆盖常用的使用需求。于是,这里整理了一些个人实际使用的一些方法。

使用示例

查询返回增加一列

代码如下:

/**
 * 测试查询返回增加一列
 */
@Test
public void testAddSelectColumn() throws Exception {
    Select select = (Select) CCJSqlParserUtil.parse("select name from user where id = 1");
    SelectUtils.addExpression(select, new Column("mail"));
    Assert.assertEquals(select.toString(), "SELECT name, mail FROM user WHERE id = 1");
}
阅读全文 »
Zacard's Notes

testng期望异常和期望异常信息的使用

发表于 2016-04-22 | 分类于 软件技术 | | 阅读次数

背景

当我们编写单元测试的时候,经常会使用到expectedExceptions来测试程序的报错是否达到预期。但是,一般的系统设计中,异常都是统一处理成一个自定义的异常,用不同的错误code和错误message来区分不同的错误信息。这就需要用到testng的expectedExceptionsMessageRegExp来匹配抛出的异常message是否是预期的。

使用

代码如下:

public class MyTest {

    @Test(expectedExceptions = MyException.class, expectedExceptionsMessageRegExp = ".*error-code-1001.*")
    public void testcaseOne() {
        System.out.println("test expectedExceptionsMessageRegExp.");
        throw new MyException(“error-code-1001”,“系统错误”);
    }
}

这个测试方法会被判定通过。

Zacard's Notes

idea设置google code style

发表于 2016-04-11 | 分类于 软件技术 | | 阅读次数

背景

idea支持自定义的code style,并且google code style也提供了正对idea的xml配置,直接导入就可以在idea中使用google提倡的code style了。

操作

  • 从github上clone google code style
  • 复制对应的xml配置(如intellij-java-google-style.xml)到“~/Library/Preferences/IDEA/codestyles/”下
  • 重启idea在Prefrence->Editor—>Code Stytle->Java,选择GoogleStyle即可
Zacard's Notes

ideaVim使用记录(持续更新)

发表于 2016-03-23 | 分类于 软件技术 | | 阅读次数

背景

一直想脱离触摸板(鼠标已经脱离),纯键盘开发。vim肯定是首选,于是idea上的vim插件ideaVim进入熟悉阶段。由于vim的操作也不熟悉,所以在此记录本人开发中用到的一些快捷键操作。

keymap 记录

  • 跳转到指定行:{行数}g
  • 标签特切换:gt或者gT,前者顺序切换,后者逆向切换
  • 单词移动:w/W,移动到下个单词开头;b/B,倒退到上个单词开头。大写的会忽略标点。命令前加数字表示执行次数,如2W
  • 删除当前单词并进入插入模式:cw
  • 撤销:u;恢复被撤销的操作:ctrl+r
  • 复制单词,替换复制内容:yiw->viwp
Zacard's Notes

使用java8将list转为map

发表于 2016-03-17 | 分类于 软件技术 | | 阅读次数

常用方式

代码如下:

public Map<Long, String> getIdNameMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername));
}

收集成实体本身map

代码如下:

public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account));
}

account -> account是一个返回本身的lambda表达式,其实还可以使用Function接口中的一个默认方法代替,使整个方法更简洁优雅:

public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getId, Function.identity()));
}

重复key的情况

代码如下:

public Map<String, Account> getNameAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity()));
}

这个方法可能报错(java.lang.IllegalStateException: Duplicate key),因为name是有可能重复的。toMap有个重载方法,可以传入一个合并的函数来解决key冲突问题:

public Map<String, Account> getNameAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2));
}

这里只是简单的使用后者覆盖前者来解决key重复问题。

指定具体收集的map

toMap还有另一个重载方法,可以指定一个Map的具体实现,来收集数据:

public Map<String, Account> getNameAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2, LinkedHashMap::new));
}
Zacard's Notes

http压力测试小工具

发表于 2016-03-15 | 分类于 软件技术 | | 阅读次数

背景

最近在寻找一款小而美的http压力测试工具,以方便本机快速测试。果断github里搜索。不负众望啊,一款4000多star的http压力测试小工具。果断试用。(ps:感谢开源,拥抱开源)

安装

工具叫做boom(传送门)。

go get github.com/rakyll/boom

这里要注意,这个工具是用go语言写的,所以你要先有go语言环境,并且是要配置GOPATH。

使用

boom -n 100 -c 10 http://www.baidu.com

-n:请求连接数
-c:请求并发数
其他参数参考官方github。

ps:boom命令在${GOPATH}/bin/下

Zacard's Notes

关于java的一些冷知识

发表于 2016-02-29 | 分类于 软件技术 | | 阅读次数

背景

最近开始重新翻阅了《Think in Java》这本书。果然,温故而知新,发现了一些冷知识。

java中的goto

goto是java中的保留字,但是却不是java中的关键字,你并不能在代码中使用goto。但是java能够使用break/continue和标签达到goto的效果。然而,需要注意的是,java里唯一需要用到这种效果的理由就是因为循环嵌套的存在,并且想从循环嵌套中break/continue。

到目前为止,本人阅读过的开源源码中且有记忆的,有使用过类似这种goto效果的,只有Google的Gson。

阅读全文 »
Zacard's Notes

关于mybatis3.3.1批量插入回写id的实践

发表于 2016-02-18 | 分类于 软件技术 | | 阅读次数

背景

今日,注意到mybatis3.3.1正式发布,果断查看了更新内容(传送门)。大致浏览了下,其中有一项喜人的改进:

Support insert multiple rows and write-back id

批量插入支持id回写了!我们知道,以往如果批量插入,需要获取插入后的ids,是需要根据特定条件反查的。但是,有了这个特性了,完全省去了这一多余查询过程。

阅读全文 »
1…4567
zacard

zacard

优生笑,菜鸟哭

65 日志
2 分类
105 标签
RSS
GitHub Weibo ZhiHu
Links
  • DingDang's Notes
© 2015 - 2021 zacard
由 Hexo 强力驱动
主题 - NexT.Mist