emacs常用快捷键

M => command
C => ctrl

Cxb: 切换buffer
Cg: 全局退出
Mx: 列出所有可用命令列表
CxCf: 文件查找
Cd: 删除一个字符
Cx0: 退出当前窗口
Cxk0: 删除当前窗口
Cx1: 删除其它窗口
Cx2: 水平分割窗口
Cx3: 垂直分割窗口
Cxo: 在窗口中切换激活的窗口
CxCc: 退出emacs

shell

Mx shell: 打开shell
CuMx shell: 打开新的shell

移动

Cf: 向前移动一个字符
Cb: 向后移动一个字符
Cp: 向下移动一个字符
Cn: 向上移动一个字符

重新载入配置文件~/.emacs

在emacs中使用cxcf打开~/.emacs文件,然后执行命令M-x eval-buffer重新载入配置文件

杂项

快捷键 + Ch:列出所有以这个快捷键开始的快捷键

自定义evail快捷键

(evil-leader/set-leader ",")
(evil-leader/set-key
  "s" 'save-buffer
  "e" 'dired
  "f" 'fzf
  "c" 'noh
  "m" 'ibuffer
  "g" 'frog-jump-buffer
  "q" 'kill-this-buffer)

一些注意的点

  1. 大多数操作命令都使用Cx作为命令开头
  2. 全屏使用toggle-frame-fullscreen命令, 对应的快捷键是<f11>
  3. 窗口最大化使用 toggle-frame-maximized命令, 对应的快捷键是M-<f10>
  4. 竖直/水平分屏:split-window-right/below
2019/3/30 posted in  emacs

一图胜千言-订单业务系统架构图

右键新窗口打开可查看大图

订单业务系统架构图

2019/3/17 posted in  业务 一图胜千言

pinpoint-docker开启邮件报警和集成钉钉报警推送

配置.env文件

下载pinpoint-docker项目 https://github.com/naver/pinpoint-docker.git

编辑.env文件, 找到batch块,开启定时任务

找到mail块,配置smtp邮件服务器地址

Read more   2018/12/3 posted in  监控

参数调优

参考:https://github.com/gudaoxuri/dew/blob/spring-boot-1.x/docs/src/main/asciidoc/_chapter/best-practices.adoc

谨防被删,以下做了备份

最佳实践

JDBC框架的选择

主流JDBC框架有Hibernate、MyBatis、Spring JDBC Template、Ebean、DBUtils等,Dew基于Spring Boot,所以对于这些框架都提供了很好的兼容。那么如何选择呢?

  • 先说Hibernate,如果你的数据表结构与对象模型基本吻合,那么使用JPA会带来很大的便捷,推荐Hibernate
  • 如果你的数据表结构与对象模型严重不吻合或是你希望对SQL有更多主动权(SQL优化、复杂查询等),那JPA就没什么优势了,这时:
    • 如果你追求极简、不需要ORMPPING,那么DBUtils会是最佳选择
    • 如果你喜欢敏捷开发,推崇充血模型,那么尝试一下Ebean吧,与Play!结合最合适不过
    • 如果你既要有一定的ORMPPING能力,又希望自己写SQL,那么MyBatis会是不错的选择
    • 如果你使用了Spring,希望框架简单些,可以接受自己写ORMPPING,未来无切换关系型数据库的计划,那么Spring JDBC Template将是个很好的选择
Read more   2018/10/27 posted in  Spring Boot

基于snowflake和scikit_learn机器学习的工作流


流程如下

  1. 收集需要机器学习分析的数据,然后把这个数据存放到sql数据仓储snowflake中
  2. python的scikit_learn机器学习项目从snowflake中读取数据进行分析
  3. 把机器学习的成果写入业务mysql中
  4. 业务系统读取机器学习的结果展现给终端用户

关键点

  1. 数据仓储层使用snowflake,兼容sql语法,提升了机器学习项目读取数据的效率
2018/10/12 posted in  一图胜千言 机器学习

rpc实现模式

service接口和dto放到一个独立的包中,方便客户端和服务端使用

客户端拿到service接口后,典型处理步骤如下

  1. 通过代理创建一个service对象供客户端使用
  2. 客户端在调用这个service的方法后,rpc客户端将把这个方法调用转成http调用,发送到服务端
  3. 为了能够定位到服务端上对应的service和方法,调用参数一般会带上service的名称和方法名,以及参数列表,比如:
{
    "method":"my\class\namespace\MyClass.test1",
    "params":[
        "param1",
        "param2",
        "param3"
    ]
}

这个my\class\namespace\MyClass就是service类接口,test1是方法

注意:客户端只有service接口,没有这个接口的实现,这个接口的实现在服务端,需要通过http请求到服务端获取这个service的实现返回的结果

服务端需要解析这个客户端发来的service接口和方法

  1. 通过service接口到容器中拿到这个service的实例(服务端是有这个service的实例了)
  2. 调用这个service实例对象的方法,并将参数传递进去,最后将这个方法返回的结果返回给客户端
2018/6/25 posted in  RPC

rocketmq 对比 kafka

kafka性能最好,但是可靠性相对较低(异步刷盘宕机可能丢消息)

rocketmq采用同步刷盘,性能相对较低,但是可靠性高

kafka客户端会合并消息发送,消息发送qps很高,但是客户端宕机导致消息没发出去就可能丢消息,但是性能好

rocketmq不会合并消息,可靠性高,但是性能相对较低

Kafka tps单机写入100万/s

Rocketmq单机写入10万/s 消息发送性能相差大约10倍,1个数量级

rocketmq支持亿级的消息堆积,kafka堆积能力更高,但是rocketmq应该可以满足业务数据堆积的需求了

kafka主要定位是日志堆积, rocketmq定位为可靠消息传输,比如订单状态通知队列,也可用于日志,但是可靠性更高

如果日志量小,日志堆积也可以使用redis

Read more   2018/6/24 posted in  消息队列

yearning docker部署注意事项

第一次启动时,yearning是无法访问的,因为第一次mysql需要初始化yearning的数据,可能yearning先于mysql启动了,导致读取数据出现异常

解决方法

  • 先启动mysql,通过查看日志,确认mysql初始化完成后在启动yearning

docker-compose.yml

version: '2'

services:
  db:
    image: mysql:5.7
    volumes:
      - ./docker/etc/mysql/:/etc/mysql/conf.d/
      - ./db_data/:/var/lib/mysql/
      - ./init-sql/:/docker-entrypoint-initdb.d/
    restart: always
    ports:
      - "3406:3306"
    environment:
      MYSQL_ROOT_PASSWORD: yearning
      MYSQL_DATABASE: Yearning
      MYSQL_USER: yearning
      MYSQL_PASSWORD: yearning
  yearning:
    image: registry.cn-hangzhou.aliyuncs.com/cookie/yearning:latest
    depends_on:
      - db
    ports:
      - "9180:8000"
    environment:
      HOST: localhost
      MYSQL_PASSWORD: yearning
      MYSQL_USER: root
      MYSQL_ADDR: db
  inception:
    image: hhyo/inception:latest
    depends_on:
      - db
    ports:
      - "6669:6669"
    volumes:
      - ./inc.cnf:/etc/inc.cnf

# 默认账号:admin,默认密码:Yearning_admin
# 感谢 eacdy 张功震 贡献

注意的点

  1. 必须先给用户赋予ddl权限,用户才可以提交ddl的工单
2018/5/20 posted in  SQL

inception安装

docker 安装, docker hub地址

https://hub.docker.com/r/hhyo/inception

github仓库地址

https://github.com/hhyo/inception

inception 配置文件

[inception]
general_log=1
general_log_file=inception.log
port=6669
socket=/tmp/inc.socket
character-set-client-handshake=0
character-set-server=utf8
inception_remote_system_password=root
inception_remote_system_user=wzf1
inception_remote_backup_port=3306
inception_remote_backup_host=127.0.0.1
inception_support_charset=utf8,utf8mb4
inception_enable_nullable=0
inception_check_primary_key=1
inception_check_column_comment=1
inception_check_table_comment=1
inception_osc_on=OFF
inception_osc_bin_dir=/usr/bin
inception_osc_min_table_size=1
inception_osc_chunk_time=0.1
inception_enable_blob_type=1
inception_check_column_default_value=1

中文文档:https://inception-document.readthedocs.io/zh_CN/latest/

2018/5/20 posted in  SQL

perocona

perocona toolkit
重复锁查询
杀慢查询

pt-query-digest 分析慢查询日志

image-20180610100427468

2018/5/20 posted in  SQL

把所有字段转成utf8mb4

use information_schema;
SELECT concat("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") as _sql 
FROM `TABLES` where table_schema like "supply_chain2" group by table_schema;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql  
FROM `TABLES` where table_schema like "supply_chain2" group by table_schema, table_name;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql 
FROM `COLUMNS` where table_schema like "supply_chain2" and data_type in ('varchar');
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql 
FROM `COLUMNS` where table_schema like "supply_chain2"
-- and data_type in ('text','tinytext','mediumtext','longtext');
2018/5/20 posted in  SQL

死锁

查看当前的数据库隔离级别

​ select @@global.tx_isolation

http://www.ywnds.com/?p=4949

​ 两个事务开始修改多个表时,如果访问表的顺序不同,会出现互相等待对方释放锁,然后才能继续处理的情况。MySQL会立刻发现这种情况并且终止较小的事务,允许其他的事务执行。

2018/5/20 posted in  SQL