http://a.icharm.me/wp-content/uploads/2018/09/豆芽图片20180925090455742.jpg

笛湖

一种基于时间戳的随机字符串生成方式

想实现一个由时间戳+随机字符串组合方式生成重复概率很低的随机字符串,但是纯数字的时间戳是在太显眼,不想让人猜到里面包含了时间戳信息,怎么办,那就对0-9的数字进行编码吧。 最初想到的是使用base64来编码,但是有个问题,时间戳的前三位基本不变动,导致base64编码后的的时间戳还是具有一定的规律性,这不是我想要的。 思虑再三,决定自己来实现一个数字编码算法,将0-9进行随机编码,每个数字都对应着6种可能的字符来替代,比如0 ,可以由 y\p\z\3\O\G 来表示,至于选择这六个字符种的哪一种,则随机决定 首先定义编码字典,用数组来保存: private val EncodeDict = Seq( 'y', 'i', 'o', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'p', 'a', 's', 'd', 'f', 'g', 'C', 'T', 'F', 'X', 'z', 'x', 'c', 'v', 'b', 'n', 'm', '0', '1', '2', '3', 'U', "H", 'V', 'Y', '8', '9', 'P', 'L', 'M', 'O', 'K', 'N', 'I', 'J', 'B', '4', '5', '6', '7', 'G', 'h', 'j', 'k', 'l', 'R', 'D', 'Z', 'E', 'S') 共有60个字符,分成6行10列, 每一列表示一个数字,0 由 y\p\z\3\O\G 来表示,1由 i\a\x\U\K\h 来表示, 以此类推。

FFMpeg抽帧截图(抽取封面图)

ffmpeg是视频处理领域最常用的开源软件,用来对视频文件进行格式转换,抽帧截图、抽取音频、加水印、剪切、合并 等等操作,非常的强大。 这里只介绍下使用ffmpeg来抽取视频文件的某一帧, 博主碰到的需求是抽取视频某一帧来当作封面图,经过研究发现有两种方式可以实现这个需求。 按照固定时间点 按照固定时间点来截图,比较好容易理解,比如每次抽取视频第1s的画面,ffmpeg 命令如下: ./ffmpeg -ss 00:00:01 -t 00:00:02 -i ~/video_7783_aed4.mp4 -frames:v 1 -pix_fmt yuvj422p -f image2 /tmp/video_7783_aed4.mp4.jpg -y</code></pre> 视频是由一帧一帧的图片组成,但并不是每一帧画面都是完整存在的,所以按照固定时间点抽取的方式需要ffmpeg根据前后帧数据和视频压缩算法 来计算出某时间点的画面,会比较占用CPU。 抽取关键帧 视频关键帧(Video Keyframes)是用于视频压缩和视频编解码的帧,视频关键帧是包含了完整信息的帧,其他的非关键帧将会使用与关键帧的差值进行压缩。视频帧具体可以分为IPB帧三种: I帧表示关键帧,是最完整的帧画面,一般视频封面都选择I帧; P帧单预测帧,利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码; B帧双向预测帧,利用双向帧进行预测编码; 一般情况下关键帧`I帧`是信息最多的帧,也是用途最多的帧。在视频检索和视频分类任务中一般都借助`I帧`来完成,在一个时长60s的视频中,可以抽取得到16个I帧、84个P帧和184个B,I帧数量少包含的信息却是最多的。 抽取关键帧作为视频的封面图是比较合适,且关键帧的画面比较完整,需要的CPU计算较少, ffmpeg命令如下: ./ffmpeg -i ~/video_7783_aed4.mp4 -vf "select=eq(pict_type\,I)" -frames:v 1 -pix_fmt yuvj422p -vsync vfr -qscale:v 2 -f image2 /tmp/video_7783_aed4.mp4.jpg -y

Use Akka-Quartz-Scheduler for cron schedule in Play Framework 2.7

The Akka-Quartz-Scheduler is a commended project by play official for implementing cron task scheduling , refer: https://www.playframework.com/documentation/2.7.x/ModuleDirectory#Akka-Quartz-Scheduler But Akka-Quartz-Scheduler documentation does not cover the play framework, so there is a article to show how to use Akka-Quartz-Scheduler to achieve Cron-like scheduling when play app startup. You can find this demo project in github. Simple Steps Step 1. Add Dependencies in build.sbt // For Akka 2.5.x and Scala 2.11.x, 2.12.x libraryDependencies += "com.

利用BeanUtils.copyProperties实现Java Pojo的单元测试覆盖

Java Pojo及普通的javaBean类,里面都是private 元素和Getter、Setter、toString等方法,我更喜欢把它称之为数据模型类(Model)。 在Java项目一般都有大量的Pojo类文件,如果对他们一个一个的进行单元测试的覆盖就很枯燥,也没有意义。下面就使用Spring 的BeanUtils.copyProperties方法来实现自动的测试覆盖。 基本思路是这样子的,利用BeanUtils.copyProperties对两个Pojo类实例的属性copy,这个过程会分别调用两个实例的Getter和Setter方法,从而实现Getter和Setter方法的覆盖,加上使用反射获取所有的类对象。 package com.icharm.pojo.test; import org.springframework.beans.BeanUtils; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.List; public class BeanDmoTest { String CLASSPATH_ALL_URL_PREFIX = "classpath:"; @Test public void beanTest() throws Exception { List list = new ArrayList(); list.add("com.xxx.a.dto"); list.add("com.xxx.b.dto"); list.add("com.xxx.c.dto"); for (String path : list) { // 包名转路径 path = path.replaceAll("\\.", "\\/"); String packageSearchPath = CLASSPATH_ALL_URL_PREFIX + path + "/**/*.class"; // 获取所有的Pojo类 ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resourcePatternResolver.

Thymeleaf布局踩坑

Thymeleaf模板引擎第一次使用,之前用过的都是freemarker,结合Spring boot记录一下初次使用时遇到的一些小坑,主要是路径和包名的一些问题。下面将记录使用thymeleaf的layout布局方式展现web内容的整个过程。 Build with Maven Thymeleaf有两种布局的方式,第一种是使用 th:include 和 th:replace这种的形式,第二种是使用layout:decorate这种。 本文使用第二种,需要引入thymeleaf-layout-dialect这个包,否则layout:decorate这种布局方式不会生效(踩到的第一个坑) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId> nz.net.ultraq.thymeleaf</groupId> <artifactId>thymeleaf-layout-dialect</artifactId> </dependency> ViewModel 这里对html模板进行了一个封装,使其可以更加灵活方便地使用,就是一个POJO类,对Template中变动的内容进行定义,在提供一个返回ModelAndView对象的方法。 package me.icharm.orange.ViewModel; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.BeanUtils; import org.springframework.web.servlet.ModelAndView; import java.util.Map; /** * @author elias * @email [email protected] * @date 2018/11/21 17:40 */ @Data @Slf4j public class WeuiResultPage { /** * 视图模板路径 */ public String path = "weui/result_fragment"; /** * 图标 */ private String icon; /** * 标题 */ private String title; /** * 内容 */ private String content; /** * 绿色按钮名称 */ private String btnPrimary; /** * 白色按钮名称 */ private String btnDefault; /** * 绿色按钮事件 */ private String btnPrimaryAction; /** * 白色按钮事件 */ private String btnDefaultAction; /** * This object convert to ModelAndView object.

IDEA根据数据库表结构生成Model类(POJO)

idea自动的脚本可以将一个数据的表结构自动生成模型类,变量名采用驼峰命名方式。下面是一个简单的系统参数表创建的sql: create table system_parameter ( ID bigint auto_increment comment '主键' primary key, SKEY varchar(32) not null comment '键名', SVALUE varchar(256) null comment '键值', REMARK varchar(256) null comment '备注', OPERATER varchar(20) null comment '操作人', CREATE_TIME datetime null comment '创建时间', UPDATE_TIME datetime null comment '更新时间', constraint UK_SYSTEM_PARAMETER unique (SYS_KEY) ) comment '系统参数表' charset = utf8; 自动生成该表对应的dmo类,操作如下: 1.表名上右击 - Scripted Extensions - Generate POJOs.groovy 1 然后选择保存的位置。 改进的Script Idea自带的script已经很强大了,但是如果想把表中注释信息,自动注释到dmo类上面,就需要使用下面的script。 import com.intellij.database.model.DasTable import com.intellij.database.model.ObjectKind import com.