Giter Club home page Giter Club logo

blog's People

Contributors

lj-zhu avatar

Watchers

 avatar  avatar

blog's Issues

docker常用命令

常用docker命令
http://blog.csdn.net/wsscy2004/article/details/25878363

1、查看docker服务信息
docker info

2、查看正在运行的容器
docker ps
docker ps -a 为查看所有的容器,包括已经停止的。

3、查看容器日志
docker logs -f <容器名orID>

4、删除单个容器
docker rm <容器名orID>

5、删除所有容器
docker rm $(docker ps -a -q)

6、停止、启动、杀死一个容器
docker stop <容器名orID>
docker start <容器名orID>
docker kill <容器名orID>

7、查看所有镜像
docker images

8、删除所有镜像
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)

9、运行一个新容器,同时为它命名、端口映射、文件夹映射。以redmine镜像为例
docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine

10、进入到docker容器终端
docker exec -it pms-web /bin/sh

11、一个容器连接到另一个容器
docker run -i -t --name sonar -d -link mmysql:db tpires/sonar-server
sonar

容器连接到mmysql容器,并将mmysql容器重命名为db。这样,sonar容器就可以使用db的相关的环境变量了。

12、拉取镜像
docker pull <镜像名:tag>
如 docker pull sameersbn/redmine:latest

13、当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。

机器a
docker save busybox-1 > /home/save.tar

使用scp将save.tar拷到机器b上,然后:
docker load < /home/save.tar

14、构建自己的镜像
docker build -t <镜像名> <Dockerfile路径>

15、重新查看container的stdout

启动top命令,后台运行

$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)

获取正在running的container的输出

$ sudo docker attach $ID
top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 373572k total, 355560k used, 18012k free, 27872k buffers
Swap: 786428k total, 0k used, 786428k free, 221740k cached
^C$
$ sudo docker stop $ID

16、后台运行(-d)、并暴露端口(-p)
docker run -d -p 127.0.0.1:33301:22 centos6-ssh

17、从Container中拷贝文件出来
sudo docker cp 7bb0e258aefe:/etc/debian_version .

拷贝7bb0e258aefe中的/etc/debian_version到当前目录下。
注意:只要7bb0e258aefe没有被删除,文件命名空间就还在,可以放心的把exit状态的container的文件拷贝出来

18、依附到运行中的容器
sudo docker attach ac4c (ac4c 是容器号)

退出,一定不要用ctrl+c,那样就是让docker容器停止了。
要用如下快捷键:先按,ctrl+p;再按,ctrl+q

19、查看端口映射
docker port ac4c (ac4c 是容器号)

List分组

定义分组接口,比较两个元素是否是同一组数据

public interface Group<T> {
   boolean isSameGroup(T current, T next);
}

遍历数据,使用Group规则比较当前元素与下个元素是否为同一类数据,进行切割数组

public static <T> List<List<T>> groupList(List<T> list, Group<T> groupBy) {
    // 结果
    List<List<T>> groupResult = new ArrayList<>();
    if (list == null || list.isEmpty()) {
        return groupResult;
    }

    int len = list.size();
    // 当前元素
    T currentItem = list.get(0);
    // 分组的开始下标
    int start = 0;
    for (int i=1; i<len; i++) {
    	// 取下一个元素
        T nextItem = list.get(i);
		// 当前元素和一下元素不同分组
        if(!groupBy.isSameGroup(currentItem, nextItem)) {
        	// 保存分组
            groupResult.add(list.subList(start, i));
            // 重置当前元素
            currentItem = nextItem; 
            // 保存新分组的开始下标
            start = i;
        }
    }
    if(start == 0) {
        groupResult.add(list);
    } else {
    	// 保存余的元素
        groupResult.add(list.subList(start, len));
    }
    return groupResult;
}

测试

public static void main(String[] args) {
        
    Group<Integer> groupBy = new Group<Integer>() {
        @Override
        public boolean isSameGroup(Integer current, Integer next) {
            return current.equals(next);
        }
    };
    
    List<Integer> list = new ArrayList<>();
    List<List<Integer>> groupResult = groupList(list, groupBy);
    System.out.println(groupResult);
    
    list.add(1);
    list.add(1);
    groupResult = groupList(list, groupBy);
    System.out.println(groupResult);
    
    list.add(2);
    groupResult = groupList(list, groupBy);
    System.out.println(groupResult);
    
    list.add(4);
    list.add(4);
    list.add(4);
    groupResult = groupList(list, groupBy);
    System.out.println(groupResult);
    
    list.add(7);
    groupResult = groupList(list, groupBy);
    System.out.println(groupResult);
    list.add(8);
    list.add(8);
    list.add(8);
    groupResult = groupList(list, groupBy);
    System.out.println(groupResult);
    
}

结果

[]
[[1, 1]]
[[1, 1], [2]]
[[1, 1], [2], [4, 4, 4]]
[[1, 1], [2], [4, 4, 4], [7]]
[[1, 1], [2], [4, 4, 4], [7], [8, 8, 8]]

ThreadLocal在Web应用中的应用

在struts2、springMVC的web应用中,不推荐直接使用request,response对象。而登录相关的一些信息一般会放到session中,在action或controller中有时需要用户的一些信息,这时就可以使用拦截器把session中的一些用户信息放到ThreadLocal中,在action或controller中就可以很容易的取到。
struts2中ServletActionContext.getRequest()就是利用这个机制通过静态方法获取request对象的。

  /**
     * Gets the HTTP servlet request object.
     *
     * @return the HTTP servlet request object.
     */
    public static HttpServletRequest getRequest() {
        return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST);
    }

requestp实际存放到ActionContext.java 中的类变量actionContext中

static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>();

利用Spring-web,在应用启动时做设置是否需要启动定时任务

我们的Web应用中或多或少的都会用到一些定时任务。但任务量又不大,还不需要单独跑定时任务的应用。但是应用是部署是又是至少两台对外服务(负载均衡, 不中断服务发布),如果多台机器同时跑定时任务时可能会导致1.重复执行相同的任务,2造成数据混乱。
利用Servlet 3中的ServletContainerInitializer类,可以很容易实现Web应用启动时动态做一些设置。
Spring-web中的SpringServletContainerInitializer实现了这个接口,在应用启动时会调用所有实现了WebApplicationInitializer接口的类。
应用中只要实现这个接口,在onStartup中做些初始化的操作。
我们就是利用这个接口,根据一些环境变量和profile做些特殊处理。
@order(1)
public class WebAppInitializer implements WebApplicationInitializer {

private static final Logger logger = LoggerFactory.getLogger(WebAppInitializer.class);

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    logger.info("--------------------WebAppInitializer------------------------");
    try {
        String hosteName = SystemInfoUtil.getHostName();
        if(!ConfigUtil.isOnline() || (hosteName != null && hosteName.toUpperCase().contains("MASTER"))) {
            servletContext.setInitParameter("spring.profiles.active", "schedule");
            logger.info("spring.profiles.active=schedule");
        }
    } catch (Exception e) {
        logger.error("WebAppInitializerError", e);
    }
}

}

导出Excel/Csv的设计

在信息管理系统中,导出Excel或CSV是一个很常用的功能。导出一般需要有三个步骤:一写表头,二获取数据,一行行的写入文件,三通过浏览器下载到本地查看。获取什么数据,每条数据需要怎么处理,每个导出都是不一样的,这部分交给具体的导出功能来实现。像控制取数据代码,写入文件的功能抽取出来,封装成一个工具类,用于简化导出。

/**
  * 取数据的接口
 */
public interface DataExporter<T>{
    /**
     * 获取数据
     * @return
     */
    List<T> getDatas(int start, int maxSize);
    
    /**
     * 表头数据
     * @return
     */
    List<String> getTitle();
    
    /**
     *  每行数据
     * @param object
     * @return
     */
    List getExportData(T rowData);
  
    /**
     * 统计�数据
     * @param object
     * @return
     */
    List getExportTotalData();
}

导出数据可以是Excel也可以是CSV文件,除了如何把一行数据写入文件中不一样,其余的控制代码是一样的,这样就可以设计一个abstract类

public abstract class Exportor<T> {
    private static final int PAGE_SIZE = 500;

    public void export(DataExporter<T> exporter) throws IOException {
        //表头
        List<String> titles = exporter.getTitle();
        if (titles != null) {
            writeTitle(titles);
        }
        try {
            int pageIndex = 1;
            int startIndex = 0;
            List<T> list = null;
            do {
                // 取数据
                list = exporter.getDatas(startIndex, PAGE_SIZE);
                if(list != null) {
                    // 导出数据
                    for (T t : list) {
                        List rowdata = exporter.getExportData(t);
                        writeRowData(rowdata);
                    }
                }
                startIndex = pageIndex * PAGE_SIZE;
                pageIndex++;
            } while (list.size() == PAGE_SIZE);
            
            // 导出总计结果
            List<T> totalData = exporter.getExportTotalData();
            if(totalData != null && totalData.size() > 0){
                writeRowData(totalData);
            }
        } finally {
            this.close();
        }
    }
    
    /**
     * 写一行数据
     * @param rowData
     */
    protected abstract void writeRowData(List rowData) throws IOException;

    /**
     * 写表头
     * @param title
     */
    protected abstract void writeTitle(List<String> title) throws IOException;
    
    /**
     * 清理工作
     */
    protected abstract void close() throws IOException;
    
}

写入Excel实现:
public class ExcelExportor extends Exportor {

private ExcelWriter excelWriter = null;
private OutputStream outputStream = null;

public ExcelExportor(OutputStream outputStream) {
    super();
    this.excelWriter = new ExcelWriter();
    this.outputStream = outputStream;
}

@Override
protected void writeRowData(List rowData) {
    excelWriter.writeRowData(rowData);
}

@Override
protected void writeTitle(List<String> title) {
    excelWriter.writeRowData(title);
}

@Override
protected void close() {
    excelWriter.writeFile(outputStream);
    try {
        outputStream.flush();
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

导出到CSV文件的实现:
public class CSVExportor extends Exportor {

private CSVWriter csvWriter = null;

public CSVExportor(Writer writer) {
    super();
    csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR);
}

protected void writeTitle(List<String> title) {
    csvWriter.writeNext(title.toArray(new String[title.size()]));
}

protected void writeRowData(List rowData) {
    String[] rowArray = new String[rowData.size()];
    rowData.toArray(rowArray);
    csvWriter.writeNext(rowArray);
}

@Override
protected void close() {
    try {
        csvWriter.flush();
        csvWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

在struts2中结合自定义一个导出Excel的Result

public class ExcelResult<T> implements Result {

	private static final Logger logger = LoggerFactory.getLogger(ExcelResult.class);
    
    private String fileName = "export.xls";
    private DataExporter<T> exporter;
    
    
	public ExcelResult(){
		super();
	}
	
	public ExcelResult(DataExporter<T> exporter){
		this(null, exporter);
	}
	
	public ExcelResult(String fileName, DataExporter<T> exporter){
        super();
        if(fileName != null) {
            try {
                this.fileName = new String(fileName.getBytes(), "ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        this.exporter = exporter;
	}
	
	@Override
    public void execute(ActionInvocation invocation) throws Exception {
        HttpServletResponse response = ServletActionContext.getResponse();
        
        ServletOutputStream outputStream = response.getOutputStream();
        try {
            response.setHeader("Pragma", "No-cache"); 
            response.setHeader("Cache-Control", "No-cache"); 
            response.setDateHeader("Expires", 0);
            response.setHeader("Content-Disposition","attachment;filename=" + fileName + DateUtil.date2String(new Date(), "_yyyyMMddHHmmss") + ".xls");
            response.setContentType("application/vnd.ms-excel;charset=gbk");
            Exportor<T> export = new ExcelExportor<>(outputStream);
            export.export(exporter);
        } catch(Exception e) {
            logger.error("导出Excel时出错了", e);
        }
    }
    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public void setExporter(DataExporter<T> exporter) {
        this.exporter = exporter;
    } 
}

具体使用方法:

public ExcelResult<Reservation> exportResvs() {
        final Map params = _buildQueryParams();
        
        ExcelResult<Reservation> result = new ExcelResult<>("订单列表", new DataExporter<Reservation>(){

            @Override
            public List<Reservation> getDatas(int start, int maxSize) {
                return reservationService.getReservations(params, start, maxSize);
            }

            @Override
            public List<String> getTitle() {
                List<String> titles = new ArrayList<String>();
                titles.add("订单号");
                titles.add("渠道");
                titles.add("卖价");
                titles.add("创建时间");
                return titles;
            }

            @Override
            public List getExportData(Reservation resv) {
                List<Object> rowData = new ArrayList<Object>();
                
                rowData.add(resv.getReservationId());
                rowData.add(resv.getChannelName());
                rowData.add(resv.getTotalMoney());
                
                rowData.add(DateUtil.date2String(resv.getCreateDatetime(), DateUtil.DATE_FORMAT_DATE_TIME));
                return rowData;
            }

			@Override
            public List getExportTotalData() {
	            return null;
            }
            
        });
        
        return result;
    }

SpringMVC 加密 / 解密请求休中的Json

  1. 实现RequestBodyAdvice、ResponseBodyAdvice 实现加解密。
  2. 继承MappingJackson2HttpMessageConverter 重写readInternal/writeInternal方法
  3. 利用filter中使用HttpServletRequestWrapper的子类读取json并解密,使用解密后的数据构造新的inputStream

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.