blog icon indicating copy to clipboard operation
blog copied to clipboard

📝 My blog / notes

Results 86 blog issues
Sort by recently updated
recently updated
newest added

## 绝对路径 相对路径 绝对路径: /path 我们经常在终端输入命令`pwd` 然后可以看当前文件夹路径,比如`/Users/Documents/someFolder `,这就是一个绝对路径 相对路径: path 或者./path 或者 ../path `代码示例` ```js fs.writeFile('/Users/absolute.js', ‘this is a absolute path', () => {}); fs.writeFile('Users/relative.js', ’this is a relative path',...

js
nodejs

### 显示类型转换 尽管JavaScript可以自动做许多类型转换, 但有时仍需要做显式转换, 或者为了使代码变 得清晰易读而做显式转换。 做显式类型转换最简单的方法就是使用Boolean()、Number()、String()或Object()函 数。 ```js Number( "3“ ) // 3 String(false) // "false" 或使用false.toString() Object(3) // Number(3) Boolean([]) // true Boolean('') // false ``` 这边拿Boolean([]) 和Boolean('')...

js

## 输入地址,解析域名,获取ip地址 当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上每个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询。这能使浏览器获得请求对应的IP地址。 ## 发起TCP的连接请求 浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。 `三次握手`:发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后, 回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发 送端再回传一个带 ACK 标志的数据包,代表“握手”结束。若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发 送相同的数据包。 ![image](https://user-images.githubusercontent.com/24861316/37328789-6004f3fc-26d6-11e8-9756-6558974e6cda.png) `四次挥手`:包括一个结束报文,一个应答报文,一个结束报文,一个应答报文。跟三次握手比起来就是同步-应答报文是放一起的,而`四次挥手应答报文,结束报文是分开的。 ![image](https://user-images.githubusercontent.com/24861316/37328581-a3bf3e0a-26d5-11e8-82b0-776ed1f35e24.png) ## 发起http请求 一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTP的GET请求 。远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态表示一个正确的响应。 此时,Web服务器提供资源服务,客户端开始下载资源。 请求返回后,便进入了我们关注的前端模块 ## 页面渲染 ![image](https://user-images.githubusercontent.com/24861316/37328015-89a7c908-26d3-11e8-8ef0-a09dedeae976.png)...

http

优化方向 | 优化手段 -- | -- 请求数量 | 合并脚本和样式表,CSS Sprites,按需加载资源,简化页面的设计 请求带宽 | 开启GZip,压缩JavaScript和CSS ,移除重复脚本,图像优化 缓存利用 | 使用CDN,使用外部JavaScript和CSS,添加Expires头,配置ETag,减少DNS查找,使AjaX可缓存 页面结构 | 将样式表放在顶部,将脚本放在底部,尽早刷新文档的输出 代码校验 | 避免重定向 ## 减少HTTP请求 ### 合并脚本和样式表(模块打包) 模块打包(合并文件)是通过合并所有脚本文件成单一脚本以及合并所有样式成单一样式表的方式来减少HTTP请求数目。 ### CSS...

http

### 对称加密: 加密和解密同用一个密钥(共享密钥加密) 以共享密钥方式加密时必须将密钥也发给对方。在互联网上转发密钥时,如果通信被监听那么密钥 就可会落入攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的密钥。 ### 非对称加密: 使用公钥和私钥两把密钥(公开密钥加密) 使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。 利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。 ![image](https://user-images.githubusercontent.com/24861316/74150334-a3558780-4c44-11ea-9b88-148b003ec8ee.png) 但公开密钥加密方式仍有个不足:无法证明公开密钥本身就是货真价实的公开密钥,比如正准备和某台服务器建立公开密钥加密方式下的通信时,或许在公开密钥传输途中,那台服务器发行的公开密钥已经被攻击者替换掉了。 解决:用证明公开密钥正确性的证书ssl (+http => https) ### ssl ![image](https://user-images.githubusercontent.com/24861316/74150978-1b707d00-4c46-11ea-8f85-e6c83bf625c4.png) ### reference 《图解HTTP》

http

讲Json web token 之前先来了解下什么是token,因为jwt本质就是一个token ### 什么token token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库 ### 什么是JSON Web Token JSON web Token,简称JWT,本质是一个token,是一种紧凑的URL安全方法,用于在网络通信的双方之间传递。一般放在HTTP的headers 参数里面的authorization里面,值的前面加Bearer关键字和空格。除此之外,也可以在url和request body中传递。 ### JSON Web Token的组成 一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名依顺序用点号(".")链接而成:1.header,2.payload,3.signature。 #### 头部(Header)里面说明类型和使用的算法,比如: ```json { "alg": "HS256", "typ": "JWT" }...

http

1. ![image](https://user-images.githubusercontent.com/24861316/44557932-d7e53300-a773-11e8-9ad6-0a4ed1c1d5a0.png) ![image](https://user-images.githubusercontent.com/24861316/44558291-e7657b80-a775-11e8-9fd9-fca5a8d710d7.png) 背景:这是在修个bug,externalViewEntity是一个component(B)的prop,是一个function,这个component(B)里面会有`if(externalViewEntity){}` 这样的判断逻辑,但原先被传进去的参数是`() => externalViewEntity && externalViewEntity(this.props.call)` ,无论其中externalViewEntity是否存在,这个参数都是一个存在的function,导致后面`if(externalViewEntity){#永远会进来这边} ` 。 本来是改成`externalViewEntity={externalViewEntity && () => externalViewEntity(this.props.call)}`,这样虽然bug解决了,但是其实因为一直有个function去return出 externalViewEntity(this.props.call),当组件其他state改变了,react会因为`() => externalViewEntity(this.props.call)}`而对这个组件做执行判断,造成性能浪费。 更优解决办法是在render外面写个`externalViewEntity = () => this.props.externalViewEntity(this.props.call);` ,用`this.externalViewEntity`去调用。

## 背景 想要在centos 服务器中穿件git服务器,方便在本地(mac) curd云服务器上的repo ## 步骤 ### 在centos云服务器上安装git yum install -y git ### 在你想要的repo中初始化git git init ![image](https://user-images.githubusercontent.com/24861316/72666166-a34dd780-3a4a-11ea-9846-4e8ab0382368.png) 红框部分的路径是git路径,clone指令会用到 ### 在你电脑尝试clone刚才的git repo git clone root@{你的服务器ip}:/root/ghchat-prod/.git/ 输入服务器密码 克隆成功

开发小记

## 栈 ![image](https://user-images.githubusercontent.com/24861316/72666111-fe32ff00-3a49-11ea-8be8-0d4098180a62.png) 后进先出 ## 调用栈 ### 示例代码 ```py def greet(name): print "hello, " + name + "!" greet2(name) print "getting ready to say bye..." bye() def greet2(name): print "how...

阅读笔记

# 为啥需要装饰者模式 在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责。那么我们就可以使用装饰者模式。装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象。装饰者模式能够在不改变对象自身的基础上,在程序运行期间给对象 动态地添加职责。 在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题 1. 会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之改变; 2. 继承这种功能复用方式通常被称为“白箱复用”,“白箱”是相对可见性而言的, 在继承方式中,超类的内部细节是对子类可见的,继承常常被认为破坏了封装性。 3. 在完成一些功能复用的同时,有可能创建出大量的子类, 使子类的数量呈爆炸性增长。比如有4种型号的自行车,每种自行车都是一个单独的类,给每种自行车都装上前灯、尾 灯和铃铛这 3 种配件(三个类),那就要继承这个三个类。每个自行车类要继承三次配件类,最后就产生4 * 3 = 12个类。但是如果把前灯、尾灯、铃铛这些对象动态组 合到自行车上面,则只需要额外增加 3 个类。 ```js // 原始的飞机类 const Plane =...

阅读笔记