Markdown语法
引用自:Te_Lee的 Markdown——入门指南
Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。看到这里请不要被「标记」、「语言」所迷惑,Markdown 的语法十分简单。常用的标记符号也不超过十个,这种相对于更为复杂的 HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多,且一旦熟悉这种语法规则,会有一劳永逸的效果。
语法简要规则标题
每篇文章都离不开标题,层次分明的标题可以让文章的结构清晰明了,让读者能快速抓住行文脉络。
# 一级标题## 二级标题### 三级标题
以此类推,最多可以到六级标题,#号后的空格可加可不加,规范的写法是加上一个空格。
列表
无序列表在文字需要前加上 - 或者 *;而有序列表则需要在文字前加上 1. ,注意空格,这里的数字1并不是固定写死的,使用任意数字都可以。
引用
当你需要引用其他地方的一段文字时,需要用到引用的格式,在文本前加上 >。
青年的朝气倘已消失,前进不己的好奇心已衰退以后,人生就没有意义。 ——穆勒
图片与链接
插入链接与插入图片的语 ...
RabbitMQ安装部署及常见问题
引用自:centos/rhel 6.5(更新至centos 7)下rabbitmq安装(最简单方便的方式),rabbitMQ windows 安装 入门
安装从RabbitMQ官方下载页面下载对应版本的安装包,执行安装包的时候会提示安装 Erlang 并打开 Erlang 的官方下载页面,下载安装 Erlang,之后 RabbitMQ会继续安装完成。
部署windows系统下 RabbitMQ 会作为服务安装并设置为自启动,因此无需进行额外的设置。在开始菜单中可以找到服务的启动、停止控制。
进入 RabbitMQ 安装目录下的 sbin 文件夹,在控制台下执行下述命令启用 RabbitMQ 的web管理工具,在浏览器中访问 http://localhost:15672/ 即可进行管理,默认 用户名 | 密码 是 guest | guest。
1rabbitmq-plugins enable rabbitmq_management
常见问题启用控制台12345678910[root@dev-server ~]# rabbitmq-plugins enable rabbi ...
SpringBoot和Vue单页面前后端分离项目的整合与构建
日常开发前后端分离应用时,通常会使用到Spring Boot开发后台服务,Vue.js开发前端SPA,而在部署时通常将后台服务和前端应用分开部署,使用nginx反向代理或者后台配置cors解决前后端的跨域问题。这样的方式在部署环节时稍显繁琐,本文介绍一种在构建环节直接将前端SPA直接打包进后台服务的jar包,只用部署jar包即可访问前端页面的方法。
以ultimate-spider为例说明该方法是如何实现将SPA打进后台服务jar包的。
ultimate-spider是采用IDEA的project + modules的方式进行开发的,该项目有两个module:spider-server,后台服务;spider-web,前端SPA。以下是相关的pom.xml文件的内容。
ultimate-spider的pom.xml
1234567891011121314151617181920212223242526272829303132<?xml version="1.0" encoding="UTF-8"?><project xm ...
String.format的用法
引用自 Java中String.format的使用
String类的format()方法用于创建格式化的字符串一级连接多个字符串对象。format()方法有两种重载形式。
format(String format, Object... args) 新字符串使用本地语言环境,根据字符串格式和参数生成格式化的新字符串。
format(Locale locale, String format, Object... args) 使用制定的语言环境,根据字符串格式和参数生成格式化的字符串。
转换符
转换符
说明
%s
字符串类型
%c
字符类型
%b
布尔类型
%d
十进制整数
%x
十六进制整数
%o
八进制整数
%f
浮点类型
%a
十六进制浮点类型
%e
指数类型
%g
通用浮点类型(f和e类型中较短的)
%h
散列码
%%
百分号
%n
换行符
%tx
日期与时间类型(x代表不同的日期与时间转换符)
搭配转换符的标志
标志
说明
+
为正数或者负数添加符号
−
左对齐
0
数字前面补0
空 ...
Todo-Tomato技术解读
Todo-Tomato 是一款融合待办事项管理和番茄工作法,用于高效处理工作事务的工作利器,本文对 Todo-Tomato 使用的技术进行简要解读。
话不多说,先放上Todo-Tomato的界面截图。
本文的技术解读基于Todo-Tomato v1.0.0版本。
技术选型使用目前比较流行的前后端分离进行开发:
前端技术栈:Vue.js + vue-router + vuex + axios + element-ui
后端技术栈:Spring Boot + Spring JPA + MySQL + druid + Redis
部署:阿里云ECS + Ubuntu16.04 + Nginx + OpenJDK8 + HTTPS
由于使用的技术比较繁杂,这里选取一些个人觉得比较有记录价值的技术点进行说明。
后端技术点Log4j2日志配置12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455Configuration: statu ...
VS Code常用插件记录
语言包
Chinese (Simplified) Language Pack for Visual Studio Code
主题
Smile Theme
快捷键
IntelliJ IDEA Keybindings
Project Manage
Project Manager
Todo Tree
HTML CSS JS
Auto Close Tag
Auto Rename Tag
Beautify
HTML CSS Support
Path Autocomplete
Node.js
npm
Vue.js
Vetur
Ant Design Vue helper
Markdown
Markdown PDF
Markdown TOC
Git
GitLens
Git History
Git Graph
Golang
Go
Python
Python
Flutter
Flutter
Dart
Docker
Docker
远程工具
Remote - WSL
Properties File
Better TOML
YAML
模板引擎
FreeMarker
代码高亮
Br ...
cron语法简单总结
引用自:cron 表达式的格式
Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异。
在 UNIX cron 里,要执行的作业(或者说命令)是存放在 cron 表达式中的,在第六个域位置上。Quartz 用 cron 表达式存放执行计划。引用了 cron 表达式的CronTrigger 在计划的时间里会与 job 关联上。
另一个与 UNIX cron 表达式的不同点是在表达式中支持域的数目。UNIX 给出五个域(分、时、日、月和周),Quartz 提供七个域。表 5.1 列出了 Quartz cron 表达式支持的七个域。
名称
是否必须
允许值
特殊字符
秒
是
0-59
,-*/
分
是
0-59
,-*/
时
是
0-23
,-*/
日
是
1-31
,-*?/L W C
月
是
1 ...
flatten-maven-plugin插件配置说明
引用自:使用flatten-maven-plugin对发布的POM进行精简
使用maven开发的模块化应用,可以发布出去供他人使用,比如各种开源库,使用时,要么是继承,要么是以依赖的形式引入。但我们看各种库的pom.xml文件,通常都比较简单,一般只有一些必要的依赖信息,作为开发者,通常认为使用者也就需要这些信息。但是真正开发时,对应模块的pom可能比较复杂,可能要使用各种插件,引用各种依赖,组件间有继承关系,甚至根据不同的参数走不同的分支,即使用profile机制等,maven默认在部署时,会保留对应模块中的pom的所有信息,不会做改动。这样就给模块的发布带来了一定的麻烦,如果直接发布这样的pom.xml,是可能给使用者造成干扰的,出了问题又很难进行定位。
解决这个问题有很多的做法,比如构建两个工程,一个用于开发,一个用于版本发布,两个工程的pom是不同的,这样看上去也更符合软件开发的常规流程,另外,也可以考虑禁用maven默认的deloy过程,然后直接调用 deploy:deploy-file 单独部署某个文件。总之,不管怎样,办法肯定是有的。
而本文的目的,是想介绍一种新的方 ...
weixin-java-tools微信JavaSDK开发工具包
引用自:微信Java SDK开发文档
weixin-java-tools 是一款开源的微信 Java SDK 工具,对微信接口封装的比较全,简单配置即可使用,正式版的更新频率是两个月,是 Java 开发微信项目的利器。此文主要介绍使用过程中遇到的的一些 wiki 中没有详细介绍的地方。
CP_如何调用未支持的接口
CP_如何调用未支持的接口
使用 wxCpService.get(url, queryParam) 和 wxCpService.post(url, postData) 方法时 url 和 queryParam 不用附带 accessToken 参数,因为该参数在实际调用微信接口时已经封装在 url 的 queryParam 里了。post 方法中的 postData 是 stringify 处理之后的 JSON 字符串 而不是 JSON 对象。
MP_js_api
MP_js_api
微信企业号服务获取JS-SDK需要的证书信息可以调用 wxCpService.createJsapiSignature(url),其中 url 必须是调用 JS-SDK 页面的全路径(包 ...
使用GitHub和Jenkins自动构建并部署静态页面
随着DevOps的日趋成熟,CI/CD的概念已经慢慢为广大开发运维人员所熟知和认同,本文记录了GitHub结合Jenkins自动构建和部署静态页面的方法,并从中窥见CI/CD之一二,同时也是做一个备忘记录。
创建任务创建任务时选择构建一个自由风格的软件项目。
配置Jenkins任务General
源码管理
填写源码的git地址,用于下载源码到jenkins的工作空间,以便后续进行构建操作。
构建触发器
进入GitHub的相应项目中配置webhook,webhook的Payload URL填写格式为http://jenkins所在的domain或者ip:port/github-webhook/。完成配置后,github接收特定的事件之后会触发请求该url。jenkins接收到请求之后会触发任务执行构建。
构建环境
在Console Output中加入时间戳,将nodejs 和 npm命令加入PATH,方便进行全局执行。
构建
首先执行npm install安装依赖包,再执行npm run build进行构建。
YupaitsWork.sh脚本用于将构建生成的页面 ...
使用Gitee+Jenkins+Docker完成前后端分离项目的CI/CD
Gitee Webhook配置
URL的格式为 http://[username]:[password或者jenkins的api_token]@www.yupaits.com:8080/generic-webhook-trigger/invoke 。
webhook请求提交的数据参考码云平台帮助文档。
Jenkins插件安装、环境配置必需插件Jenkins需要安装以下插件:
Generic Webhook Trigger Plugin
Git Plugin
NodeJS Plugin
全局环境Jenkins需要配置以下全局工具:
JDK
Git
Maven
NodeJS
Jenkins任务配置General
源码管理
填写Gitee代码仓库地址,选择需要构建的分支。
构建触发器
配置触发器参数和触发过滤条件。这里选择了分支名称和项目名称作为构建时的过滤条件。Expression里的$是webhook请求中的请求体JSON数据对象,而Variable中的ref则是Jenkins触发器的变量名,在Optional filter中可以通过$ref来引用该变量。
构建环境
由于T ...
发布jar包到Maven中央仓库
引用自发布jar包到maven中央仓库
在 maven 中引入第三方 jar 包是非常简单的,只需使用 groupId + artifactId + version 就能从 Maven 仓库中下载对应的 jar 包。
例如:引入 guava 的 jar 包
12345<dependency> <gruopId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>25.0-jre</version></dependency>
本文就介绍如何将自己的 jar 包发布到 Maven 中央仓库。
创建issue首先需要在 https://issues.sonatype.org/secure/Dashboard.jspa 注册一个账号,创建一个新项目的 issue 并提交。
Project 选择 Community Support,Issue type 选择 New Project。
注意 ...
开源项目License的介绍
引用自《开源许可证的一些介绍》
当我们在github、gitee上新建项目的时候,往往不知道到该如何选择一个合适的开源许可证,本文引用gitee上的License介绍对常见的License做一个简单的介绍。
开源许可证Apache v2 LicenseApache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:
需要给代码的用户一份Apache Licence
如果你修改了代码,需要再被修改的文件中说明。
在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商 ...
微信公众号管理平台的实现
微信公众号管理平台是对多个公众号统一配置管理的平台,本文介绍了该平台的实现方案。项目地址:wechat-admin,该项目尚未开放,待对项目中的内容进行脱敏之后会公开。
核心问题多个公众号如何复用同一个消息接口、同一套消息处理逻辑?
使用工具微信Java开发工具包weixin-java-tools中的公众号开发工具weixin-java-mp。
具体实现实现思路
多个公众号使用统一的消息接收接口,并附带公众号在管理平台的id作为标识;
统一消息接收接口获取id,动态配置仅用于本次消息处理的消息路由;
消息路由根据实际接收到的消息事件做出响应。
代码说明
WxPortalController.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455@RestController@RequestMapping("/portal/WxMpAccount/{id}")public cla ...
搭建OpenLDAP服务
引用自 我花了一个五一终于搞懂了OpenLDAP
轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。
大部分企业级工具都支持LDAP协议,我们可以搭建OpenLDAP服务使得这些企业级工具共享同一套用户名和密码来进行认证授权。
安装OpenLDAP1yum install openldap openldap-clients openldap-servers
启动OpenLDAP服务
1service slapd start
配置OpenLDAProot.ldif12345678910dn: olcDatabase={2}bdb,cn=configchangetype: modifyreplace: olcRootDNolcRootDN: cn=admin,dc=example,dc=com-replace: olcSuffixolcSuffix: dc=example,dc=com-repla ...
通过开启swap分区解决小内存阿里云服务器的运行瓶颈
引用自:ECS Linux开启swap(虚拟内存)
阿里云在2018年春节前后通过一系列的促销活动向新老顾客推广云服务器,在诱人的价格面前笔者贡献了口袋里最后的可支配人民币,但实际使用下来,发现1核2G内存的ECS服务器的性能实在有限,特别是最近在上面部署docker容器的时候明显感觉到内存吃紧。思来想去,发现可以通过开启swap分区来解决内存瓶颈。
swap分区大小设置阿里云的linux云服务器默认是没有启用swap分区(交换分区)的。一般情况下swapswap分区的大小可以参考以下规则进行设定:
内存大小
swap大小
MEM_SIZE <= 4G
最小2G
4G < MEM_SIZE <= 16G
最小4G
16G < MEM_SIZE <= 64G
最小8G
64G < MEM_SIZE <= 256G
最小16G
启用swap分区创建用于交换分区的文件1dd if=/dev/zero of=/mnt/swap bs=block_size count=numbe ...
阿里云Linux服务器格式化和挂载数据盘
引用自:Linux 格式化和挂载数据盘
操作须知单独购买的数据盘需要先挂载数据盘,然后才能格式化。
随实例时一起购买的数据盘,无需挂载,直接格式化。
您需要知道挂载到实例的数据盘的设备名:您可以通过 ECS 管理控制台 > 磁盘详情 > 磁盘挂载信息 查到数据盘的设备名。数据盘的设备名由系统默认分配,从 /dev/xvdb 开始往后顺序排列,分布范围包括 /dev/xvdb−/dev/xvdz。
操作步骤
远程连接实例。
运行 fdisk -l 命令查看实例是否有数据盘。如果执行命令后,没有发现 /dev/vdb,表示您的实例没有数据盘,无需格式化数据盘,请忽略本文后续内容。
如果您的数据盘显示的是 dev/xvd?,表示您使用的是非 I/O 优化实例。 其中 ? 是 a−z 的任一个字母。
创建一个单分区数据盘,依次执行以下命令:
运行 fdisk /dev/vdb:对数据盘进行分区。
输入 n 并按回车键:创建一个新分区。
输入 p 并按回车键:选择主分区。因为创建的是一个单分区数据盘,所以只需要创建主分区。
如果要创建 ...
代理模式
为其它对象提供一种代理以控制对这个对象的访问。
类结构图
Subject:接口类,定义了一些需要代理的接口方法。
RealSubject:具体的实现类。
ProxySubject:代理类,保存一个Subject引用,可以注入一个具体的子类比如RealSubject。
代理模式其实就是在操作对象时引用一定程度的间接性。这种间接性,可以增加很多附加操作。比如权限控制,参数校验等等。
12345678910public class ProxyPersonManager implements PersonManager { // 接口引用 PersonManager realPersonManager = new RealPersonManager(); @Override public double getSalary(String name, String operateName) { // 1. 增加一些的权限判断。比如操作人是否有查询某人工资的权限 // 2. 具体类的调用 return realP ...
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
双重锁检测123456789101112131415161718public class Singleton { // 单例对象 private volatile static Singleton instance = null; // 私有构造方法 private Singleton() {} public static Singleton getInstance() { if (install == null) { // 双重检测机制 synchronized (Singleton.class) { // 同步锁 if (instance == null) { // 双重检测机制 instance = new Singleton(); ...
合成模式
合成模式属于对象的结构模式,有时又叫做“部分-整体”模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。
结构类图
Component:这是一个抽象角色,它给参与组合的对象规定一个接口。这个角色给出共有接口及其默认行为,可以用来管理所有的子对象。合成对象通常把它所包含的子对象当作类型为Component的对象。在安全模式的合成模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。
Leaf:代表餐价组合的树叶对象。一个树叶对象没有下级子对象,定义了参加组合的原始对象的行为。
Composite:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。树枝构件给出了所有的管理子对象的方法,如add、remove以及getChild。