btrfs

btrfs 禁用 COW chattr +C /path/to/dir/ https://typeblog.net/migrate-to-btrfs/ 数据一致性相关的特性 COW 事务 理解 COW 事务,必须首先理解 COW 和事务这两个术语。 什么是 COW? 所谓 COW,即每次写磁盘数据时,先将更新数据写入一个新的 block,当新数据写入成功之后,再更新相关的数据结构指向新 block 。 什么是事务? COW 只能保证单一数据更新的原子性。但文件系统中很多操作需要更新多个不同的元数据,比如创建文件需要修改以下这些元数据: 修改 extent tree,分配一段磁盘空间 创建一个新的 inode,并插入 FS Tree 中 增加一个目录项,插入到 FS Tree 中 任何一个步骤出错,文件便不能创建成功,因此可以定义为一个事务。 下面将演示一个 COW 事务。 A 是 FS Tree 的根节点,新的 inode 的信息将被插入节点 C 。首先,btrfs 将 inode 插入一个新分配的 block C ‘中,并修改上层节点 B,使其指向新的 block C ‘;修改 B 也将引发 COW,以此类推,引发一个连锁反应,直到最顶层的 Root A 。当整个过程结束后,新节点 A ‘变成了 FS Tree 的根。但此时事务并未结束,superblock 依然指向 A 。 ...

2019-03-30 · 1 min · 85 words · -

go > docker

‘go > docker’ gOOS=linux GOARCH=arm go build . docker build -t registry.wiloon.com/nj4xx-data:v0.1.0 . docker push registry.wiloon.com/nj4xx-data:v0.1.0 docker pull registry.wiloon.com/nj4xx-data:v0.1.0

2019-03-28 · 1 min · 19 words · -

Windows apps, win apps

Windows apps, win apps WizTree 硬盘占用分析, 商用收费 SpaceSniffer 硬盘占用分析, 商用友好 WinDirStat MiniTool Partition Wizard, 磁盘分区工具 anydeak 远程桌面 todesk 远程桌面 taskmgr, 任务管理器, C:\Windows\System32\Taskmgr.exe winget winget install Microsoft.WindowsTerminal Microsoft.WindowsTerminal WinScp, WinSCP.WinSCP firefox, Mozilla.Firefox powershell, Microsoft.PowerShell curl, cURL.cURL Golang, GoLang.Go Tabby, Eugeny.Tabby nodejs, OpenJS.NodeJS choco # 安装软件,重复执行只会检查是否安装不会升级版本 choco install keepassxc # 升级软件到新版本 choco upgrade keepassxc https://blog.wiloon.com/?p=8340 https://chocolatey.org/packages chocolatey packages Name 备注 chocolatey choco可以自己更新自己 keepassxc microsoft-windows-terminal 1.12.10393.0 winscp vnote.portable 支持markdown和puml的文本编辑器 vscode Visual Studio Code notepadplusplus puyyt telegraf redis-desktop-manager heidisql 录屏 https://www.v1tx.com/post/best-screen-recorder/ ...

2019-03-28 · 1 min · 147 words · -

armv6, armv7, rm处理器中a5 a8 a9,v6 v7,arm7 arm9 arm11

armv6, armv7, rm处理器中a5 a8 a9,v6 v7,arm7 arm9 arm11 ARM是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,几乎所有手机都是使用它的。 armv6, armv7, armv7s是ARM CPU的不同指令集,原则上是向下兼容的。如iPhone4S CPU支持armv7, 但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。同理iPhone5 CPU支持armv7s,它虽然也兼容armv7,但是却无法进行相关的优化。 ARM处理器发展这么多年,有很多架构,很多不同的内核 架构有armv1 v2 v3 v4 v5 v6 v7 内核太多了,比如armv1对应的是arm1,armv5对应的arm9,armv6对应的arm11,armv7对应的cortex(比如A8 A9都属于cortex架构) cortex-a8 cortex-a9 arm11 arm 9都是CPU构架。 在性能上cortex-a9 >cortex-a8>arm11。 arm11是ARM V6的构架,老的指令集,被淘汰的东西咯,性能不如ARM V7构架的CPU。 cortex-a8 是第一款基于 ARM V7指令集的CPU,比V6先进了,V6的不支持在线FLASH播放。即使能安装插件也不能完整的支持FLASH播放,性能上不行,即使破解了播不出来。A8完美支持FLASH的! cortex-a8 是目前的主流CPU,中高端机上的,尤其是高端机的稳定产品,中低端都用V6构架的CPU,比如MSM 7227 ,别看800Hz的频率,其实是上一代的,不如同频率的7230的性能的四分之一。 cortex-a9多核处理器,对MPCore的优化,向高性能的发展,未来的主流,现在的双核手机CPU都是这个构架 目前最好的是cortex-A9构架的CPU是高端的主流CPU,比如NV的双核,德州仪器的双核很多都是用的A9构架,A8是目前的中高端的主流,一般A8构架的双核CPU不多,几乎没有。 https://blog.csdn.net/maochengtao/article/details/9951131

2019-03-27 · 1 min · 47 words · -

WAL

WAL 什么是 WAL WAL (Write Ahead Log) 预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。 在计算机科学中,「预写式日志」 (Write-ahead logging,缩写 WAL)是关系数据库系统中用于提供原子性和持久性 (ACID 属性中的两个)的一系列技术。在使用 WAL 的系统中,所有的修改在提交之前都要先写入 log 文件中。 log 文件中通常包括 redo 和 undo 信息。这样做的目的可以通过一个例子来说明。假设一个程序在执行某些操作的过程中机器掉电了。在重新启动时,程序可能需要知道当时执行的操作是成功了还是部分成功或者是失败了。如果使用了 WAL,程序就可以检查 log 文件,并对突然掉电时计划执行的操作内容跟实际上执行的操作内容进行比较。在这个比较的基础上,程序就可以决定是撤销已做的操作还是继续完成已做的操作,或者是保持原样。 WAL 允许用 in-place 方式更新数据库。另一种用来实现原子更新的方法是 shadow paging,它并不是 in-place 方式。用 in-place 方式做更新的主要优点是减少索引和块列表的修改。ARIES 是 WAL 系列技术常用的算法。在文件系统中,WAL 通常称为 journaling。PostgreSQL 也是用 WAL 来提供 point-in-time 恢复和数据库复制特性。 备份 我们想一想,如果想保证对一个数据的操作可以恢复。可以怎么做?你不用去想数据库是怎么实现的,也不用想太高深。其实这是一个很简单的问题,我们常常在处理这种问题。最简单的方法其实就是备份一份数据:当我需要对一条数据做更新操作前,先将这条数据备份在一个地方,然后去更新,如果更新失败,可以从备份数据中回写回来。这样就可以保证事务的回滚,就可以保证数据操作的原子性了。其实 SQLite 引入 WAL 之前就是通过这种方式来实现原子事务,称之为 rollback journal, rollback journal 机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功,则删除备份数据,提交修改。 WAL 再继续上面的问题?如何做到数据的可恢复 (原子性)和提交成功的数据被持久化到磁盘 (持久性)?另一种机制就是WAL,WAL 机制的原理也很简单:「修改并不直接写入到数据库文件中,而是写入到另外一个称为 WAL 的文件中;如果事务失败,WAL 中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。」 WAL 的优点 读和写可以完全地并发执行,不会互相阻塞 (但是写之间仍然不能并发)。 WAL 在大多数情况下,拥有更好的性能 (因为无需每次写入时都要写两个文件)。 磁盘 I/O 行为更容易被预测。 使用更少的 fsync()操作,减少系统脆弱的问题。 提升性能 我们都知道,数据库的最大性能挑战就是磁盘的读写,许多先辈在提供数据存储性能上绞尽脑汁,提出和实验了一套又一套方法。其实所有方案最终总结出来就三种:「随机读写改顺序读写」、「缓冲单条读写改批量读写」、「单线程读写改并发读写」。WAL 其实也是这两种思路的一种实现,一方面 WAL 中记录事务的更新内容,通过 WAL 将随机的脏页写入变成顺序的日志刷盘,另一方面,WAL 通过 buffer 的方式改单条磁盘刷入为缓冲批量刷盘,再者从 WAL 数据到最终数据的同步过程中可以采用并发同步的方式。这样极大提升数据库写入性能,因此,WAL 的写入能力决定了数据库整体性能的上限,尤其是在高并发时。 ...

2019-03-27 · 2 min · 224 words · -

多CPU架构支持的Docker镜像

多 CPU 架构支持的 Docker 镜像 https://medium.com/@mauridb/docker-multi-architecture-images-365a44c26be6

2019-03-23 · 1 min · 6 words · -

tomcat session 共享, redis集群

tomcat session 共享, redis集群 https://github.com/ran-jit/tomcat-cluster-redis-session-manager

2019-03-22 · 1 min · 5 words · -

golang 算符优先级

golang 算符优先级 Binary operators (MACAO) Prio Operators Note 1 * / % « » & &^ Multiplicative 2 + - ^ Additive 3 == != < <= > >= Comparison 4 && And 5 | Or

2019-03-21 · 1 min · 36 words · -

循环冗余校验 (CRC)

循环冗余校验 (CRC) 从奇偶校验说起 所谓通讯过程的校验是指在通讯数据后加上一些附加信息,通过这些附加信息来判断接收到的数据是否和发送出的数据相同。比如说RS232串行通讯可以设置奇偶校验位,所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个或偶数个。比如我们要发送的字节是0x1a,二进制表示为0001 1010。 采用奇校验,则在数据后补上个0,数据变为0001 1010 0,数据中1的个数为奇数个 (3个) 采用偶校验,则在数据后补上个1,数据变为0001 1010 1,数据中1的个数为偶数个 (4个) 接收方通过计算数据中1个数是否满足奇偶性来确定数据是否有错。 奇偶校验的缺点也很明显,首先,它对错误的检测概率大约只有50%。也就是只有一半的错误它能够检测出来。另外,每传输一个字节都要附加一位校验位,对传输效率的影响很大。因此,在高速数据通讯中很少采用奇偶校验。奇偶校验优点也很明显,它很简单,因此可以用硬件来实现,这样可以减少软件的负担。因此,奇偶校验也被广泛的应用着。 奇偶校验就先介绍到这来,之所以从奇偶校验说起,是因为这种校验方式最简单,而且后面将会知道奇偶校验其实就是CRC 校验的一种(CRC-1)。 累加和校验 另一种常见的校验方式是累加和校验。所谓累加和校验实现方式有很多种,最常用的一种是在一次通讯数据包的最后加入一个字节的校验数据。这个字节内容为前面数据包中全部数据的忽略进位的按字节累加和。比如下面的例子: 我们要传输的信息为: 6、23、4 加上校验和后的数据包: 6、23、4、33 这里 33 为前三个字节的校验和。接收方收到全部数据后对前三个数据进行同样的累加计算,如果累加和与最后一个字节相同的话就认为传输的数据没有错误。 累加和校验由于实现起来非常简单,也被广泛的采用。但是这种校验方式的检错能力也比较一般,对于单字节的校验和大概有1/256 的概率将原本是错误的通讯数据误判为正确数据。之所以这里介绍这种校验,是因为CRC校验在传输数据的形式上与累加和校验是相同的,都可以表示为: 通讯数据 校验字节 (也可能是多个字节) CRC 算法 CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。还以上面例子中的数据为例: 23、4 可以看做一个2进制数: 0000011000010111 00000010 假如被除数选9,二进制表示为: 1001 CRC即循环冗余校验码 (Cyclic Redundancy Check) : 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查 (CRC) 是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 CRC32简介 CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。 CRC32检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS (帧检错序列)采用的是CRC-CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。 crc golang m_data := []byte{0x01,0x02,0x03,0x04} //创建Byte切片 checksum := CheckSum(m_data) //调用计算CRC函数 CheckSum fmt.Printf("check sum:%X \n",checksum) https://blog.csdn.net/liyuanbhu/article/details/7882789 ...

2019-03-21 · 1 min · 70 words · -

golang base64

golang base64 http://www.01happy.com/golang-base64-encode-decode/ golang中base64编码和解码 Golang 3年前 (2016-08-05) 1011浏览 0评论 golang中base64的编码和解码可以用内置库encoding/base64 package main import ( “encoding/base64” “fmt” “log” ) func main() { input := []byte(“hello golang base64 快乐编程http://www.01happy.com +~”) // 演示base64编码 encodeString := base64.StdEncoding.EncodeToString(input) fmt.Println(encodeString) // 对上面的编码结果进行base64解码 decodeBytes, err := base64.StdEncoding.DecodeString(encodeString) if err != nil { log.Fatalln(err) } fmt.Println(string(decodeBytes)) fmt.Println() // 如果要用在url中,需要使用URLEncoding uEnc := base64.URLEncoding.EncodeToString([]byte(input)) fmt.Println(uEnc) uDec, err := base64.URLEncoding.DecodeString(uEnc) if err != nil { log.Fatalln(err) } fmt.Println(string(uDec)) } 运行输出: go run encode.go aGVsbG8gZ29sYW5nIGJhc2U2NCDlv6vkuZDnvJbnqItodHRwOi8vd3d3LjAxaGFwcHkuY29tICt+ ...

2019-03-21 · 1 min · 84 words · -

golang bytes.buffer

golang bytes.buffer buf := bytes.NewBuffer([]byte{}) bytes.buffer 是一个缓冲 byte 类型的缓冲器,这个缓冲器里存放着都是 byte A buffer is a variable-sized buffer of bytes with Read and Write methods. The zero value for Buffer is an empty buffer ready to use. 创建 Buffer 缓冲器 var b bytes.Buffer // 定义一个 Buffer 变量,不用初始化 b.Writer([]byte("Hello ")) // 可以直接使用 b1 := new(bytes.Buffer) //直接使用 new 初始化,可以直接使用 // 其它两种定义方式 func NewBuffer(buf []byte) *Buffer func NewBufferString(s string) *Buffer NewBufferString 还可以用 bytes.NewBufferString(“hello”) 来建立一个内容是 hello 的缓冲器 ...

2019-03-21 · 1 min · 149 words · -

jpackage, JEP 343

jpackage, JEP 343 https://www.infoq.cn/article/Hx61r30V8*Ur5ltrQjXu?utm_source=rss&utm_medium=article https://openjdk.java.net/jeps/343 OpenJDK 社区发布了JEP 343: 打包工具的早期访问版本。JEP 343: 打包工具,又名 jpackage,是打包自包含 Java 应用程序和 Java 运行时环境的新工具。这个基于JavaFX javapackager 工具的原型适用于对 jpackage 感兴趣的开发人员。

2019-03-19 · 1 min · 20 words · -

Linux 命令选项, 参数,括号, 可选, 必选

Linux 命令选项, 参数,括号, 可选, 必选 https://blog.csdn.net/raoqin/article/details/8875089 []: 内的内容意思是: 可写可不写 例如: /home下就一个list 文件,使用ls -help中的 Usage: ls [OPTION]… [FILE]… {}: 那就必须要在{}内给出的选择里选一个。 <>: 表示必选 在数据库中 Transact-SQL 语法规则 Transact-SQL 引用中的语法关系图使用下列规则。 规范 用于 大写 Transact-SQL 关键字。 斜体 Transact-SQL 语法中用户提供的参数。 | (竖线) 分隔括号或大括号内的语法项目。只能选择一个项目。 [ ] (方括号) 可选语法项目。不必键入方括号。 {} (大括号) 必选语法项。不要键入大括号。 [ ,…n ] 表示前面的项可重复 n 次。每一项由逗号分隔。 [ …n ] 表示前面的项可重复 n 次。每一项由空格分隔。 加粗 数据库名、表名、列名、索引名、存储过程、实用工具、数据类型名以及必须按所显示的原样键入的文本。 <标签> ::= 语法块的名称。此规则用于对可在语句中的多个位置使用的过长语法或语法单元部分进行分组和标记。适合使用语法块的每个位置由括在尖括号内的标签表示: <标签>。 命令行语法字符 在命令行语法中,某些字符与格式有着特殊的意义与含义。 本文档中的命令行语法使用以下字符格式: 方括号 [] 方括号 ( [ ] ) 表示里面的元素 (参数、值或信息) 是可选的。 您可以选择一个或多个条目,也可以不选。 不要将方括号本身也输入到命令行中。 ...

2019-03-19 · 1 min · 157 words · -

MySQL DELETE TRUNCATE drop

MySQL DELETE TRUNCATE drop 相同点: 1.truncate和不带where子句的delete、以及drop都会删除表内的数据。 2.drop、truncate都是DDL语句(数据定义语言),执行后会自动提交。 不同点: truncate 和 delete 只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。 delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。 truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。 3.delete 语句不影响表所占用的 extent,高水线(high watermark)保持原位置不动 drop 语句将表所占用的空间全部释放。 truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。 4.速度,一般来说: drop> truncate > delete 5.安全性: 小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及 使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大. 想删除表,当然用 drop 想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。 6.delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同: 二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 ...

2019-03-18 · 1 min · 100 words · -

DecimalFormat

DecimalFormat 我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Java 提供 DecimalFormat类,帮你用最快的速度将数字格式化为你需要的样子。下面是一个例子: importjava.text.DecimalFormat; publicclassTestNumberFormat{ publicstaticvoidmain(String[]args){ doublepi=3.1415927;//圆周率 //取一位整数 System.out.println(newDecimalFormat(“0”).format(pi));//3 //取一位整数和两位小数 System.out.println(newDecimalFormat(“0.00”).format(pi));//3.14 //取两位整数和三位小数,整数不足部分以0填补。 System.out.println(new DecimalFormat(“00.000”).format(pi));// 03.142 //取所有整数部分 System.out.println(newDecimalFormat("#").format(pi));//3 //以百分比方式计数,并取两位小数 System.out.println(new DecimalFormat("#.##%").format(pi));//314.16% longc=299792458;//光速 //显示为科学计数法,并取五位小数 System.out.println(newDecimalFormat("#.#####E0").format(c));//2.99792E8 //显示为两位整数的科学计数法,并取四位小数 System.out.println(newDecimalFormat(“00.####E0”).format(c));//29.9792E7 //每三位以逗号进行分隔。 System.out.println(newDecimalFormat(",###").format(c));//299,792,458 //将格式嵌入文本 System.out.println(newDecimalFormat(“光速大小为每秒,###米。”).format(c)); } } DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。上面的例子包含了差不多所有的基本用法,如果你想了解更多,请参考 DecimalFormat 类的文档。 https://blog.csdn.net/wangchangshuai0010/article/details/8577982

2019-03-18 · 1 min · 45 words · -

霍桑效应

霍桑效应 20 年代时,在芝加哥郊外一个名为"霍桑"的工厂里,研究人员在研究照明条件对工人绩效表现的影响。研究人员最初认为,随着工厂照明条件的改善,工人的生产率应当会随之提升。但事实却并非如此,研究人员后来才发现,工人绩效的提升是因为他们感觉受到了公司的关注,从而增强了工作动机,这就是"霍桑效应"的产生。 https://www.infoq.cn/article/gU*236UQhE5FYgDsYXoB?utm_source=rss&utm_medium=article

2019-03-18 · 1 min · 4 words · -

ansible 管理工作站配置, linux初始化

‘ansible 管理工作站配置, linux初始化’ # archlinux 直接从仓库里安装就是最新版本 sudo pacman -S git ansible ubuntu,debian ubuntu 默认 apt 安装的ansible版本可能是旧版本, 建议参照ansible官网文档安装新版本的ansible https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#latest-releases-via-apt-debian Add the following line to /etc/apt/sources.list: deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main Then run these commands: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367 sudo apt-get update sudo apt-get install ansible 编写ansible 脚本 vim local.yml - hosts: localhost become: true tasks: - name: Install htop apt: name=htop 提交到 github git add local.yml git commit -m "initial commit" git push origin master 执行脚本 ansible-pull模式 sudo ansible-pull -U https://github.com/wiloon/ansible.git 本地执行 ansible-playbook ansible/local.yml --extra-vars "user_name=wiloonwy" https://linux.cn/article-10434-1.html

2019-03-16 · 1 min · 88 words · -

SSL 故障分析

SSL 故障分析 openssl s_client -connect host0:port0 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' openssl verify foo.pem openssl s_client -connect host0:port0 -state -showcerts 解码根证书 openssl x509 -text -in roch.pem https://www.ibm.com/developerworks/cn/linux/l-cn-sclient/index.html

2019-03-15 · 1 min · 29 words · -

clonezill

clonezill download clonezill iso from https://clonezilla.org/downloads.php install balenaEtcher dd bs=1M conv=fdatasync if=./clonezilla-live-3.2.0-5-amd64.iso of=/dev/sdx start clonezilla device-image nfs_server dhcp nfs4 192.168.50.227 /backup_xxxx/ beginner save parts clonezill https://clonezilla.org/ https://clonezilla.org/liveusb.php#macos-setup Download the Clonezilla Live iso file. Insert a USB flash drive on the Mac machine. Erase it using the standard Mac Disk Utility (exFAT works fine). Download balenaEtcher for macOS, then follow its document to burn the image to the USB flash drive. Eject the USB drive. Thanks to Hans Palm for providing this info. ...

2019-03-15 · 1 min · 141 words · -

diffie-hellman

diffie-hellman openssl dhparam -out dhparam.pem 2048 # 如果你的机器性能足够强大,可以用 4096 位加密

2019-03-15 · 1 min · 10 words · -