YAML,比JSON更适合作配置文件

很多项目使用JSON作为配置文件,最明显的例子就是npm和yarn使用的package.json文件.当然这更多的是因为JSON和JS千丝万缕的关系. 但是,JSON实际上是一种非常糟糕的配置语言.别误会我的意思,我其实是喜欢JSON的.它是一种相对灵活的文本格式,对于机器和人类来说都很容易阅读,而且是一种非常好的数据交换和存储格式.但作为一种配置语言,它有它的不足. JSON的问题 缺乏注释 注释对于配置语言而言绝对是一个重要的功能.注释可用于标注不同的配置选项,解释为什么要配置成特定的值,更重要的是,在使用不同的配置进行测试和调试时需要临时注释掉部分配置.当然,如果只是把JSON当作是一种数据交换格式,那么就不需要用到注释. 我们可以通过一些方法给JSON添加注释.一种常见的方法是在对象中使用特殊的键作为注释,例如“//”或“__comment”.但是,这种语法的可读性不高,并且为了在单个对象中包含多个注释,需要为每个注释使用唯一的键.David Crockford(JSON的发明者)建议使用预处理器来删除注释.如果你的应用程序需要使用JSON作为配置,那么完全没问题,不过这确实带来了一些额外的工作量. 一些JSON库允许将注释作为输入.例如,Ruby的JSON模块和启用了JsonParser.Feature.ALLOW_COMMENTS功能的Java Jackson库可以处理JavaScript风格的注释.但是,这不是标准的方式,而且很多编辑器无法正确处理JSON文件中的注释,这让编辑它们变得更加困难. 过于严格 JSON规范非常严格,这也是为什么实现JSON解析器会这么简单,但在我看来,它还会影响可读性,并且在较小程度上会影响可写性. 低信噪比 与其他配置语言相比,JSON显得非常嘈杂.JSON的很多标点符号对可读性毫无帮助,况且,对象中的键几乎都是标识符,所以键的引号其实是多余的. 此外,JSON需要使用花括号将整个文档包围起来,所以JSON是JavaScript的子集,并在流中发送多个对象时用于界定不同的对象.但是,对于配置文件来说,最外面的大括号其实没有任何用处.在配置文件中,键值对之间的逗号也是没有必要的.通常情况下,每行只有一个键值对,所以使用换行作为分隔符更有意义. 说到逗号,JSON居然不允许在结尾出现逗号.如果你需要在每个键值对之后使用逗号,那么至少应该接受结尾的逗号,因为有了结尾的逗号,在添加新条目时会更容易,而且在进行commit diff时也更清晰. 长字符串 JSON作为配置格式的另一个问题是,它不支持多行字符串.如果你想在字符串中换行,必须使用“\n”进行转义,更糟糕的是,如果你想要一个字符串在文件中另起一行显示,那就彻底没办法了.如果你的配置项里没有很长的字符串,那就不是问题.但是,如果你的配置项里包括了长字符串,例如项目描述或GPG密钥,你可能不希望只是使用“\n”来转义而不是使用真实的换行符. 数字 此外,在某些情况下,JSON对数字的定义可能会有问题.JSON规范中将数字定义成使用十进制表示的任意精度有限浮点数.对于大多数应用程序来说,这没有问题.但是,如果你需要使用十六进制表示法或表示无穷大或NaN等值时,那么TOML或YAML将能够更好地处理它们. { "name": "rsshub", "version": "0.0.1", "description": »

月杪 月杪 on Dev

用Nginx和rclone做Google Drive下载页

在写了在Linux上使用rclone挂载Google Drive等服务以后偶然想到能挂载Google Drive等一众网盘以后还能催生出很多玩法,其中一种就是与Nginx等Web server结合起来,做一个方便的下载页面. 准备 要实现下载页主要用到Nginx以及Nginx提供的一些功能. 其中包括自动检索,身份验证等. 配置 默认的情况下Nginx索引到目录会直接返回403,这个时候需要的只是开启autoindex autoindex on; 重载后就可以成功开启autoindex模式了 成功开启后还需要配置身份验证,不然只要知道地址谁可以随意下载网盘中的文件了. Nginx给我们提供了很简单的方式basic auth,配置方法: printf "user:$(openssl passwd -crypt passwd)\n" >> /etc/nginx/conf.d/passwd 其中user代表你的帐号,passwd代表你的密码,/etc/nginx/conf.d/passwd是生成好的验证文件. 然后在Nginx的配置文件相应位置加入 auth_basic "Authorized"; »

月杪 月杪 on Linux

用acme.sh签发Let's Encrypt证书

这几天用certbot签发Let's Encrypt证书的时候发现了各种问题, 有Python版本问题以及pip源问题. 反正就是各种蠢 对我这样一个使用者来说Python制造的问题比它解决的问题还多 于是开始使用国人制作的shell工具acme.sh来签发, 这个工具安装使用很简单, 安装: curl https://get.acme.sh | sh 使用: # 使用手动dns验证 acme.sh --issue -d example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please # 续签 acme.sh --issue -d »

月杪 月杪 on Linux, SSL

Stop DHCP From Changing resolv.conf

For DHCP users, there may be times when you need to edit /etc/resolv.conf to use other nameservers. Then, after a period of time (or after a »

月杪 月杪 on Linux, VPS, DNS

在Linux上使用rclone挂载Google Drive等服务

rclone可以帮助我们在Linux上挂载一些储存服务,包括Google drive, onedrive, box, AWS S3等等.同时不会占用硬盘空间 安装依赖 apt-get install fuse 下载 wget https://downloads.rclone.org/v1.41/rclone-v1.41-linux-amd64.zip 截止目前最新版为1.41,在 https://downloads.rclone.org/ 可以看到历史版本. 下载解压后里面的可执行文件rclone就是我们需要的,可以直接在当前目录使用也可以将其拷贝到/usr/local/bin. 配置 ./rclone config # 当前目录下执行 rclone config # 系统目录下执行 »

Github被微软收购

Congratulations to GitHub on their acquisition by Microsoft! This is validation of the growing influence of software developers in the world, and the importance of modern »

月杪 月杪 on Other

GDPR到底是什么

最近几天至少收到几十个服务的有关隐私协议的邮件(如果你没收到甚至没听说过GDPR,说明你基本不使用这个星球上的主流网络服务) 那么这个GDPR到底是什么呢? GDPR介绍 GDPR是欧盟于2018年5月25日正式开始实行的<一般数据保护条例> 该条例是近三十年来数据保护立法的最大变动,旨在加强对欧盟境内居民的个人数据和隐私保护.此外,它还将通过统一数据和隐私条例来简化对跨国企业的监管框架.它将取代1995年颁布的<数据保护指令> 1995年的<数据保护指令>95/46/EC是欧盟版的隐私保护条例.其主要目标包括协调数据保护立法,以及规范将个人数据转移到欧盟以外的“第三国”的情形.除了其它一系列措施,各个盟国还各自成立独立的公共机构,监督该指令的实施,并作为与企业和公民互动的监管机构.整体而言,该指令符合经济合作与发展协会(OECD)的最初建议以及隐私权是基本人权的核心概念. 虽然<数据保护指令>旨在团结不同盟国的立法,但这只是一项指令,当置换到各国独立的法律时仍有一定的解释空间.加上当今数据格局的快速变化,尤其是Facebook LinkedIn等社交平台以及云技术的兴起,势必要升级欧盟地区的监管环境.即将到来的GDPR是一项更大的立法,并且在各个成员国即刻可执行. 条例 vs. 指令 这项变化的一个重要特征就是欧盟GDPR是一项条例取代原有的指令.条例直接适用于欧盟各成员国,而对于指令,各成员国有权酌情决定数据保护法的实施.因而,除了严格的数据和隐私保护,条例的实施还将通过在欧盟地区统一数据和隐私法规而简化监管框架.对于跨国企业来说,这将帮助他们在与多个数据和隐私保护机构沟通时消除当地法律之间的不一致性,从而降低行政成本和负担. 处罚力度加大 GDPR将继续通过监管机构和法院执行,除了民事补救还有刑事和行政处罚.然而,根据国际隐私专业人士协会的数据,GDPR加大了行政处罚的力度,根据案情情况最高可罚款两千万欧元,或公司年营业额的4%. 新扩大的管辖权将影响在欧盟地区开展业务的中国企业 该条例的一个重要特征是新扩大的管辖权,可能会影响到欧盟以外的企业.新条例适用于为欧盟境内的个人提供商品和服务,或监控个人行为(如商业网站或移动应用的运营商)的企业.这一规定将影响很多中国企业. GDPR规定同意书将仍是处理个人数据的一个要求,并为同意书设立了更严格的条件.EUDataProtectionLaw.com指出,对这些条件的定义是“数据主体通过申明或一个清晰的肯定动作,在知情的情况下自主 具体而明确地表明自己的意愿,即表示他们同意个人相关数据被处理.” 规定新权利 欧盟GDPR还建立了两项新的个人隐私权,“删除权”和“移植权”.删除权是对“被遗忘权”的扩充,让个人有权要求删除其个人数据.而移植权则让个人可以更轻松地访问自己的数据.个人可以要求将其数据从一个供应商转移到另一个供应商.此类数据转移将为个人创造更多方便,而加大了供应商之间的竞争. 如何确保合规 GDPR不止适用于欧盟内的企业,还适用于欧盟以外的企业——如果他们为欧盟境内的数据主体提供商品或服务,或者监控其行为.GDPR也适用于处理或持有欧盟境内数据主体数据的企业,不论该企业位于何处. 很多企业之前并未遵循过欧盟数据和隐私法,因而很多细节(如范围 实施等)都不清楚.对于在欧盟境内运营的企业,或是向欧洲个人提供商品 服务或监控其行为的企业,您可以通过以下步骤提前为明年做准备. 根据现有资料深入解读GDPR »

用Golang重写Github webhook后台服务

起因 前段时间写过一篇利用Github的Webhook功能进行持续集成, 当时使用nodejs来写了webhook的后台服务. 那个程序已经稳定运行了一段时间,期间并没有出现大的问题. 但是毕竟是js的程序,空转状态就需要占用几十Mb的内存,就一个HTTP监听占用这么大确定不是开玩笑??? 另外一个问题就是该程序跑起来以后在Linux里会是一个node进程,这个时候如果你的服务器上同时运行了好几个由nodejs驱动的程序的话..你可以想到有多壮观 行动 于是决定用go来重新实现这个工具,基本是完全复刻旧的nodejs项目然后添加了配置文件功能. GoWebhook 服务重新跑起来了,内存占用大概只有nodejs项目的八分之一到十分之一. 并且后台也不会显示一个node进程了. 后记 现在看来脚本语言还是不是太适合做服务端开发,即使服务已经跑起来了还是会想用编译语言重新写一遍. 而且得益于语言层面完善的设计和更加现代化的通用库似乎Go的开发效率并不会比js低太多喔. »

月杪 月杪 on Github

for循环中的++i和i++有什么区别

i++和++i是C系语言的经典课题, 我们知道i++和++i的表面区别为++i的返回值为i+1,而i++则为i,而它们的底层实现分别为: ++i实现: int operator ++ () { return i+1; } i++实现: int operator ++ (int flag) { int j = i; i += 1; return »

月杪 月杪 on Code

我眼中程序员简历

为开源项目贡献过代码 +10 接触过3种以上编程语言 +10 有业余编程项目 +10 有持续维护的开源项目 +10 简历为PDF格式或独立HTML页面 +5 有独立域名的技术博客 +5 有自己的Github地址 +5 同时接触过编译语言和脚本语言 +5 只接触过一种编程语言 -5 屡次强调自己的Master/Doctor学历 -5 简历格式为docx -5 简历中提到熟悉Microsoft Office -5 Github中全是Markdown项目 »

月杪 月杪 on Other