0%

敲黑板

vagrant 命令行报错 Encoding::UndefinedConversionError

使用 vagrant 命令时提示 process_builder.rb:44:in `encode!’: “\xE5” to UTF-8 in conversion from ASCII-8BIT to UTF-8 to UTF-16LE (Encoding::UndefinedConversionError)

本例使用的 vagrant 版本为 2.2.10, 安装目录:<br/> D:\HashiCorp\Vagrant\embedded\gems\2.2.10\gems\childprocess-4.0.0\lib\childprocess\windows\process_builder.rb 第 44 行

修改 newstr.encode!(‘UTF-16LE’) 为 <br/> newstr.encode!(‘UTF-16LE’, invalid: :replace, undef: :replace, replace: ‘?’) 参考连接

vagrant 自制 box 启动时 Authentication failure

  • vagrant 2.3.6
  • virtualBox 7.0.8
  • win 11

Authentication failure 是 ssh 登录证书错误, 但虚拟机已经启动完成

  • .ssh/authorized_keys.vagrant/machines/default/virtualbox/private_key 有变化(内容改动/文件存在)
1
2
3
4
5
6
7
8
9
10
11
12
13
...
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
...
阅读全文 »

shell 重置密码

  1. 开机按 e 键进入内核编辑
  2. 光标移动到倒数第二段 Linux16 末尾添加 init=/bin/sh
  3. ctrl + x 进行引导启动, 成功进入命令提示界面
  4. 输入 mount -o remount, rw / 挂载根目录
  5. 使用 passwd 命令修改指定用户密码
  6. 直到提示 passwd: all authentication tokens updated successfully.
  7. 输入 touch /.autorelabel 回车
  8. 输入 exec /sbin/init 回车重启系统

命令

  • export 导出全局变量
  • declare 声明变量
  • unset 删除变量
  • local 声明局部变量,一般用于函数内部
阅读全文 »

敲黑板

启动 nginx 失败

命令行提示错误 98: address already in use

查找系统进程中已存在的 nginx 进程号, 使用 kill -9 $PID 关闭进程后重启 nginx 服务

内置变量

  • $nginx_version nginx 版本

  • $connection_requests TCP 链接当前的请求数量

  • $proxy_protocol_addr 获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串

    阅读全文 »

敲黑板

  • Package docker-ce is not available, but is referred to by another package.

    如果提示未发现可用的 docker-ce 包时,检查系统镜像源是否正确(如果不能翻墙时, 使用国内的镜像源修改 /etc/apt/source.list)

  • Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json: dial unix /var/run/docker.sock: connect: permission denied

    执行 docker 相关命令时提示, 表示 docker 权限不足

    • 使用 sudo 命令运行 docker 命令

    • 将当前用户加入到 docker 组中

1
2
3
4
[root@localhost ~]# cat /etc/group | grep docker
docker:x:994:vagrant
[root@localhost ~]# cat /etc/gshadow | grep docker
docker:!::vagrant
1
2
3
4
5
6
7
8
9
10
groupadd docker # 添加 docker 用户组
gpasswd -a $USER docker # 添加登陆用户到 docker 用户组中
newgrp docker # 更新用户组
或者
usermod -aG docker $USER # 给用户添加一个新的附属组
newgrp docker # 重新登陆组

systemctl restart docker # 重启 docker 服务

systemctl enable docker # 设置 docker 守护进程开机启动
阅读全文 »

–no-sandbox –disable-web-security –user-data-dir=C:\chromedata

fetch() 表单上传时, 不能设置 Content-Type 头, 否则会丢失文件边界

浏览器引擎

浏览器 渲染引擎 js 引擎
IE Trident JScript(IE3.0-IE8.0) / Chakra(IE9~)
Chrome webkit / Blink V8
Safari webkit Nitro(SquirrelFish)
Firefox Gecko ~Monkey 系列(SpiderMonkey / TraceMonkey / JaegerMonkey / OdinMonkey)
Opera WebKit / Blink Carakan

改变原数组的方法

  • pop 从数组中删除最后一个元素,并返回该元素的值(数组为空时返回 undefined). 此方法更改数组的长度

    1
    arr.pop();
  • push 将一个或多个元素添加到数组的末尾, 并返回该数组的新长度

    1
    arr.push(element1, ..., elementN);
  • shift 从数组中删除第一个元素,并返回该元素的值(数组为空则返回 undefined). 此方法更改数组的长度

    1
    arr.shift();
  • unshift 将一个或多个元素添加到数组的开头. 并返回该数组的新长度(该方法修改原有数组)

    1
    arr.unshift(element1, ..., elementN);
    阅读全文 »

函数防抖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @method debounce 函数防抖
* @param {Function} fn 执行方法
* @param {Number} delay 延迟时间 默认 300 毫秒
* @returns {Function}
*/
const debounce = function (fn, delay) {
if (typeof fn !== 'function') throw new Error('fn is not Function');
delay = delay >= 0 ? delay : 300;

let timer;
return function () {
let context = this;
let args = arguments;

if (timer) clearTimeout(timer);

timer = setTimeout(() => {
fn.apply(context, args);
}, delay);
};
};

函数节流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @method throttle 函数节流
* @param {Function} fn 执行方法
* @param {Number} delay 延迟时间 默认 300 毫秒
* @returns {Function}
*/
const throttle = function (fn, delay) {
if (typeof fn !== 'function') throw new Error('fn is not Function');
delay = delay >= 0 ? delay : 300;

var previous = 0;
return function () {
var _this = this;
var args = arguments;
var now = new Date();
if (now - previous > delay) {
fn.apply(_this, args);
previous = now;
}
};
};
阅读全文 »

React

React 18.3.1

设计思想

  • 只有当在组件树中 相同的 位置渲染 相同的 组件时, React 才会一直保留着组件的 state
  • 在一般安全的情况下采用批处理方式处理 state 更新

变换

设计 React 的核心前提是认为 UI 只是把数据通过映射关系变换成另一种形式的数据。同样的输入必会有同样的输出。这恰好就是纯函数。

抽象

需要把 UI 抽象成多个隐藏内部细节,又可复用的函数。通过在一个函数中调用另一个函数来实现复杂的 UI

组合

将两个或者多个不同的抽象通过组合再次抽象成一个抽象

状态

使用不可变的数据模型, 把可以改变 state 的函数串联起来作为原点放置在顶层

状态不存在于组件内, 状态是由 React 保存的, React 通过组件在渲染树中的位置将它保存的每个状态与正确的组件关联起来

  • 这个变量是否通过 props 从父组件中获取,如果是,则不是一个状态
  • 这个变量是否在组件的整个生命周期中都保持不变,如果是,则不是一个状态
  • 这个变量是否可以通过其他状态(state)或者属性(props)计算得到,如果是,则不是一个状态
  • 这个变量是否在组件的 render 方法中使用,如果不在,则不是一个状态
阅读全文 »

敲黑板

隐私协议

  • 2.32.3 开始支持

  • 2023-09-15 之后, 隐私相关功能默认开始, 对于未声明的处理用户信息的接口或组件直接禁用

  • wx.getPrivacySetting 查询微信侧记录的用户是否有待同意的隐私政策信息, 通过返回结果 res 中的 needAuthorization 字段获取, true 表示还没同意过

  • wx.openPrivacyContract 此接口打开 wx.getPrivacySetting 获取到的开发者在小程序管理后台配置的 《小程序用户隐私保护指引》名称信息的页面

  • wx.requirePrivacyAuthorize 模拟隐私接口调用, 并触发隐私弹窗逻辑

  • wx.onNeedPrivacyAuthorization 监听隐私接口需要用户授权事件, 当需要用户进行隐私授权时会触发. 触发事件时, 开发者需要弹出隐私协议说明,
    并在用户同意或拒绝授权后调用回调接口 resolve 触发原隐私接口或组件继续执行.

    • resolve 是一个函数, 主动调用触发原隐私接口或组件继续执行
    • eventInfo 表示触发本次事件的关联信息
1
2
3
4
5
6
7
8
<!-- 用户触发此组件时, 微信会同步收到同意信息 -->
<!-- 事件回调表示用户已同意隐私政策后的处理逻辑 -->
<button
open-type="agreePrivacyAuthorization"
bind:agreeprivacyauthorization="handleAgreePrivacyAuthorization"
>
同意
</button>
阅读全文 »

敲黑板

  • 开启 charles 无法代理 https, 检查电脑和手机上的 charles 证书是否过期

电脑删除证书

  1. 使用 win + r 键调起系统运行窗口, 在输入框中输入 mmc 命令后回车
    charles-11
  2. 在弹出的对话框选择 “文件” -> “添加或删除管理单元”
    charles-12
阅读全文 »

@babel/cli

install

1
npm i -D @babel/cli @babel/core @babel/preset-env

运行

参数

  • --watch | -w 监听文件改变自动编译
  • --out-file | -o 输出指定文件名
  • --out-dir | -d 编译整个目录
    • 编译目录下所有文件输出合并为一个文件
1
2
3
4
5
npx babel index.js -w # 编译并监听 index.js

npx babel index.js -o index.min.js # 编译 index.js 文件输出到 index.min.js

npx babel src -d dist # 编译 src 目录下文件输出到 dist 下
阅读全文 »