menu neoFelhz's Planet
neoFelhz's Planet
Robert Yang
Publish: 2018 一月 17日 12:19:09 中午
Update: 2018 一月 17日 3:28:35 下午
选择一个评论系统
技术6 disqus valine 评论 

不要选择静态博客,直接用 WordPress 或者 Typecho 等动态博客的自带评论系统,完。之前想过,要是有 Hexo 转 Typecho 的轮子,我就换回去了,可惜没有。

实际上之前用 WordPress 的时候自带评论系统就挺好用的,后台面板、邮件通

mokeyjay
Publish: 2018 一月 16日 7:18:56 早上
学到一个适合装逼的新词——CVM开发模式(ctrl+c、ctrl+v、modify)
杂谈 
学到一个适合装逼的新词——CVM开发模式(ctrl+c、ctrl+v、modify)
milkice
Publish: 2018 一月 15日 2:37:19 下午
Kratos-M 原生Kratos主题优化版
Develop Tech WordPress Kratos 
Kratos 是一款免费开源的两栏结构并且拥有自适应效果的主题,她能够在任何浏览器下进行友好体验的访问。Kratos 秉持了专心写作专心阅读的特点,简单大方的主页构造并采用了2:1的完美比例,使得博客能在臃肿杂乱的环境中脱颖而出。Kratos 主题内置了强大的主题后台控制平台,可以轻松设置关键字及站点描述,自定义的顶部样式(背景图 or ……
Robert Yang
Publish: 2018 一月 8日 6:16:02 早上
Update: 2018 一月 11日 2:05:57 下午
动态范围 宽容度 RAW Log 都是什么
技术6 动态范围 宽容度 RAW Log 

写这个主要是因为昨天B站视频评论,里面有个人在自己也不懂“动态范围”“宽容度”的情况下强行给别人科普。他认为照片能拉回多少高光和暗部信息叫宽容度,而在视频中这个概念叫动态范围,在视频中使用 Log 模式拍摄能提高动态范围。

Ephen
Publish: 2017 七月 25日 11:15:09 上午
Update: 2018 一月 11日 12:57:26 下午
成功取得项目管理专业人士资格认证
心情驿站 项目 管理 

各位看官请注意:

此文章涉及本姑娘个人信息,文章公开代表逛到这里的人可以看,但并不代表我同意被传播。

DCC
Publish: 2018 一月 11日 3:11:00 凌晨
CNAME 接入 Cloudflare 使用免费 Railgun
CNAME 接入 Cloudflare为何选择 CNAME 接入 CloudflareCloudflare 是国外 CDN 厂商,提供免备案无限流量 CDN,免费的 HTTPS 证书和无限量的 ...
Zohar
Publish: 2018 一月 6日 5:20:00 下午
Typecho主题:Cactus
Cactus:一个简约的Typecho响应式主题。下载GitHub:ZoharWang/typecho-theme-Cactus(无耻求Star安装 下载压缩包并解压 修改文件夹名为Cactus...
Ice-Hazymoon
Publish: 2018 一月 5日 2:23:18 下午
GARNiDELiA 『Error』-「BEATLESS」OP
喵喵喵 

不解释, 日常安利~

Publish: 2018 一月 2日 4:34:30 下午
再见 2017, 你好 2018

新年和圣诞都过去了,随着圣诞节过去,这个博客也已经建立了1年,最近手边的事情太多没赶上年底写完总结,于是推迟到了现在,真是怠惰啊….

Publish: 2018 一月 1日 3:06:11 下午
再见 2017 ,你好 2018

时光飞逝,转眼间博主快18咯
这一年发生了许多许多
记性不好,这些能记住的都算印象深刻了吧。。。
这是我的第一篇“年终总结”


年初

刚开完一个令我印象深刻的联欢会,

为啥印象深刻呢?校级联欢,老师托我搞了个微信墙。。。Exciting

<-- 这行记录的事情被我隐藏了,知道这些事的人并不多。。 -->

就被主任托给各个会考科目的老师折腾会考去了。。。一个元旦折腾过去,会考过了。

入坑Ingress,成了北绿一个小小的特工。


寒假

参与了北京南站的志愿者活动,在一个小团体过得挺舒服,也看到了一些社会上的不良现象。


三月

上一届的高三成人礼,再次在后台干活。
急脾气该改改了,我坚持自己的方案,差点与某个没理解我思路的老师吵起来。。。
成人礼最后,想用奶油整一下某个学长,最后却被他按在地上抹了一脸[捂脸]

生日那天,明明送了我一组 USB充电的AA电池 ,之前一直念叨让学校买点试试,结果他先买了(似乎现在学校还没买。。。),现在一个在鼠标里,两个在包里备着,还有一个在家里吃灰。。。


四月

游学,去西安,各种折腾,晚上睡觉前要收手机,第一天交了一个,第二天年级组长看我在接近收手机时发了个朋友圈,于是断定我有俩手机,于是晚上交了俩(我带了四个哈哈哈)
<-- 感情问题。。。继续隐藏。。。 -->


接近夏天

和明明一起参加了个 机器人足球比赛 ,非常懵逼的干趴下好几队。。。在最后一轮输给了冠军。。。然后似乎全校老师都认识我和明明了。。。

放假前和明明帮学校弄视频,第一次用 AE 做动画(套模板)


暑假

刚放假就去石家庄“玩”,被老姐按在她屋里学了两周,回京继续被她按着学。。。

老妈收走了我的显示器。。于是我这个熊孩子找了个废笔记本屏幕组装了个显示器。。。


秋季开学

没啥好说的,学吧(我这重度电子依赖症终于能一整天离开手机了)
搬到 分校后基本没得玩了。。。
班里电脑 没有网,于是接了无线网卡,后来觉得无线网卡不好使又换了路由器。。。


年末

新年联欢,主任出差,设备靠自己,照样玩得挺High


其他事件等我想起来再加吧 。。。。


最后

希望自己在高考前少碰点电子设备吧。。。

mokeyjay
Publish: 2018 一月 1日 2:24:39 下午
各位,新年快乐~
杂谈 
各位,新年快乐~
METO
Publish: 2018 一月 1日 12:57:42 下午
以程序员的角度玩微信跳一跳

前些日子微信推出了一款小游戏「跳一跳」,游戏中玩家需要扮演一个「黑色」小人,在不同颜色、形状的跳板方块间进行跳跃。操作也很容易,按压屏幕越久,小人会跳得越远。

显然这游戏对我这样的手残党非常不友好

若干次徘徊在十位数后,决定好好研究这个游戏,用程序员的思路去解决它。

外挂无非两种:内存修改、物理辅助。这里研究后者,也就是识别出跳跃距离后,换算成时间后模拟真实触碰操作。这种方式最保险,而且不容易被后台察觉 XD

观察棋子,不难发现棋子的颜色始终是没有变化的,因此可以根据颜色识别出棋子中最宽的部分,取中心即可

棋盘部分比较难识别,忽略掉背景色后会有阴影等因素的干扰,还有前后两个棋子紧挨的特殊情况。

考虑从上到下做行扫描,提取出所有连续的颜色块,排除掉中心点与棋子过于靠近的情况,这样就避免识别到棋子头部,取最上面且长度大于棋子宽度的切片,就得到目标点横坐标。

对于纵坐标可以只考虑棋盘右侧,这样就不需要和阴影打交道。棋盘只有圆盘、方块两种类型,边缘的锯齿状如下

容易发现规律,方块的中心线位于边缘峰值处,圆盘的中心线在峰值处偏下。可以设定一个计数器,当边缘连续 4-5 次没有增加时停止,将此处确定为纵坐标。

有时候两个方块相邻会出现识别失败,

131
Publish: 2018 一月 1日 4:00:00 凌晨
再见 2017!你好 2018!
再见 2017!你好 2018!
liwanglin12
Publish: 2017 十二月 31日 4:00:20 下午
Bye 2017, Hi 2018
记录 

CE2018,LWL 的自由天空,雷达已识别,上升到高度层 1514736000。






- EOF -

Axton
Publish: 2017 十二月 31日 3:59:46 下午
点亮2018:无垠2017年度总结
其他 2017 2018 总结 新年 
随着 Telegram 换上了小红帽,2017也即将要过去。在2017年的最后一段时间,我终于开始写这篇拖了很久的总结。
Elepover
Publish: 2017 十二月 26日 6:55:58 早上
Arch 折腾记 - 安装 yaourt 以及搭建 TeamSpeak 3 服务器
这篇文章其实是一篇水文(关于 AUR 和 yaourtArchWiki 上已有详细介绍,在此不再赘述。官方仓库内的大量二进制软件包以及 AUR 中的其他软件包,使得 Arch 的既有软件包数量多...
METO
Publish: 2017 十二月 24日 6:31:40 早上
关于校园网HTTP劫持的分析
OpenWrt 

接上文 https://i-meto.com/shit-scutweb/

最近发现不少应用的联网异常,尤其是网易云音乐的播放时常请求失败,怀疑是垃圾校园网搞的鬼,于是做了一些分析。

通过抓包不难发现有不少类似 http://202.38.196.91/cache/5/05/music.126.net/9733b9************fa0d36a82/653**********bb10ec.mp3 的请求。通过查询 IP 发现这台服务器位于校内,开放了 80 端口,初步判断是一台缓存服务器。

使用 wireshark 进行抓包,得到更详细的请求过程

  • 18,19,20: TCP 三次握手
  • 21: GET 请求下载 QQ 安装包
  • 22: (抢答)
kookxiang
Publish: 2017 十二月 23日 6:00:32 晚上
I'm Still Alive

< 访问完整版以查看此播放器 >

mokeyjay
Publish: 2017 十二月 22日 2:53:58 凌晨
Win10的Ubuntu子系统运行npm命令报错的解决方案
Linux 技术 
转载自:https://github.com/Microsoft/WSL/issues/1512 I was having this issue when running zsh with oh-my-zsh inside the WSL. but changing the PATH helped. In my ~/.bashrc I have this script to automatical
Robert Yang
Publish: 2017 十二月 17日 7:55:42 早上
Update: 2017 十二月 17日 9:35:36 上午
延时摄影入门
不能无聊 延时摄影 LRTimelapse 

需要的软件: Premiere Pro、Lightroom Classic、LRTimelapse
需要的设备: 相机+三角架(有些机器需要快门线)

拍摄之前要知道想拍什么,找到有动态元素的位置,架好三角架,如果光线会变化可以使用A档测光,没有变化的话或

DCC
Publish: 2017 十二月 15日 8:37:00 早上
Bitextor 双语爬虫
配置 Bitextor 环境以下操作均在 Ubuntu 16.04 下完成,运行环境 Azure B2MS 型机器首先配置相关的环境(GCC & Python)apt-get update &a...
Ice-Hazymoon
Publish: 2017 十二月 11日 4:54:45 下午
博客一周年达成~
喵喵喵 

如果你看到了这句话说明博主已经忘记了这件事
才..才不是什么定时发布的文章呢!!

mokeyjay
Publish: 2017 十二月 11日 10:24:58 上午
TP5.1不继承控制器基类的情况下实例化视图
PHP 

手头的项目有个需求是在命令行下渲染模板并返回html源码,以便进一步处理 但是TP5.0里的 [crayon-5a60f02d9e73a615593386/] 在5.1里面被砍掉了,而且命令行下无法继承控制器基类。那要怎么办呢? 我通过阅读源码解决了这个问题,分享一下: [crayon-5a60f02d9e740036246203/]
mokeyjay
Publish: 2017 十二月 8日 5:16:48 下午
emmmmm…我的SMTP怎么被关闭了?难怪最近几个月邮件通知都怪怪的。现在重新打开了,应该正常了吧?因为邮件通知的问题吞了大家那么多评论真是十分抱歉
杂谈 
emmmmm...我的SMTP怎么被关闭了?难怪最近几个月邮件通知都怪怪的。现在重新打开了,应该正常了吧?因为邮件通知的问题吞了大家那么多评论真是十分抱歉
mokeyjay
Publish: 2017 十二月 8日 4:56:20 下午
强烈安利《寻梦环游记》,又一部被译名坑了的神片,年度最佳动画电影预定!
杂谈 
强烈安利《寻梦环游记》,又一部被译名坑了的神片,年度最佳动画电影预定!
Elepover
Publish: 2017 十二月 8日 1:47:00 下午
养成良好的代码习惯,及其重要性
初入程序猿的世界,多多少少感到有些新奇,迫不及待地想要自己搞个大新闻出来。但第二次打开的时候:卧槽,我都写了什么???我突然方了.jpg(以下内容均以 C# 作为演示语言,并主要针对开源项目)排...
PoiScript
Publish: 2017 十二月 7日 7:42:27 早上
2017 HTTPS 调查
https 

Contents

这篇文章改写自 poi 的计算机网络课论文。

前言

自 1991 年,第一个带有文档的 HTTP ── HTTP V0.9 问世以来,HTTP 协议得到了广泛的运用。

Cisco 统计,在 2016 年,全球的的网络流量达到了惊人的 1.2 ZB 流量,其中视频的流量就达到了 73%。而目前的视频传输协议中最常用的分别是 Apple 的 HLS(HTTP Live Stream) 和 Google 的 DASH(Dynamic Adaptive Streaming over HTTP),而两者都是基于 HTTP 的协议。

随着互联网的发展,网络通信中的安全性也得到了重视。在 1995 年,TLS 协议的前身 SSL 协议应运而生。而我们今天要讨论的就是在 SSL 诞生的 22 年之后,互联网上的 HTTPS 运用到达了什么程度。

总览

我收集了目前 Alexa 排名前 1,000 的网站,虽然数量不多但是都是无疑占据了互联网上大多数的流量,通过来一窥互联网当前 HTTPS 的普及程度。部分的数据来自于 ssllibs

实际上,我有 Alexa 前 1,000,000 的网站的名单。但是 ssllib 的 API 调用起来极其费时,对一个网站 ssl 配置的查询需要 2~3 分钟的时间,所以只能退而求其次。只考察前 1,000 个网站。

首先,在这 1,000 个网站中,目前有效的网站只有 981 个,其他的网站都无法成功解析其域名,可能是网站己经下线或者迁移到别的域名了,所以其是否支持 HTTPS 就不得而知了。

然后,在这 981 个网站中,支持 HTTPS 的恰好有 800 个,占比约有 81.5%。而在前 100 的网站中,只有 10 个网站不支持 HTTPS。

虽然这 800 个网站都支持 HTTPS 协议,但是他们在协议的实现上的不同也会产生安全性的差异。例如 RC4 加密曾经是 TLS 所采用的加密算法之一,但是在 2015 年遭到了破解,因此已经禁止在 TLS 中使用了。可目前仍然有网站使用 RC4 加密,甚至作为唯一的加密手段,那其 HTTPS 就形同虚设了。

TLS 版本

我统计了这 800 个网站所支持的最高的 TLS 协议的版本:

绝大多数的网站(98 %)的网站支持了 TLS 1.2 标准。比较遗憾的是,没有看到网站使用了最新的 TLS 1.3 标准,不过考虑到 TLS 1.3 还处在草案阶段,不使用也是合情合理的。 此外,我也发现了还有 37 个网站仍在使用已经被认为是不安全的 SSL 3.0。

TLS 握手

TLS 中最常见的握手方式两种:一种是基于 RSA 算法的;另外一种是基于 DH(Diffie-Hellman) 算法。RSA 算法历史悠久,兼容性好;DH 算法在加密速度上更有优势,而且拥有前向安全性。 TLS 握手的一个目的就是保证安全性。DH 握手可以使用除了 RSA 以外的证书来提高性能,例如 ECC。ECC 证书内置了 ECDSA 公钥,使用了 ECC(Elliptic curve cryptography)算法,它的密钥更短 ── 256 bit 的 ECC 算法强度和 3072 bit 的 RSA 算法安全性相当 ── 而加密速度更快。 在 800 个支持 HTTPS 的网站中,大多数的网站还是选择了传统的 RSA 证书,只有少量的网站(35 个)选择了 ECC 证书:

TLS 握手的另外一个目的就是可以验证网站的身份,即需要数字签名。目前主要的签名方式有两者,分别是 RSA 和 ECDSA(Elliptic Curve Digital Signature Algorithms)。 在这 800 个网站中,有 21 个网站使用了 ECDSA 签名:

从 HTTPS 到 HSTS

当一个网站部署了 HTTPS 后,当用户再发起 HTTP 请求时,应该主动将用户引导到更安全的 HTTPS。目前有两种方法引导:一是当用户发起 HTTP 请求时,直接将其重定向到 HTTPS;二是设置 HSTS 响应头。

在这 800 个网站中,当我们直接发起 HTTP 请求时,HTTP的状态码分布为:

我们知道在 HTTP 的状态码中,20X 的状态码表示资源已经找到;30X 表示重定向;40X 的状态码表示资源不存在;50X 表示服务器发生了错误;因此,我们的粗略的统计为 573 个网站会将用户重定向到安全的 HTTPS 页面。其余的不会。

和直接重定向到 HTTPS相比,HSTS 的方法要好得多:网站在 HTTP 应答头中加入 HSTS(Strict-Transport-Security)的信息。它指定了一个有效时间,在有效时间内,当浏览器下次访问该域名时将直接使用 HTTPS 协议访问。

上述两种办法都有一个缺陷:都需要先经过一次 HTTP 请求后,才能过渡到 HTTPS 请求。如果第一次的 HTTP 请求就遭到了劫持,那就无能为力了。所以,相比简单的设置 HSTS 应答头,加入 HSTS Preloading List 的意义更大。

HSTS Preloading List 的原理就是在浏览器中内置一张支持 HSTS 网站的列表,当用户访问当中的网站时,如果在有效期内的话,浏览器会直接使用 HTTPS 链接,不会再发起 HTTP 请求。

目前的 HSTS Preloading List 主要由 Chrome 维护,FirefoxIE/Edge 都在使用。截至 2017 年 11 月 30 号,Chrome 的 HSTS Preloading List 中一共有 41312 个域名。而在这 800 个支持 HTTPS 的域名中,有 124 个网站也在其中。

Chrome 的 HSTS Preloading List 支持申请,所以可以见这个列表来的域名将会越来越多,最后覆盖到我们常用的域名。

维护证书安全

HTTPS 链接中,另一个容易受到攻击的地方就是证书。证书是由 CA(证书颁发机构)颁布的,而受信任的 CA 多达上百个。我们先来看看这 800 个网站的证书是由哪些 CA 颁发的:

现有的证书信任链还有一个问题就是任意一个受信任的 CA 都可以给任意一个域名颁发证书。所以如果出现了中间证书甚至是根证书被盗签时,对于浏览器来说是无法分辨的。

一种解决办法就是在应答头中加入 HPKP (HTTP Public Key Pinning)信息:即将自己的证书指纹放在 HTTP 的应答头里,让浏览器记录这些信息。当浏览器下次访问时都会验证该指纹,如果指纹不对的话,即使证书合法,浏览器也会直接断开链接。

显然,HPKP 和 HSTS 一样也有 HTTP 被劫持的危险。所以也有相应的 HPKP Preloading List。但是和 HSTS Preloading List 不同,个人用户无法申请将自己的网站加入其中。所以目前的 HPKP Preloading List 的规模还比较小,而在这 800 个网站中也只有 2 个网站设置了 HPKP 的应答头。

此外, Chrome 提出了另外一种解决办法,那就是 Certificate Transparency:即将整个证书签名的过程透明化,任何证书持有者和 CA 都可以将自己证书的记录提交到相应的 Certificate Logs 服务器中,而这整个记录都是受到审计和监控的;浏览器在访问网站时就会对证书进行校验,进而做出不同的反应。

下面就是一个支持 Certificate Transparency 的页面的例子:

但是,Certificate Transparency 目前只有 Chrome 支持。而 Chrome 知道其利用率还太低,所以即使在 Certificate Logs 服务器中查不到相应的证书也不会有太大影响。

结论

从上面的分析我们可以得出:尽管大多数的网站都已经支持 HTTPS 协议了,但是实现还是参差不齐。而面对一些新型的攻击,例如首次 HTTP 协议遭到劫持,证书被盗签等问题准备得还是不够充分。

P.S.

很可惜,没有收集到所有 1,000,000 个域名的 HTTPS 信息,不过还是可以统计一下其他的信息。例如,域名的长度:

和顶级域名的分布:

Elepover
Publish: 2017 十二月 6日 5:53:48 凌晨
Arch 折腾记 - 为什么我选择 Arch
本文引用了大量源自 ArchWiki(含社区翻译的中文版)的内容,若有未标记或声明来源的引用内容,敬请提出。正如标题所指,本文较多为作者个人观点。态度态度决定未来,折腾也是如此。Study ha...
liwanglin12
Publish: 2017 十二月 3日 8:47:57 早上
[LWL的自由天空 年度简报] – 云起
网站 LWL 的自由天空 常务 年度简报 

2017 年,转瞬而过。 知世故而不世故,处江湖而远江湖。人情冷暖已看透,赤子之心永不丢。 这是自由天空的 2017 年年度简报,你好。
Robert Yang
Publish: 2017 十二月 2日 7:02:18 早上
Update: 2017 十二月 2日 3:00:00 下午
转移到 Let's Encrypt
技术6 证书 https Let’s Encrypt 

去年是用非正常手段签的免费 AlphaSSL 野卡,12月27号就过期。正好今天没事就用 Let’s Encrypt 替换原来的证书。我的博客问题在于部分资源是缓存到又拍云上面的,所以自己的服务器上要签一次证书,又拍云上要签一次。好在又拍云自己可以签发续签 Let’s En

Robert Yang
Publish: 2017 十二月 1日 3:42:11 下午
Update: 2017 十二月 2日 10:35:44 上午
你好,早晨
世界在这里 摄影 阳光 冬日 

我最近有点懒了,可能是早上太冷的缘故,不太想起床。周四好容易起来一回,发现太阳很给面子啊,索性拿相机出去拍几张。

使用 Chromium 系浏览器的时候,图床会自动返回压缩后的 WEBP 格式图片,我发现饱和度会下降,下载之后看就正常了。

131
Publish: 2017 十二月 2日 4:00:00 凌晨
中国大陆使用reCAPTCHA
很久以前就想用reCAPTCHA了,怎奈国内不存在这个服务(雾),只好用了Luosimao的人机验证前几天在洛谷上发现它可以正常使用reCAPTCHA,于是这周末就查了一下然后给自己的小站换上了...
Halyul
Publish: 2017 三月 22日 11:39:00 晚上
Update: 2017 十二月 2日 3:16:42 凌晨
失踪人口回归系列之增强站点SSL安全性
技术 教程 

失踪人口回归系列之第二篇

Halyul
Publish: 2017 三月 23日 1:14:00 凌晨
Update: 2017 十二月 2日 3:16:42 凌晨
解决Hexo MODULE NOT FOUND问题
杂 Hexo 

Hexo上最玄学的问题,没有之一

Halyul
Publish: 2017 六月 5日 9:07:00 晚上
Update: 2017 十二月 2日 3:16:42 凌晨
『转』真正的自由?——从杨舒平的演讲来谈中国和言论自由

原文地址: neoFelhz’s Blog

在前天,也就是那个特殊的日子的前一天晚上,我和几个同学彻夜长谈。我们谈了很多东西,我思绪万千,所以我决定写点东西出来。

请点击这里查看

Halyul
Publish: 2017 三月 22日 9:53:00 晚上
Update: 2017 十二月 2日 3:16:42 凌晨
失踪人口回归系列之在VPS上搭建HEXO的GIT部署环境
技术 Hexo 教程 

失踪人口回归系列的第一篇文章

Halyul
Publish: 2017 七月 16日 3:18:00 下午
Update: 2017 十二月 1日 10:23:00 晚上
记Piwik统计中西藏、台湾被视为独立的国家一事
键盘侠 

说实话,我还真的不知道怎么给这篇文章写标签和分类。垃圾Piwik!

DCC
Publish: 2017 十二月 1日 2:22:00 下午
CentOS 7 下 LEMP 的配置
CentOS 是 RHEL (Red Hat Enterprise Linux) 的免费版,由于红帽的大力推广,在国内外很是流行。因为众多企业和开发者使用,首先要求的是保证稳定,所以 CentO...
Zohar
Publish: 2017 十二月 1日 5:00:00 凌晨
通过CNAME方式接入Cloudflare
Cloudflare(以下简称CF)是一家非常优秀的CDN服务商,它所提供的免费服务功能非常丰富,足以应付绝大多数中小型网站的需求,可以说是业界良心。通常来说,免费版CF只能通过NS方式接入,这...
Ice-Hazymoon
Publish: 2017 十一月 29日 4:41:04 下午
记(水)一件趣事
喵喵喵 奇淫技巧 日常 
好久没水写博客了.... 因为英语的词汇量出奇的少,于是自己嘴贱 ...
Publish: 2017 十一月 29日 4:13:02 下午
Android 的优化软件们

昨天晚上跟同学聊天的时候脑洞大开,于是各种编段子,后来整理了下发到了我的 Telegram 频道 上,经过其他人转发之后……… 开启了编段子的夜

mokeyjay
Publish: 2017 十一月 29日 1:54:21 下午
绕过微信爬取猩便利特价信息并推送到微信
PHP 技术 

前言 公司里又多了一个无人货架——就是前阵子新闻说融资好几亿的猩便利 我是搞不太懂这玩意儿怎么突然火起来而且能骗到那么多融资的,按理说这玩意儿应该没啥盈利能力啊。虽然货架成本低廉,但需要每天人工四处给货架补货,零售价也就普通小卖部水平,也不向企业收取租金之类的,还有商品被偷取的风险。总体来说感觉每包零食赚的那几毛、几块并不足以承担补货员每天跑的成本以及商品被偷取、损坏的风险 感觉和现今的共享单车行
Publish: 2017 十一月 28日 5:40:19 凌晨
如何为 ThinkJS 3 网站优化 TTFB 时间

今年早些时候,奇舞团开源的 Node.js 框架 ── ThinkJS 迎来了她的 3.0 版本。尽管今年我很少更新博客,但「每次 ThinkJS 发布大版本,我都要更新博客程序」的老传统还是不能丢。所以,你现在看到的这个博客,已经是基于 ThinkJS 3 全面重构后的新版。

ThinkJS 3 基于 Koa 2.x 开发,内核实现得非常小巧,框架通过 Middleware(兼容 Koa)、Adapter、Extend 等机制来扩展出强大而丰富的功能。按照惯例,ThinkJS 大版本之间无法平滑进行,但这次升级带来的工作量不算太大,本站的升级工作花了一下午全部完成。

基于 ThinkJS 开发的网站普遍都很快,这篇文章我打算聊聊如何为 ThinkJS 3 网站优化 TTFB 时间,使之变得更快。

Time to first byte(简称 TTFB)时间,又称首字节时间,是 WEB 性能优化中非常重要的指标。它代表着从浏览器发起 HTTP 请求到收到 HTTP 响应第一个字节的这段时间,包含了 DNS 解析、建立 TCP 连接、建立 SSL 连接、发送 HTTP 请求、网络传输、服务端处理、30X 重定向等阶段。在影响 TTFB 所有因素中,服务端程序何时输出响应决定了服务端处理时间的长短,也是本文关注的优化目标。

优化 WEB 页面的 TTFB 时间除了要尽可能优化业务逻辑之外,还有两个常用技巧:

  • 多个 HTTP 请求响应(动静拆分);
  • 一个 HTTP 请求多次响应(分块传输);

前者无非就是先尽快输出一个无服务端复杂逻辑的空壳页面,再发起 ajax、jsonp 等异步请求填充内容。这种方案不利于 SEO,比较适用于单页应用。

像本站这种以内容为主的 Web 页面,非常适合采用第二个技巧来优化 TTFB 时间。本文重点介绍它。

分块传输响应需要用到我之前介绍过的 HTTP Transfer-Encoding: chunked 机制。有了这个机制,服务端可以随时将已经完成的部分响应发送给给客户端,而不必等待全部完成后再一次发送。浏览器拿到部分响应,就能解析并执行其中的 HTML、CSS 和 JS 代码,还能加载其中引用的子资源,最终让用户更快看到部分页面内容。分块传输也是 Facebook 在 2009 年实现的 Bigpipe 方案的理论基础,这里不再赘述。

再来说说 ThinkJS。

在 ThinkJS 之前几个版本中,我们可以通过 http.write(content) 发送多个 chunk,再通过 http.end(content) 发送最后一个 chunk,非常方便。

而 ThinkJS 3 使用的 Koa 2.x,只能通过 ctx.body 设置并结束响应,意味着通常情况下响应只能发送一次,还得放在整个 Controller 流程的最后。

通过分析代码,我找到在 ThinkJS 3 中多次发送响应的两种方案:

  • ctx.body 支持传入 Stream,创建 Readable 流 rs 并多次调用 rs.push(content) 可以多次发送 chunk,调用 rs.push(null) 可以结束响应;
  • Koa 代码层面上并没有禁止我们使用 ctx.res,通过 res 对象可以完全控制响应;

方案一比较正统;方案二则危险得多,官方都说要后果自负:

Bypassing Koa's response handling is not supported. Avoid using the following node properties: res.statusCode, res.writeHead(), res.write(), res.end(). via

所以,本站最终采用了方案二。Koa 总共就几个文件,出啥奇怪的问题都不怕。

下面开始贴代码。

1)创建 Controller 的 Extend 文件 src/extend/controller.js

const firstChunkMinLength = 4096;

module.exports = {
    async renderAndFlush(tpl) {
        let content = await this.render(tpl);

        //first chunk
        if(!this.ctx.headerSent) {
            this.ctx.type = 'html';
            this.ctx.flushHeaders();

            let length = content.length;
            if(length < firstChunkMinLength) {
                content += `<s>${' '.repeat(firstChunkLength - length)}</s>`;
            }
        }

        this.ctx.res.write(content);
    }
};

输出第一个 chunk 之前,需要通过 ctx 的 type setter 和 flushHeaders 方法来输出响应起始行和头部。

第一个 chunk 不能太小,否则会被某些浏览器缓存起来,不会马上显示,达不到我们想要的效果。更多细节可以点开这个 stackoverflow 的链接自己看。另外,我在实际测试中发现,只补空格 iOS Safari 依然不会立刻渲染,把空格放在标签里就没问题。也可能是我的幻觉,欢迎大家测试并指正。

2)在 Controller 里将原本渲染模板的逻辑根据实际情况拆分为多步:

async indexAction() {
    let pageName = 'blog-home';
    let title = 'JerryQu 的小站';
    this.assign({ pageName, title});

    //输出头部和边栏 HTML
    await this.renderAndFlush('home/inc/header');

    //查询数据库(耗时操作)
    let pn = this.get('pn');
    let data = await this.model('post').getPostList(pn, 10);
    data.pagerPath = getPagerPath(this.ctx, 'pn');
    this.assign(data);

    //输出剩余 HTML
    return this.display('home/index_post_list');
}

也就是说需要提前发送的模板通过 renderAndFlush 来渲染并发送,剩余模板还是走原有的 display 逻辑。

至此,本文要介绍的优化工作已经完成,赶紧打开浏览器验证一下吧。

但是如果你照着我的代码改造,肯定会遇到不少坑,下面列举几个:

1)原本的异常逻辑重定向到错误页不好用,直接提示 Can't set headers after they are sent. 错误。

这个错误信息已经把原因描述得很明白,HTTP/1 的响应需要严格按照起始行、头部和正文的顺序发送,已经发送了正文,就不能再通过 30X 状态码和 Location 头部来跳转页面。

解决方案:有一些会产生跳转的逻辑例如参数合法性检查,可以挪到发送第一个分块之前来进行。另一些异常跳转逻辑则无法提前,例如查询数据库后发现不存在对应的文章,这种情况可以输出一段 JS 代码在浏览器中跳转,或者直接渲染错误页面。

2)提前输出的模板中部分变量取不到值。

例如本站第一个分块输出了左侧内容,这个分块对应的模板中,有很多字段原本来自数据库查询后的结果,提前渲染必然取不到值。

解决方案:这些需要用到数据库字段的逻辑,有一些可以挪到后续分块中;有一些则不好后移,例如需要动态赋值的页面 <title>,只能放在 <head> 里。一种方案是继续使用万能的 JS,通过后续分块中的 docuemnt.title 来给页面 title 赋值。对于不支持 JS 的 Spider,可以禁用提前输出响应策略。

我使用了另外一套方案:由于文章数量不多,我索性在程序启动时,把全部文章 ID 和标题对应关系从数据库取出来,存在配置中。这样,后续第一个分块获取标题时无需查询数据库。

下面这段代码需要放在 src/bootstrap/worker.js

//HTTP 服务启动前执行
think.beforeStartServer(async () => {
    let postTitle = {};
    (await think.model('post').field(['slug', 'title']).select()).forEach(item => {
        postTitle[item.slug] = item.title;
    });
    think.config('postTitle', postTitle);
});

3)Middleware 中获取到的 ctx.body 不是完整页面。

本方案只有最后一个分块内容才会赋值给 ctx.body,前面分块的输出则完全绕过了 Middleware,出现这种情况是正常的。如果你不能接受,还是老老实实用 Readable Stream 吧。

最后,看完本文,相信你对如何优化 ThinkJS 3 网站的 TTFB 时间有了足够了解,赶紧动手试试吧。遇到任何问题,欢迎留言讨论。

本文链接:https://imququ.com/post/reduce-ttfb-on-thinkjs3-website.html参与讨论

mokeyjay
Publish: 2017 十一月 26日 7:37:44 早上
二次元图片壁纸放大降噪神器Waifu2x
软件 

简介 waifu2x,著名的二次元图片壁纸放大降噪神器 不仅放大不模糊,还自带去噪点功能 最适合经常收图做壁纸,但总遇到好看的图分辨率都低的人 (例如我 吐槽 之所以找到这么一款软件,其实是因为前天看到了某论坛的新壁纸 我当场就社保了 于是一路顺过去找到P站出处,想收原图 奈何原图分辨率不够高 印象中听说过图片可以插值放大,于是各种搜索、对比,最终选出这款最好用的,效果意外地好 效果对比 P站原图
DCC
Publish: 2017 十一月 25日 4:01:00 下午
今年二零一七
“这是最好的时代。”今年二零一七北电女学生被性侵的事件爆出,网上热议,众说纷纭。后来有个小伙子,自称侯亮平,他是那个女生的学弟,此番出现是为其鸣不平,他揭露了很多黑暗内幕,可他说的话很快就不见,...
mokeyjay
Publish: 2017 十一月 21日 1:06:25 下午
最近博客评论确实有点问题。别急,等我学会了Laravel和Vue就自己重写一套博客系统(挖坑
杂谈 
最近博客评论确实有点问题。别急,等我学会了Laravel和Vue就自己重写一套博客系统(挖坑
Zohar
Publish: 2017 十一月 20日 4:30:00 下午
对「穷逼VIP」事件的一些个人看法
开门见山:你们啊,不要总想着弄个大新闻!那只是一段注释而已,又不是展现给用户看的。有些人是真的厉害,把这样一段注释,直接给上升到了一个相当高的高度上,甚至还扯到“阿里的优越感”什么的。我觉得,一...
mokeyjay
Publish: 2017 十一月 18日 3:39:03 下午
评超人归来2《正义联盟》
简评 

自这片子昨天上映以来,我的微博首页到处充斥着吐槽的声音,没有一个人对此片整体给予正面评价。其实我早就对这个联盟的名字感到无语,今天吃完饭也实在是闲着,迫不及待就想买票进去看看究竟烂成什么样 剧情回顾 开场蝙蝠侠打爆了一只小怪,随着人物对白引出了外星人入侵地球这么一个故事主线以及上一部电影的“超人已死”。地球上有三个“母盒”,只要凑齐了就可以毁灭地球,然而大BOSS轻松就拿到两个。眼看地球要毁灭了,
Publish: 2017 十一月 18日 2:33:17 下午
闲聊·记录 | 2017年11月

时间往往过得很快,这个月似乎发生了不少事情,梳理下思路来想想这个到现在都干了什么…..


上月底我受同学邀请去了一家手游公司工作,主要从事手游 SDK 的相关开发(所以我也不知道手游的策划们是怎么干活的),对于我来说,难度属于并不是很难,

Publish: 2017 十一月 18日 2:12:12 下午
bPlayer

说起来很久都没写博客了呢,估计这两天会写一篇博文记录下最近的事情~

2017 年

Zohar
Publish: 2017 十一月 14日 3:55:00 下午
MacBook Pro
在今年的苹果返校活动开始后的第一天,入了一台盼望已久的MacBook Pro,弃掉了陪伴了我好多好多好多年的联想。7号下单,前前后后一共收到了4个EMS的快递,14号的下午终于拿到了电脑,心急的...
DCC
Publish: 2017 十一月 11日 3:11:00 凌晨
Nginx 的编译安装
默认安装的 Nginx 在大部分情况下都是足够使用的,但有的时候我们还需要其他一些高级的东西,这个时候就需要编译安装啦。这个部分比较繁琐,纯小白不看也没关系。东西比较多,我们创建一个文件夹单独存...
liwanglin12
Publish: 2017 十一月 10日 10:05:37 上午
办到了年轻人的第一张 VISA 卡
记录 VISA 借记卡 银行 

办到了年轻人的第一张 VISA 卡🌚

Axton
Publish: 2017 十一月 6日 12:56:58 下午
MDx:轻于形,悦于心
作品 开发 Material Design MDx 主题 
MDx,一款轻快、优雅且强大的 Material Design 风格 WordPress 主题 欢迎来到 MDx 的世界。 English Version & English Docs are being translated. 目前 MDx 最新版本 v1.7.2。 请从 这里 下载 MDx 的最新版本。 MDx QQ 交流群687577787,欢 ...
Robert Yang
Publish: 2017 九月 17日 8:22:48 早上
Update: 2017 十一月 6日 11:23:57 上午
开一个飞利浦的妖刀
不能无聊 买买买 

由于某些众所周知的原因(qong),我的笔记本显示器是TN屏的,不过大多数的笔记本IPS屏幕也是辣鸡。所以有些时候用Lr、Ps这些处理个照片非常恼火,和在手机上看的色差太大了,手机屏幕毕竟是小而贵,再差也差不到哪里去。所以又迫于穷,买了费力浦的妖刀245C7QJSB,可以说

DCC
Publish: 2017 十一月 2日 8:30:00 早上
震惊!天翼校园客户端被植入病毒
天翼校园客户端被植入病毒!中毒电脑被用来“挖矿”金山毒霸安全实验室监测发现,“天翼校园客户端”被植入后门病毒......​​​今天上午,金山毒霸安全实验室监测发现,中国电信江苏分公司校园门户网站...
Robert Yang
Publish: 2017 十一月 2日 4:38:36 凌晨
Update: 2017 十一月 2日 5:09:12 凌晨
Camera Raw 10.0 更新
技术6 Adobe Camera Raw PS 

Adobe 家的瑞士军刀更新到了2018版本,原来的 Lightroom CC 改名为 Lightroom Classic CC 。而 Lightroom CC 的名字给了一个新工具,可以认为是 Lr 的简化版本,突出的云同步的理念。 Lightroom Classic C

METO
Publish: 2017 十一月 1日 4:00:00 下午
一键点亮你的网易云音乐
网易云音乐是很好用,但禁不住一直丢版权音乐。眼看着歌单一片一片地灰掉,用 PHP 写了一个搬运脚本,妈妈再也不用担心我的网易云音乐变灰了。
Zohar
Publish: 2017 十月 30日 6:30:00 早上
Typecho插件:Comment2Telegram
Comment2Telegram:一个通过Telegram推送评论通知的Typecho插件。下载GitHub:Vrzl/typecho-plugin-Comment2Telegram(无耻求St...
Robert Yang
Publish: 2017 十月 19日 5:59:22 凌晨
Update: 2017 十月 20日 12:46:15 下午
为 Windows 颜色管理正名
技术6 色彩管理 srgb macos windows 

通常会听到一种声音,专业设计师使用 macOS 是因为 macOS 的颜色管理比 Windows 强很多,直到 iOS 拍摄的照片默认使用 Display P3 色域保存之后,很多人也惯性的认为 Windows 在显示 P3 色域照片时会无法正确识别颜色配置。2017年都要

Ephen
Publish: 2017 八月 29日 10:29:36 上午
Update: 2017 十月 18日 12:01:12 中午
告别“牙套妹”称号
心情驿站 生活 

各位看官请注意:

此文章涉及本姑娘个人信息,文章公开代表逛到这里的人可以看,但并不代表我同意被传播。

liwanglin12
Publish: 2017 十月 16日 10:27:04 上午
1024 天成就达成!
网站 LWL 的自由天空 纪念日 

LWL 的自由天空

2014.12.28 - 2017.10.16

Made with by lwl12

 

PoiScript
Publish: 2017 十月 16日 6:10:47 早上
NgModule 的作用域
angular 

Contents

前言

在开始聊这个话题之前,先提一个我遇到过问题:假设有一个 SpinnerService,这是一个可以在进行发送 HTTP 请求等异步操作的显示一个加载动画的 Service 。

这样看来,它应该是每个 Module 和 Component 中都可能用到的一个 Service,那么我们把放到 SharedModuleproviders 当中。然后在需要这个 SpinnerService 的 Module 中导入这个 SharedModule 即可。代码看起来大概是这样的:

// app/shared/spinner.service.ts
@Injectable()
export class SpinnerService {
  show () { /* code logic */ }
  hide () { /* code logic */ }
}

// app/shared/shared.module.st
@NgModule({
  providers: [SpinnerService],
  //other staffs
})
export class SharedModule {}

// app/some/some.module.ts
@NgModule({
  imports: [SharedModule],
  // other staffs
})
export class SomeModule {}

代码看起来没什么问题,而且也能正常运行。但是如果你在两个不同的 Component 中分别调用 SpinnerService 中的 show()hide() 函数,你会发现加载动画没有如愿的消失;更近一步,如果在 Service 中有共用的数据的,你会发现两个不同的 Component 中对数据的修改也无法同步。 Component 中的 Service 是由 Module 提供的,所以问题就出在 Module 上。

有的读者的可能已经猜到了:虽然两个 Module 中会提供一个 SpinnerService ,但是他们不是同一个实例。

Dependency Injection

在继续解释为什么不是同一个实例的之前,我想先粗略地说一下为什么应该会是同一个实例。这就涉及到一个概念: Dependency Injection ,动态注入。

以 angular.io 上的例子为例:假设有一个 Car 类,其依赖一个 Engine 类。

于是你可以这么写(不使用 Dependency Injection ):

export class Car {
  public engine: Engine;
  constructor() { this.engine = new Engine(); }
}

当然也可以这么写(使用 Dependency Injection ):

export class Car {
  constructor(public engine: Engine) { }
}

两者看起来区别不大,而且当需要调用 engine 的时候,用法也是相同的。但是后者的好处却有不少:

  1. EngineCar 的结构是完全独立的:传入 Car 中的是 Engine 的一个实例而不是在 Car 的新建这个实例。所以如果 Engine 的构造函数发生变化的时候也不需要修改 Car 中的构造函数。

  2. 因为传入 Car 中的是一个实例,所以可以复用这个实例,减少内存占用。

  3. 因为传入的只是一个实例,所以甚至可以传入一个虚假用于单元测试的 Engine

Angular 通过 Hierarchical Dependency Injectors 实现了上述的 Dependency Injection 。 Hierarchical Dependency Injectors 具体的实现,例如 Service 的复用, Component 的 Injectors 等都是很值得一说的,不过和本文相关性不大,这里按下不表。

Providers & Declarations

我们知道一个 Module 中可以有 Components , Directives , 和 Pipes ,还有 Services 。前三者都是与 HTML 模板相关的,需要放在在 Module 的 declarations 中;后者一般用来处理数据,放在 providers 中。

那么 providersdeclarations 的区别是什么呢?其中一个就是两者的作用域不同: providers 中是全局的;而 declarations 则是本地的,只有该 Module 中可以使用。

Services 为什么会是全局的呢?其实很好理解,因为 Services 经过编译之后最后都是生成一个类,在导入或是导出它们的时候都会限定在命名空间内。

所以, Services 应该只在 providers 中出现一次;而其他三者则是在需要的 Module 的 declarations 地方都出现。

当然,在所有出现的地方都需要写一遍也是非常烦杂。这时我们就可以把他们放到一个 SharedModuledeclarationsexports ,最后在需要的 Module 中导入该 SharedModule 即可。

对应到上面的问题,你会发现确实也只有在 SharedModuleproviders 中出现了 SpinnerService 呀,但是问题还是存在啊。

其实不止 SharedModule ,导入了 SharedModuleSomeModule 相当于也提供了 SpinnerService 。所以在两个 Module 中就会有两个由不同的 Module 提供的,两个不同的 SpinnerService

导入拥有提供了 Services 的 Module ,相当与自己提供了相同的 Services 。这样的例子这样的情况你可能早就接触过了:当你在 AppModule 中导入了 HttpModule 之后,你就可以使用 Http 这个全局 Service 来发送 HTTP 请求了。

这里的 AppModule 指 Root Module ,下同。

另一方面,如果一个 Module 既有 Components 也有 Services 时则需要分别对待了:在 AppModule 中导入这个 Module 的时候需要调用 forRoot() ,它返回的是一个 ModuleWithProviders;而在其他的 Module 则是直接导入这个 Module 或者调用 forChild()。例如 RouterModule 就既有 Component <router-outlet> 和 Directive routerLink ,也有 Service ActivatedRoute

Best Practice

至此,要解决文章开头的问题可以很简单:将 SpinnerService 放到 AppModuleproviders 里即可。

但是,这样的简单粗暴地将每一个 Service 都交由 AppModule 提供的解决方法违反了我们一贯的原则:尽可能保持每个 Moudle 的功能和结构简单。

所以,我们确实应该将 SpinnerService 移出 SharedModule ,然而也不应该放进 AppModule 而是可以考虑放进一个新建的 CoreModule 中。而这个 CoreModule 也应该作为一个纯粹的只提供 Services 的 Module ,而只在 AppModule 中导入它。

当然,因为只在 AppModule 中导入,所以如果有一些只需要在 AppComponent 中使用的 Component ,如 NavComponentFooterComponent 等也可以考虑放到其中。

References

  1. 文章中提到了可以使用一个虚假的 Service 用于 Component 的单元测试, 这里 介绍了具体应该怎么做。

  2. Angular 的 Hierarchical Dependency Injectors 系统,这是一个很有趣的系统,每一个 Component 都有一个与之对应的可编辑的 Injector 。具体可以查看的 Angular 的官方文档: Hierarchical Dependency Injectors

  3. 写 Angular 应用的一个原则都是保持每一个 Module 的功能和结构的简单和统一,这一点和 Unix 的哲学不谋而合:Write programs that do one thing and do it well. 那么我们怎么应该这么设计一个好的 Module 呢?Angular 官方的 NgModule FAQs 中其实给出了 答案 。从中我们可以看出,CoreModule 这种只提供 Service 和 SharedModule 这种只提供 Components ,Directives 和 Pipes 的 Module 是目前来说官方认为最好的设计。

Viosey
Publish: 2017 十月 12日 2:40:00 凌晨
Update: 2017 十月 13日 1:54:24 下午
手动编译 Nginx 并安装 VeryNginx
技术向 Nginx VeryNginx Linux 

VeryNginx 是个非常有意思且便捷的 Nginx 扩展程序。最近新开了台 VPS,便想体验一下它带来的快感。

Viosey
Publish: 2017 六月 1日 11:47:20 中午
Update: 2017 十月 13日 1:54:22 下午
从 Material 主题学习开源项目管理
技术向 开源 OpenSource 项目管理 

几分钟之前,1.4.0 版本 material 主题正式发布

Viosey
Publish: 2017 四月 24日 4:27:03 凌晨
Update: 2017 十月 13日 1:54:05 下午
使用 BrowserStack 测试前端兼容性
技术向 BrowserStack Front-end FTS 前端兼容性 

前端开发一直过不去的坎就是浏览器兼容性。

Viosey
Publish: 2017 四月 3日 4:10:11 下午
Update: 2017 十月 13日 1:53:50 下午
Story of Journey
分享境 PS4 风之旅人 Journey 多图杀猫 第九艺术 

多图预警

Chapter 1

两周之

Viosey
Publish: 2017 九月 26日 3:30:00 下午
Update: 2017 十月 13日 1:47:41 下午
全新 Material Theme 官网
创作集 React SCSS Material 

好久不见。

二十天前,新版的 Material Theme 官网有了第一行代码。

Elepover
Publish: 2017 十月 13日 4:56:00 凌晨
Arch 折腾记 - 搭建 Synapse
Matrix, Synapse 和 Riot 的关系Matrix: An open network for secure, decentralized communication.Matrix ...
Robert Yang
Publish: 2017 十月 7日 4:12:54 凌晨
Update: 2017 十月 7日 5:58:01 凌晨
开始使用 Service Workers
技术6 服务工作线程 Service Worker 缓存 

Service Workers 是什么?

<
Robert Yang
Publish: 2017 十月 3日 8:28:33 早上
Update: 2017 十月 5日 2:58:57 下午
多合一二维码收款码
技术6 二维码支付 qrcode 

我之前看到了一个网站可以将支付宝和微信的收款码合在一起,研究了下,应该是通过UA来判断扫码的客户端,从而返回特定的链接或者代码。我用网上的工具将支付宝,微信,QQ钱包的二维码都解码之后,用PHP写一个判断来返回对应的值。不过很遗憾的是只有支付宝支持这种用外部返回链接的方式直

METO
Publish: 2017 十月 5日 7:25:56 早上
LEDE 内网转发 IPv6
OpenWrt 
  • 2017.10.19 更新 NAT6 方式

之前发过一篇《OpenWrt 内网转发 IPv6》的文章,转眼间一年过去了,OpenWrt 也产生了一个新的分支 LEDE,有同学用之前的方案失效来私信我,这里也公布一个新的方式。

relay6

旧的方案是采用 NAT6 来实现转发,但其实 LEDE 内置了 Relay(中继)协议,无需安装任何插件,可以参考 https://lede-project.org/docs/user-guide/basic-ipv6-configuration 做如下操作。

  1. 进入路由器终端:$ ssh root@192.168.1.1

  2. 编辑 dhcp 配置文件:$ vi /etc/config/dhcp

Publish: 2017 十月 4日 3:51:03 下午
ESP8266 断网神器 基础使用

我们都是熊孩纸~~~ x2

Elepover
Publish: 2017 十月 4日 2:57:00 下午
Arch 折腾记 - 搭建 NodeBB
NodeBB 是一个搞笑高校高效*的论坛系统(辣鸡输入法),由 Node.js 驱动。(PS 不得不说,现在 JS 真的是越来越万能了)(连宇宙第一 IDE(Visual Studio)也靠它做...
DCC
Publish: 2017 十月 4日 2:26:00 凌晨
最最最纯粹的下载机搭建教程
之前讲了如何搭建 NextCloud,搭建过程可谓是非常繁琐的了,即使是环境配置用了一键包还是很复杂,而且 NextCloud 作为大型的云同步盘,对服务器资源的消耗是非常巨大的,而且为了安全性...
Publish: 2017 十月 3日 5:38:09 下午
ESP8266 断网神器 淘板子与刷入程序

我们都是熊孩纸~~~

Zohar
Publish: 2017 十月 3日 8:41:00 早上
Nginx启用HTTP Basic Auth
我们通常可以使用HTTP基本认证来保护我们网站的一些页面(如:探针),效果如图:当用户输入了错误的用户名或密码时,Nginx会返回401 Authorization Required禁止访问。生...
Robert Yang
Publish: 2017 十月 2日 2:43:32 凌晨
Update: 2017 十月 2日 5:52:43 凌晨
使用新窗口打开是个坏习惯
技术6 target 新窗口打开 blank 

实际上有点标题党了,应该说成在任何时候在网页上都使用新窗口打开属性是一个坏习惯。很多站长都喜欢问怎么把自己网站的链接搞成新窗口打开的方式,实际上我觉得这是完全多此一举,甚至是一个坏习惯。
实际上会发现很多国外网站和国内网站的不同之处在于,国内网站的链接喜欢新窗口打开,

Axton
Publish: 2017 十月 1日 6:25:44 早上
自动检查SSL证书到期情况
开发 Python SSL 检查 证书 
这是什么鬼? 自从我换了ECS,无垠旗下的各种项目也陆陆续续换成了HTTPS协议。然而,随着HTTPS使用越来越广泛,我手头的证书也越来越多。Let's的证书还好说嘛,可以搞自动续期,但各种CDN上的证书就难搞了...何况我在各大CDN服务商都有挂域名。我才懒得 ...
Robert Yang
Publish: 2017 九月 30日 5:17:05 凌晨
Update: 2017 九月 30日 3:45:37 下午
两个自己拍摄的延时摄影视频
不能无聊 延时摄影 318国道 芦山县 

分享两个自己学做延时视频的成果,第一个是在从稻城返程的时候在318国道旁边休息时拍摄的,不过我忘记了具体位置。第二个是在我家拍摄的芦山县新城的样子。做的不是太好,将就看看。





本来是只有两个比较满意的,不过我觉得我上次拍的黄花照波开花的过程还是可以看看的,所以放在下面



Publish: 2017 九月 29日 9:04:27 晚上
开箱测评 | 阿里月饼

前几天,收到了一份从 Kookxiang 寄来的阿里月饼! ありがとう
那么,来开箱吧!

DCC
Publish: 2017 九月 27日 3:51:00 凌晨
也许是最棒的个人网盘、下载机方案
为什么我自建网盘和下载机一个接一个国内网盘停止服务,以及百度云辣鸡的限速和8秒让我意识到,国内的网盘真的是越来越不安全和麻烦了,再加上本人木有钱续费辣鸡的迅雷会员了,(而且就算有睾贵的会员,某些...
Robert Yang
Publish: 2017 九月 22日 3:13:30 凌晨
Update: 2017 九月 23日 2:05:45 凌晨
几个提高WordPress速度的技巧
技术6 wordpress nginx php 

虽然有很多介绍WordPress缓存插件的,我也介绍过用Redis来缓存WordPress生成的页面,这也不失为一个较便捷的优化方法。但是很多时候我们会使用动态的元素,比如手机端和桌面端分发不同的图片,如果直接使用前端缓存插件会导致这些元素失去原有的效果。
Apach

DCC
Publish: 2017 九月 21日 10:11:00 上午
这盛世,如谁所愿?
回应团中央“这盛世不如我所愿!” 本文原文转自药丸时报特稿 仅以此文献给曾经的药丸时报 @PillNews 我们和你们一样,我们痛恨贪官,我们对庸官当道感到愤怒,我们反感堵塞言论的行为,我们看...
Publish: 2017 九月 21日 5:08:00 凌晨
九年计划

简单说明

在北京市第五十四中学的秋季运动会上,武旭主任屡次担当女子实心球裁判。

蠢黑通行
Publish: 2017 九月 17日 3:09:00 下午
使用UltraEdit一键转换MAT方案为IFW
My Android Tools作为一位Android优化软件新秀,使用与其他优化软件单纯的杀后台抑制后台唤醒完全不同的方法,深受Android倒腾党的喜爱。但任何应用App都可以使用公开的接口...
Publish: 2017 九月 15日 5:33:49 下午
LetITFly BBS 重新开放啦

LetITFly BBS

LetITFly BBS 的前身是

Elepover
Publish: 2017 九月 13日 11:12:00 晚上
Arch 折腾记 - 搭建 StackEdit
Arch Linux 折腾记系列Arch Linux - A simple, lightweight distribution.Arch Linux 以其轻量化的特性、易用的编译系统、丰富的社区...
Publish: 2017 九月 10日 3:55:19 下午
辣鸡MIUI

MIUI9 快如闪电
快你个锤子

liwanglin12
Publish: 2017 九月 10日 3:25:58 下午
自建邮件服务小记
程序 Mail MTA 

使用 mailcow-dockerized 项目搭建自己的邮件服务器
METO
Publish: 2017 九月 4日 4:02:00 下午
微博图片反查上传者

消息来源于 https://www.v2ex.com/t/388152

大概就是上传到微博的图片,在 URL 中会带上一串用户的 uid 标识。

比方说 http://wx1.sinaimg.cn/mw690/9d0d09abgy1fj0wcs7aewj20ij0sn12y.jpg 这张图片,提取文件名前 8 位 9d0d09ab,以 16 进制转成 10 进制后就可以得到用户 uid: 2634877355

看完感觉很震惊,马上关闭了 API 站的一个图床接口,从今天开始替换所有微博图床的图片。
安利一下兽兽的图床:https://sm.ms


一个赶工出来的反查器

Ice-Hazymoon
Publish: 2017 九月 2日 5:58:21 凌晨
【みうめ・メイリア・217+ATY】「Hysteric Bullet」 踊っちゃってみたOFFiCiAL
喵喵喵 GARNiDELiA MARiA 

嗯,不想多说什么,先水一下,顺便证明我还活着



编舞&导演:Miume

歌唱・作词:MARiA

MARiA (GARNiDELiA)

217(COJIRASE THE TRIP)

Miume (COJIRASE THE TRIP)

 

哔哩哔哩:https://www.bilibili.com/video/av14060156/

YouTube:https://youtu.be/FrUKGoBkVvI

Eana Hufwe
Publish: 2017 八月 29日 2:09:49 凌晨
Update: 2017 八月 29日 4:18:23 凌晨
Obfuscate PDF Text: Scramble Copied Text with Crafted CMap
Tech PDF CMap Obfuscate Scramble 

Notice

  • This does not prevent your PDF from being copied. OCR nowadays is pretty advanced.
  • Backup your document before you do anything.
  • The author does not encourage plagiarism in any form.
Troy
Publish: 2017 八月 27日 4:54:24 下午
生日快乐
日常 

emmm…
祝我自己生日快乐,话说今年好奇怪哦,等了 28 分钟的启动页,反反复复地打开与关闭,却发现只有 Bilibili 有相应的内容。
我记得往年 QQ 邮箱应该会自动给我发一封邮件,QQ 的启动页,QQ 空间的启动页,Google 的 logo 区域应该会变成生日相关的内容诶……

顺便这篇文章证明我还活着(XD)。

(emm… 作业好多啧,去写作业了…… =。=)

Ephen
Publish: 2017 八月 18日 9:51:42 上午
Update: 2017 八月 25日 9:21:29 上午
使用公共 DNS 上网的弊端(二)
知识探索 公共DNS Public DNS 本地DNS 递归DNS edns-client-subnet 

上一篇文章《使用公共 DNS 上网的弊端(一)》我讲到当我们使用公共 DNS 上网时可能会因为该 DNS 的出口与本地实际网络所属区域和运营商不一致而导致调度不准,进而影响连接速度可能变慢。这篇文章同时发到了咱们 CloudXNS 的微信公众号上,不少小伙伴与我们产生了互动。

有的小伙伴就问到:“如果是支持 Edns-Client-Subnet 的公共 DNS,还会存在我说的问题吗?”

不得不佩服小伙伴们的学识!(比灰姑娘可厉害多了……

Axton
Publish: 2017 八月 24日 2:44:26 下午
关于这个主题及本站未来计划
开发 MDx WordPress 主题 
主题还没完成,未发布!!! 受新高考政策的影响,即日起我会基本失踪,主题开发暂停,预计11月中旬回归。 最后一个有空的下午就折腾了一个下午的主题,就差最后一点了但是想想太着急发布也不是很好,就先缓缓吧,11月再说。 本来想趁这个下午给评 ...
KeJun
Publish: 2017 八月 18日 8:01:16 早上
Docker+Jekyll+NGINX 全自动部署
jekyll docker nginx auto pull autopull 
继上一篇文章,完成了个人首页的全自动部署。
Ephen
Publish: 2017 八月 4日 3:13:14 凌晨
Update: 2017 八月 18日 5:56:19 凌晨
使用公共 DNS 上网的弊端(一)
知识探索 公共DNS Public DNS 本地DNS 递归DNS 

作为资深网民的我们都知道,本地 DNS 是非常重要的,它能决定你到底能不能上网。

由于本地运营商 DNS 常常被大家诟病容易遭到劫持等风险,使得很多人选用公共 DNS 来作为本地上网用的 DNS ,例如 114DNS 、阿里 DNS 等。

但是,喜欢用公共 DNS 的你,知道公共 DNS 在上网时会有什么弊端吗?

KeJun
Publish: 2017 八月 17日 8:01:16 早上
Powershell 美化笔记
powershell 
嗯,PowerShell 的蠢蓝色背景和宋体真的是丑到让我怀疑人生。
milkice
Publish: 2017 八月 15日 3:08:45 凌晨
[Music] Counting Stars
Experiences Memories Personal Summer 
无法提供摘要。这是一篇受保护的文章。
DCC
Publish: 2017 八月 14日 11:53:00 中午
浏览器小绿锁——HTTPS 安全配置
水一篇教程来介绍一下 HTTPS 的一些配置吧,废话不多说,先看本博客的测试得分:蛐蛐大神的文章对本人有很大的启发,在此表示感谢。HTTPS超文本传输安全协议(Hypertext Transfe...
Axton
Publish: 2017 八月 13日 1:53:29 凌晨
PJAX,真的好吗?
开发 PJAX 前端 
本文从实用性的角度看待PJAX技术,而非技术角度。 最近发现越来越多的网站开始使用了PJAX无刷新加载。看起来这是一种趋势:PJAX是一种优秀的技术,大家都在用。但真的是这样吗?我看未必。 别把AJAX和PJAX放在一起 AJAX和PJAX,看起来非常相似, ...
Publish: 2017 八月 12日 3:18:12 下午
用笔记本屏幕造个显示器

嗯,高三了,老妈没收了我的显示器[捂脸] (虽然以前也不给我吧)

暑假还有点时间,搞事!

Axton
Publish: 2017 八月 6日 4:01:20 下午
1000天成就达成!
其他 

1000天成就达成!

Publish: 2017 八月 6日 6:37:02 早上
本博客开始支持 TLS 1.3

几个月前,我在升级本博客所用 Nginx 时,顺手加上了对 TLS 1.3 的支持,本文贴出详细的步骤和注意事项。有关 TLS 1.3 的介绍可以看 CloudFlare 的这篇文章:An overview of TLS 1.3 and Q&A。需要注意目前 Chrome 和 Firefox 支持的是 TLS 1.3 draft 18,暂时不要用在生产环境。

安装依赖

我的 VPS 系统是 Ubuntu 16.04.3 LTS,如果你使用其它发行版,与包管理有关的命令请自行调整。

首先安装依赖库和编译要用到的工具:

sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev unzip git

获取必要组件

nginx-ctngx-brotli 与本文主题无关,不过都是常用的 Nginx 组件,一并记录在这里。

nginx-ct

nginx-ct 模块用于启用 Certificate Transparency 功能。直接从 github 上获取源码:

wget -O nginx-ct.zip -c https://github.com/grahamedgecombe/nginx-ct/archive/v1.3.2.zip
unzip nginx-ct.zip

ngx_brotli

本站支持 Google 开发的 Brotli 压缩格式,它通过内置分析大量网页得出的字典,实现了更高的压缩比率,同时几乎不影响压缩 / 解压速度。

以前要想支持 ngx_brotli 模块,需要先手动编译 libbrotli。经评论里的朋友提醒,现在已经不用了。直接获取源码即可:

git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli

git submodule update --init

cd ../

OpenSSL

为了支持 TLS 1.3,需要使用 OpenSSL 1.1.1 的 draft-18 分支:

git clone -b tls1.3-draft-18 --single-branch https://github.com/openssl/openssl.git openssl

编译并安装 Nginx

接着就可以获取 Nginx 源码,编译并安装:

wget -c https://nginx.org/download/nginx-1.13.4.tar.gz
tar zxf nginx-1.13.4.tar.gz

cd nginx-1.13.4/

./configure --add-module=../ngx_brotli --add-module=../nginx-ct-1.3.2 --with-openssl=../openssl --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module

make
sudo make install

enable-tls1_3 是让 OpenSSL 支持 TLS 1.3 的关键选项;而 enable-weak-ssl-ciphers 的作用是让 OpenSSL 继续支持 3DES 等不安全的 Cipher Suite,如果你打算继续支持 IE8,才需要加上这个选项。

除了 http_v2http_ssl 这两个 HTTP/2 必备模块之外,我还额外启用了 http_gzip_static,需要启用哪些模块需要根据自己实际情况来决定。

以上步骤会把 Nginx 装到 /usr/local/nginx/ 目录,如需更改路径可以在 configure 时指定。

WEB 站点配置

在 Nginx 的站点配置中,以下两个参数需要修改:

ssl_protocols              TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 增加 TLSv1.3
ssl_ciphers                TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

包含 TLS13 是 TLS 1.3 新增的 Cipher Suite,加在最前面即可;如果你不打算继续支持 IE8,可以去掉包含 3DES 的 Cipher Suite。

本博客完整的 Nginx 配置,请点击这里查看。

验证是否支持 TLS 1.3

目前最新版 Chrome 和 Firefox 都支持 TLS 1.3,但需要手动开启:

  • Chrome,将 chrome://flags/ 中的 Maximum TLS version enabled 改为 TLS 1.3(Chrome 62 中需要将 TLS 1.3 改为 Enabled (Draft),感谢 @TsuranSonoda 指出);
  • Firefox,将 about:config 中的 security.tls.version.max 改为 4

本博客多次推荐的 Qualys SSL Labs's SSL Server Test 也支持验证服务端是否支持 TLS 1.3,非常方便,继续推荐。

本文链接:https://imququ.com/post/enable-tls-1-3.html参与讨论

milkice
Publish: 2017 八月 2日 12:02:53 中午
osu! 日文字体显示不正常の修复方案
Games Tech Font Japanese OSU! Windows 
最近太忙没什么好写的就随便水一篇吧格式什么的就不要care了 因为日常嫌弃Windows 10太不干净,Windows Update也提示我该把1607升级到1703了,于是就重装了一下到了1703,后来打开osu之后发现有个问题 请无视糟糕透顶的成绩 嗯这个日文字体不是太养眼啊( 那么,找找原因吧 一开始以为是1703阉割掉了一部分日文……
Robert Yang
Publish: 2017 八月 1日 7:41:30 早上
Update: 2017 八月 1日 8:48:22 早上
稻城亚丁游记
世界在这里 稻城 亚丁 S318 

前几天,我们一家人从芦山出发走过 G318~S217~S216 到达稻城县香格里拉镇。一路上 G318 除了二郎山天全路段容易堵车(我们去的时候是隧道中出车祸堵车,回来的时候是天全这边暴雨塌方堵车,所以雅康高速修好通车之后建议走雅康高速),之后的路况都算是不错的。
<

Zohar
Publish: 2017 七月 28日 6:36:00 晚上
一些有利于保障个人信息安全的上网习惯
在我删库跑路之前其实已经发过一篇类似的文章了,但是最终我还是觉得应该再发一次。这篇文章相比较于删库之前的那篇,可能会更加侧重于介绍一些「个人信息安全」方面的内容。本文可能会涉及一些互联网服务,所...
Axton
Publish: 2017 七月 25日 3:53:20 下午
做了一个个人摄影展示页
其他 开发 摄影 Axton 个人 
不废话,先扔链接(丢:photo.axton.cc 做这个页面的起因很神奇。我曾经用过腾讯云的CDN但是已经弃用很久了,所有配置也清空了,但前几天腾讯云莫名其妙给我产生了7.5KB的CDN流量,然后邮件短信各种告诉我已经激活了50GB/月共6个月的新手包。2333我想 ...
Lirici
Publish: 2017 七月 25日 1:59:36 下午
记一次事故
手滑导致的一次事故昨晚修改配置文件,编辑好了直接用xftp上传。想着顺手清理一下mysql日志,删的时候不小心碰到触控板,把/usr/local/mysql/var里的mysql文件夹删了。我发...
milkice
Publish: 2017 七月 25日 12:37:37 下午
CloudFront+WordPress实现全站CDN
CDN Tech Web AWS CloudFront WordPress 
最近真的要穷的吃土啦! 原先的vps的月付费用已经完全无法支撑(摊手),后来不得已把IceBox迁到了Digital Ocean(有coupon可以连着开好几个月啦),但是失望地发现无论是美西旧金山节点还是新加坡节点从国内访问的速度都是十分感人,况且听说最近Digital Ocean在国内一些地方不能访问,据说是因为路由的问题,所以无论如……
METO
Publish: 2017 七月 24日 3:58:00 下午
Bilibili 自动开宝箱脚本

项目地址:https://github.com/metowolf/BilibiliHelper

之前用 PHP 写了个直播间自动挂机脚本,等级从个位数快速成长到 33 级。
某天晚上和 LWL 聊天的时候脑洞大开,花了一个晚上实现了用 PHP 自动开宝箱领瓜子。

较难的部分就是验证码识别,用了字符切割,再与训练样本匹配的方法,使正确率几乎达到了 100% (目前还没失败的报告

实现后的脚本在服务器上试运行了两天,效果良好,和之前直播挂机脚本合并重写了逻辑,可以安心食用了。

药效

  • 每日签到
  • 每 5 分钟自动发送心跳包,+3000 观众经验
  • 每日自动领宝箱(瓜子)

食用方法

  1. 首先你需要有一台服务器,非虚拟主机。
  2. 安装有 php, php-gd, php-curl,Ubuntu 用户可以直接 sudo apt install
Ephen
Publish: 2016 十二月 30日 10:43:00 上午
Update: 2017 七月 24日 7:35:20 早上
几乎花了一个下午的时间参观了风河博客
心情驿站 知识探索 DNS 泛域名 

2015 年 CloudXNS “重出江湖”的时候,我们做了个让用户写体验文章的活动,风河博客的一篇《谈谈CloudXNS》吸引了我的眼球。

Elepover
Publish: 2017 七月 22日 11:38:45 晚上
关于 Windows 的一些“误会”
在我个人看来,Microsoft Windows 是我很欣赏的操作系统。Windows 的优势所在复杂但又完善的权限系统细致的组策略及其他设置调节现成驱动程序多Adobe 全家桶等独占注册表 -...
Robert Yang
Publish: 2017 七月 19日 1:26:18 下午
Update: 2017 七月 21日 8:35:54 早上
腾达AC18安装梅林固件
技术6 腾达 ac18 路由 梅林 

搬新家之后路由换了个腾达的 AC18 ,主要是听说这货刷不死,拿回来刷个梅林。AC18 的配置和 AC68U 基本相同,所以可以直接刷上 AC68U 的梅林固件,地址在这里

Ice-Hazymoon
Publish: 2017 七月 20日 4:40:34 下午
[游戏日常]185抽没出卡卡西
日常 游戏 抽卡 


听说你们脸很黑,我跟你讲我都不想鄙视你们

· 抽奖前: 

· 抽奖后: 

185连,还是没出,这是要让我继续氪金的节奏 

Ephen
Publish: 2017 七月 17日 8:20:44 早上
Update: 2017 七月 18日 9:23:28 上午
什么情况下DNS会使用TCP传输协议?
知识探索 DNS TCP UDP 协议 

我们知道, DNS 是同时占用 UDP 和 TCP 的 53 端口传输数据的,这种单个应用协议同时使用两种传输协议的情况,在 TCP/IP 栈中也算是个异类。

当我们在使用 tcpdump 、 WireShark 等抓包工具分析时,会发现几乎所有的 DNS 应用都是在使用 UDP 传输。

那么,为什么 DNS 还要占用 TCP 的端口,到底什么情况下才会用到 TCP 呢?

Ephen
Publish: 2016 七月 26日 6:14:02 早上
Update: 2017 七月 18日 7:58:26 早上
全新出发,正式启用Hexo!
心情驿站 博客折腾 hexo sitemap 

郑重声明:原网站http://www.chinatesters.com已正式停止更新,内容已全部转移至这里,未来所有的更新也都在这里。新的站点,新的开始,新的旅程!~

Elepover
Publish: 2017 七月 16日 11:35:00 晚上
拯救一块硬盘的正确姿势
DiskGenius 启动时会跳出一句话:“数据无价,谨慎操作。”某日,博主的同学 ××× 暴力热插拔我的 SD 卡,导致分区表直接报废...Windows: 使用此光盘之前需要将其格式化。(光...
liwanglin12
Publish: 2017 七月 15日 2:49:10 下午
黄昏
时事 

LWL今天想推荐一首歌给大家,这首歌作者当初在写的时候为了防止它被不可描述,所以就说它是一首关于父权的,家庭暴力的歌,其实并不仅仅关于此,叫做《黄昏》。
METO
Publish: 2017 七月 14日 11:35:00 中午
修复 Telegram 中文输入

近日将 Ubuntu 升级到了 17.10,新的 Gnome3 桌面的确好看很多。但同时出现了很多之前在 Unity 没有出现过的 BUG,例如在 Telegram 下无论怎么切换输入法都不能输入中文。

于是聊天就很蛋疼,想要回复对方一句话,得先打在其他地方,然后再复制回来发送。

到 Telegram 的 Github issue 上查了查,有不少 Fedora 用户也有这样的问题。

大概是所有 QT 编写的应用程序在 Gnome3 下都会出现这个问题,解决方法是引入 QT_IM_MODULE 变量。大致步骤如下:

  1. 编辑 ~/.local/share/applications/telegramdesktop.desktop 文件
  2. 修改 Exec 该行,添加环境变量
Lirici
Publish: 2017 七月 13日 2:14:00 下午
在Centos7上部署魔改版后端
在Centos7上部署魔改版后端跟Centos6中有一些不同,本文介绍如何在Centos7上部署魔改版SSR基本就是官方教程拿来改一改项目的Github地址官方部署教程,适用于Centos6准备...
Lirici
Publish: 2017 七月 13日 1:35:11 下午
Centos7替换Firewall为iptables
>对于习惯了Centos6的人来说使用iptables肯定比Firewall更舒服。其实是我懒得学习怎么使用Firewall因为Centos7默认使用的是Firewall所以这里就教大家怎...
Publish: 2017 七月 12日 9:48:00 上午
做好精致教育 成就共同梦想

​北京市第五十四中学 2017·夏

高清未压缩视频下载:链接: https://pan.baidu.com/s/1bpGRDNL 密码: e77u

制作:
张哲 周慧明

策划:
北京市第五十四中学 科宣处

技术支持:
北京市第五十四中学 信息中心

Publish: 2017 七月 11日 11:17:24 晚上
海淘与转运(日本)

今天有人提醒我好久没写博文了 Orz
最近确实很忙,有好几件事情都要做,然而今天又跑了趟图书大厦…..

嘛,为什么今天突然说起转运的事情了呢…..
因为之前一直在 StartedJP 有个想买的

KeJun
Publish: 2017 七月 11日 11:49:27 中午
初识 Linux 文件权限
linux 权限 
Linux一般将文件可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有 read/write/execute 等权限——鸟哥
Axton
Publish: 2017 七月 11日 3:32:04 凌晨
Hack.init() 2017 Write Up
开发 Hack.init() WriteUp 
日常碎碎念 非常荣幸,(zijibaoming)参加了7.8-9在上海科技大学举办的Hack.init()创客马拉松。既然来了就想着写点东西出来,也算是留个纪念吧2333 开始之前 7.7到达上海,第二天早上前往上海科技大学。结果跑错门,烈日下绕了大半圈,结果真的 ...
METO
Publish: 2017 七月 6日 9:42:00 上午
用 Service Workers 为网站加速

其实 Service Workers 是 Google 爸爸推出很久的一个黑科技,它可以在浏览器层面动态缓存一些请求,从而使网站的二次加载速度大幅提高。

二次刷新我的博客,只重载了 16.0KB 的资源,甚至可以剪断网线访问 ∠( ᐛ 」∠)_

需要注意的是,Service Workers 只有在 HTTPS 的前提下才能发挥作用

添加 sw-toolbox 核心

下载 sw-toolbox.js 并且放置到主题目录下的 assets/js 目录

*如果你是默认主题,应该是在path_to_ghost/content/themes/casper/assets/js

创建缓存规则

在主题根目录下创建 serviceworker.js,并且写入下面内容

'use strict';

(function () {
  'use
Axton
Publish: 2017 七月 4日 7:01:19 早上
一篇划水公告
其他 

启用新的DataCenter-Singapore B,同时无垠旗下所有服务器已开启谷歌BBR加速算法

Publish: 2017 七月 2日 8:49:38 晚上
一加5使用感受与折腾

使用感受

PoiScript
Publish: 2017 六月 27日 7:32:10 早上
Spacemacs 和 Org-mode 和 LaTeX
emacs latex org-mode 

Contents

前言

我曾经试图将我的所有课笔记转换成 Markdown 文档以永久保存. 我的笔记包含了大量的数学公式, 所以需要在 Markdown 里内嵌 LaTeX.

LaTeX 是对著名排版系统 TeX 的二次开发, TeX 是公认的数学公式排版最好的系统.

但是, 在 Markdown 里编辑 LaTeX 简直是噩梦: 编辑器不提供 LaTeX 的补全. 一个公式里可能有大量重复的 \alpha \sigama \rightarrow 等符号, 而它们全部需要我一个字母一个字母地输入.

Markdown 中内嵌的 LaTeX 大多是通过 MathJax 实现的, 所以另外一个大问题就是有的宏用不了了

所以在花费了大量时间将一本书的笔记录成 Markdown 之后, 我放弃了. :)


后来在 #archlinux-cn 的 riaqn 安利下, 我开始使用 Emacs 的 Org-mode 来作笔记. 不得不说相比 Markdown, Org-mode 配合 Emacs 的生态, 在各种体验上都上升了不止一个等级.

当然, 一个编辑器想要达到最佳的输入效果, 一番配置是少不了的. 下面就是我的整个 Emacs + Org-mode + LaTeX 环境的配置过程, 大家可以选择性观看.

Spacemacs

Emacs (Editor MACroS) 是一个文本编辑器, 著名的编辑器之战的两大主角之一 (另一个是 vi 即其派生版本).

在 openSUSE 中安装 Emacs 只需要在 root 用户下运行:

$ zypper in emacs

其他的 Linux 发行版请尝试使用包管理器安装, 或者和 Windows/macOS 用户一起看看官方文档.

而 Spacemacs 是一个由社区驱动的 Emacs 的分支, 它的口号是:

The best editor is neither Emacs nor Vim, it's Emacs and Vim!

正如他们的口号所言, Spacemacs 的最大的特点就是 Vim 风格中通过 Evil 实现了 Vim 的键位绑定. 在 Emacs 中也能使用 Vim 中独特的 insert modevisual mode 了.

Spacemacs 的默认风格是 Vim, 同时也提供了 Emacs 和 Hybrid 适用不同的人.

安装 Spacemacs 只需要:

$ mv ~/.emacs.d ~/.emacs.d.old && mv ~/.emacs ~/.emacs.old # backup
$ git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d

在 Windows 下的话, 不仅要将 Spacemacs 的 .emacs 放在 C:\Users\{username}\ 同时也要在 C:\Users\{username}\AppData\Roaming 里. 此外, 还有可能出现 packages unavailable 的情况, 此时可以参考一下官方的 FAQ.

无论是什么Editor/IDE, 装好的第一步应该都是修改字体吧. Spacemacs 的默认等宽字体是 Abode 的 Source Code Pro, 这曾经是我也是我的首选, 不过我现在喜欢用带连字 (ligatures) 的 Fira Code.

Spacemacs 的配置文件在 ~/.spacemacs, 打开后找到 dotspacemacs-default-font 修改成:

dotspacemacs-default-font '("Fira Code"
                            :size 21
                            :weight normal
                            :width normal
                            :powerline-scale 1.4)

其中字体大小, 宽度等参数见个人喜好, 你可以在这里 看到各个参数的含义.

英文的等宽字体配置完后, 还可以选择性地配置其他的语言, 例如中文:

;; Set Chinese Font
;; Put this inside `dotspacemacs/user-config()`
(dolist (charset '(kana han cjk-misc bopomofo))
        (set-fontset-font (frame-parameter nil 'font) charset
                          (font-spec :family "Noto Sans SC" :size 20)))

如果不配置中文字体的话, 在打开带有中文字符的文件时, Emacs 会出现严重的卡顿 :(

Org-mode & LaTeX

Org-mode 是 Emacs 中的一种编辑模式, 支持编写 To-do list, 日志, 笔记等功能. 其中(对于我来说)最重要的就是支持 内嵌 LaTeX 了. Org-mode 从 Emacs 22 开始就已经成为默认安装的部分了, 所以不需要额外的安装操作, 只需要打开带有 .org 的文件, 就会自动进入 Org-mode 了.

不过想要有 LaTeX 的预览/导出的话, 还需要安装 texlive. openSUSE 下依旧是在 root 环境下运行:

$ zypper in texlive

#archliux-cn 的 farseerfc 前辈提示我可以用 texlive 的 Unix Installer, 方便管理各个版本的 texlive, 不过我还未尝试过.

其他的系统也可以使用包管理器安装或者请参照一下官方文档.

Org-mode 内嵌 LaTeX 有几种方式, display 我喜欢用 \[E=mc^2\], inline 我偏好 $E=mc^2$. 预览时只需要用 C - C X L 即可.

默认的预览有点小, 所以我在 .spacemacs 里拉伸了一下大小:

;; Enlarge LaTeX Fragment in Org-mode
;; Put this inside `dotspacemacs/user-config`
(require 'org)
(plist-put org-format-latex-options :scale 2.5)

CDLaTeX

到这里看来 Emacs + Org-mode 的组合相比 Markdown 似乎没有给输入太大的便利吧. 所以接下来要介绍的就是 Emacs 的另外一个 mode 了, 这个 mode 可以大大提高在 Org-mode 中输入 LaTeX 的效率 -- CDLaTeX.

在介绍 CDLaTeX 的工作原理之前, 先说一下 Emacs 中的 mode: Org-mode 和 CDLaTeX 虽然同是 Emacs 的 mode, 但是地位不同的. Org-mode 是 Major Mode(主要模块); CDLaTeX 是 Minor Mode(辅助模块). 一般来说 Emacs 是不能同时使用多个 Major Mode.

如果想在 Emacs 的 buffer 中开多个 Major Mode, 参见: MultipleModes

所以 CDLaTeX 作用其实是实现了部分来自另外一个 Major Mode -- AUCTeX 的功能, 让你可以在其他的 Major Mode 里快速输入 LaTeX.

相比直接在 Org-mode 里使用 CDLaTeX, Org-mode 推荐使用 Org-mode 自带的轻量版的 org-cdlatex-mode.

org-cdlatex-mode 依赖 cdlatex.eltexmathp.el(这个来自 AUTeX, 作用是判定目前光标所在位置是否在内嵌的 LaTeX 中). 所以我们需要在 .spacemacs 加入我们需要安装的 CDLaTeXAUTeX:

dotspacemacs-additional-packages '(cdlatex auctex)

然后重启 Emacs, Spacemacs 会自动帮你安装好他们.

注意全部使用小写, 而且不要用 M - x package-install 来安装, 因为 Spacemacs 会在重启之后删掉他们...

再次打开 Org-mode, 用 M - x org-cdlatex-mode 打开 CDLaTeX. 然后你就可以体验的 CDLaTeX 带来的快速输入 LaTeX 的功能了:

  1. 用自动补全一些 LaTeX 模板, 例如: fr => \frac{}{}, lr( => \left(\right). 此外,也可以用于在各个 {} 之间跳跃.

  2. _^ 会自动补全 {}, 不过如果 {} 里只有一个元素的话, 也会自动去掉.

  3. ` 后加一个字母可以快速输入一些 LaTeX 的符号, 例如 `a => \alpha, `b => \beta

  4. 在一些字母之后加上 ' 则是可以修改该字母的字体或者加修饰, 例如 a'. => \dot{a}, a'1 => {\displaystyle a}

<TAB> 的补全

`的补全

后语

经过上述配置和折腾之后, 整理笔记终于成了一件不那么麻烦的事了. :)

一直有人问我为什么那么费劲的在各种标记语言里嵌套 LaTeX, 而不直接用 LaTeX 写呢? 嗯... 其实我一直有一个想法就是建立一个属于自己的类似知识库的东西, 所以我的期望是可以导出成 HTML 以便于时刻可以浏览, 而 LaTeX 在这方面就比较吃力了.

不过使用了 Org-mode 之后也有一个问题: 目前似乎没有现成的基于 Org-mode 的 Wiki Software, 所以这意味着我可能又需要自己造个轮子了... :(

Publish: 2017 六月 26日 5:33:00 凌晨
使用一言API做些东西

官方说明:http://hitokoto.cn/api

由于会考和中考,又放了一个小长假,无聊嘛,做一些东西

比如博客顶部的这个

还有这个

这俩都调用了一言(hitokoto.cn)的API。

第一个源码在here↓
yiyan.zip

第二个就不放源码了哈,实现起来一点都不难
http://public.asec01.net/projects/yiyan/

Publish: 2017 六月 24日 9:20:00 上午
第十八届机器人竞赛 - 经验与总结

程序与硬件方面

在厂家提供的程序上做出修改,添加拨码开关用于快速调整开球战术。
  1. 重新测量距离数据,使程序判断车在赛场中的位置更加精准。
  2. 修改添加开球战术。
Publish: 2017 六月 24日 9:09:00 上午
第十八届机器人竞赛

好几天前就该写了。。。

Ephen
Publish: 2017 六月 23日 1:35:05 凌晨
Update: 2017 六月 23日 2:34:23 凌晨
SSL证书颁发机构将对域名强制CAA检查,到底什么是CAA?CAA记录详解
工作笔记 知识探索 DNS https SSL CAA 

强制CAA检查的提议

2017年3月7日,CA|B Forum (一个全球证书颁发机构与浏览器的技术论坛)发起了一项关于对域名强制检查CAA的一项提议的投票,获得187票支持,投票有效,提议通过。

提议通过后,将于2017年9月8日根据Mozilla的Gervase Markham提出的检查CAA记录作为基准要求来实施。

详情参见:Ballot 187 – Make CAA Checking Mandatory

什么是CAA记录?

CAA,全称Certificate Authority Authorization,即证书颁发机构授权。它为了改善PKI(Public Key Infrastructure:公钥基础设施)生态系统强度、减少证书意外错误发布的风险,通过DNS机制创建CAA资源记录,从而限定了特定域名颁发的证书和CA(证书颁发机构)之间的联系。从此,再也不能是任意CA都可以为任意域名颁发证书了。

Zohar
Publish: 2017 六月 21日 5:42:00 凌晨
支付宝、微信、QQ收款二维码3合1
最近折腾了一下合并收款码,简单记录一下折腾的过程,方法不唯一,只是提供一种思路,如果各位大佬有更加简单粗暴的办法,一定要偷偷告诉我哈(=`ω´=)Here we go!原理首先解析出三个二维码的...
Robert Yang
Publish: 2017 六月 20日 6:40:57 早上
Update: 2017 六月 20日 7:09:00 早上
集体荣誉感和自私有什么联系
思考 集体 集体荣誉 集体主义 

所谓的集体荣誉感,尤其是在学校里被灌输的,大多都会变成自私的一种体现,为什么这么说呢?因为你被教育到你是集体的一个成员,你的荣誉是来自集体,集体伟大你就伟大,集体得到荣誉你就得到荣誉,这样看起来似乎是没有什么问题。但是这样会走向一个极端,那就是集体中的个体会用各种办法来维护

Publish: 2017 六月 18日 8:53:45 晚上
Android 开发为什么不应该继续使用 Eclipse

借着我现在学校正在教 Android 开发的契机,聊一聊为什么你应当使用 Android Studio 而不再使用 Eclipse + ADT 的方式。

Axton
Publish: 2017 六月 18日 8:17:41 早上
MDx主题开发开始
开发 Material Design MDUI WordPress 主题 
考虑了有一段时间,终于下定决心自己写一款WP主题,暂时定名MDx,不过最后有可能改名...
PoiScript
Publish: 2017 六月 15日 1:35:03 下午
基于 React 的 SEO 友好的博客
blog react seo 

Contents

前言

嗯, 没错, 又是一篇 "如何打造一个 XXX 的博客" 的文章.

这里的 XXX 是 "基于 React 的 SEO 友好".

Search engine optimization (SEO) 即 搜索引擎优化

什么? React? 你不是 Angular 的教徒 吗? 怎么叛变到 React 了呢?

嗯, 这就说来话长了.

Angular 还未达到 SEO-friendly 的程度

单页应用一直有一个令人诟病的问题就是就是其对搜索引擎不友好.

究其原因, 就是单页应用核心就是 JavaScript 应用, 而一般的搜索引擎都只在乎你页面的 HTML 而对于其中的 JavaScript 是不会执行的.

虽然 Google 曾经表示会抓取单页应用 (对 Ajax 的结果进行缓存), 但是现在已经表示已经 不再支持了.

用 Google 自家的框架 Angular 写的 Solomon 在 Google Search 下只能显示一个可怜标题(2017-6-15)

难道单页应用就是不能实现 SEO 吗? 并不是, 还是可以通过一种名叫 Server-side rendering(服务器端预渲染) 的方式来实现的.

Angular 的 Server-side Rendering API 叫 Angular Univeral API, 并且 也已经整合进了 Angular 4.

虽然前景是好的, 但是目前支持的 Angular Universal 的库少之又少, 难怕是 Angular 官方的 Angular Material 也 尚未支持.

而相比之下, React 的 Server-side Rendering API: ReactDOMServer.renderToString() 则适用程度大了很多, 至少我目前还没有发现不支持的库.

当然也有可能是 React 的 API 实现的非常简单, 生成 HTML 时, 只调用了 constructor(), componentWillMount(), render(), componentDidMount() 几个方法.

所以我叛教了 :)

react-snapshot & react-helmet

想调用 React 的 Server-side Rendering 的 API 的话, 最简单的方法是使用 react-snapshot.

它和 creat-react-app (一个类似 Angular Cli 的命令行工具) 整合得很好, 只需要将 render() 替换成 React-Snaport 提供的 render() 即可. 它会在 Developer Mode 的时候调用 Render.render() 和之前一样; 在 Production Mode 的时候调用 ReactDomServer.toSting().

在运行 react-scripts build 后再运行 react-snapshot, 就会开启一个爬虫, 将所以的页面遍历一遍后, 导出至 HTML.

运行结果:

使用 w3m 访问 About 页面的结果:

同时也保留了单页应用不需要重复加载的优点:

从 About 页面进入之后, 我重复切换了几次页面, 但是 Network 里都没有出现新的请求

原理是什么? 每一个单页应用都有一个 index.html 作为的入口.

而使用了 react-snapshot 之后, 你的单页应用相当于有了同时多个不同入口, 或者说你同时拥有了复数个功能相同的单页应用.

react-snapshot 目前还有一个问题 (对我来说), 它会将路径 /path/to/page 保存为 /path/to/page.html, 但是并不是所有的服务器都可以识别, 例如 Python 的 SimpleHTTPServer 就不行. 所以我写了 一个小脚本, 将保存好的 /path/to/page.html 重命名为 /path/to/page/index.html.

我给 react-snapshot 推了一个 Pull Request, 增加将页面保留保存为 /path/to/page/index.html 的形式, 希望可以被合并, 这样就能省去这一步了.

如果说 react-snapshot 让你的单页应用里的 body 标签搜索引擎可见的话, 那 react-helmet 就可以让你的单页应里的 head 标签能被搜索引擎爬到了.

head 中的 meta 标签更是 SEO 的关键之一, 通过它我们可以主动给爬虫提供重要的信息, 例如文章的作者, 发布时间等.

更进一步

嗯, 经过 react-snapshot 和 react-helmet 处理之后, 已经能够完全满足 SEO 的需求了.

其实文章写到这里, 除了一些关于 Angular 的吐槽和 react-snapshot 的小修改的话, 和 Medium 上的 这篇文章 没什么区别.

但是还有一些缺点, 在说之前, 先说一下为什么单页引用可以提高网页的响应速度, 减少资源的加载次数.

因为单页应用虽然在第一个页面的时候, 需要加载更多的内容 (毕竟还要加载 JavaScript) 但是在访问第二个, 第三个页面的时候, 则不需要请求任何的资源, 因为它们是由你的浏览器动态生成的.

假设你访问一个传统的静态网页, 每访问一个页面, 你可能只需要 60 的数据量, 但是你每访问一个页面都需要 60 的数据量. 而访问一个单页应用, 你需要 200 的数据量 --- 但是从头到尾都只需要这 200 的数据量.

所以使用 react-snapshot 之后, 可以达到切换页面不需要重新载入文字的原因是, 它其实是将你的所有文字都写入了 JavaScript.

以上面的 Medium 那篇文章中给的 Demo: https://yadg.surge.sh/ 为例, //about 的文字都写进了 JavaScript 里, 所以才能做到流畅的切换(因为全部帮都下载来了...):

所以假设你有上百篇文章的话, 造成的结果就是用户需要在加载的完全部的文章之后才可以正常使用你的博客 (在没有加载完剩余的文章之前, 用户只能盯着当前的页面什么都做不了).

如果访问一个单页应用需要 2000 的数据量的话, 那还值得吗?

虽然目前来说也就我的博客也就几篇文章, 远远达不到 2000 数据量的程度, 不过随着时间的增长, 这个问题只会越来越明显.

所以我做了一个改进: 在 React 中使用 XHR (XML HTTP Request) 获取文章, 而不是用上面 Medium 里用 Component 的形式. 这样就不需要全部写进 JavaScript 里了.

等一下, 如果使用 XHR 的话, 在调 render() 的时候, 是不会含有文字的: 因为 XHR 请求是异步, 而 React 中的 setState 函数也是异步的.

没错, 就是空标签. 那么说好的 SEO 呢? 很简单, 把生成的 HTML 里的空标签 替换成我们的文章 即可. :)

提示: 直接替换生成的 HTML 文件是一个危险的行为, 最好替换普通的标签, 不要替换 React Component 生成的标签.

因为如果随意替换的话, 可以会丢掉带有额外属性 (例如: data-reactid) 的标签. 其中 data-reactid 是 React 给每一个 Component 的一个唯一的标识符, 如果缺少了其中的某一个的话, 会导致 React 停止工作.

后语

在经过上述的步骤之后, 我们的博客将拥有一下特性:

  1. 基于 React 模型

  2. 博客中的每一个链接都是可以直接打开, 而不需要将路由重写至 index.html. 而且每一个页面都有 Server-side rendering, 可以被搜索引擎爬到, 哪怕是不支持 JavaScript 的纯文本浏览器 (例如 w3m) 也可以直接访问, 而不会显示那个臭名昭著的 "Loading". :)

  3. 在打开一个页面之后, 除非是查看一篇新的文章, 否则, 不需要再加载任何的资源. 而查看一篇新的文章时, 也只需要加载文章本身的 HTML, 其他组件, CSS 都不需要重新加载.

这是我想到的目前来说, 最完美的单页应用的 SEO 的解决方案.

有什么疑问的话, 可以查看 Solomon 中 /react 的源码, 当然也欢迎向我提问.

没错, 我已经打算将 Solomon-React 和 Solomon-AMP 合并到一个 repo 了. :)


算上这篇文章, 我的博客里几乎半数以上都是 "如何打造一个 XXX 的博客" 的文章了 :( , 一点都不技术 poi.

接下来我大概会继续我的 Rust 学习之旅, 然后... 等到我做了些真正有趣的东西再和大家分享吧.

METO
Publish: 2017 六月 14日 2:14:43 下午
让 Ghost 吃上 APlayer

之前围绕着 DIYgod 做的 HTML5 音乐播放器 APlayer 做了不少东西,然而因为种种原因并没有给自己的博客挂上。

Wordpress 有 Hermit-X,Typecho 有 APlayer-Typecho-Plugin, 然而 Ghost 什么也没有,主要是官方一直没给出插件开发的文档。

于是我花了一点时间,开发了一个云解析的播放器“插件”,主要原理是由 JS 解析短标签的数据,从 API 请求歌曲信息,再在用户端进行生成播放器。

期间遇到了不少问题,诸如样式炸裂、跨域、异步请求等等,不过都解决了。

下面记录一下简化后的步骤:

引入依赖

首先进入后台,进入 Code Injection 菜单,在 Blog Header 加入代码

<style>
    li {margin: 0em
131
Publish: 2017 六月 13日 4:00:00 凌晨
SS+Cow代理配置
此方案适用于有境外SS账号+境内服务器的人
ItsLucas
Publish: 2017 六月 7日 7:04:05 早上
Arch Linux 使用F2FS作为根文件系统的安装方案 [ItsLucas]
Linux Maintenance OS Tech Arch F2FS 
一些BB F2FS最近被炒的十分火热,某些号称18个月不卡顿的手机用的特别开心 那么我在想要不要把它用在Arch上 不BB了,开始安装 首先请Follow官方的安装指南 https://wiki.archlinux.org/index.php/installation_guide 在建立分区之前停下 我们的分区表大概长这样(我弄了个1G的……
milkice
Publish: 2017 六月 7日 6:41:29 早上
ADSL猫(RG100A)通过设置VLAN虚拟WAN口
Openwrt Router VLAN RG100A 
前言 自从家里宽带升到百兆之后 电信师傅就把我原来那个配置好的刷了tomato的路由器换成了电信的光猫 按照惯例我在网上找破解这个光猫超级密码的方法,但是我找了很多试了很多办法都不行,想刷成别的系统找了下似乎也没有适配这个机型的系统,于是就很无奈啊 本来我家打印机是接在那个tomato路由器上的这样一来我就可以在手机上直接打印了,可是现在……
liwanglin12
Publish: 2017 六月 6日 4:00:13 下午
高考加油!
时事 

愿你们合上笔盖的那一刻,有武士将刀收回剑鞘般的骄傲。

 

高考加油啦!祝各位一战成名!

学考党和中考党也是一样

本博主今年没有考试,甚至还放了假🐟233333

131
Publish: 2017 六月 6日 4:00:00 凌晨
记一次SS中转配置
记一次SS中转配置
KeJun
Publish: 2017 六月 4日 4:00:00 下午
在 VPS 上利用 GIT HOOKS 自动部署 Jekyll
jekyll git hooks vps ubuntu 
jekyll 官方提供了教程,写的还是蛮清楚的,但我觉得还是有必要记录一下。
Axton
Publish: 2017 六月 3日 2:06:09 下午
用Python活捉多余jQuery
开发 jQuery Python 
唔,我猜肯定有人看了标题也不知道我要说什么。 起因是这样的: 我在将服务器换到云服务器之后,后知后觉地发现服务器水管太细,图片加载实在太慢,于是使用了七牛CDN来加速图片加载。在WordPress端我选择了WPJAM插件来方便管理。 有一天我无聊 ...
KeJun
Publish: 2017 六月 2日 4:00:00 下午
Windows 无痛运行 Jekyll 3?
jekyll install windows 一键安装 .bat 
在windows上运行ruby也是相当麻烦的,安装各种出错…但是win10 、jekyll3之后官方起码有了在bash下安装的教程。
KeJun
Publish: 2017 五月 31日 4:00:00 下午
MDN JavaScript阅读计划(1)
javascript mdn reading 
JavaScript document reading plan 1.