Service Worker 实践

Service Worker 的生命周期

Service Worker 脚本通过 navigator.serviceWorker.register 方法注册到页面,之后可以脱离页面在浏览器后台运行:

1
2
3
4
5
6
7
8
9
10
if (navigator.serviceWorker) {
navigator.serviceWorker.register('/service-worker.js')
.then(function(registration) {
console.log('service worker 注册成功');
})
.catch(function (err) {
console.log('servcie worker 注册失败');
});
}

出于安全原因, Service Worker 脚本的作用范围不能超出脚本文件所在的路径。比如地址是 /sw-test/sw.js 的脚本只能控制 /sw-test/ 下的页面。

Service Worker 从注册开始需要先 install, 如果 install 成功, 接下来需要 activate, 然后才能接管页面。但是如果页面被先前的 Service Worker 控制着, 那么它会停留在 installed(waiting) 这个阶段等到页面重新打开才会接管页面, 或者可以通过调用 self.skipWaiting() 方法跳过等待。所以一个 Service Worker 脚本的生命周期有这样一些阶段(从左往右):

浏览器的协商缓存与强缓存

什么是浏览器缓存

浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。

浏览器缓存的优点有:

  1. 减少了冗余的数据传输,节省了网费

  2. 减少了服务器的负担,大大提升了网站的性能

  3. 加快了客户端加载网页的速度

Shell 命令笔记

find 命令 rm 删除某目录下所有子目录中的某类文件

1
2
3
4
find . -name "test.file" -exec rm -rf {} \;
# or
find . -name "test.file" | xargs rm -rf;

解决 Mac XAMPP Mysql 无法启动问题

1
2
3
ps -ef | grep mysqld # 得到相应进程 PID
sudo kill PID
sudo /Applications/XAMPP/xamppfiles/bin/mysql.server start

复制到剪贴板

1
pbcopy < ~/.ssh/id_rsa.pub

根据端口杀死进程 shell 脚本

1
2
3
4
5
# 查看端口号所使用的进程号
lsof -i:8080
# 杀死指定端口进程
kill -9 $pid

开发机 samba 安装指南

简介:Samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。

注意:要安装samba必须有 root 权限,没有权限可以找相关同学申请。

安装

  • 下载 samba-3.5.8.tar.gz 到 /home/work/(此处可以用自己指定 path)

    wget "http://hetu.baidu.com:80/api/tool/getFile?toolId=1145&fileId=925" -O "samba-3.5.8.tar.gz"

  • 解压 tar zxvf samba-3.5.8.tar.gz

  • 执行 cd samba-3.5.8/source3

  • 执行 ./configure && make -j 4

  • 执行 make install

ES6 Generator 介绍

定义生成器函数

在 ES6 中定义一个生成器函数很简单,在 function 后跟上「*」即可:

1
2
3
4
5
6
7
8
function* foo1() { };
function *foo2() { };
function * foo3() { };
foo1.toString(); // "function* foo1() { }"
foo2.toString(); // "function* foo2() { }"
foo3.toString(); // "function* foo3() { }"
foo1.constructor; // function GeneratorFunction() { [native code] }

调用生成器函数会产生一个生成器(generator)。生成器拥有的最重要的方法是 next(),用来迭代:

1
2
3
function* foo() { };
var bar = foo();
bar.next(); // Object {value: undefined, done: true}

Javascript this 解析

在 Javascript 里,函数被调用的时候,除了接受声明时定义的形式参数,每一个函数还接受两个附加的参数: this 和 arguments。随着函数使用场合的不同,this 的值会发生变化。但是有一个总的原则,那就是 this 指的是,调用函数的那个对象。

HTTP 消息结构

HTTP 是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。一个 HTTP “客户端”是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个 HTTP 的请求的目的。

SSL 证书简介

相关概念

SSL证书:在应用HTTPS之前,用户应先配置SSL证书。SSL证书是由证书授权中心(CA)签发的对用户公钥的认证。证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。

HTTPS:Hyper Text Transfer Protocol over Secure Socket Layer。HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。

SSL:Secure Sockets Layer。SSL是一个安全协议,它提供使用 TCP/IP 的通信应用程序间的隐私与完整性。因特网的超文本传输协议(HTTP)使用 SSL 来实现安全的通信。

TLS:Transport Layer Security Protocol。TLS是IETF制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。TLS也经常用SSL来指代。

Javascript 按位运算解析

1. 按位非 ~

对每一个比特位执行非(NOT)操作。NOT a 结果为 a 的反转(即反码)。

1
2
var num = ~4;
console.log(a); // -5

解析:

4 的二进制数为 100,补满32位

00000000000000000000000000000100

按位取反

11111111111111111111111111111011

由于32位开头第一个是 1,所以这是一个负数,将二进制转换成负数,需要先反码

00000000000000000000000000000100

之后,再+1

00000000000000000000000000000101

转换成十进制为 5,加上符号变成负数 -5

常用排序算法

快速排序

简介:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

实现

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  1. 从数列中挑出一个元素,称为 “基准”(pivot);

  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。