180917-Shell命令之xargs使用小结

Shell命令之xargs使用小结

常见用于管道的处理中,拿到前面的数据进行后续的处理;

xargs 以空白字符或换行作为分割,默认使用echo输出结果,且会忽略空白行,官方说明如下

xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial-arguments followed by items read from standard input. Blank lines on the standard input are ignored.

180916-ReactJs之日期转换

常见的日期与时间戳之间的相互转换,记录下借助插件momoent来实现

1. 使用姿势

使用前,有那么几步需要走

安装依赖

1
sudo npm install --save moment

引入依赖

1
import moment from 'moment';

开始使用

1
2
// 将时间戳(ms),转换为指定格式的日期
moment(Time).format("YYYY-MM-DD HH:mm:ss")

2. 常用说明

a. 日期格式化

1
2
3
4
5
moment().format('MMMM Do YYYY, h:mm:ss a'); // 九月 16日 2018, 8:54:12 晚上
moment().format('dddd'); // 星期日
moment().format("MMM Do YY"); // 9月 16日 18
moment().format('YYYY [escaped] YYYY'); // 2018 escaped 2018
moment().format(); // 2018-09-16T20:54:12+08:00

b. 相对时间

1
2
3
4
5
moment("20111031", "YYYYMMDD").fromNow(); // 7 年前
moment("20120620", "YYYYMMDD").fromNow(); // 6 年前
moment().startOf('day').fromNow(); // 21 小时前
moment().endOf('day').fromNow(); // 3 小时内
moment().startOf('hour').fromNow(); // 1 小时前

c. 日历时间

1
2
3
4
5
6
7
8
moment().subtract(10, 'days').calendar(); // 2018年9月6日
moment().subtract(6, 'days').calendar(); // 本周一晚上8点55
moment().subtract(3, 'days').calendar(); // 本周四晚上8点55
moment().subtract(1, 'days').calendar(); // 昨天晚上8点55分
moment().calendar(); // 今天晚上8点55分
moment().add(1, 'days').calendar(); // 明天晚上8点55分
moment().add(3, 'days').calendar(); // 下周三晚上8点55
moment().add(10, 'days').calendar(); // 2018年9月26日

d. 多语言

1
2
3
4
5
6
7
8
moment().format('L');    // 2018-09-16
moment().format('l'); // 2018-09-16
moment().format('LL'); // 2018年9月16日
moment().format('ll'); // 2018年9月16日
moment().format('LLL'); // 2018年9月16日晚上8点55分
moment().format('lll'); // 2018年9月16日晚上8点55分
moment().format('LLLL'); // 2018年9月16日星期日晚上8点55分
moment().format('llll'); // 2018年9月16日星期日晚上8点55分

II. 其他

0. 相关

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

180915-ReactJs之Fix:uncaught at check call argument [object Promise] is not a function

Fix uncaught at check call: argument [object Promise] is not a function

在使用ANTD的魔板套前端页面的时候,遇到了一个诡异的问题,记录下

在modal中的写法如下

1
2
3
4
* addGroup({payload}, {call, put}) {
yield call(addGroup(payload));
console.log("add group over!");
},

在执行时,控制台报错

1
uncaught at check call: argument [object Promise] is not a function

主要原因在 yield call(addGroup(payload)); 的使用姿势问题,对于需要传递参数的去哪个,不能直接这么干,应该改为

1
yield call(addGroup, payload);

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

180911-获取应用中所有线程

如何获取应用中,所有活动的线程?

1
2
3
4
ThreadGroup group = Thread.currentThread().getThreadGroup();
// 激活的线程数加倍
int estimatedSize = group.activeCount() * 2;
Thread[] slackList = new Thread[estimatedSize];

上面是获取当前线程所在的ThreadGroup, 然后将这个分组内的所有线程丢到slackList数组中,实际测试时,数组大小可能是大于实际的线程数的(而且可能性特别大)

通过ThreadGroup,还可以获取上一层的Group, 然后遍历所有的线程

180910-Java根据路径获取文件内容

给出一个资源路径,然后获取资源文件的信息,可以说是非常常见的一种需求场景了,当然划分一下,本文针对最常见的三种状况进行分析

  • 网络地址
  • 本地绝对路径
  • 本地相对路径

180907-IDEA编译Groovy脚本失败记录

在做 https://github.com/liuyueyi/quick-task 项目时,遇到了一个蛋疼的问题,不知道什么时候加了个Groovy脚本之后,整个项目就编译不过了,特此记录一下

180906-Centos网络带宽监控小结

Centos网络带宽监控小结

查看机器的网络流入流出带宽,一个简单的方式就是利用 iftop ,下面简单的记录下使用姿势

180905-Spring返回Json对象

Spring之返回Json串

使用Spring搭建的web后端服务,与前端通过Json串进行交互,特此记录下使用姿势

1. 直接返回JsonString

这个可以说是最简单和最常见的一种使用姿势了,直接返回String,如下

1
2
3
4
5
@ResponseBody
@RequestMapping(value = "/body")
public String body(@RequestBody Req req) {
return JSON.toJSONString(req);
}

2. 使用JsonInclude注解

直接返回的是一个对象,然后交给框架来将对象转换为String丢给前端

1
2
3
4
5
@RequestMapping(path = {"/index", "/"})
public ResponseWrapper<List<PoetryDTO>> index() {
List<PoetryDTO> ans = poetryReadService.getIndex();
return ResponseWrapper.successReturn(ans);
}

直接用上面的方式时,可能会抛出,提示没有对应的HttpMessageConverter来转换ResponseWrapper对象

一个简单的使用姿势就是直接使用注解 com.fasterxml.jackson.annotation.JsonInclude

如下即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
JsonInclude
@Data
@NoArgsConstructor
public class ResponseWrapper<T> {
private int code;
private String msg;
private T data;

public ResponseWrapper(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}

public static <T> ResponseWrapper<T> buildSuccess(T data) {
return new ResponseWrapper<>(200, "success", data);
}

public static <T> ResponseWrapper<T> buildError(int code, String msg, T data) {
return new ResponseWrapper<>(code, msg, data);
}
}

因此关键就是HttpMessageConverter在起作用了,下一篇重点关注下这个是什么东西,干嘛用,以及如何自己实现一个特定需求的转换器

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

180830-SpringBoot之获取application.yml配置参数

SpringBoot之获取Application.yml配置参数

需要获取配置文件中的配置参数的场景挺多的,常见的一种方式就是直接从Enironment对象中获取,或者使用 @Value 注解的方式注入,但是这都有一个前提,需要确切的知道配置的name

如果某些场景下,我需要遍历配置参数可以怎么办?

180827-Java获取类路劲的几种姿势小结

I. Java获取类路劲的几种姿势小结

在Java环境中,如何获取当前类的路径,如何获取项目根路径,可以说是比较常见的需求场景了,下面简单的记录一下

180815-Spring之RestTemplate使用小结二:中级使用篇

Spring之RestTemplate中级使用篇

前面一篇介绍了如何使用RestTemplate发起post和get请求,然而也只能满足一些基本的场景,对于一些特殊的如需要设置请求头,添加认证信息等场景,却没有提及可以怎么做,这一篇则相当于进阶版,将主要介绍

  • get/post请求如何携带 header
  • post传文件可以怎么玩, post提交json串怎么处理
  • exchange方法的使用姿势

180813-Spring之RestTemplate使用小结一

Spring之RestTemplate初级使用篇

作为一个Java后端,需要通过HTTP请求其他的网络资源可以说是一个比较常见的case了;一般怎么做呢?

可能大部分的小伙伴直接捞起Apache的HttpClient开始做,或者用其他的一些知名的开源库如OkHttp, 当然原生的HttpURLConnection也是没问题的

本篇博文则主要关注点放在Spring的生态下,利用RestTemplate来发起Http请求的使用姿势

180810-单页面Vue打包子页面提示404问题记录

网上下了个Vue项目,打包为dist之后,扔到ngxin服务器上运行,正常连接访问没啥问题,但是刷新之后提示404

记录下修复过程

180808-Java实现一个MD5工具类

I. MD5工具类

利用JDK封装一个简易的MD5工具类,逻辑比较简单,直接贴下具体实现

180807-Quick-Task 动态脚本支持框架之Groovy脚本加载执行

Quick-Task 动态脚本支持框架之Groovy脚本加载执行

上一篇简答说了如何判断有任务动态添加、删除或更新,归于一点就是监听文件的变化,判断目录下的Groovy文件是否有新增删除和改变,从而判定是否有任务的变更;

接下来的问题就比较明显了,当任务变更之后,就需要重新加载任务了,即如何动态的编译并执行Groovy文件呢?

相关系列博文:

180804-Spring之动态注册bean

Spring之动态注册bean

什么场景下,需要主动向Spring容器注册bean呢?

如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运行了,而这个基础平台是一直都在运行的,所以在新来任务时,最直观需要注册的就是 DataSource 数据源这个bean了,那么可以怎么玩?

I. 主动注册Bean支持

借助BeanDefinition来实现bean的定义,从最终的使用来看,代码比较少,几行而已

1
2
3
4
5
6
7
8
9
10
11
12
13
public <T> T registerBean(String name, Class<T> clazz, Object... args) {
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
if (args.length > 0) {
for (Object arg : args) {
beanDefinitionBuilder.addConstructorArgValue(arg);
}
}
BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();

BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
beanFactory.registerBeanDefinition(name, beanDefinition);
return applicationContext.getBean(name, clazz);
}

测试如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import com.github.hui.story.quickstory.server.VisitService;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class BeanHolder {
private final ConfigurableApplicationContext applicationContext;

public BeanHolder(ConfigurableApplicationContext applicationContext) {
this.applicationContext = applicationContext;
initSer();
}

public void initSer() {
InrSer ser = registerBean("test", InrSer.class);
ser.name = "一灰";
ser.uid = 22;
System.out.println(ser);

InrSer ser2 = registerBean("test2", InrSer.class, "一灰灰Blog", 20);
System.out.println(ser2);
}

@ToString
public static class InrSer {
private String name;
private Integer uid;

@Autowired
private VisitService visitService;

public InrSer() {
}

public InrSer(String name, Integer uid) {
this.name = name;
this.uid = uid;
}
}

private <T> T registerBean(String name, Class<T> clazz, Object... args) {
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
if (args.length > 0) {
for (Object arg : args) {
beanDefinitionBuilder.addConstructorArgValue(arg);
}
}
BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();

BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
beanFactory.registerBeanDefinition(name, beanDefinition);
return applicationContext.getBean(name, clazz);
}
}

输出如下

show

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

180803-Spring定时任务高级使用篇

前面一篇博文 《Spring之定时任务基本使用篇》 介绍了Spring环境下,定时任务的简单使用姿势,也留了一些问题,这一篇则希望能针对这些问题给个答案

I. 定时任务进阶篇

1. 问题小结

前面一篇博文,抛出了下面的几个问题,接下来则围绕问题进行分析

  • 一个项目中有多个定时任务时,他们是并行执行的还是串行执行的?
  • 如果默认是串行的
    • 那么有相同的crond表达式的定时任务之间,有先后顺序么?
    • 某个任务的阻塞是否会影响后面的任务?
    • 如果需要他们并行执行,可以怎么做?
  • 如果是并发执行的
    • 是新创建线程还是采用线程池来复用呢?
    • 在并发执行时,假设有个每秒执行一次的任务,但是它执行一次消耗的时间大于1s时,这个任务的表现时怎样的呢?不断地新增线程来执行还是等执行完毕之后再执行下一次的呢?

180801-Spring之定时任务基本使用篇

Spring之定时任务基本使用篇

spring-boot项目中,想添加一个定时任务,可以怎么办?

  • 不管什么项目,都是可以直接用JDK原生的定时任务来实现
  • 借助@Scheduled注解来使用

本篇博文则主要集中在在SpringBoot项目中,怎么使用定时任务

180731-关于写作的一点杂谈

晚上吃了顿烧烤,回来之后就比较晚了,今天的工作小结却没有啥好东西可以写,修了一天的数据,加了点业务逻辑的if/else,也确实没有什么特别值得说到的事情。索性就写一写从去年四五月份开始,到现在一直在坚持的写博文。

先来一张庐山三叠泉排个版

三叠泉

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×