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": "Make RSS Great Again!", "main": "index.js", "scripts": { "start": "node index.js", "docs:dev": "vuepress dev docs", "docs:build": "vuepress build docs", "format": "prettier \"**/*.{js,json,md}\" --write", "lint": "eslint \"**/*.js\" && prettier-check \"**/*.{js,json,md}\"" }, "repository": { "type": "git", "url": "git+https://github.com/DIYgod/RSSHub.git" }, "keywords": [ "RSS" ], "gitHooks": { "pre-commit": "npm run lint" }, "author": "DIYgod", "license": "MIT", "bugs": { "url": "https://github. »

Author image 月杪 on #Linux,

用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"; # 必须有basic验证的描述,否则并不会弹出要求验证窗口 auth_basic_user_file /etc/nginx/conf.d/passwd; 重载后再次打开页面,就会看到提醒验证的弹窗了. 美化 经过上面的配置已经基本可用了,不过默认的index界面确实不太美观. 于是找到了Nginx-Fancyindex-Theme这个美化模板,配置好以后的样子大概是这样: 稍微好看了一丢丢. 下载 在页面可以直接得到下载链接,不过脱离了浏览器直接下载的话会出现验证失败的错误信息,比如: curl https://drive.moonagic.com/moonagic.com_ecc.zip -o moonagic.com_ecc.zip <html> <head><title>401 Authorization Required</title></head> <body bgcolor="white"> <center><h1>401 Authorization Required</h1></center> <hr><center>nginx/1.15.2</center> </body> </html> wget https://drive.moonagic.com/moonagic.com_ecc.zip --2018-08-06 21:33:48-- https://drive.moonagic.com/moonagic.com_ecc.zip Resolving drive.moonagic.com (drive.moonagic.com)... 104.199.220.164 Connecting to drive.moonagic.com (drive.moonagic.com)|104.199.220.164|:443... connected. HTTP request sent, awaiting response. »

Author image 月杪 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 example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --renew # 续签ecc acme.sh --issue -d example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --renew --ecc # 签发384位密钥的ecc证书 acme.sh --issue -d example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --keylength ec-384 # 签发泛域名证书 acme.sh --issue -d example.com -d '*.exmaple.com' --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --keylength ec-384 第一次执行的时候会提示你需要设定的TXT记录,设定好以后再次执行就可以获取到证书了. »

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 system reboot), you discover that your changes to /etc/resolv.conf have been reverted. This tutorial shows three methods to stop DHCP from changing the /etc/resolv.conf on Debian or Ubuntu. Method 1: Change interface settings to static On a cloud vps, I do not suggest using this method. »

Author image 月杪 on #Linux,

Google的新TCP拥塞算法BBR

更新:Debian9都发布好久了,用Debian9吧 不需要折腾内核就能直接开启BBR 上个月网友发现Google在GitHub上的项目Google/BBR. 前几天发现在几个Linux发行版中的候选版内核已经实装,而里面刚好也有Debian. 在看了Telegram群组里的说明后自己试着新开一台机器用上了BBR. 对比测试后发现提升确实非常大,gce美西在试用默认算法的情况下重庆电信HTTP下载大概在100~200K/s左右,而切换到BBR以后HTTP下载速率可以达到3000~4000K/s. Debian系统具体步骤: 添加experimental源 deb http://httpredir.debian.org/debian experimental main 安装新内核 ==目前最新4.9内核预选版为rc8== apt -t experimental install linux-image-4.9.0-rc8-amd64-unsigned ==目前的版本== apt -t experimental install linux-image-4.9.0-trunk-amd64-unsigned ==进入unstable源== deb http://httpredir.debian.org/debian unstable main 添加源后可通过apt-cache search [packagename]搜索对应包,比如你想要搜索内核的话: #apt-cache search linux-image linux-headers-3.16.0-4-amd64 - Header files for Linux 3.16.0-4-amd64 linux-image-3.16.0-4-amd64 - Linux 3.16 for 64-bit PCs linux-image-3.16.0-4-amd64-dbg - Debugging symbols for Linux 3.16.0-4-amd64 linux-image-amd64 - Linux for 64-bit PCs (meta-package) linux-image-amd64-dbg - Debugging symbols for Linux amd64 configuration (meta-package) linux-headers-4. »

Author image 月杪 on #Linux,

Setup LetsEncrypt on Debian

Install LetsEncrypt Client git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt Obtain a Certificate Inside the nginx config, add this location block: location ~ /\.well-known/acme-challenge { root /var/www/html; } Reload Nginx: systemctl reload nginx Generate Certificate: cd /opt/letsencrypt ./letsencrypt-auto certonly -a webroot \ --webroot-path=/var/www/html \ -d example.com \ -d www.example.com »

为Linux手动添加swap空间

GCE建立的实例默认是没有swap的,所以如果需要swap的话就必须自己添加. 以下的操作都需要root权限 首先先建立一个分区 dd if=/dev/zero of=/var/swap bs=1024 count=1024000 这样就会创建/var/swap这么一个分区文件. 把这个分区变成swap分区。 mkswap /var/swap 使用这个swap分区。使其成为有效状态。 swapon /var/swap ==如果需要取消的话== swapoff /var/swap rm /var/swap 现在查看一下 → free -h total used free shared buff/cache available Mem: 592M 87M 48M 3.2M 456M 409M Swap: 999M 0B 999M 显示已经有swap了,但是如果重启以后会重置,还是需要手动启动.解决方案是修改/etc/fstab文件,增加如下一行 /var/swap swap swap defaults 0 0 搞定. »

Author image 月杪 on #Linux,