归档
按年份和月份浏览文章。
Glamsterdam Gas 重定价:EIP-2780、EIP-8037 与 EIP-8038 对 Solidity dApp 和 EVM Wallet 的影响
面向 Solidity dApp、智能合约基础设施和 EVM Wallet 开发者的迁移指南 信息核对日期:2026-08-16 摘要 Glamsterdam 网络升级正在重构 Ethereum 的 gas 定价方式。其中最容易被应用开发者注意到的是 EIP-2780:Resource-based intrinsic
HIIT 还是 Zone 2 训练?
大多数人一想到“心肺训练”,脑海里就会浮现两个场景: - 🏃♂️ 长跑、慢跑,节奏稳定 - 🥵 疯狂冲刺、爆汗、全力以赴 这两种,其实就是Zone 2(低强度有氧)和HIIT(高强度间歇)。 到底哪个更适合你? --- 🥊 有氧 vs. 无氧,到底选哪个? 答案很简单:能两者兼顾最好。 如果你时间有限,就要根据
如何在不放弃立场下化解一次纷争
《我就是你啊:走进他人内心的7项修炼》读后感以及总结:如何在不放弃立场下化解一次纷争 --- 第一步:控制自己的情绪,学会换位思考 在冲突中,人们往往容易被情绪牵动,从而偏离理性的沟通。 所以第一步就是要控制自己的情绪。 举例来说,当别人拒绝我们时,我们常常会下意识地觉得被否定,甚至怀疑对方是在针对自己。但实际上,对方
K8S StatefulSet 中更新 volumeClaimTemplates 的存储大小
截止 Kubernetes 到 1.33,StatefulSet 的 volumeClaimTemplates 中的存储大小是不可变的,这意味着你不能直接通过修改 StatefulSet 的配置来更新存储大小。 但是有几种方法可以实现存储扩容: 方法一:手动扩容现有 PVC(推荐) 这是最简单且风险最小的方法: 确保存
确定 stdout/stderr 是否已经被重定向
有个场景是当日志输出到屏幕时增加颜色,当输出到普通文件或者重定向就去掉颜色,因为颜色是通过 ANSII Code 控制的,看起来像是乱码一样。 在 Unix 中,万物皆文件,那么就可以通过读取文件属性确认。 例如在 go 代码中: --- 原文:GitHub Issue 259
在单页应用中 index.html 该使用什么 cache-control ?
index.html 是 SPA 单页应用的入口, js/css 等静态文件路径都在这里被定义。 所以一般而言,index.html 的缓存控制指令会被设置为 private, max-age=0。 这样设置后, CDN 和浏览器都不会缓存 index.html,当代码更新时也不会导致用户侧出现没有更新的状态。 但是这
solidity: 正确理解 immutable 关键字
Solidity 早在0.6.5 版本就引入了 immutable关键字。 immutable 可以认为是运行时常量,数据直接存储在已部署的字节码中,所以并不会占用存储槽。 官方博客这样解释其工作原理: 虽然常规状态变量以固定偏移量存储在存储中,但不可变变量的情况并非如此。相反,不可变数据直接存储在已部署的字节码中,即
使用 vscode 编辑查看 go 标准库和编译器代码
如果直接使用 vscode 打开刚克隆下来的 go 标准库代码,那么会收到一堆错误。 第一,go 1.21 使用标准的 toolchain 版本约定,而 go 标准库始终会使用下一个版本号约定,所以 go 1.21 编译器无法在 go 1.22 上工作。 第二,go 标准库源码在 src 目录中,还有 misc 包,主
跨域 cross-origin 和跨站 cross-site 是不同的概念
跨域一般用于同源策略,不同的协议、主机以及端口都算作跨域: - 协议不同 http://example.com 和 https://example.com - 主机不同,即使二级域名相同 https://www.example.com 和 https://example.com - 端口不同 http://exampl
golang generic nil check 泛型空指针检查
目前 golang 无法支持对泛型参数空检查,例如下面代码就会报错: 解决方式只能把参数 T 改为指针: 但是如果我们需要写一个函数可以把任意参数转化为指针,比如 aws sdk go v2中几乎所有参数都是指针类型,所以提供了一系列的函数,例如取 string 指针: 如果写一个泛型的取指针的函数就会遇到上面 IsN
solidity: bytes 强制类型转化为地址注意点
当 bytes32 转换为 address 时候,需要进行强制转换,通常有两种方式 第一种,转换为 bytes20 然后再转换为 address 第二种,转化为 uint160 再转换为 address 这两种方式看起来差不多,其实输出是不一样的。第一种会取前 20 字节,也就是后面数据截断;第二种是取后 20 字节,
selfdestruct 的两点重要的容易被忽视的逻辑
selfdestruct(address payable recipient) 的作用是销毁当前合同状态,将其资金发送到给定地址,在之前的 solidity 编译器中也叫做 suicide,因其带有负面意义改为 selfdestruct 其中有两点很重要的,而且很容易被忽视的 强制发送余额,不会执行 receive 函
grep 命令中一些需要转义的特殊字符
比如有这样一段文本,需要匹配出中间 ETH 地址 在 nodejs 中可以这样做 但是使用 grep 就不行,没有任何返回 谷歌了一遍才发现, { 和 } 需要进行转义操作 继续尝试了几个操作符, 这个不需要转义,而 + 和 ? 需要转义才可以使用。 为什么在编程语言中最常用的重复类符号在 grep 中需要转义使用?
Solidity 自定义错误类型
从 Solidity 0.8.4 开始,开始支持自定义错误。 231 中说明了在 Solidty 中 revert(string) 调用会被 ABI 编码成 Error(string) ,因为 string 动态数据的存在,会消耗大量的 gas 费用。 新的自定义错误使用类似与 event 的定义方式,使用 error
在跳板机环境下使用 iTerm2 自由上传下载文件
如果远程服务器可以自由与本地通信,那么最简单的方式就是 scp 命令 但是存在跳板机这一个中间层,而且远程服务器不能直接连接,就不能直接使用这种方式。 因为可以通过 SSH 登录远程服务器,那么我们可以直接 SSH 环境下直接上传下载文件,这种方式类似于在 shell 中复制粘贴一样。 首先确认远程服务器和本机机器都安
RegExp.prototype.test() 不要使用全局正则
test() 方法接受一个字符串,如果匹配返回 true。 今天遇到一个坑,如下面所示: 这是因为 regexp 对象内部有个 lastIndex 属性,每次运行都会改变这个 lastIndex 属性,使得正则对象从这个新的索引开始匹配。 所以上面的第二次正则匹配返回了 false。 如果要修改这种错误,可以手动设置
cURL 自定义 Host 请求头
有这样一个场景,服务端配置了下面的 nginx 如果我们要本机或者其它机器直连ip进行测试,直接访问 127.0.0.1 或者 localhost 都是不行的,因为 nginx 会根据 http 请求 host 头来路由。 第一种解决方法,改 /etc/hosts 文件,将 example.com 固定到具体 ip 上
Node.js 定时任务
有这样的一个需求,每 1 秒进行一项任务,那么就可以写成下面的方式: 根据打印日志,可以看到就算任务没有完成,那么也会自动调用 job 为此需要加一个"锁",如果已经加锁,那么不再需要运行 job 如下面日志所示,那么现在任务就顺序执行了 不过这也有个问题,假设需要任务之前间隔是固定的,比如上面的1秒,那么这个解决方式
Solidity 0.8.0 破坏性更新
数值计算默认不会出现溢出 如果溢出会返回 Panic(uint256) 错误,具体值为 Panic(11),ERC20 再也不需要 SafeMath 库了。 如果要开启溢出,那么要加上 uncheck {...} 代码块。 查询 chainid 在 0.8 中,chainid 的获取加上了语法糖,可以在 block.c
Nodejs 中全局 this 的指向
Nodejs 现在支持两种模块机制,一种是 CommonJS,一种是官方规范 ECMAScript 模块。 全局 this 在 CommonJS 不是指向 global(或者说 globalThis),而是指向 module.export。 这是因为 CommonJS 本质上是用函数包裹当前文件生成的一个作用域,所以能
cURL 响应状态码的相关例子
1. 怎么获取返回 HTTP 状态码 curl -I 可以返回响应头,当然也就包含了响应状态码。 如果想只要状态码,那么可以这样做: 如果请求失败,那么返回 000 2. HTTP 响应状态码 500/400 那么 curl 运行是否也是失败? 否 如果想要 shell 返回错误码,可以加上 -f 参数,非 200 会
shell read 逐行读取操作同时修改全局变量的问题
当文件没有可读的行时,read 命令将以非零状态退出,所以我们可以使用 while...read 逐行处理数据。 第一种,使用 cat 读取文件然后管道符传给 while...read 第二种,使用输入重定向到 while...read 内 如果同时操作的全局变量,比如这里有个例子,有一个文件内容需要在每行最后加上逗号
ECMAScript2021: 逻辑赋值运算符
目前 js 支持 3 种逻辑赋值运算符: 与数学意义的逻辑运算符不同的是,逻辑赋值符在不符合逻辑条件下不会触发 setter 实际使用中,逻辑赋值运算符能提供更好的性能,如下面代码: 上述代码中赋值给 .innerHTML 属性会删除 msgElement 元素内部子元素,然后插入从新分配的字符串后再进行解析,而逻辑赋
比特币替换交易(RBF)
RBF(replace-by-fee) 在 bip125 中规范。 最简单的方式是只要存在 TxIn 成员中的 nSequence 字段值小于 0xffffffff - 1 那么就可以进行替换交易。 使用下面代码在 regtest 下进行尝试: 然后进行发送,可以看到内存池中已经有这个交易了。 然后更改下矿工费,也就是
p99延迟是什么?
Go1.14发布时,Sameer Ajmani 再说明其性能提升时提到一个 p99 延迟,查了资料,但是最近突然想起来又忘记了,这里记录下来。 原文是说: Some data: improved loaded gRPC server throughput by 15% & reduced p99 latency by
Rust Iterator 迭代器
在 Rust 中很多常用数据结构,例如Vector、HashMap 都内置了迭代器,消费这些结构直接只使用 for...in 的结构即可。 如果要自定义一个迭代器,只要实现 Iterator trait 即可,每次遍历都是运行 next 方法,直到返回 None。 如下所示,可以直接使用 for 进行遍历。 不过你可能
Rust 中的 From 和 Into trait
Rust 中 From trait 定义一个类型如何转换为另一个类型的过程,还有些类似于构造函数。比如最常见的可以将 str 转换为 String 再比如将一个原始 i32 数字转化为 Number 类型 如果一个类型实现了 From,那么也自动实现了 Into trait,Into 实际上是 From 的逆运算。由于
GET 请求可不可以附带 body?
正常的认知中,GET 是不可以使用 body 的,如果要使用 body,可以转化成 querystring。 查了些资料,发现规范并没有限制,但是实际使用是有很大区别的。 使用 Go 实现一个 Server,然后使用 curl(v7.54.0),nodejs(v13.5.0),go(v1.13.5) 来实验: 使用 G
solidity 重入攻击和预防
solidity 执行是单线程事务执行的,所以没有并发也就没有了竞态,所以怎么可以进行重入攻击呢? 如下所示代码,警告⚠️:下面代码有严重bug! 这是一个钱包,之前存取,看起没有什么问题,但是如果我们withdraw发送到一个合约里面,我们可以利用合约重新调用 withdraw 就可以耗尽钱包里所有的钱。 问题出在哪
Go中可比较性和有序性
什么是可比较性,简单来说就是可以使用比较运算符的类型具有可比较性。 比较运算符又分为等于、大于、小于等形式。可以使用等于和不等的那么就代表此类型具有可比较性。可以使用大于和小于的的类型,那么就说明此类型具有有序性。 一般而言: - 布尔类型具有可比较性。两个布尔值相等,那么说明二者都是 true 或 false。 -
Solidity v0.6.0 主要功能和破坏性更新示例
重载关键字 和 C++ 中面向对象继承类似,Solidity 提供了 virtual 和 override 关键字。继承抽象合约或者合约接口需要加上 overide 关键字。 回退函数更改 异常捕获 当进行外部非低级调用时,异常会冒泡到上层,v6.0 加入 try...catch 可以捕获到下层异常。 try 后接外部
Go1.14 重要新特性
语言变更 内嵌接口方法集允许部分重叠 接口(interface)是方法集合,方法必须有唯一的非空名称。 之前的接口规范:一个接口 T 可以在方法集中使用接口 E,这里的 E 称之为 T 的内嵌接口,使得 E 中的所有公有和私有方法被添加到接口 T 中。 所以如下所示的 ReadWriteCloser 多个内嵌接口拥有同
解决 nodejs 在 macOS Catalina (v10.15) 无法使用 node-gyp 问题
升级到 macos v10.15 之后,nodejs无法正常编译 c++ 库,node-gyp 文档给了解决方案,本篇是其的简短翻译。 --- 当升级到 macOS Catalina 或者使用 Software Update 会造成 node-gyp 安装失败。一般在 npm install 的时候会遇到下面这个错误:
基于x509的认证授权技术
认证方式有很多,比如使用用户名密码的BasicAuth,使用 AccessToken 的 OAuth 2.0 等等,还有一个这篇文章要写的基于 X509 的认证方式,这个不太常见,目前我就在k8s api server中见到。 认证的本质就是获取并确定请求方的身份。回想一下在 TLS 中确认身份的情况,在握手中服务端要
age:一个现代化的加密工具
age:一个现代化的加密工具 age 是 golang crypto 库的维护者之一的 FiloSottile 写的一个现代化加密工具,目前正处在 Beta 阶段。 age 的是 Actual Good Encryption 的缩写,有点 PGP(Pretty Good Privacy) 的意思,说起来作者本身的想法就
谷歌和苹果发布的COVID-19密切接触者追踪应用是如何保护用户隐私的?
最近谷歌和苹果公司作为竞争对手不常见的联合起来,发布了一个COVID-19 Contract Tracing应用,也就是密切接触者追踪应用。其实现原理并不复杂,简单而言就是用户使用蓝牙将个人相关信息传递附近的手机上,如果有人确诊了,可以将这个人的信息上传到服务端,然后再推送给其它相关手机上,这样就能判断一个人是否有感染
Go linter: io.ReadFull 不需要判断返回值长度
io.ReadFull 返回从Reader读取的字节数量和错误信息 ReadFull 经常出现在其它辅助函数中,比如随机数生成函数 rand.Read 除了判断 err 是否不为空之外,经常有代码还会判断这个 n 的长度是否和 b 的长度一样,其实这是没必要的,io.ReadFull 内部保证了如果 err == ni
Go slice 技巧
翻译: https://github.com/golang/go/wiki/SliceTricks --- 追加 复制 切割(cut) 删除 不保护删除 注意:如果元素类型是指针或者一个结构体内含有指针,上述的切割和删除会有内存泄露的风险,被删除的元素仍然被 a 引用,而不被垃圾回收处理,下面的代码可以处理这些问题:
Go: 清空 Slice 的两种方法:[:0]和nil
如果要清空一个slice,那么可以简单的赋值为nil,垃圾回收器会自动回收原有的数据。 nil slice 和普通 slice一样可以使用 cap len 内置函数,以及被 for range 遍历。本质和 empty slice 性质一样,零长度和零容量,当然也可以使用 append 操作。 但是如果还需要使用 sl
Go: big.Int 常用辅助函数
深拷贝 判断值是否大于、小于或等于 0 如果 x 0 返回 +1 如果判断是否为 0 那么也可以用这个,如果 BitLen() 返回 0 那么就是值为 0 转化为固定长度的 bytes 转化为 bytes 很简单,直接使用 Bytes() 即可,但转化的 bytes 只有值的最小字节长度。 如果要转化为固定长度,在 g
使用中转合约减少以太坊多笔转账Gas使用
以太坊中普通交易至少需要 21000 Gas 而合约 transfer 方法仅需要 2300 Gas ,这样可以利用这点节省费用。 部署一个代理合约,使用这个代理合约进行转账,另外也不需要先转入再转出,直接使用合约进行中转 在 Goerli 网络上进行测试,发送了 20 笔转账仅使用了 211,093 Gas 而要是传
k8s 国内源安装备忘清单
注意以下命令,需要切换到 root 后运行 --- 系统:ubuntu 16.04 安装 docker 首先确定已经安装完成 docker,如果没有安装可以使用以下脚本快速安装并配置: 安装 k8s 套件 关闭 swap 为了性能考虑,k8s 需要关闭 swap 功能,然后重启主机。 在 /etc/fstab 中找到带
使用以太坊 CREATE2 操作码实现在线支付系统
假设我们有个一个支持 ETH 支付的线上商城,支付系统怎么设计? 因为 ETH 支持合约,我们可以设计一个单地址合约,让顾客扫描预定义的二维码,二维码含有订单id,当支付成功后发送一个 Pay 事件,订单系统只要监听这个事件即可。不过我们需要设计一整套的系统,包括二维码标准、合约系统等等,而且不能兼容交易所/钱包的转账
获取以太坊交易被Revert的原因
Solidity 0.4.22 支持 require 和 revert 函数加上错误原因的字符串,如果交易被Revert将会返回这个字符串,并编码成 Error(string)。 在测试环境中进行部署后,使用 ethcall 调用: 即可获取到返回结果: 可以看到返回的结果,是使用 Error 进行了 ABI 编码了,
Go: 正确处理 net 包中的错误
Go 网络开发中的常用的应用层协议库都是基于 net 标准库开发的,比如 gorilla/websocket 和 go-grpc,还有最常用的 http 库。 当请求一个不存在的 host 时会返回一个错误,如下所示 这个错误本质其实是 net.DNSError,在 Go 早期开发中,会经常使用接口断言匹配错误。 比如
solidity 处理智能合约转账的安全辅助函数
在智能合约中处理转账,最常见是 Ether 和 ERC20Token 的转账。 在转账 Ether 时,一般我们直接使用 .transfer(uint256)(或者 send) 函数,但是这个函数有个限制,只能使用 2300 gas,而且不能调整,这样就会出现一个问题,如果在合约内转给另一个合约地址,合约内对 fall
solidity: 判断目标地址是否为合约地址的两种方法
目前常用两种方式判断目标地址是否为合约,如下所示 第一种根据目标地址的代码是否为空判断,extcodesize 操作码 gas 消耗为 700。 另一种是根据目标代码 keccack256 的哈希来判断,参考 EIP1052,空值哈希正好是 0xc5d2460186f7233c927e7db2dcc703c0e500b
Go: 按位清除运算符(bit clear)
在 Go 语言中有个特殊的位运算符,使用 &^ 符号表示,包含与操作和取反操作。 《Go语言圣经》里面有对此的描述,z = x &^ y,如果 y 中比特位为 1 那么 z 对应比特位值就是 0,否则 z 就使用 x 对应位置的比特位值。 这种解释方法太绕了,实际执行方式是 x 和 y取反后的值进行与操作。实际应用中,
证书中CommonName和SubjectAlternativeName
这是 github.com 的 https 证书解码后的数据,通过 Subject 字段可以看到证书所有者的基本信息,其中 CN 是 CommonName 的简写,中文常称作通用名称。 当浏览器进行 TLS 握手时是不是通过 CommonName 来判断证书是属于当前域名 github.com 的呢? 答案是否定的,而
ECMA2020: Optional Chaining & Nullish Coalescing
下面这个错误在 JavaScript 中最为常见 unable to get property of undefined or null reference 通常为了解决这个问题,我们可以使用 && 操作符来取对象属性值。 不过当数据很长的时候就特别麻烦,ECMA2020 通过了一项提案Optional Chainin
容器资源可见性问题与 GOMAXPROCS 配置
Go 程序启动时候会根据 CPU 数量设置 GOMAXPROCS,比如下面的程序中在 8 核处理下输出为 8。 当我们使用 Docker 的时候也是如此,不过当我们使用 docker run 的时候同时限制了 CPU 数量,那么程序中会正常显示吗? 不会,比如 docker run --cpus=2 IMAGE,输出还
Go: 显式声明某个类型实现了一个接口
Go 中没有面向对象的 implements 关键字,一个类型实现了一个接口是隐式的。 其实显式声明主要为了让编译器提前判断接口是否被实现而已。 所以在 Go 中还是有很多方式的。 如下所示 \UserCacher 实现了 Cacher 接口 为了让编译器提前判断的话,可这样做: 或者在一个“构造函数”内实现:
分享:你可能不知道的Go
本文是根据我在公司分享的《你可能不知道的 Go(上)》而整理的文章 本次分享的主题是《你不知道的 Go》,其实这个名称来源自《你不知道的 JavaScript》这本书,当然起这个名字有些“妄自尊大”,再者这次分享确实没有什么“高大上”的内容,只是一些大部分初学者不会注意到的盲点,所以之后我就改名为《你可能不知道的 Go
Win10 Chrome播放视频非常卡顿?
最近我发现用 WindowsChrome 的时候,播放视频非常卡顿,视频就像一帧一帧的播放一样,但是 Mac 下没有这样的问题。 找了好久的解决方案,重装 Chrome,禁用所有 Chrome 插件,安装新显卡驱动都试过,都没解决。 最后我尝试禁用了 Chrome 的硬件加速功能,没想到解决了。 最后给出具体解决方式:
MySQL upsert操作
upsert 操作是说如果这条记录存在(含有 unique key 或 primary key 的字段存在)那么就更新,否则就插入一条新的记录。 首先创建一张新表,包含一个主键约束 id 然后插入多条数据: 如果现在要插入 id 为 2 的记录,那么就会报错: 如果简单改一下,就不会报错了: 或者将 update 设置
如果你忘了你的云服务器登录密码
如果你忘了云服务器的密码,有没有简单的方式找回? 有,前提是你设置了公钥登录以及可以使用 docker。 以 ubuntu 为例,只需要两步: 然后输入你的密码就可以了。 这是为啥?因为 Docker 守护进程需要 root 权限,所以操作 docker 就可以直接使用 root 来操控系统。只要这里对系统配置相关的内
最简单的方式使用最新开发分支的Golang编译器
使用如下的命令: 比如这里我就使用了 go1.13 的未发布的最新编译器,那么就可以使用一些 go1.13 才有的功能。 比如下面的数字分隔符: 然后使用 gotip run main.go 就可以了。
Go: 使用 build tag 来自定义构建配置
通常我们会给每个产品环境设置不同的配置,比如 redis 要在开发环境就连接 localhost:6379,测试环境可能连接某一个主机的 redis。 配置文件通常会使用 env 或者 yml。这样每次构建包放在不同的环境就需要手写一套配置,开发也需要向运维提供配置文档。 最近在一直在用 python,项目通常都是使用
Python模块和包管理
模块和包 在 Python 中每一个 .py 都可以视作一个模块(module),而每一个包含 init.py 的目录则可以视作包(packge)。 如下所示,packs 因为包含 init.py 而可以看做是一个包,而 packs/one.py 则是一个模块。 在 one.py 中简单定义了一个函数 One: 如果我
减少 Go 构建文件大小的简单策略
由于 go 编译程序自带运行时,所以一个简单的 hello,world 程序也会超过 1M 的大小 构建并查看编译后文件大小 最近我发现一个技巧,通过加入 ldflags 指令就可以减少构建大小。 减少了 400K 左右。 在 go link 文档中有 ldflags 的指令详细说明,这里就是说把 debug 信息全部
Go 无文件引入配置到构建程序
程序运行时需要引入一些配置信息,比如需要一个 password 信息。 一般而言有两种方式:1. 使用环境变量 2. 使用配置文件 运行结果: 不过还可以通过硬编码到运行程序内进行, 通过使用 ldflags 参数传入 build 或者 run 里就可以了, 具体参数说明: importpath 这里是在 main 包
mongodb update 策略
mongo update() 指令包含是三个参数,如下所示: 假设有如下数据: 如果使用 update 命令执行如下语句: 这里 update 文档仅仅是 kv 数据,而不包含任何“更新运算符”,那么会替换整个文档,但 \id 字段不会被更新。这个时候 update 文档也被称为“替换文档”。 但如果 update 参
使用 Go 进行 Solidity ABI 编解码
类型对应关系 | 类型 | Solidity | Go | | ---------------- | -------- | ------------------ | | 字符串 | string | string | | 布尔 | bool | bool | | 地址 | address | common.Addres
Dockerfile COPY 和 ADD 指令区别和使用规则
ADD 和 COPY 指令在 Dockerfile 中具有相同的功能,都是将构建上下文的文件复制到镜像中去,具体语法规则如下所示,可以说在大多数情况下,二者仅仅是语义上的区别。 其中 src(下称源路径) 和 dest(下称目标路径) 参数可以是目录或者文件,下面使用具体事例来说明具体的规则。 新建一个文件夹,具体包含
禁用 Mac 内置键盘和触控板
最近买了个键盘,大小刚好能放在 13 英寸的 MBP 上,这样打字就舒服了很多。但是存在一个问题,直接放在上面有时候会触发内置键盘的按键。 解决方式就是禁用内置键盘,找了好多解决方案,结果都不能使用,最后找到这个软件 tekezo/Karabiner-Elements。安装后会安装两个软件,一个 Karabiner-E
搭建比特币测试环境
这是我正在写的一个电子书《比特币应用开发指南》,这是第一章的搭建测试环境的一小节。 --- 搭建比特币节点 本书使用 BitcoinCore 0.16.3 和 Ubuntu 16.04 作为示例。 下载 运行下列命令下载 BitcoinCore 0.16.3 压缩包 检验下载 下载校验和文件 下载完成后使用以下命令验证
Nodejs 多线程以及线程池教程
Nodejs v11.7.0 发布后,wokerthreads API 就进入基本稳定状态,不需要在运行时候加上 --experimental-worker 标识了。 worker 对于执行 CPU 密集型操作非常有用,但对 I/O 密集型操作没有多大帮助,使用内置异步 I/O 操作效率更高。 API 简介 创建一个
node.js Buffer 与 BigInt 类型互转
node.js 中的 Buffer 是使用 Uint8Array 实现的,所以可以认为是 Golang 中的 []byte 类型。 不过在 Golang math 包中 []byte 和 math.BigInt 类型是可以互转的。 在之前的 BigInt 尝鲜 一文中,介绍了 BigInt 的用法,虽然 BigInt
分享:我是如何为公司追回价值 8 百万人民币的虚拟货币的
几个月之前,钱包部门的同事和我说有一个 ERC20 Token 无法进行转账,转账交易发出去后是交易成功了但是余额没有变化,然后给我发了交易的 txid 让我来看看有没有解决办法。在 etherscan 上查看这个交易状态是成功的,但是并没有发出 ERC20 Transfer 事件,而是一个 RejectedPayme
开始使用 Go Module
开始使用 Go Module Go 的包管理方式是逐渐演进的, 最初是 monorepo 模式,所有的包都放在 GOPATH 里面,使用类似命名空间的包路径区分包,不过这种包管理显然是有问题,由于包依赖可能会引入破坏性更新,生产环境和测试环境会出现运行不一致的问题。 从 v1.5 开始开始引入 vendor 包模式,如
vscode-go 设置 lint 不强制检查对包公开类型是否注释
vscode-go 插件使用 golint 作为默认代码风格检查工具,而 golint 需要对包公开类型等需要注释说明用途,而且必须以类型名称开头。 所以经常会遇到风格检查下面的错误: 但是对于国内的公司而言,不能只用英语注释吧,或者中英文混杂的注释,如下所示: 代码要定义一个们,所以我需要注释说明这是个门,想想都很滑
在命令行工具中使用代理
Mac 和 Linux 类 Unix 环境下设置代理特别简单,只要在用户家目录下的 .bashrc 或 .bashprofile (ZSH 对应 .zshrc 以及 .zshprofile)设置 httpproxy 和 httpsproxy 环境变量到代理地址即可,如下所示,其中 $url 就是代理地址。 这里我设置了
从随机数到比特币地址
从随机数到私钥 比特币是去中心化的,生成地址更是和传统银行中心化方式不同。 地址不需要中心化组织确认是否有重复,使用者也不需要担心会与别人地址重复,因为地址空间的数量达到 2 256 个,用十进制表示的话,大约是 10 77 ,而可见宇宙被估计只含有 10 80 个原子。更通俗话的讲地址重复的可能性比被陨石砸到的的几率
Nginx 请求连接限制配置
通过 APT 等包管理工具安装的 nginx 默认也安装了请求限制模块 limitreqmodule 和 limitconnmodule ,这两个官方模块可以配置客户端请求和者连接的数量。 那请求和连接有什么区别呢? 对于 HTTP 协议来说,其建立在 TCP 之上,1.0 版本一个 HTTP 请求就会产生一个 TCP
一些常用 github 协作术语
ref: https://medium.freecodecamp.org/what-do-cryptic-github-comments-mean-9c1912bcc0a4
for(const num of list) 为什么可以运行?
JS 在 ES6 加入了 const 关键字,除了加入了其它语言一样的常量特性,不仅没有 var 的变量提升,还有块级作用域特性。 常量是不可变的,在 ES6 中指的是常量存储地址的不变性,而不是常量的不可变。所以在 const arr = [];arr.push(1) 是可以运行的。 了解这个之后,我们再看看 for
Markdown 实现代码 diff 效果
如下图所示,github 提供了代码提交记录的 diff 效果,其实在 markdown里面也可以轻松实现。 代码块的语法类型为patch,在删除行加上 -,在新增行加上 +。 更新: 看到 web3.js 上用的语法类型是 diff ,和上面的 patch 差不多。
[Linux]在终端下输入密码时显示星号提示符
在使用 sudo 命令的时候会要求我们输入密码,但是这个密码并没有任何反馈,比如下面这个例子。 ~$ sudo apt update [sudo] password for root: 下面简单修改 sudo 的配置文件就可以类似在浏览器表单中输入密码一样显示 的字样。 大功告成!
Chrome 已经原生支持截图功能,还可以给节点截图
昨天Chrome62稳定版释出,除了常规修复各种安全问题外,还增加很多功能上的支持,比如说今天要介绍的强大的截图功能。 直接截图 打开开发者工具页面,选择左上角的元素选择按钮(Inspect) Windows 下按住 Ctrl,Mac 就按住 Command,然后在页面拖动选择区域即可。 Chrome会自动使用下载方式
express 路由模块化
使用 express.Router 类来创建可安装的模块化路由处理程序。Router 实例是完整的中间件和路由系统;因此,常常将其称为“微型应用程序”。 以下示例将路由器创建为模块,在其中装入中间件,定义一些路由,然后安装在主应用程序的路径中。 在应用程序目录中创建名为 birds.js 的路由器文件,其中包含以下内容
前端表单响应回车键的注意点
1. submit 事件的发生对象是form元素,而不是button元素,submit 事件会触发 submit button 的单击事件,而 submit button 单击事件会触发 form action,单击 submit 按钮也会直接触发 submit 事件。 2. 当输入回车的时候,表单响应的可能是第一个
一些Mac的使用技巧
常用的复制文本是Command+C,相应的粘贴剪贴都是用的Command结合xv。 开发工具 Mac默认自带许多Runtime,比如说Ruby和Python,不过Git貌似就没有自带,这时候我们只要在Terminal里面运行xcode-select --install,这个命令就会下载很多必要的开发组件,比如说git。
Node.js Console 颜色清单
在 Node.js 中打印颜色很简单,就是加上一段字符串描述就可以了,例如: 更多: 需要注意的是,一但加上某一个颜色,之后所有的字符都会受到影响。 所以需要加上 reset 来清除颜色。 更强大的库可以使用 https://github.com/chalk/chalk
URL传递中文编码的解决方案
网页URL的合法字符分成两类。 URL元字符:分号(;),逗号(’,’),斜杠(/),问号(?),冒号(:),at(@),&,等号(=),加号(+),美元符号($),井号() 语义字符:a-z,A-Z,0-9,连词号(-),下划线(),点(.),感叹号(!),波浪线(~),星号(),单引号(\),圆括号(()) 除了以
JS事件中target与currentTarget区别
(1)currentTarget currentTarget属性返回事件当前所在的节点,即正在执行的监听函数所绑定的那个节点。作为比较,target属性返回事件发生的节点。如果监听函数在捕获阶段和冒泡阶段触发,那么这两个属性返回的值是不一样的。 上面代码中,点击para节点,该节点会不可见。另外,在监听函数中,curr
阿里巴巴前端笔试题:数组拍平
1 编写一个 JavaScript 函数,接受一个仅包含数字的 多维数组 ,返回拍平以后的结果。例如传入:[1, [[2], 3, 4], 5],返回 [1, 2, 3, 4, 5]。 (本题来源:阿里巴巴前端笔试题) 2 编写一个 JavaScript generator 函数,接受一个仅包含数字的 多维数组 ,返回
使用 Object.create(null) 代替大括号生成({})对象
传统对象写法为 var obj = {} 这种写法等价于 Object.create(Object.prototype) ,所以 {} 并不是真正的空对象,它还通过原型链继承了 Object 的属性方法。 这种方式不好地方是,{} 在某些时候会进行隐式类型转型,还有当我们使用 for...in 时候会遍历原形链上的属性
为长数字添加逗号分隔符
第一个我想到的是使用正则来处理,不考虑小数的情况下: 当然如果要考虑小数的话就得把数字先转化为字符串,然后 split 分割去第一部分即可。 其实还有一个更简单的方式,Node 下也可以使用: 另外在 i18n 的数字处理上已经有 API 了。 而就处理速度而言,使用正则的方式更快一些,测试环境(Node 8.9.1
JS 优化获取对象类型的方式
我们都知道可以通过 Object.prototype.toString.call(obj) 的方式来获取类型真实的类型。 不过我发现一个更简单而且更快的写法。利用大括号 {} 代替 Object.prototype, 在 135 中我简单说明了, {} 等价于 Object.create(Object.prototyp
JS将字符串转为驼峰写法
就是干 使用正则
理解 Promise
语法 参数 executor是一个带有resolve和reject两个参数的函数 。executor 函数在Promise构造函数执行时同步执行,被传递resolve和reject函数(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promi
js:找出字符串中重复数量最多的字母
1 2
js生成随机字符串以及任意范围的数字
代码细节 库 另外,我是用 TypeScript 写了兼容浏览器端和服务器端的随机数获取库,直接使用npm i -S random.ts 安装即可,如下是使用方法。
js巧用乘法进行小数处理和Unicode字符串快速转换成中文
小技巧:Unicode字符串快速转换成中文 补充内容: 每个字符在JavaScript内部都是以16位(即2个字节)的UTF-16格式储存。也就是说,JavaScript的单位字符长度固定为16位长度,即2个字节。 但是,UTF-16有两种长度:对于U+0000到U+FFFF之间的字符,长度为16位(即2个字节);对于
给 Array.prototype.reduce() 加一个初始值
Array.prototype.reduce() 方法很简单,直接加一个回调函数即可。 再进阶一点,callback 可以传入 4 个参数 - Accumulator (acc) (累计器) - Current Value (cur) (当前值) - Current Index (idx) (当前索引,可选) - So
推荐使用yarn包管理工具替代npm
yarn确实很快!使用流程上特别爽!下载安装 yarnpkg,并进行国内镜像配置 另外,yarn 还可以直接添加远程 git 的包!这个NPM是不支持的,已经不再维护的 Bower 也是支持的。 常用命令 添加依赖包 升级依赖包 移除依赖包 安装项目的全部依赖 yarn bin yarn bin 将打印 yarn 将把
理解 JS 作用域和 this
答案:1。定义变量如果不使用 var 则变量为为全局作用域。当然严格模式是禁止这样做的。 当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。 这里的变量a进行了提升,先定义(!把定义提升!)后(!在其
Linux下解决修改文件权限引起的Git记录文件变化问题
git默认会跟踪web文件夹的权限修改,当我们使用chmod指令的时候,git也会把被修改权限的文件添加到被修改的状态。 因为 laravel 部署在生产环境中的时候,需要对 storage 目录进行赋权,不过正是因为如此,当我们运行 git status 的时候会莫名的把 storage 目录所有的 .gitigno
使用certbot免费升级到https
使用certbot免费升级到https 环境为 Ubuntu Server 16.04 和 Nginx,具体可参考官网,letsencrypt是certbot以前的名称,github的地址也重定向到certbot了。 Certbot, previously the Let's Encrypt Client, is EF
19 个 JavaScript 常用的简写技术
1.三元操作符 当想写if...else语句时,使用三元操作符来代替。 简写: 也可以嵌套if语句: 2.短路求值简写方式 当给一个变量分配另一个值时,想确定源始值不是null,undefined或空值。可以写撰写一个多重条件的if语句。 或者可以使用短路求值方法: 上面代码的||表示“或运算”,即如果 variabl
JS中非严格比较操作符的类型转换逻辑
在 JavaScript 中有六种数据会自动转化为布尔型 在ECMA规范中非严格操作符(==)是会强制类型转换的,这点和上面的六种转换逻辑还不一样,也就是说当遇到非严格操作符的时候,undefined不会转化为false然后再与后面对比。 规范有点绕,其实特别简单—— 如果要比较 x==y,有下面这几种情况 如果 x
使用公私钥登录远程服务器
使用公私钥登录远程服务器 本机生成公私钥 拷贝公钥到远程服务器 修改远程服务器SSH配置文件 注意:AuthorsizedKeysFile ~/.ssh/authorizedkeys,如果存在多用户,最好使用绝对路径,因为如果修改文件的是当前环境是root用户,~代表/home/root,否则不同的用户会存在不用密钥也
在Git中仅仅改变文件名称的大小写不被追踪的解决方式
在对文件命名大小写不敏感的文件系统中,如果你改了文件名(只是大小写变化),Git 默认模式是识别不了这种变化的,自然就无法提交,那该怎么做呢?有不少方法,看看 StackOverflow 的讨论。当然绕过这个问题的办法是约定所有的文件名小写。 git mv -f OldFile oldfile
初始化 Ubuntu Server 清单
说明 学习Linux最好的方式就是使用发行版的操作系统,Ubuntu是我第一个接触的系统,当然也是广泛被推荐给新手学习的第一个操作系统。 下载安装 百度搜索下载即可,windows下我们需要先安装虚拟机,我用的VMware 12,这个挺好用的,中文界面,功能强大,不过不好的地方就是需要花钱。不过有些事情你懂的。Ubun
LNMP环境搭建最佳实践
laravel+LNMP配置最佳实践 更新软件源 sudo apt-get update 解决语言问题冲突 安装所有依赖 sudo apt install git vim php7.1-mysql php7.1-fpm php7.1-curl php7.1-xml php7.1-mcrypt php7.1-json p
修改Ubuntu的时区
安装了Ubuntu Server之后,默认的英文环境下时区是国外的,所以使用Git等操作的时候,记录的时间会有些错乱,我们可以简单的使用命令行来修改时区。 sudo dpkg-reconfigure tzdata 然后我们依次选择 Asia-China-Beijing就可以了!
在Ubuntu上安装 Nodejs 以及配置 NPM
编译安装nodejs最新版本 从 nodejs 官网下载最新源代码 choose the newest Node,copy the url,and run like this: wget https://nodejs.org/dist/v7.8.0/node-v7.8.0.tar.gz. 安装依赖以及编译 1. sud
Ubuntu中怎样添加或删除一个PPA源
PPA源 Personal Package Archives(个人软件包档案)是Ubuntu Launchpad网站提供的一项服务,允许个人用户上传软件源代码,通过Launchpad进行编译并发布为2进制软件包,作为apt/新立得源供其他用户下载和更新。在Launchpad网站上的每一个用户和团队都可以拥有一个或多个P
安装使用Gitlab进行内部代码管理
在这里选择你的系统,按照提示安装。 下面以Ubuntu 16.04 LTS版本为例,以后会补充使用docker来管理 gitlab。 安装依赖包 sudo apt-get install curl openssh-server ca-certificates postfix 添加gitlab源 curl -sS htt
Docker+Nodejs实践
依赖 1. Docker 2. Nodejs 步骤 1 新建一个项目,安装 express 包。 然后新建一个 index.js ,一个简单的服务器环境就搭好了。 我们运行 node index.js 打开浏览器 localhost:3000 就能看到 Hello,Docker 的提示,现在退出。 2 保证安装 doc
Go: 一个 JSON 切分成两个对象
MySQL 默认忽略内联外键定义的坑
创建一个省份表 然后 User 表中的 province 字段关联省份表的 pid 字段 这一步没有报错。 但是查看 users 表中的所有索引时 只有 uid 主键的索引定义! 这十分奇怪啊,然后我又查找了标准 SQL 语法,我这里的定义并没有错误。 之后我尝试了不使用内联的方式,然后就成功了! 然后找了 MySQL
[翻译] Go switch 关键字
Switch 规范: https://golang.org/ref/specSwitchstatements Spec: https://golang.org/ref/specSwitchstatements Golang 的 switch 关键字十分灵活,比如说,你不需要像 C++、Java 等需要明确 break
给 localhost 签发 https 证书
本文介绍一个可以给 localhost 签发 https 证书的工具 mkcert,而且使用特别简单。 工具下载地址: https://github.com/FiloSottile/mkcert/releases/latest 或者工具包管理工具: 然后两步就可以生成 localhost 证书 这样就可以给 local
solidity v0.5.0 主要破坏性更新示例
强制显式声明函数可见性 默认可见性声明被废弃,所有的函数和构造函数不再隐式声明 public,必须手动加上 public。而 fallback 和接口函数需要强制加上 external。 强制显式指定复合型数据类型位置 结构体、数组、映射等复合型数据需要指定数据位置,包括函数参数和返回值。另外 external 函数中
Go: 判断空字符串的性能比较
字符串在 Go 内部中是一个结构体,一个字段记录长度,一个字段记录指针位置。 判断字符串为空最常见的是 data == "" 这样,之前我认为这里分配了一个空字符串会占用分配的时间,所以我把一些判断都改成了 len(data) == 0 这样就不用分配一个空字符串的空间了,效率应该会提升。 但最近我在 Go 源码中看到
await 技巧
不要在同步函数使用 await async/await 可以接受同步函数,相当于 await Promise.resolve ,今天在个异步流程中发现一个同步函数使用了 await ,结果上没什么区别,但是会有性能损失。 性能对比: 不要使用 return await fn() 最近评审代码发现 return awai
Go: 声明即初始化
因为分离编译的原因,在 C++ 中声明和定义是不同的概念。在其它语言中,定义和声明几乎没有区别。 C++ 默认初始化的规则是在函数外定义的变量拥有初始值,而在函数内部没有。c++ 就是这么多规矩。如果不注意的话就会运行时错误。 在 JavaScript 因为动态类型的原因并不能默认初始化,所有变量未赋值则为 undef
go generate 预处理器教程
通常编译 protobuf 会使用 protoc 手动编译,更好一点可以写一个 Makefile 指令来做。 不过在 Go 中提供一种在源文件定义类似 Makefile 指令 generate。当运行 go generate 后,编译器会找到所有包含 //go:generate command argument...
redis 安装清单
redis 推荐使用在 linux 下安装。 下载编译 打开 https://redis.io/download 选择稳定版本下载,按照下列方式进行编译安装。 最后使用 which 命令就可以看到 redis-cli 被安装到 /usr/local/bin/redis-cli 使用配置文件启动 创建一个 redis/6
Node.js 常见错误解决方式
Unexpected end of JSON input while parsing near npm install 出现 ”Unexpected end of JSON input while parsing near” 的错误。 运行 npm cache clean --force 国内网络慢?node-sass
比特币中交易延展性问题
交易延展性 (Transaction Malleability) 当交易被签名时,签名并没有覆盖交易中所有的数据 (比如位于 txin 中的 scriptSig,由于 scriptSig 中包含公钥和签名数据,不可能对自身自签名),而交易中所有的数据又会被用来生成交易的哈希值来作为该交易的唯一标示。如此,尽管不常见的,
node.js 中的 process.env 遇到的坑
有这么一段代码,是否会有打印输出 “hello,world” ? 答案是会。 因为 process.env 给任何属性赋值都会先转化为字符串,而字符串在强制转化成布尔值是 true,所以回打印输出。 来自官方文档,值得注意的是,以后不可以再给process.env的属性赋值为非字符串类型,否则会再将来的版本中报错。 A
BitcoinCore 安装清单
ITerm2 技巧
ITerm2 设置 option 键为 Alt 键 保持 SSH 连接不自动断开 使用 ITerm2 经常遇到 SSH 服务自动休眠断开,提示下面的信息。 修改自动断开可以修改配置配置即可。 这里的发送一个 ASCII 码,可以使用 127,也就是发送一个 del 删除键,这样不会影响当前命令行。
理解ES6中的字符串和数值解构赋值
ES6 允许从数组和对象中提取值,然后对变量进行赋值,这种“模式匹配”被称为解构。 当等号右边不是数组或者对象,类如字符串、数值、布尔值会被转换成了一个类似数组的对象,这些对象都有一个length属性,因此还可以对这个属性解构赋值。 上面的字符串hello会先转化为new String('he')包装对象,所以会有le
AngularJS Git 提交信息规范
目标 - 允许通过脚本自动生成变更日志 - 允许通过命令过滤某些提交信息(例如不重要的格式变动信息) - 提供更多的历史记录信息 快速生成变更日志 我们在变更日志中使用这三个部分:新特性、问题修复(bug fix)、不兼容变更(breaking change)。 这些列表可以在发布更新的时候通过脚本生成,并链接到相关的
说说 XSRF 防范
这是我在知乎的一个回答。原提问是如何在单页应用下进行 XSRF 防护。 XSRF(CSRF) 攻击的原理是什么?就是攻击者能猜测出所有的需要提交的内容以及类型,所以所有的解决方案共同出发点就是加一个攻击者也不知道随机值发送给后端验证就可以防范。 有很多解决方案,cookie-session,很不友好的所有表单都得填写验
理解 JS 中的装饰器
本文为 JS 装饰器旧版,待更新 --- 什么是装饰器?曾经看过一个说明比较好的比喻,秋天的时候穿秋裤可以保暖,一旦变冷了我们再穿上毛裤,穿毛裤不影响我们穿秋裤,这里的毛裤就是装饰器。 在JS中,装饰器可以为对象属性添加添加新的配置,而不会影响原有对象的基本功能,这个其实是语法糖。 举个简单的例子就是 这里的装饰器函数
使用 Docker 安装 gitlab
以前在 8 中留了一个坑,用 Docker 来安装 gitlab-ce,今天正好想起来。 用 Docker 安装因为国内镜像的原因会更快,而且就一条命令就解决了,在官方文档上详细说明了如何使用 docker 安装 gitlab。 首先查看 GitlabCE Dockerfile 里面有端口和数据卷的说明,如下所示。 另
在 Ubuntu 上安装 Docker
建议把Docker安装在linux系统上学习使用,如果使用 Windows 可以使用虚拟机安装 Ubuntu 进行学习。 补充一点,如果在windows上安装,官方推荐使用 windows 10 专业版,因为这个版本才包含Hyper-V的虚拟化服务,能让docker具有像linux一样的底层兼容性,如果没有使用这个版本
函数节流与函数防抖
什么是函数节流与函数防抖 举个栗子,我们知道目前的一种说法是当 1 秒内连续播放 24 张以上的图片时,在人眼的视觉中就会形成一个连贯的动画,所以在电影的播放(以前是,现在不知道)中基本是以每秒 24 张的速度播放的,为什么不 100 张或更多是因为 24 张就可以满足人类视觉需求的时候,100 张就会显得很浪费资源。
ES5中数组函数对空位的处理
数组的空位指,数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位。 上面代码中,Array(3)返回一个具有3个空位的数组。 注意,空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。 上面代码说明,第一个数组的0号位置是有值的,
在git中新建一个空白分支
当我们有一个有一个完全重构的新版本要开始的时候,比如第一版本用的 Angular,第二版选择 React,我们需要在我们的项目工程新建一个完全空白的分支,也就是说新分支完全没有任何 commit 记录,但是会保留所有文件。 以我的一个 gulp-stater 项目为例,现在只有一个 master 分支,也有很多提交,现
Debian APT Nginx 各个版本的区别
使用用 ubuntu 安装 nginx 很简单,直接就两条命令。 然后就会显示如下所示的内容: 可以看到这里除了几个必要库依赖包(lib),还需要安装 nginx nginx-common nginx-core,那么这三个文件都有什么区别? 简单的使用 apt show package-name 就可以了解包的描述。
Linux sed 和 find 命令清单
sed 之前在使用 sed 就只在 ubuntu 上替换 apt 源用过。 一直还没记住,容易输错,结果经常就把 sources.list 文件破坏掉了 😓。 sed 是流编辑器,读取一个文件,按照命令每次只处理一行。具体命令如下所示: option 就是上述命令的 -i 部分,这个是修改源文件。处理行为默认是只输出
nginx user 模块详解
nginx 运行后可以指定用户,比如说一个静态网页服务器的文件目录的不同的用户有不同的访问权限,使用 nginx 指定用户就可以有权限对此目录读写。 我其实很好奇怎么直接指定用户的,而且运行nginx的时候也没有需要输入密码之类旳。 在网上查找资料后有以下发现: Nginx 主进程(master process)会以
VSCode代码风格自动校验和格式化清单
vscode 提供了很多优秀的插件,对于代码风格校验和代码格式化,我最常用的是 eslint 和 prettier,eslint 自不必说,第二个是代码格式化插件,不仅可以对 js html css 格式化,还可以对 sass 以及 json 等进行格式化。 当然格式化的标准编辑器不太同意,比如函数表达式中函数名后面带
密码强度校验:先行断言正则与通用库
在用户注册业务场景中,一般而言的用户密码强度:密码至少8个字符,包括1个大写字母,1个小写字母和1个数字或特殊字符。本文原本转载来自css88的一篇整理,但是其内容只是简单说明了几种验证密码强度正则的写法,比如说 /^(?=.\d)(?=.[a-zA-Z]).{6,20}$/ ,这里用了「先行断言」,之前自己对此理解不
Ubuntu新建用户并赋予权限清单
通常新建用户会遇到很多问题,比如 shell 不支持 tab 提示,下述流程解决了常见新建用户出现的问题。 新建用户 首先在建立一个用户家目录,一般建立在 /home 下,目录名一般直接使用用户名。接着使用 useradd 命令继续,命令结构如下。 useradd -d HOME-DIR -s /bin/bash -c
bash 键盘高级操作技巧
移动光标 按键 | 行为 -- | -- Ctrl-a | 移动光标到行首。 Ctrl-e | 移动光标到行尾。 Ctrl-f | 光标前移一个字符;和右箭头作用一样。 Ctrl-b | 光标后移一个字符;和左箭头作用一样。 Alt-f | 光标前移一个字(word\单词)。 Alt-b | 光标后移一个字(word\
VSCode一些技巧和快捷键
VSCode 一些技巧和快捷键 如何让 VSCode 打开文件始终在新标签页打开? VSCode 有一个默认设定,单击一个右侧侧边栏的文件是预览模式,如果不输入任何任何文本就始终保持预览模式。 预览模式是的打开一个新文件,然后再打开一个新文件,第二个就会占用第一个窗口。详细信息可以查看:https://code.vis
用 JS 和 Go 来实现中英文简单排版
业界最为标准的中英文排版格式,中文和英文之间加空格,中文和数字之间加空格。现在微信(安卓 6.6.2 测试版)已经支持。 原理其实这个很简单,就是匹配相连接的中文和英文(包括数字),然后在中间加一个空格即可。接下来用 JS 和 Golang 实现。需要注意的是已经符合排版的就不需要加空格了。 匹配中文是用的 [\u4e
十行代码将 Nodejs fs 模块转换无回调(promisify)形式
promisify 是指将 Node.js 回调风格的函数转化为 Promise 形式,这样就可以使用 then().catch() 的方式避免回调地狱。 那么什么 Node.js 回调风格呢?简单讲就是回调函数参数中的第一个参数必须是 error,其余是必要的参数。 举个例子。 fs.open(path, flags
Go语言结构体和JSON序列化
一个结构体( struct )就是一个字段的集合,而 type 的含义跟其字面意思相符。这有点类似 JS 中的对象。 匿名字段 匿名字段类似下面这种方式 如果变量中的 Student 也有 Human 中的 name 字段,Go 不会重写而是优先最外层访问。s.Human.name 就是访问 Human 内的,s.na
为什么 git pull 会修改文件权限和所属用户以及用户组?
问题过程 首先 git clone 之后进行改变用户组 然后使用 git pull 更新本地仓库,这里明显发现已经发生了变化。 注意:git pull = git fetch + git merge 下面会更多用 git merge 说明。 当然如果修改了权限,git pull 之后也会变成默认权限(根据 umask
Go 语言延迟调用和错误处理
Go 支持使用关键字 defer 创建函数内延迟语句(进栈),当函数在 return 之前,这些 defer 语句会按照先进后出执行(出栈)。 如下所示,在 test 函数 return 之前所有进入 defer 栈的语句都会先执行。 需要注意的是,编译器在到达 defer 语句的时候要进行确认参数值以及类型,分配堆栈
不常见的 NPM 包管理技巧
除了使用 npmjs.com 这个集中包托管网站,npm 还可以使用 Git 和本地包来安装。 和正常的 npm install package-name 语法一样,只不过下面的 package-name 全部换成了 url。 使用 Git 包 官方在文档里定义的 url 的格式是 ://[ [: ]@] [: ][:
JS BigInt 尝鲜
JavaScript 所有数字内部都是 float64 类型,所以数值的精度最多只能到 53 个二进制位,大于这个范围的整数是无法精确表示的。 在很多金融场景如果使用 JS 的话就得使用一些 BigNumber 库。其中以太坊 web3.js 使用的是最为流行的是 bignumber.js,并且包含 .d.ts 类型提
TypeScript 导入 JSON Module
这是我在知乎问题 Typescript有什么冷门但是很好用的特性? 的回答。 Node.js 模块是允许直接导入 JSON 文件的,但是 ES Module 现在还不支持,TS 在 2.9 (18年5月17日还未发布)之前也不支持。日常中使用 JSON 最多的场景就是 配置文件了,如果要使用的话需要使用下面一些 tri