Springboot的启动原理
Spring Boot 打包插件
Spring Boot 提供了一个名叫 spring-boot-maven-plugin 的 maven 项目打包插件,可以方便的将 Spring Boot 项目打成 jar 包。这样我们就不再需要部署 Tomcat 、Jetty等之类的 Web 服务器容器啦。
我们先看一下 Spring Boot 打包后的结构是什么样的,打开 target 目录我们发现有两个jar包:
hello-0.0.1-SNAPSHOT.jar:17.3MB
hello-0.0.1-SNAPSHOT.jar.original:3KB
其中,hello-0.0.1-SNAPSHOT.jar 是通过 Spring Boot 提供的打包插件采用新的格式打成 Fat Jar,包含了所有的依赖;而 hello-0.0.1-SNAPSHOT.jar.original 则是Java原生的打包方式生成的,仅仅只包含了项目本身的内容。
SpringBoot FatJar 的组织结构
我们将 Spring Boot 打的可执行 Jar 展开后的结构如下所示:
12345678910111 ...
部署分布式HA FastDFS集群
FastDFS
FastDFS的作者余庆在其 GitHub 上是这样描述的:“FastDFS is an open source high performance distributed file system. It’s major functions include: file storing, file syncing and file accessing (file uploading and file downloading), and it can resolve the high capacity and load balancing problem. FastDFS should meet the requirement of the website whose service based on files such as photo sharing site and video sharing site” ,意思说,FastDFS是一个开源的高性能分布式文件系统。其主要功能包括:文件存储、文件同步和文件访问(文件上传和文件下载),它可以解决高容量和负载平衡问题。Fas ...
类文件结构及类加载机制
写在前面
我们都知道 JVM 并不能直接运行 Java 源文件,而是开发者通过 JDK 自带的工具命令 javac将 Java 源文件编译成 class 字节码文件,也就是二进制文件,然后供JVM加载并使用。
为了深入学习这一块的内容,先创建类 User:
User.java
123456789101112131415161718192021package com.openmind;/** * jishuzhan * * @author zhoujunwen * @date 2019-11-17 * @time 20:28 * @desc */public class User { private String name; private int age; public String getName() { return name; } // 省略 getter 和 setter}
类文件结构
Class类文件结构
编译User.java类,我们用 Sublime Text 打开 User.clas ...
squid代理上网
0x00 目的
因安全原因,开发环境封外网后,作为可审计的代理连接外网下载必要软件;
生产环境需要连接外部接口的应用,在线下测试时可以通过设置线下的代理服务器测试软件代理访问功能是否正常。
0x01 服务器信息
ip 10.57.22.8 端口 3128
10.57.22.219
公用帐号 squid 密码 public
0x02 代理上网的逻辑
0x03 使用方法(部分适用于Centos系统)
1.全局的代理设置
1234567vi /etc/profile#添加下面内容 (=号两边没有空格,有空格报command no find)http_proxy=http://10.57.22.8:3128/https_proxy=http://10.57.22.8:3128/export http_proxyexport https_proxy
使其生效:
1source /etc/profile
验证:
1curl http://www.baidu.com
2.yum的代理设置
123vi /etc/yum.conf#添加下面内容proxy=http://10.57.22.8 ...
mysql+mybatis+druid批量更新数据时的配置
批量更新SQL
为什么要批量更新
很多时候,我们都是单条更新数据,或者是批量更新统一字段相同值。
但有些情况下,为了某些场景,我们通常需要批量更新某一段时间的或者全量的数据。比如,某个业务线需要增加一个字段,但是这个字段需要根据已存在的数据计算得出,并不是保持一致的时候,需要批量更新。再比如,某些傻叉设计的用户密码是明文入库,当你发现的时候,有必要加密处理。
批量更新逻辑
先看看一段批量更新mybatis表达式:
12345678<update id="updateUserPassword" parameterType="com.zhoujunwen.gaea.dal.po.User"> <foreach collection="list" separator=";" item="user"> <if test="user.pass != null and user.pass !=''"> ...
执行git命令时中文文件名乱码的解决办法
在命令行执行git diff比较项目的差异或者执行git status查看文件的状态时,中文文件名全部显示乱码。
如下:
12modified: "source/_posts/mybatis\344\275\277\347\224\250spring-druid\346\225\260\346\215\256\346\272\220\350\277\236\346\216\245\346\261\240\351\205\215\347\275\256log4j\346\211\223\345\215\260sql\350\257\255\345\217\245\344\273\245\345\217\212\345\274\200\345\220\257\347\233\221\346\216\247\345\271\263\345\217\260.md"modified: "source/_posts/\345\205\263\344\272\216\346\267\273\345\212\240\345\245\275\345\217\213\ ...
关于微信添加好友的研究(二)
关于微信RE相关的所有文章,如果没有特别说明,全部基于【TKkk-iOSer/WeChatPlugin-MacOS】项目为基础开发的。
在此,由衷感谢TK.
为了尽快找到突破口,我们事先发起一个添加好友的请求给当前微信。在微信中就可以看到消息红点,同事出现了【新的朋友】。此时,我们通过xcode的【debug view hierarchy】debug微信。从视图中可以看到这一层应该为MMContactsViewController。
图1 xcode debug视图
图2 xcode 拖动旋转及视图树状图
找到突破口之后,我们通过反编译利器【Hooper Disassembler】打开微信应用,等待反编译结束之后,查询MMContactsViewControllerclass,浏览其方法,可以看到有一个friendRequestMgr:didChangeFriendRequestUnreadCount:isFilter:,点击方法,进入汇编代码中,我们根据名称猜测一下,这或许就是添加好友的请求。
123456789101112131415161718192021222 ...
关于微信添加群聊的研究(一)
通过选择联系人,添加到群,首先调用MMSessionPickerListRowView的checkboxChecked:方法。
伪代码如下:
12345678910void -[MMSessionPickerListRowView checkboxChecked:](void * self, void * _cmd, void * arg2) { rbx = self; if ([self disabled] == 0x0) { rax = [rbx chosen]; [rbx setChosen:sign_extend_64(rax)]; [rbx _callDelegate]; [rbx setNeedsDisplay:0x1]; } return;}
重写的代码:
123456789- (void) checkboxChecked: (id)arg1 { MMSessionPickerListRowView *li ...
MySQL开发规范.md
一. 命名规范
库名、表名、字段名必须使用小写字母,并采用下划线分割
为了统一规范, 库名、表名、字段名使用小写字母,禁用关键字(index,order等)。
前缀命令规范
视图以view_开头,事件以event_开头,触发器以trig_开头,存储过程以proc_开头,函数以func_开头,应用上面禁用
普通索引以idx_各个列名简称,唯一索引以uk_各个列名简称命名,中间用_隔开。如 idx_col1_col2_col3(col1,col2,col3),如果列过长,用简写
临时表以tmp_实体表名,线上禁用,备份表以bak_日期_实体表名,尽可能备份至HDFS
库名、表名、字段名禁止超过32个字符,需见名知意
库名、表名、字段名支持最多32个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符,例:业务名称/实体_表作用
按日期时间分表须符合_YYYYMMDD格式
按月或日生成的表,以_YYYYMM[DD]方式命名。
二. 库表基础规范
使用Innodb存储引擎
所有表必须使用默认存储引擎InnoDB。
表编码方式统一使用UTF8或UTF8MB4的
创建索引时u ...
基于微信UI做群发机器人(零)
设计思想
从本质上来说这个项目不算机器人,因目前不能提供自动回复、自动对话的业务场景。
需求说明
公司大部分业务都是ToB的,运营管理着好几百个微信群,产品跟运营私交甚好,因此,在产品的耳边吹了一口气,“我们做一个微信机器人,帮助我们管理微信群吧,最好加上群聊,也可回答一些客户的问题”。产品听了,觉得这事可以有,想想,快到年底了,KPI考核也没什么补救,说不定这也就是一部分。
时间倒退到2017年8月底,产品开始设计一款名叫“微信机器人”的项目。嗯,看名字就觉得很高大上。BTW,设计稿呢???没有,就是口头产品,没进入评审环境,直接告诉我我们需要一款这样的…,能干…最好…的产品,Balabala说了一堆,其实就是做一个能够收发群消息,能够管理群成员,能够干微信能干的事情,最后,这些要干的事情,必须在我们的运营管理后台可操作,消息发送状态可查看。
这项殊荣交给我了,限定要在9月初上线。
服务设计
拿到需求之后,并没有急着开发,而是先度娘问问,有没有现成的,如果有的话,直接copy一份也就成了(毕竟人家说我们是搬砖的)。调研后得知,大家都基于微信web版开发的,在GitHub上发现有 ...