0%

起因

一般家庭内受房间布局影响,通常都会在房间的几个角落布置多个Wi-Fi设备。真难想象,如果每个Wi-Fi设备相互独立工作,需要忍受着信号差时需要手动切换Wi-Fi信号的痛苦。

有一种概念叫无线漫游,当网络环境存在多个相同SSID的AP,且它们的微单元互相有一定范围的重合时,无线用户可以在整个WLAN覆盖区内移动,无线网卡能够自动发现附近信号强度最大的AP,并通过这个AP收发数据,保持不间断的网络连接,这就称为无线漫游。

华为路由器(荣耀路由2),它自带Bridge(AP)模式,这个模式非常棒,每个无线Wi-Fi信号源都设置相同的信号名称、相同的频段、相同的密码等全部相同的信号设置情况下,全屋就可以享受统一的Wi-Fi接入!再也不用忍受手动切换信号的痛苦了。然而华为路由器本身带有mesh功能,多个同类型路由器之间可以无缝切换。家用路由器几个型号不一致,无法享受mesh功能做无缝切换,只能算做“快速漫游”。

快速漫游虽然可以通过同名Wi-Fi起到快速切换的作用,但可能会造成IP地址切换、网络断开重连。因此需要在上级路由器中绑定Mac地址为静态IP分配,保证在信号切换后IP地址不变。

阅读全文 »

博客支持CodePen的方法

https://www.npmjs.com/package/hexo-codepen

1
npm i -D hexo-codepen

然后在Markdown中嵌入

1
{% codepen userId|anonymous|anon slugHash theme [defaultTab [height [width]]] %}

在CodePen编辑器右下角Embed按钮弹开后,复制HTML代码如:

1
2
3
4
5
6
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="alphaqiu" data-slug-hash="MWwVzar" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="水平垂直居中/Loading mask">
<span>See the Pen <a href="https://codepen.io/alphaqiu/pen/MWwVzar">
水平垂直居中/Loading mask</a> by alphaqiu (<a href="https://codepen.io/alphaqiu">@alphaqiu</a>)
on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

p🏷️标签里对应的参数填到潜入代码对应位置:

1
{% codepen alphaqiu MWwVzar dark "result" 500 %}

水平和垂直居中

Webpack脚手架

学习以来,对Webpack有所理解。对于前端开发来说,他在开发过程中需要关注jscssassets等相关资源。这些内容分别分散在各个目录下。Webpack把他们统一视作资源,在开发过程中通过import或者其他形式关联起来,并进行加工处理。可以减少前端开发的精力。

下面就对环境的搭建逐一拆解。

初始化空项目

基础环境的构建依赖Nodejs。我们通过npm来构建一个项目。

1
2
mkdir my-project && cd my-project
npm init -y

通过npm init -y来简单的创建一个package.json。需要简单修改一下其中的内容:

1
2
"private": true,
-- 删除 "main": "index.js"

private为私有项目,不至于后续误操作上传到npm网站。

这是个web前端项目,所以入口程序不必提供。

初始化Webpack环境

1
npm install -D webpack webpack-cli

💡关于npm install参数

npm install -D 等同于 --save-dev
npm install -S 等同于 —save
npm install -O 等同于 --save-optional
当你为你的模块安装一个依赖模块时,正常情况下你得先安装他们

(在模块根目录下npm install module-name),

然后连同版本号手动将他们添加到模块配置文件package.json中的依赖里(dependencies)。

--save--save-dev可以省掉你手动修改package.json文件的步骤。
spm install module-name -save 自动把模块和版本号添加到dependencies部分
spm install module-name -save-dve 自动把模块和版本号添加到devdependencies部分

至于配置文件区分这俩部分, 是用于区别开发依赖模块和产品依赖模块, 以我见过的情况来看 devDepandencies主要是配置测试框架, 例如jshint、mocha。

通过这些命令,我们会得到一个新的package.json。然后再做一个试验就懂得了区别:

删除node_modules目录,然后执行
npm install —production,可以看到,npm只帮我们自动安装package.json中dependencies部分的模块;如果执行npm install ,则package.json中指定的dependencies和devDependencies都会被自动安装进来。

可以上官方网站查看具体使用说明:https://webpack.docschina.org/guides/installation/

阅读全文 »

转载:https://mp.weixin.qq.com/s/ihJFa5Wir4ohhZUXVSBvMQ

怎么让我们的系统更快

随着信息技术的迅速发展,单台服务器处理能力越来越强,迫使编程模式由从前的串行模式升级到并发模型。

并发模型包含 IO 多路复用、多进程以及多线程,这几种模型都各有优劣,现代复杂的高并发架构大多是几种模型协同使用,不同场景应用不同模型,扬长避短,发挥服务器的最大性能。

多线程,因为其轻量和易用,成为并发编程中使用频率最高的并发模型,包括后衍生的协程等其他子产品,也都基于它。

并发 ≠ 并行

并发 (concurrency) 和 并行 ( parallelism) 是不同的。

在单个 CPU 核上,线程通过时间片或者让出控制权来实现任务切换,达到 “同时” 运行多个任务的目的,这就是所谓的并发。但实际上任何时刻都只有一个任务被执行,其他任务通过某种算法来排队。

多核 CPU 可以让同一进程内的 “多个线程” 做到真正意义上的同时运行,这才是并行。

进程、线程、协程

进程:进程是系统进行资源分配的基本单位,有独立的内存空间。

线程:线程是 CPU 调度和分派的基本单位,线程依附于进程存在,每个线程会共享父进程的资源。

协程:协程是一种用户态的轻量级线程,协程的调度完全由用户控制,协程间切换只需要保存任务的上下文,没有内核的开销。

线程上下文切换

由于中断处理,多任务处理,用户态切换等原因会导致 CPU 从一个线程切换到另一个线程,切换过程需要保存当前进程的状态并恢复另一个进程的状态。

上下文切换的代价是高昂的,因为在核心上交换线程会花费很多时间。上下文切换的延迟取决于不同的因素,大概在在 50 到 100 纳秒之间。考虑到硬件平均在每个核心上每纳秒执行 12 条指令,那么一次上下文切换可能会花费 600 到 1200 条指令的延迟时间。实际上,上下文切换占用了大量程序执行指令的时间。

如果存在跨核上下文切换(Cross-Core Context Switch),可能会导致 CPU 缓存失效(CPU 从缓存访问数据的成本大约 3 到 40 个时钟周期,从主存访问数据的成本大约 100 到 300 个时钟周期),这种场景的切换成本会更加昂贵。

Golang 为并发而生

Golang 从 2009 年正式发布以来,依靠其极高运行速度和高效的开发效率,迅速占据市场份额。Golang 从语言级别支持并发,通过轻量级协程 Goroutine 来实现程序并发运行。

Goroutine 非常轻量,主要体现在以下两个方面:

上下文切换代价小: Goroutine 上下文切换只涉及到三个寄存器(PC / SP / DX)的值修改;而对比线程的上下文切换则需要涉及模式切换(从用户态切换到内核态)、以及 16 个寄存器、PC、SP…等寄存器的刷新;

内存占用少:线程栈空间通常是 2M,Goroutine 栈空间最小 2K;

Golang 程序中可以轻松支持10w 级别的 Goroutine 运行,而线程数量达到 1k 时,内存占用就已经达到 2G。

阅读全文 »

原文档出处:https://www.kancloud.cn/chase688/orange_framework/1448035

平滑重启是指能让我们的程序在重启的过程不中断服务,新老进程无缝衔接,实现零停机时间(Zero-Downtime)部署;平滑重启是建立在优雅退出的基础之上的,目前实现平滑重启的主要策略有两种:

方案一:我们的服务如果是多机器部署,可以通过网关程序,将即将重启服务的机器从网关下线,重启完成后再重新上线,该方案适合多机器部署的企业级应用;

方案二:让我们的程序实现自启动,重启子进程来实现平滑重启,核心策略是通过拷贝文件描述符实现子进程和父进程切换,适合单机器部署应用;

今天我们就主要介绍方案二,让我们的程序拥有平滑重启的功能,相关实现参考一个开源库:

https://github.com/fvbock/endless

阅读全文 »

【转载】https://diamondfsd.com/lets-encrytp-hand-https/

Let’s Encrypt 简介

如果要启用HTTPS,我们就需要从证书授权机构(以下简称CA) 处获取一个证书,Let’s Encrypt 就是一个 CA。我们可以从 Let’s Encrypt 获得网站域名的免费的证书。这篇文章也主要讲的是通过 Let’s Encrypt + Nginx 来让网站升级到HTTPS。

Certbot 简介

Certbot 是Let’s Encrypt官方推荐的获取证书的客户端,可以帮我们获取免费的Let’s Encrypt 证书。Certbot 是支持所有 Unix 内核的操作系统的,个人博客的服务器系统是CentOS 7,这篇教程也是通过在个人博客上启用HTTPS的基础上完成的。

获取免费证书

  1. 安装Certbot客户端

    1
    yum install certbot
  2. 获取证书

    1
    certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com

    这个命令会为 example.com 和 www.example.com 这两个域名生成一个证书,使用 --webroot 模式会在 /var/www/example 中创建 .well-known 文件夹,这个文件夹里面包含了一些验证文件,certbot 会通过访问 example.com/.well-known/acme-challenge 来验证你的域名是否绑定的这个服务器。这个命令在大多数情况下都可以满足需求,

但是有些时候我们的一些服务并没有根目录,例如一些微服务,这时候使用 --webroot 就走不通了。certbot 还有另外一种模式 --standalone , 这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。我们有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。

1
certbot certonly --standalone -d example.com -d www.example.com

证书生成完毕后,我们可以在 /etc/letsencrypt/live/ 目录下看到对应域名的文件夹,里面存放了指向证书的一些快捷方式。

这时候我们的第一生成证书已经完成了,接下来就是配置我们的web服务器,启用HTTPS。

阅读全文 »

助记词的实现

fork了人家的源码,在此基础上增加了实用功能,保证通过助记词恢复和对助记词的校验。

https://github.com/alphaqiu/mnemonic

BIP39是助记词标准的实现,助记词是一个随机数的字序列,用来作为种子产生一个确定性的钱包。单词序列足以重新创建种子,然后再创建钱包和所有派生的密钥。一个实现带有助记词的确定性钱包应用程序在首次创建钱包时将向用户显示12到24个单词的序列。该单词序列是钱包备份,可用于恢复和重新创建相同或任何兼容的钱包应用程序中的所有密钥。记忆单词使用户更容易备份钱包,因为与随机数字序列相比,它们易于阅读和正确地转录。所有的助记词在这里可以查看:助记词词库。

使用BIP39中定义的标准化过程,钱包自动生成助记词。钱包从一个熵源开始,添加一个校验和,然后将熵映射到一个单词列表,具体步骤如下:

  1. 创建128到256位的随机序列(熵)。
  2. 通过获取SHA256哈希的第一(熵长度/ 32)位来创建随机序列的校验和。
  3. 将校验和添加到随机序列的末尾。
  4. 将序列分成11位的部分。
  5. 将每个11位值映射到来自2048个单词的预定义字典中的单词。
  6. 助记词是单词序列。 生成助记词的步骤如下图。
阅读全文 »

​ 2019年1月11日消息,谷歌加密研究人员称将发布一款工具,目的是让用户能够更安全的上网。本周一,谷歌密码学家Filippo Valsorda表示,他已经快完成一项名为mkcert的开源项目,该项目允许开发者在本地部署HTTPS测试环境。

  现在,大多数网络流量通过HTTPS传输,且用户对浏览器功能安全性期望望越来越高,这就需要开发人员在HTTPS环境中创建和测试应用程序。而这样做就需要开发者在本地安装TLS/SSL证书,部署HTTPS环境,但实际操作起来并不那么简单,需要开发人员先生成自签名证书再进行安装,整个过较为程繁琐也容易出错。

  mkcert则是一个让网站通过自动发布证书和安装来处理HTTPS流量的工具。Valsorda介绍称,通过不安全的HTTP环境测试Web应用程序,可能会掩盖HTTP 和HTTPS混合内容问题,而这些问题可能降低站点的安全性。

  据称,mkcert是一个简单的设计工具,它隐藏了生成有效TLS证书所需的难懂知识,并且适用于包括本地主机在内的任何主机名或IP。mkcert并不是创建自签名证书,而是生成由用户的私有证书颁发机构(CA)签名的证书,并计算机在运行时会自动配置为证书可信任状态。因此,当您的浏览器加载由您的mkcert实例生成的证书时,它将显示绿色锁!

  mkcert适用的系统包括Linux、macOS、 Windows,同时支持Firefox、 Chrome和Chromium。通过一些额外的步骤,该工具还可以支持Android和iOS系统。

mkcert地址: https://github.com/FiloSottile/mkcert

mkcert是由谷歌的Filippo Valsorda使用Golang开发的一个开源工具,使用非常简单,不需要进行任何配置,就可以生成任何你喜欢的域名的本地可信赖的开发证书。

这个开源库不仅展示了生成证书的用法,也展示了在各个平台上调用证书导入的办法。值得学习。

阅读全文 »

转载至 https://www.jianshu.com/p/7fadd5c722c1

出现 UNTRUSTED_CERT_TITLE原因在于系统时间太旧,只要将待重装的机器系统时间调整至当前时间即可。

Step1

首先打开MacBook,按下电源按钮后,下一步就是按住⌘ + R.

Step2

1.接下来你要做的就是去Utilities然后点击Terminal。

img

2.命令行输入 date

如果您收到 UNTRUSTED_CERT_TITLE 错误,则可能会看到一个非常旧的日期。比如31/12/2017

3.然后只需要在命令行输入 当前日期 date MMDDHHMMYY

注: M=Month, D=Day, H=Hour in 24-hour notation, M=Minute and Y=年份后两位.

Step3

退出命令行, 重新启动,按住 ⌘+R 再选择重新安装macOS就OK了。