MD文档个人规范


Author
|
Earl
Describe
|
该文档标准化个人MD文档规范、记录Typora常见样式、快捷键和使用方法
Last Update
|
2024-4-16

 

流程图

  1. 流程图简介

  2. 流程图代码示例

    群里提问的艺术

    提问之前

    尝试自己解决

    搜索也是一门艺术

    Baidu

    Google

    查阅手册或者文档

    查阅论坛或者社区

    github

    stackoverflow

    查阅源代码

    询问朋友

    自检并且不断尝试

    不能自己解决

    明白自己想问什么

    梳理准备你的问题

    言简意赅

    怎样提问

    用词准确, 问题明确

    描述准确, 信息充足

    准确有效的信息

    问题内容

    做过什么尝试

    想要问什么

    别问毫无意义的问题

    有没有人在

    有没有人会

    注意事项

    提问前做好冷场的心理准备

    也许这个问题网上搜一下就知道答案

    也许别人在忙

    也许这个问题太简单了

    也许没人做过这个

    谦虚, 别人没有义务为你解决问题

    没有一定的学习能力, 遇到问题只会伸手的不适合玩这个

    群唯一的作用: 扯淡, 交流, 分享, 以上几条为前提

嵌入网页

  1. 网页嵌入示例

 

 

 

时序图

Created with Raphaël 2.2.0clientclientserverserversync_queuesync_queueaccept_queueaccept_queuebind()connect()listen()SYNC_SEND1. SYNputSYNC_RCVD2. SYN + ACKESTABLISHED3. ACKputESTABLISHEDaccept()

 

 

 

Emoji图标

 

  1. 文档通用型标记

    • 📻:Emoji使用格式

    Emoji作用说明Emoji作用说明
    📻可扩展内容🔎备注说明
    📜需求💡需求实现方案
    📌异常/反常现象🔑解释异常/反常/存疑
    🚁记忆点标题📓记忆点内容
    👅未确认猜想存疑
  1. 流程步骤标注

    Emoji作用说明Emoji作用说明
    1️⃣步骤12️⃣步骤2
    3️⃣步骤34️⃣步骤4
    5️⃣步骤56️⃣步骤6
    7️⃣步骤78️⃣步骤8
    9️⃣步骤9🔟步骤10
    0️⃣步骤0🔁[1️⃣3️⃣]循环步骤1和步骤3
  2. Emoji使用格式

    • 📻:这里写对应的内容

      • 🔎:支持缩进和组合使用

         

HTML4实体

实体对应字符说明
©©版权
®®注册商标
™商标
&&与符号
  空格
ÁÁ 

 

规范样式

参数解析

  1. 参数格式

    • log_format

      • 参数值: log_format name [escape=default|json|none] string ...;

      • 默认值: log_format combined "...";

      • 作用域: http

      • 参数解析:配置日志的格式

        • 🔎:可以配置要记录的变量,如下实例所示$remote_addr是远程IP地址、$time_local是本地时间、$status是请求的状态,还有以前使用过的各种变量,貌似官网列举的变量不是全部,老师说正常的Nginx变量都可以用

        • 🔎:日志的格式除了支持文本的方式还支持json的格式的字符串,但是nginx并不知道变量的层级关系,只会去做特殊字符的转义

      • 配置实例

       

指令解析



 

  1. create [-s] [-e] [-c] [-t ttl] <path> [data] [acl]

    • 功能解析:在指定路径位置创建一个节点,[data]是指定节点的数据内容

    • 使用示例

    • 补充说明

      • 指定位置节点已经存在的前提下再创建该节点会报错

      • 创建节点同时指定节点数据,如果数据中有空格需要使用双引号将数据完整括起来,否则空格后面的内容会被识别为acl参数

     

API解析

  1. QueryWrapper<BrandEntity>--->queryWrapper.eq(String column,Object val)

    • 功能解析:查询指定字段等于指定值的记录

    • 使用示例queryWrapper.eq("age",30);

      • 示例含义:查询age字段等于30的记录

    • 补充说明

      • 箭头前为返回值类型,方法调用者首字母小写为实例方法,方法调用者首字母大写为静态方法,补充说明没有可以不添加

 

WEB API解析

  1. POSThttp://192.168.56.10:9200/customer/external/1/_update

    • 请求体

    • 功能解析:根据文档数据的索引、类型、文档id和文档内容对文档数据进行更新,如果文档数据和ES服务器中的文档数据内容相同,多次操作ES服务器中的数据不会发生任何变化,连数据的版本号都不会发生变化,在响应内容的result为noop,表示什么都不做,然而不带_update的更新操作不会检查原文档数据是否和需要更新后的文档数据是否一致;同时注意使用_update进行更新,更新内容要放在请求体的doc属性中

    • 响应内容

      【多次操作单文档数据不变的响应】

    • 补充说明

      • URI带_update的更新请求只能是POST请求方式,不能使用PUT请求方式,且带_update的POST请求是局部更新,即文档数据不会直接全部覆盖,有对应属性的数据相应修改,没有对应的属性就保留原文档数据,新增没有的属性和相应的数据;但是注意不带_update的上述两种PUT和POST方式的更新都是全量更新,即直接用请求体的数据直接将原文档数据全部直接覆盖

 

内容确认

  1. 对于内容确认,我们有如下规定样式原本不确定内容或者猜想内容后期经确认的内容

 

步骤流程

  1. 实现步骤和工作流程

    1️⃣:先这样

    2️⃣:然后这样

    🔁[1️⃣2️⃣]:重复第一步和第二步直到满足条件

    3️⃣:最后这样

 

常见问题

  1. JMeter报错Address Already in use

    • 问题描述:Jmeter访问测试本机127.0.0.1的端口服务,在无限请求的情况下请求产生大量异常,异常率迅速飙升超过50%,响应体报错,提示信息Address already in use

    • 原因分析:该问题实际是windows的问题,windows本身提供给TCP/IP的端口是1024-5000,且需要四分钟才会循环回收这些端口,短时间内跑大量的请求会将端口占满

    • 解决方法1:修改windows的注册文件,windows官方文档中指出当尝试大于5000的TCP端口连接时会收到大量错误,可以通过以下方案来解决

      • 1️⃣:在win+r打开窗口中使用命令regedit打开注册表

      • 2️⃣:选择计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

      • 3️⃣:右击parameters新建--DWORD32位,修改对应名字为MaxUserPort,点击该MaxUserPort,在弹出窗口将数值改为65534,基数为十进制

        • 🔎:这是设置最大可用端口数量

      • 4️⃣:右击parameters新建--DWORD32位,修改对应名字为TCPTimedWaitDelay,点击该TCPTimedWaitDelay,在弹出窗口将数值改为30,基数为十进制

        • 🔎:这是设置windows回收关闭端口的等待时间为30s

      • 5️⃣:退出注册表编辑器,重启计算机配置才能生效

      • 补充说明对解决方法1进行补充说明,不需要补充说明该项可以不写

 

测试分析

  1. XXX测试

    • 测试环境

      • 1️⃣:​100个用户线程,1s内每个用户线程发起50次扣减库存请求,总共发起5000次,场景为请求连接nginx负载均衡两个运行实例操作虚拟机上的同一个数据库的同一个共享数据,查询数据库库存和更新数据库库存两条SQL简化为一条SQLupdate db_stock set count=count-#{count} where product_code=#{product_no} and count >= #{count}

      • 2️⃣:在1️⃣的环境基础上再开启服务组件的多例模式

      • 3️⃣:在1️⃣的环境基础上在服务中使用@Transactional注解手动开启事务

    • 测试结果

      • 1️⃣:吞吐量为1953,所有库存扣减请求全部成功,数据库库存被正确减为0

      • 2️⃣:吞吐量为2224,所有库存扣减请求全部成功,数据库库存被正确减为0

      • 3️⃣:吞吐量为1850,所有库存扣减请求全部成功,数据库库存被正确减为0

    • 结果分析

      • 一条SQL因为mysql内部加了悲观锁,因此服务中不需要加锁,不需要加事务,集群下也能保证数据库共享数据的操作原子性,性能提升非常可观;不仅能满足集群部署无锁并发线程安全性,还不需要加事务[1],而且在服务组件单例或者多例模式下都能保证共享数据的并发线程安全,不管是锁、事务还是多例都能可观影响系统的并发性能

 

补充说明

  1. 补充说明以🔎打头,后跟一个中文冒号,补充说明的内容与IDE的注释颜色保持一致,均为绿色,用来对上一级内容要点进行补充说明

    • 🔎:这是对上述补充说明格式说明的补充说明

    • 要点1

      • 🔎:对要点1的补充说明

    • 渲染代码::mag_right:<font color=green>:...</font>

  2. 对一个词或者局部的简单说明使用[这种方式]进行简单说明

    • 增加特定的样式表示该注释[以下代码是测试用例,不要在生产中使用]

      • 这个部分需要在C:\Users\Earl\AppData\Roaming\Typora\themes\github.css中添加动画的如下css样式,Typora官网说用户自定义的css样式应该放在相同目录下的github.user.css中避免Typora更新将主题css文件覆盖掉,但是我试了不能实现对应效果,最后还是在C:\Users\Earl\AppData\Roaming\Typora\themes\github.css中进行的修改,而且想把整个样式抽取出来放在github.css中并没有达到对应效果,这一块深入学了前端再来解决

  3. 补充说明使用示例

    • OpenResty中Lua脚本获取请求的通用信息

      • 🔎:以下代码全部在hello.lua脚本中

      • 获取http协议版本ngx.req.http_version()

      • 获取请求的方法ngx.req.get_method()

      • 获取原始的请求头内容ngx.req.raw_header()

        • 🔎:该方式获取的是最原始的整个请求头文本

      • 获取请求的请求体内容ngx.req.get_body_data()

         

旁注

  1. 对中间内容使用注的方式来进行旁注[1]或者说明[2]

     

 

存疑和解惑

  1. 一旦Mysql的一张表中在业务中有一个地方使用了select...for update,其他业务逻辑不能使用普通的select来做业务避免出现并发性的问题

    • :上述观点存疑,意思是记录被锁住了,其他线程还能操作吗?还是说使用了select...for update如果其他不使用for update上锁的操作不会等待锁会直接失败?

    • 🔑:明白了,是因为虽然线程1使用select...for update上锁了,但是其他业务线程2如果使用普通的selectselect操作不会被阻塞,只有更新操作会被阻塞【类似CopyOnWriteArrayList的读写并发】,但是如果其他业务将还没提交的数据读取到,在处理期间上锁的原业务已经提交了,此时做出的更改就是基于线程1上锁前的数据,而非线程1提交后的数据,此时多业务对共享数据的更新操作就会出现并发线程安全问题,因此使用select...for update所有表下的业务都得使用select...for update

 

源码解析

  1. 加锁方法

    • 核心:这里面写的很绕但是核心逻辑还是和我们自己的实现差不多,使用ConcurrentHashMap来存储锁重入计数信息,加锁先从ConcurrentHashMapthreadData通过当前线程获取锁重入计数对象LockData,如果不为null说明本次上锁是锁重入,直接原子整数累加1;如果LockData为null就进入获取锁的阶段,会拼接出完整的节点对象路径并创建临时序列化节点,并获取子节点列表,判断创建的临时序列化节点的序列号在子节点列表中是否小于最大租约数,如果小于就获取锁成功,这里最大租约数默认写死就是1,所以只有最小的节点才能获取锁,返回获取锁的标志作为返回当前节点完整路径的标志并将路径了当前线程以及锁重入计数为1封装到LockData中传递给threadData并结束上锁方法;如果大于最大租约数就去监听当前节点下标-最大租约数的节点的删除事件,里面的事件监听并判断前驱节点是否仍然存在使用的getData方法,比我们使用的exists方法的优势在于exists方法不论节点是否存在都会进行监听,但是getData方法如果节点不存在就不会进行监听,这样可以避免客户端资源的泄露和浪费;面试按前面手动实现的过程结合这个流程来说即可

     

字体

  1. 字体样式

    黑体:SimHei

    华文黑体:STHeiti

    微软正黑体:Microsoft JhengHei

    微软雅黑体:Microsoft YaHei

    华文细黑:STXihei

    楷体:KaiTi

    楷体_GB2312:KaiTi_GB2312

    华文楷体:STKaiti

    华文行楷:STXingkai

    宋体:SimSun

    新宋体:NSimSun

    仿宋:FangSong

    仿宋_GB2312:FangSong_GB2312

    华文宋体:STSong

    华文中宋:STZhongsong

    华文仿宋:STFangsong

    等宽代码:Monospace

    华文新魏:STXinwei

    华文琥珀:STHupo

    隶书:LiSu

    华文隶书:STLiti

    华文彩云:STCaiyun

    方正舒体:FZShuTi

    方正姚体:FZYaoti

    幼圆:YouYuan

    PingFangSC-Medium

     

     

文档布局

 

标题简介



 

摘要栏

  1. 要点

    • Typora无法执行JS代码,但是网页可以渲染JS代码,把摘要栏的最后更新时间设置成如果JS代码能执行,则用当前文件的最后修改时间覆盖时间图层的文本内容,JS渲染的时间格式示例为Wed Apr 16 2024

    • Typora导出PDF时对前端代码的渲染效果并不好,常常会发生前端代码效果混乱的现象【也可能是html格式涉及到页面组合的代码需要独占行,否则出现页面渲染布局异常的问题】

    • 注意一下摘要栏JS代码块中的window.onload只会执行其中一个,正常是执行最后写的一个,如果一个文档中存在多个window.onload事件中执行的代码,需要将这些模板中的事件代码整合在同一个window.onload中,否则部分时间无法转换为JS代码渲染的时间,如下示例所示【这些组件代码不需要完整的html结构,JS代码块可以写在body标签中】,直接用浏览器就可以显示以下代码效果,注意这种html格式的样式必须独占行,否则会发生Typora中正常渲染但是转换成html或者PDF渲染效果混乱的情况


Author
|
Earl
Describe
|
该文档列举Lua的基本语法、在Web开发中使用Lua脚本的常用场景和注意事项
Reference
|
Last Update
|
2024-8-15

 


Author
|
Earl
Describe
|
单行描述模板
Last Update
|
2024-4-16

常用模板

自定义摘要栏模板

Author
|
Earl
Describe
|
该文档整理Linux系统下的常用软件安装及基本设置、Linux常用命令、Linux常用应用及相应快捷键;以下的演示均在CentOS7.6 mini版中实现;远程客户端使用XShell7,文件传输工具使用Xftp7
Last Update
|
2024-4-16
【单行描述模板】 自定义摘要栏模板

Author
|
Earl
Describe
|
单行描述模板
Last Update
|
2024-4-16
自定义摘要栏模板

Author
|
Earl
Describe
|
该文档整理Linux系统下的常用软件安装及基本设置、Linux常用命令、Linux常用应用及相应快捷键;以下的演示均在CentOS7.6 mini版中实现;远程客户端使用XShell7,文件传输工具使用Xftp7
Git
|
https://
Last Update
|
2024-4-16
【单行描述模板】 自定义摘要栏模板

Author
|
Earl
Describe
|
单行描述模板
Git
|
https://
Last Update
|
2024-4-16

Typora

 

快捷键

快捷键作用说明
Ctrl+U文字添加下划线
Alt+Shift+5文字添加删除线
Ctrl+K插入链接
Ctrl+Shift+1隐藏侧边栏或者打开大纲视图
Ctrl+Shift+K插入代码块
Ctrl+Shift+M插入公式块
Crtl+Home跳转文档开头
Ctrl+F/F3搜索当前文档内容
Crtl+End跳转文档末尾
Ctrl+Shift+I插入图片
F11切换全屏
Ctrl+/打开源代码编辑模式
Ctrl+H查找替换
Tab向后缩进
Shift+Tab向前缩进
Ctrl+T插入表格
Ctrl+Shift+Q生成说明栏
Ctrl+B粗体文字
Ctrl+I斜体文字
Ctrl+##表示大键盘数字,将文本转换成#级标题
Ctrl+Enter光标在表格中使用此快捷键快速在光标下方插入行
Ctrl+Shift+1隐藏显示左侧边栏
Ctrl+Shift+x生成复选框
Shift+Enter生成换行标签<br />
这样就可以在表格中实现换行效果
Ctrl+Shift+Delete删除表格中光标所在的当前行

 

文档样式

无序列表



有序列表



 

  1. 样式示例

  2.  

 

复选框

 

脚注

 

文字样式

  1. 输入**,星号间的文字将会展现为斜体

  2. 输入****,四个星号最中间的文字将会展现为粗体

  3. 输入******,六个星号最中间的文字将会展现为斜体加粗

  4. 输入~~,波浪线中间的文字将会展现为下标

  5. 输入~~~~,四个波浪线最中间的文字将会展现为删除线

  6. 输入^^,尖号之间的文字将会展现为上标

  7. 输入====,四个等号之间的文件将会高亮展现key

  8. 文字头部输入#,并点击空格,井号+空格后面字体将会整体展现为标题【独占行为标题】或者大好字体一号字体【非独占行为大好字体】

    • 🔎:​几级标题或者小号字体就输入几个井号,最多可以输入6个井号

  9. 输入~~~,生成代码块

  10. 输入$$,点击回车,生成公式块,这个公式块不一定能被网页渲染出来,但是可以被转成PDF

  11. 输入>,点击空格生成说明栏

  12. 输入\,转义字符可以对emoji和特殊字符进行转义,直接输出文本,不再转换为对应效果,如:mag_right:

  13. 输入<u></u>,夹在<u>标签中的内容将会展示为下划线

 

 

表格



 

  1. 鼠标右键--插入--表格即可插入表格

    • 🔎:表格中的数据可以是图片

  2. 合并行列

    列一 列二
    合并行
    列一 列二
    合并列 行二列二
    行三列二

    [合并列示例]

    大类 数据类型 占用存储空间[Byte] 数字范围 默认值
    整数型
    byte 1 -128~127[27-1] 0
    short 2 约-32000~32000[215-1]
    int 4 约-21亿~21亿[215-1]
    long 8 [263-1] 0L
    布尔型 boolean 1 true|false false
    字符型 char 2 约0~6500[216-1] \u0000
    浮点型 float 4 有效位数6-7位[3*1038] 0.0
    double 8 有效位数15位[1.8*10308]

 

代码

  1. 单行代码

    • 输入``,在中间写入单行代码

    • 样式示例:import com.atlisheng.array.ArrayList;

  2. 代码块

    • 输入```,在后面紧跟代码语言种类并回车

    • 样式示例

分割线

  1. 输入三个连续减号就会生成分割线

    🔎可以单独成行,也可以搭配其他样式使用



 

图片



  1. 插入网络存储图片效果演示

  1. 图片靠左

    • 00D18237

      • 同样通过前端代码style="zoom:8%;float:left"属性来控制图片靠左或者靠右【靠右改成right即可】

      • 但是这种方式导出PDF会有问题,更好的方式是修改主题样式.css文件,参考Typora图片居左、中、右(推荐方式二)-CSDN博客【但是我这里转成PDF是可行的】

       

     

文档目录

  1. 输入[toc],自动生成文档目录,该文档目录在PDF或者html页面都是可以正常显示和使用的

 

Latex公式

输入$$后回车获取公式框,输入Latex语法符号被渲染为特定的公式

  1. Latex语法

    语法对应公式
    $%$注释,百分号后面的内容作为注释内容
    $\%$百分号是注释标识符,使用转义字符\保留百分号的原始意义
      

 

 

流程图

  1. 流程图简介

  2. 流程图代码示例

    群里提问的艺术

    提问之前

    尝试自己解决

    搜索也是一门艺术

    Baidu

    Google

    查阅手册或者文档

    查阅论坛或者社区

    github

    stackoverflow

    查阅源代码

    询问朋友

    自检并且不断尝试

    不能自己解决

    明白自己想问什么

    梳理准备你的问题

    言简意赅

    怎样提问

    用词准确, 问题明确

    描述准确, 信息充足

    准确有效的信息

    问题内容

    做过什么尝试

    想要问什么

    别问毫无意义的问题

    有没有人在

    有没有人会

    注意事项

    提问前做好冷场的心理准备

    也许这个问题网上搜一下就知道答案

    也许别人在忙

    也许这个问题太简单了

    也许没人做过这个

    谦虚, 别人没有义务为你解决问题

    没有一定的学习能力, 遇到问题只会伸手的不适合玩这个

    群唯一的作用: 扯淡, 交流, 分享, 以上几条为前提

嵌入网页

  1. 网页嵌入示例

 

 

 

时序图

Created with Raphaël 2.2.0clientclientserverserversync_queuesync_queueaccept_queueaccept_queuebind()connect()listen()SYNC_SEND1. SYNputSYNC_RCVD2. SYN + ACKESTABLISHED3. ACKputESTABLISHEDaccept()

 

 

文档找回



 

  1. 这些历史记录在默认目录C:\Users\计算机用户名\AppData\Roaming\Typora\draftsRecover中,一般两三分钟就会保存一份草稿,起码保存好几个小时的记录,可以在其中找到最近的草稿另存一份就能恢复

    • 此外这个历史草稿目录还可以通过菜单文件--偏好设置--点击恢复未保存的草稿直接跳转到对应的历史草稿目录

 

吃灰库

扩展无序列表

🔎

:
这个格式在Typora中可以很好地被处处渲染,但是在非独占行的情况下因为凡是涉及HTML布局的代码被typora转换html或者pdf时被外部标签样式覆盖,会出现渲染偏差的情况,但是如果作为单行html,不论是在Typora中还是转成html或者pdf的效果是很好的,而且结合emoji可以打破MarkDown无序列表样式较少的缺陷,因为转换html和pdf的渲染问题先吃灰,用这个改进摘要栏就很不错

🔎

:
可以配置要记录的变量,如下实例所示$remote_addr是远程IP地址、$time_local是本地时间、$status是请求的状态,还有以前使用过的各种变量,貌似官网列举的变量不是全部,老师说正常的Nginx变量都可以用

 

 

附录

  1. 除了搭建博客的vuePress框架,再了解一下vitePress,据说比vuePress更好,查了一下vitePress不适合做博客,国内专门做博客的框架如hexohugo这些都挺不错的,vitePress适合做一些开源项目的官网

    • 他这里的博客意思可能是零散的文章,我要做的就是像企业官方文档一样的知识管理平台,说不定vitePress正合适

  2. Typora相关的使用说明可以参考Typora 中的 HTML 支持 | TyporaChina