用尽各种手段,进一步将网站的传输开销缩短70%以上!
去年的一篇文章提到,把图片以及绝大部分的第三方JS和CSS文件转移到CDN加速服务上,源站的总传输大小从500多KB缩短到了110KB,大约节省了80%的传输开销。今天,我又进一步优化了整个网站,最终测试下,首页仅有33.3KB的数据来自于源站,相比之前的约110KB又进一步节省了70%的大小。
用尽各种手段,进一步将网站的传输开销缩短70%以上!
去年的一篇文章提到,把图片以及绝大部分的第三方JS和CSS文件转移到CDN加速服务上,源站的总传输大小从500多KB缩短到了110KB,大约节省了80%的传输开销。今天,我又进一步优化了整个网站,最终测试下,首页仅有33.3KB的数据来自于源站,相比之前的约110KB又进一步节省了70%的大小。
一个多月没写博客了,赶紧填个坑。
离上一篇博客居然已经过去一个多月啦,看来研究生还是要比本科忙多了,每天都有事情要做。最近呢,就是参加了昨天的Google Kickstart Round G 2018,本来顺利做完了2.5题,做完的时候有60名左右,结果有个大数据犯了一个低级错误,结果一个大数据挂了,最后只有100多名!啊!好气啊!看了一下题解,发现方法和我自己实现的方法差挺多的,所以想简单讲一下我的算法。
使用CDN和对象存储OSS来优化博客的访问速度
由于我的整个博客部署在GitHub Pages上,从国内直接打开的访问速度是很慢的。过慢的访问速度会使得用户在访问网站的时候失去耐心,导致有些用户可能会直接关闭你的网站,这就会使得网站的用户留存率降低。说句题外话,这就是为什么很多网站在设计进度条的时候并没有反映网站的真实访问速度,而是先给你一个很快的加载动画,让会让你产生好像网站就要加载好的错觉,在一定程度上能增加用户的耐心。这种手段除了应用在微信的网页进度条上,还包括比如一些清理软件设计的清理系统进度条上,还有之前Windows 7在文件浏览器中的文件扫描进度条上等等——好像说的有点远了。总之在这篇文章中,我会以我的Hexo博客为例,介绍一些优化网站访问速度的方法,这也是我在优化这个博客时使用的方法。
本文将通过一个故事带你了解CDN
B报纸是最近新发行的一种特殊的报纸、B报纸会在每周定期发布,并且不对外出售。在B报纸刚刚发行的时候由于读者太少,所以只有在W报社才能看到。此外,报社每次只会印刷少量的B报纸供阅览。小U平时很喜欢看B报纸,因此他会经常专门跑去报社看报纸。
在读者比较少的时候,这种办法相对奏效,但是当观看B报纸的人越来越多的时候,问题就出现了。第一,小U离报社很远,每次要看B报纸的时候,小U都要花好长时间的路程才能到报社。第二,由于看B报纸的人越来越多,有时印刷好的所有B报纸都已经被其他的用户拿去看了,小U这个时候必须要排队,并且等到有人看完之后才能看B报纸。
一个开源的评论系统,可惜已经不太维护了,于是我进行了一些简单的修改,并做好了Docker镜像。
我这两天还在寻找合适的评论系统,主要是因为当前可用的评论系统都不能满足基本的要求。我的基本要求其实也就两点,第一,可以通过邮箱直接评论,不需要注册。第二,在有人回复的时候可以发送邮件进行通知。同时,评论者被回复时也可以收到相应的通知。上一篇中提到的Valine勉强支持,可惜Valine在安全性上存在很大的问题。Livere总的来说还不错,但缺乏邮件提醒功能。最终,我还是使用了一个开源评论系统isso,并进行了一部分的调整,部署在了我自己的服务器上。我进行了一些修改,并已经做好了Docker镜像,可供直接拉取使用。
前几天还在说,使用Hexo搭建博客比较顺利,没什么大坑,后来就接二连三的遇到各种问题。
其实这些问题也不全是Hexo的原因,这些问题在搭建一个静态博客的时候都有可能遇到,不过还是能拿来讲讲,以供参考。Hexo的配置确实非常容易,这一点不可否认。只需要安装好Node.js
以及其他必要的依赖,按照官网提供的文档一步一步做就行了。我把博客部署在GitHub Pages
上,这样就省去了自己搭建服务器的成本,为了加快访问GitHub的速度,我配置了CDN和对象存储的优化,这在后续的博客中也会慢慢介绍。
心血来潮使用Hexo在GitHub上部署了一个Blog,总的来说还是挺容易的,没什么大坑。
记得搭博客最早在高三的时候就试过了,那个时候是在新浪云(SAE)上面搭了一个WordPress,其实现在看来感觉WordPress过于臃肿,不适合做随便写写的那种博客。但那个时候WordPress的宣传语好像是,不用敲一行代码就能搭一个个人博客。Emmmm,要知道那个时候我才刚开始写C和C++,成天面对黑底白字的控制台的时候突然告诉我,现在可以一句代码都不写,直接搭一个个人的博客了,还是很有吸引力的。
使用PyTorch的一些笔记,以防写完就忘,看完API又想起来,长此以往。
LSTM中的hidden state
其实就是指每一个LSTM cell的输出,而cell state
则是每次传递到下一层的「长时记忆」,我总觉得这个名字起的特别别扭,所以总不能很好的理解。下面这张图能更好的说明这些变量的意义。
再来简单的回顾一下LSTM的几个公式
其中$h_t$和$c_t$就是所谓的hidden state
和cell state
了。可以看到LSTM中所谓的output gate
,即$o_t$其实是中间状态,它和cell state
经过$\tanh$相乘,得到了hidden state
,也就是输出值。
PyTorch中LSTM的输出结果是一个二元组套二元组(output, (h_n, c_n))
。第一个output
是每一个timestamp的输出,也就是每一个cell的hidden state
。第二个输出是一个二元组,分别表示最后一个timestamp的hidden state
和cell state
。因此,如果把h_n
和c_n
记录下来,就可以保留整个LSTM的状态了。
PyTorch中可以通过bidirectional=True
来方便的将LSTM设置为双向,此时output
会自动把每一个timestamp的正向和反向LSTM拼在一起。而h_n
和c_n
的第一维长度会变为2(单向是长度为1)。而且此时有
即正向output
的最后一个timestemp(对应LSTM的最后一个cell)的输出和正向的hidden state
相同,反向output
的最后一个timestamp(对应LSTM的第一个cell)的输出和反向的hidden state
相同。
此外,在PyTorch中,LSTM输出的形状和别的框架不太一样,它是序列长度优先的,(seq_len, batch_size, hz),如果觉得不习惯,可以通过batch_first=True
来设定为batch_size
优先。
总结一下<algorithm>头文件中的常用函数。
每隔一段时间,我总能在<algorithm>中发现一些神奇的函数,这些函数我之前基本上没有听说过,所以最近我阅读了一下algorithm头文件的相关文档,把那些很实用,但是之前没怎么听说过的函数简单的罗列一下。我主要阅读的文档来自DevDocs上的algorithm头文件介绍,此外Visual C++也有类似的文档供参考。
1 | void sort(RandomIt first, RandomIt last); // 排序 |