<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[oneofprogrammer的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/oneofprogrammer</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; oneofprogrammer]]></copyright><item><title><![CDATA[Nginx的学习]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/110340265</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/110340265</guid><author>oneofprogrammer</author><pubDate>Sun, 29 Nov 2020 17:39:31 +0800</pubDate><description><![CDATA[什么是Nginx

“Nginx 是一款轻量级的 HTTP 服务器，采用事件驱动的异步非阻塞处理方式框架，这让其具有极好的 IO 性能，时常用于服务端的反向代理和负载均衡。”

windows安装Nginx
1.在官网http://nginx.org/en/download.html 下载喜欢的windows版本
2.解压压缩包
3.添加对应解压后的文件夹路径进系统变量
4.命令行运行nginx, 在浏览器打开localhost:80，效果如下：

nginx启动、热重启、关闭以及测试配置的命令如下
# 启]]></description><category></category></item><item><title><![CDATA[redis初学习]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/110339595</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/110339595</guid><author>oneofprogrammer</author><pubDate>Sun, 29 Nov 2020 17:36:48 +0800</pubDate><description><![CDATA[redis是什么
Redis是C语言开发的一个开源的（遵从BSD协议）高性能键值对（key-value）的内存数据库，可以用作数据库、缓存、消息中间件等。它是一种NoSQL（not-only sql，泛指非关系型数据库）的数据库。
redis优点
1、性能优秀，数据在内存中，读写速度非常快，支持并发10W QPS；
2、单进程单线程，是线程安全的，采用IO多路复用机制；
3、丰富的数据类型，支持字符串（strings）、散列（hashes）、列表（lists）、集合（sets）、有序集合（sorted se]]></description><category></category></item><item><title><![CDATA[ES6第十九章Generator函数异步应用]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/107735741</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/107735741</guid><author>oneofprogrammer</author><pubDate>Sun, 02 Aug 2020 18:07:02 +0800</pubDate><description><![CDATA[为什么使用Generator?
如果依次读取两个以上的文件，就会出现多重嵌套。代码不是纵向发展，而是横向发展，很快就会乱成一团，无法管理。因为多个异步操作形成了强耦合，只要有一个操作需要修改，它的上层回调函数和下层回调函数，可能都要跟着修改。这种情况就称为"回调函数地狱"（callback hell）。
Generator的执行情况
function* gen(x) {
  var y = yield x + 2;
  return y;
}

var g = gen(1);
g.next() // { v]]></description><category></category></item><item><title><![CDATA[ES6第二十章async函数学习笔记]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/107748445</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/107748445</guid><author>oneofprogrammer</author><pubDate>Sun, 02 Aug 2020 18:05:33 +0800</pubDate><description><![CDATA[什么是async函数
一句话，它就是 Generator 函数的语法糖。

async函数就是将 Generator 函数的星号（*）替换成async，将yield替换成await，仅此而已。

async的基本用法
async函数返回一个 Promise 对象，可以使用then方法添加回调函数。当函数执行的时候，一旦遇到await就会先返回，等到异步操作完成，再接着执行函数体内后面的语句。
async 函数有多种使用形式。
// 函数声明
async function foo() {}

// 函数表达式]]></description><category></category></item><item><title><![CDATA[Generator 学习笔记]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/106409660</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/106409660</guid><author>oneofprogrammer</author><pubDate>Thu, 28 May 2020 17:29:33 +0800</pubDate><description><![CDATA[Generator是什么
1.语法上，首先可以把它理解成，Generator 函数是一个状态机，封装了多个内部状态。
2.执行 Generator 函数会返回一个遍历器对象，也就是说，Generator 函数除了状态机，还是一个遍历器对象生成函数。返回的遍历器对象，可以依次遍历 Generator 函数内部的每一个状态。
Generator长什么样子
形式上，Generator 函数是一个普通函数，但是有两个特征。一是，function关键字与函数名之间有一个星号；二是，函数体内部使用yield表达式，定义]]></description><category></category></item><item><title><![CDATA[Iterator 的学习笔记]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/106409612</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/106409612</guid><author>oneofprogrammer</author><pubDate>Thu, 28 May 2020 17:28:15 +0800</pubDate><description><![CDATA[Iterator是什么
它是一种接口，为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口，就可以完成遍历操作（即依次处理该数据结构的所有成员）。
Iterator的作用
一是为各种数据结构，提供一个统一的、简便的访问接口；
二是使得数据结构的成员能够按某种次序排列；
三是 ES6 创造了一种新的遍历命令for...of循环，Iterator 接口主要供for...of消费。
Iterator 的遍历过程
（1）创建一个指针对象，指向当前数据结构的起始位置。也就是说，遍历器对]]></description><category></category></item><item><title><![CDATA[Eventloop 学习总结]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/106290092</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/106290092</guid><author>oneofprogrammer</author><pubDate>Fri, 22 May 2020 20:06:09 +0800</pubDate><description><![CDATA[产生背景
javascript从诞生之日起就是一门单线程的非阻塞的脚本语言。这是由其最初的用途来决定的：与浏览器交互。
单线程意味着，javascript代码在执行的任何时候，都只有一个主线程来处理所有的任务。
而非阻塞则是当代码需要进行一项异步任务（无法立刻返回结果，需要花一定时间才能返回的任务，如I/O事件）的时候，主线程会挂起（pending）这个任务，然后在异步任务返回结果的时候再根据一定规则去执行相应的回调。
单线程是必要的，也是javascript这门语言的基石，原因之一在其最初也是最主要的执行]]></description><category></category></item><item><title><![CDATA[Reflect 学习笔记]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/106178125</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/106178125</guid><author>oneofprogrammer</author><pubDate>Sun, 17 May 2020 17:56:38 +0800</pubDate><description><![CDATA[为什么要用Reflect

如果你看过Reflect的一些函数，你就会发现，这个对象上的方法基本上都可以从Object上面找到，找不到的那些，也是可以通过对对象命令式的操作去实现的；那么为什么还要新添加一个呢？

1：Reflect上面的一些方法并不是专门为对象设计的，比如Reflect.apply方法，它的参数是一个函数，如果使用Object.apply(func)会让人感觉很奇怪。
2：用一个单一的全局对象去存储这些方法，能够保持其它的JavaScript代码的整洁、干净。不然的话，这些方法可能是全局的]]></description><category></category></item><item><title><![CDATA[图解HTTP 第二，三章学习总结]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/104072020</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/104072020</guid><author>oneofprogrammer</author><pubDate>Wed, 22 Jan 2020 19:11:47 +0800</pubDate><description><![CDATA[HTTP的作用
HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同，用于客户端和服务器之间的通信。

在两台计算机之间使用 HTTP 协议通信时，在一条通信线路上必定有
一端是客户端，另一端则是服务器端。

通过请求和响应的交换达成通信

请求报文
GET /index.htm HTTP/1.1
Host: hackr.jp

起始行开头的GET表示请求访问服务器的类型，称为方法（met...]]></description><category></category></item><item><title><![CDATA[OAuth授权码的学习总结]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/101119631</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/101119631</guid><author>oneofprogrammer</author><pubDate>Sat, 21 Sep 2019 21:05:18 +0800</pubDate><description><![CDATA[OAuth 2.0 规定了四种获得令牌的流程。

授权码（authorization-code）
隐藏式（implicit）
密码式（password）
客户端凭证（client credentials）

第一种授权方式：授权码


应用场景：有后端的 Web 应用。


好处：这种方式是最常用的流程，安全性也最高，授权码通过前端传送，令牌则是储存在后端，而且所有与资源服务器的通信都在后端完成。...]]></description><category></category></item><item><title><![CDATA[es6第六章学习]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/100997697</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/100997697</guid><author>oneofprogrammer</author><pubDate>Wed, 18 Sep 2019 20:49:50 +0800</pubDate><description><![CDATA[1.RegExp 构造函数
如果RegExp构造函数第一个参数是一个正则对象，那么可以使用第二个参数指定修饰符。而且，返回的正则表达式会忽略原有的正则表达式的修饰符，只使用新指定的修饰符。

new RegExp(/abc/ig, 'i').flags
// "i"


上面代码中，原有正则对象的修饰符是ig，它会被第二个参数i覆盖。
2.字符串的正则方法
字符串对象共有 4 个方法，可以使用正则...]]></description><category></category></item><item><title><![CDATA[ECMAScript6第五章字符串处理方法扩展学习笔记]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/98784861</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/98784861</guid><author>oneofprogrammer</author><pubDate>Wed, 07 Aug 2019 21:14:44 +0800</pubDate><description><![CDATA[String.fromCodePoint()
ES6 提供了String.fromCodePoint()方法，可以识别大于0xFFFF的字符
String.fromCodePoint(0x20BB7)
// "]]></description><category></category></item><item><title><![CDATA[ECMASCript6 第四章 字符串的扩展]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/97618776</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/97618776</guid><author>oneofprogrammer</author><pubDate>Sun, 28 Jul 2019 20:14:08 +0800</pubDate><description><![CDATA[1.字符的 Unicode 表示法
单字节表示时：
允许采用\uxxxx形式表示一个字符，其中xxxx表示字符的 Unicode 码点。

这种表示法只限于码点在\u0000~\uFFFF之间的字符。

超出这个范围的字符，必须用两个双字节的形式表示。\uxxxx\uxxxx.

只要将码点放入大括号，就能正确解读该字符。
"\u{20BB7}"
// "]]></description><category></category></item><item><title><![CDATA[egg中间件middleware学习笔记]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/95656792</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/95656792</guid><author>oneofprogrammer</author><pubDate>Fri, 12 Jul 2019 20:22:04 +0800</pubDate><description><![CDATA[配置
中间件是一个放置在 app/middleware 目录下的单独文件，它需要 exports 一个普通的 function，接受两个参数：


options: 中间件的配置项，框架会将 app.config[${middlewareName}] 传递进来。


app: 当前应用 Application 的实例。


使用中间件
在 config.default.js中加入下面的配置就完成了...]]></description><category></category></item><item><title><![CDATA[koa框架初学习]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/90758076</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/90758076</guid><author>oneofprogrammer</author><pubDate>Mon, 03 Jun 2019 20:06:41 +0800</pubDate><description><![CDATA[koa框架使用配置工作


首先创建一个文件夹，然后初始化 package.json ：

npm init -y



安装koa2:



cnpm i koa --save

context对象
Koa 提供一个 Context对象，表示一次对话的上下文（包括 HTTP 请求和HTTP回复）。通过加工这个对象，就可以控制返回给用户的内容。

// demos/02.js
const Koa ...]]></description><category></category></item><item><title><![CDATA[express框架学习]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/90383639</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/90383639</guid><author>oneofprogrammer</author><pubDate>Mon, 20 May 2019 22:21:34 +0800</pubDate><description><![CDATA[express的安装

首先假定你已经安装了 Node.js，接下来为你的应用创建一个目录，然后进入此目录并将其作为当前工作目录。

 $ mkdir myapp
 $ cd myapp



通过 npm init 命令为你的应用创建一个 package.json 文件。

 $ npm init

此命令将要求你输入几个参数，例如此应用的名称和版本。 你可以直接按“回车”键接受大部分默认设置即...]]></description><category></category></item><item><title><![CDATA[变量的解构赋值]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/89366946</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/89366946</guid><author>oneofprogrammer</author><pubDate>Wed, 17 Apr 2019 22:49:32 +0800</pubDate><description><![CDATA[基本用法
以前，为变量赋值，只能直接指定值。
let a = 1;
let b = 2;
let c = 3;


ES6 允许写成下面这样。

let [a, b, c] = [1, 2, 3];


本质上，这种写法属于“模式匹配”，只要等号两边的模式相同，左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子。

let [foo, [[bar], baz]] = [1, [[2...]]></description><category></category></item><item><title><![CDATA[es6的let和const学习]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/89291236</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/89291236</guid><author>oneofprogrammer</author><pubDate>Sat, 13 Apr 2019 23:58:53 +0800</pubDate><description><![CDATA[let 命令
ES6 新增了let命令，用来声明变量。它的用法类似于var，但是所声明的变量，只在let命令所在的代码块内有效

{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1


上面代码在代码块之中，分别用let和var声明了两个变量。然后在代码块之外调用这两个变量，结果let声明的变量...]]></description><category></category></item><item><title><![CDATA[symbol学习]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/89160884</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/89160884</guid><author>oneofprogrammer</author><pubDate>Tue, 09 Apr 2019 20:25:32 +0800</pubDate><description><![CDATA[Symbol 引入的原因
ES5 的对象属性名都是字符串，这容易造成属性名的冲突。比如，你使用了一个他人提供的对象，但又想为这个对象添加新的方法（mixin 模式），新方法的名字就有可能与现有方法产生冲突。如果有一种机制，保证每个属性的名字都是独一无二的就好了，这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。
新一种数据类型
ES6 引入了一种新的原始数据类型Symbol，...]]></description><category></category></item><item><title><![CDATA[es6简单了解]]></title><link>https://blog.youkuaiyun.com/oneofprogrammer/article/details/88985997</link><guid>https://blog.youkuaiyun.com/oneofprogrammer/article/details/88985997</guid><author>oneofprogrammer</author><pubDate>Wed, 03 Apr 2019 03:11:49 +0800</pubDate><description><![CDATA[es6简单介绍微分享会会议总结

了解块级作用域
es5不允许块级作用域中定义函数，但es6可以
let const var 的区别


let局限在代码块中，其定义变量只有定义后才能使用


const定义的引用类型的值的地址不变，但是可以改变值


var定义的变量具有变量提升的作用


了解到解构赋值
了解解构赋值的语法，解构语法赋undefined的默认值条件
不懂的问题
无
对各环节的反...]]></description><category></category></item></channel></rss>