Posts List

虚拟路由冗余协议(VRRP)详解

VRRP状态切换流程 详细大图 TODO

学习Graphviz

使用go语言开发的朋友应该对pprof不会陌生,pprof可以导出像下面这种图: 那么问题来了,这是怎么生成的呢? 答案就是――Graphviz。 Graphviz Graphviz是一个自动化绘图的工具,用于绘制DOT语言描述的图形。 QuickStart 废话不多说,先上个例子,安装配置不讲了自己找。 假设我们描述一个简单的解释器的执行流程: 1. 获取输入(getInput) 2. 解析输入字符串(parse),成功转到3,失败转到5 3. 对parse出的AST求值(evaluate),成功转到4,失败转到6 4. 输出求值结果(putResult) 5. 提示语法错误(throwSyntaxError) 6. 求值过程出现异常,比如除0等(throwRuntimeError) 创建一个文件,名为interpreter.dot,并写入以下代码: digraph Interpreter { getInput -> parse -> evaluate -> putResult; parse -> throwSyntaxError; evaluate -> throwRuntimeError; } 在终端执行以下命令: dot -Tpng interpreter.dot -o interpreter.png 于是就得到了下面这张图: 这里生成的是png格式,也可以生成其它格式的文件,比如pprof生成的就是svg格式的。 DOT语言介绍 这是Graphviz文档里的DOT语法: graph: [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}' stmt_list: [ stmt [ ';' ] stmt_list ] stmt: node_stmt | edge_stmt | attr_stmt | ID '=' ID | subgraph attr_stmt: (graph | node | edge) attr_list attr_list: '[' [ a_list ] ']' [ attr_list ] a_list: ID '=' ID [ (';' | ',') ] [ a_list ] edge_stmt: (node_id | subgraph) edgeRHS [ attr_list ] edgeRHS: edgeop (node_id | subgraph) [ edgeRHS ] node_stmt: node_id [ attr_list ] node_id: ID [ port ] port: ':' ID [ ':' compass_pt ] | ':' compass_pt subgraph: [ subgraph [ ID ] ] '{' stmt_list '}' compass_pt: (n | ne | e | se | s | sw | w | nw | c | _) 详情请见:https://graphviz.

博客测试

这是标题 这是二级标题 这是内容 这是图片 这是链接 我的github 这是列表 列表1 列表2 列表3 这是代码 1package main 2 3import "fmt" 4 5func main() { 6 fmt.Println("hello world") 7} main : IO () main = putStrLn "hello world"