分类目录归档:技术

black and silver laptop computer beside yellow ceramic mug

PowerShell 禁止运行 node.js 脚本如何解决?

对于一些比较流程化的工作,我希望将其自动化,因此我写了一个脚本,帮助我来完成这个基本的工作。

但在写完后,发现了一个问题:

helper: 无法加载文件 C:\Users\bestony\AppData\Roaming\npm\helper.ps1,因为在此系统上禁止运行脚本。有关详
细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ helper
+ ~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
Code language: JavaScript (javascript)

这个问题倒是不复杂,是因为 PowerShell 相比于 CMD 拥有更全面的权限控制。如果想要解决的话,有两种方式:

1.换用 CMD

在目前的 Windows 中,依然是 CMD & PowerShell 双轨制,你可以直接使用 CMD 来执行你的命令,就无需关注这个权限的问题了。

2. 关闭权限

如果你需要继续使用 PowerShell,就要关闭 PowerShell 的校验,使用管理员模式打开 PowerShell,并执行如下命令,来关闭 PowerShell 的校验即可。

set-ExecutionPolicy RemoteSigned
Code language: JavaScript (javascript)
Open LED signage

如何为任何开源项目做贡献?

在《如何成为Golang贡献者》中,我介绍了, 我对于 Golang 的第一个贡献是修复了一处 Typo ,这是整个开源贡献中可以说是最简单的一部分。

那如果你现在是一个新人,希望参与到项目中,或希望走通整个贡献的流程,那么修复 typo 是一个不错的选择。但对于新人来说,通过阅读代码来查找 typo ,显然不是一个很好的选择。

在这种情况下,自然会产生一个问题:“有没有一种方式,可以让我快速找到 typo 呢?”

答案是肯定的,我们可以借助一些拼写检查工具,来检查具体哪些代码文件中存在 typo。

流程

这里我使用的是 Client9 的 Misspell ,一个基于 Golang 写就的拼写检查工具(用 golang 的拼写检查工具来检查 golang 源码,很合理)。

这个工具的下载安装十分简单,执行如下代码即可安装:

curl -L -o ./install-misspell.sh https://git.io/misspell
sh ./install-misspell.sh

Code language: JavaScript (javascript)

安装完成后,即可使用 misspell 命令来进行拼写的检查。以 django 项目为例,具体的执行命令如下:

git clone git@github.com:django/django.git
cd django
misspell ./*
Code language: PHP (php)

可以看到打印出了 misspell 认为可能是 typo 的地方,

202108252149852
结果

接下来你要做的就很简单了,根据 misspell 的结果,查找具体的文字,确保是否真的是 typo,如果是真的 typo,就按照项目的贡献规范进行贡献即可。

总结

借助 misspell,你可以很轻松的给一个项目快速的开始贡献代码,但如果真的是希望参与到开源社区当中,一定不能只是做 typo 的修复。typo 修复一般来说都是开源前辈留给后辈学习用的,对于实际的贡献者而言,除了熟悉流程,并没有太多的价值,因此,你还是需要将开源项目应用在自己的工作生活中,并解决一些实际的问题,才会更有价值。

5e54199359bbafe0ef692365a9bcffb6

如何成为 Golang 贡献者

是的,我成为了 Golang contributor

bzii6
我的第一个 contribution

在听完了 Go 夜聊的第 2 期播客后,我突然觉得,嗯,我是应该加入一个社区,而不是总是以一个创建者的身份去创建开源项目。可以有一个新的视角。

于是,我选择了加入我最常写的三种语言其一的 Golang。

然后接下来的问题就是,应该如何做贡献?

我查阅了一些资料,完成了此次贡献。并将其记录在此,希望可以帮到你。

贡献流程

0. 系统依赖

给 Golang 做贡献需要一些基本配置,这里不再赘述,只写明要求:

  • 安装了 Golang
  • 安装了 Git

1. 找到你要贡献的问题

实际上,既然要贡献,首先你要解决的问题是,你想贡献什么问题?绝大多数的贡献都是基于某一个特定的问题进行的。

2. 签署 Golang CLA,配置基本信息

golang 的贡献是基于 Git 进行的,因此,你在贡献前,需要确保你的各项基本信息是复合要求的。比如,你要在网站上签署 CLA(Contributor License Agreement);你的 Git Username 和 Git Email 应该符合和你签署 CLA 的信息是符合的。

签署完成后,可以使用你的 Google 账号登陆 https://go-review.googlesource.com/login/,注册一个账号。后续的 Code Review 也会在这里进行。

3. 配置 Password 、Git 等信息

需要注意的是,目前 Golang 无法从中国大陆提交贡献,所以你应该在一台海外服务器上进行贡献。以确保可以提交。想了解具体情况,可以查看附录中的 GitHub issue #20065

Golang 在提交时,是通过 Git 提交的,不过和一般我们常用的 HTTP 账号密码鉴权 or Key 鉴权不同,Golang 采用的是 GitCookies 进行提交的。因此,你需要配置 Git Cookies。

访问 go Git repositories – Git at Google (googlesource.com),登陆后,点击右上角的 Generate Password

wrtzn
点击这里

在新的页面中,复制下方蓝色框体中的 bash 代码,并粘贴在你的 Shell 中粘贴并执行,即可配置好 Git Cookies

vzgh3
蓝框里本来是 Shell 命令,被我 F12 给改了

4. 安装 Code Review 工具

在服务器上执行如下命令,安装代码提交工具

go get -u golang.org/x/review/git-codereview
Code language: JavaScript (javascript)

安装完成后,执行如下命令验证

git-codereview help

5. Clone 代码并提交贡献

接下来的就很简单了,和我们日常贡献代码很接近了

5.1 clone 代码并执行测试

首先你需要 clone 代码,并执行测试,确保你 clone 的代码本身是没问题的(不然可能会出现你改了一大堆,发现问题不是你自己的)

git clone https://go.googlesource.com/go
cd go/src
<meta charset="utf-8">./all.bash # 执行测试,如果看到 ALL TESTS PASSED 则说明代码没问题。
Code language: PHP (php)

5.2 修改代码

修改代码按照我们一般的分支协作的方式来进行即可

git checkout -b feat/xxxx
# 修改文件...
git add [files...]
git codereview change # 为你的贡献创建一个 commit
Code language: PHP (php)

5.3 提交代码

完成代码贡献后,你就可以准备提交你的代码了。不过,你还是要跑一次测试,确保你的修改没有导致某些地方坏掉。

./all.bash # 执行测试,如果看到 ALL TESTS PASSED 则说明代码没问题。
 git codereview mail  #提交你的代码
Code language: PHP (php)

6. 进行 Code Review

提交完成后,你就会在 https://go-review.googlesource.com/ 上有一个新的 Change 的记录,然后系统会自动帮你分配 Maintainer 进行 Review,这个阶段如果 Reviewer 没有给你提出需要修改的话,你只需要等待你的代码被合并即可。

yl90z

需要注意的是,Golang 对于代码的合并有要求,需要 2 个 +2 才能合并到代码库中。因此,你的代码可能会很快被某个 Maintainer Review,但很久才被另外一个 Maintainer Review (其实也没多久,只是相比于第一个)

当两个都合并完成后,左上角的标识就会变成 Merged ,此时就说明你的代码贡献成功啦!

v573a

一些注意的点

1. 关于中国区无法提交的问题

如果你使用自己的本地电脑进行提交,你会发现,你会收到一个报错

Access Denied (not available from your location)

这是因为 Golang 官方禁止了中国区的提交,将 golang 源码对于中国区进行了只读状态的设置。

这并不是 Golang 不欢迎中国开发者贡献,只是对于 GFW 封禁 golang.org 的一种抵抗。

iebps
Maintainer 的解释

你只需要将贡献环境从你的本地电脑,换成任何一个海外的服务器,就可以正常提交。

来源:access to Gerrit denied because of location · Issue #20065 · golang/go (github.com)

2. Commit Message 格式

golang 的 commet message 有自己的格式,你在提交的时候可以以这个格式进行提交,这样后续就不需要 Reviewer 帮你改了。

[模块] 修改内容
详细信息
Github link
Code language: CSS (css)

给大家举个例子,大家就知道是什么样的了。首先,下面这个是我自己的 commit message

typo: fix reponse to response in src/net/http/header.go
Change-Id: I238bc90c4f273c352ef924989a44c6e927839128
Code language: HTTP (http)

Reviewer 帮我调整后的格式

net/http: fix typo in header.go
Change-Id: Ia6df881badf9a704c7f56967404d37e230b88a09
Reviewed-on: https://go-review.googlesource.com/c/go/+/343969
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Damien Neil <dneil@google.com>
Code language: HTTP (http)

更加简单明了。

Change ID、Reviewed on、Reviewed by 是系统自动添加的,你不需要关注。

来源:Contribution Guide – The Go Programming Language (google.cn)

相关链接

text

如何解决 JavaScript 中 RegExp 不幂等的问题?

在对 WXMarkdown 进行改造的时候,我准备使用 Vercel 提供的 cloudFunction 来实现。

在执行时,出现了一个奇怪的问题,当我使用 RegExp 进行匹配的时候,会出现匹配成功和匹配失败的情况。

当我回溯代码时,发现问题出现在

import type { NextApiRequest, NextApiResponse } from "next";
const URL = require("url");
const rule = /BV([0-9a-zA-Z]{1,10})/g;
export default function handler(
  req: NextApiRequest,
  res: NextApiResponse<MDResponse>
) {
    const { url } = req.body;
    const result = rule.exec(url);
}
Code language: JavaScript (javascript)

result 的匹配结果不是每次都是可用的,会交替一次 null,一次有结果。

搜索后了解到,这是由于 RegExp 本身是具有状态的,在这种情况下,由于后一次的调用复用了之前的请求,所以出现了一次有结果,一次没有结果。

在这种情况下,有两种解决方案:

  1. 在使用 Rule 之前,对其进行重置状态,即在进行匹配之前,先设定 rule.lastIndex 为 0
  2. 另一种解决方案是将 rule 的定义放置在导出的函数内部,这样就可以在后续执行的过程中,重新初始化。

Reference

https://stackoverflow.com/questions/38910334/regular-expression-exec-function-does-not-work-multiple-times

text

为 wxa.js 构建的小程序移除 scss 依赖

wxa.js 默认使用的样式语言是 scss,所以其默认创建的项目就会要求安装 node-sass,但由于 node-sass 依赖了 binding.node 等包,导致常常会出现 node-sass 安装失败的问题。

如果你并没有在项目中使用 scss ,则可以考虑将你项目种的 node-sass 移除,从而缩小项目的依赖体积,提升项目安装成功的概率。

思路

由于 wxa 默认使用了 scss,因此,我们需要移除项目中针对 scss 的配置,并移除代码中的 scss ,这样才能保证后续在编译的过程中,不会调用 node-sass 的依赖。

步骤

  1. 移除 wxa.config.js 中关于 scss 的配置

在 wxa 的默认配置中,配置了 sass/scss 的依赖,我们如果不移除这个依赖,就会导致后续在构建的时候,自动安装相关依赖。

nv0iy

因此,我们需要在 wxa.config.js 中添加 use 相关配置,且仅保留 babel 作为依赖,具体修改如下:

module.exports = {
    plugins: [
        new ReplacePlugin({
            list: envlist,
        }),
    ],
    // 你的其他配置
    use: [
        {
            test: /\.js$/,
            name: 'babel',
        },
    ],
    // 你的其他配置
};
Code language: JavaScript (javascript)
  1. 移除项目中标记为 Scss 的语言

在移除了 wxa.js 的构建依赖后,接下来需要移除代码中关于 scss 的标示,从而使我们的代码可以被正确的渲染工具所渲染。具体修改如下所示,右侧为修改后的结果

uqzjy
  1. 移除 package.json 中的 相关依赖。

当我们完成了上述的操作之后,就可以放心的移除系统中关于 sass 的依赖了,从而减少整个项目的体积和对 node-sass 的依赖。

你只需要执行如下的命令,就可以移除项目中关于 sass 的依赖了。

npm uninstall @wxa/compiler-sass
// 或者
yarn remove @wxa/compiler-sass
Code language: JavaScript (javascript)

总结

scss是一个好的语言,但 node-sass 却不是一个好的工具,如果你不使用它,不妨将其移除,提升你的项目构建速度。

text

wxa.js 引入 tailwindcss

TailwindCSS 是我最近一段时间使用比较多的 CSS 框架,相比于传统我们习惯的前端框架,它的限制更少,你可以根据自己的需要来编写样式。如果你配置了清除没用到的 CSS,TailwindCSS 的体积甚至可以远小于其他框架。

也因为上面的这些因素,我也自然而然的会选择将其放在小程序中来使用。而由于我使用的是 wxa.js ,所以这里也是一个对应的 wxa.js 的教程。

安装

1. 安装 TailiwndCSS 到你的项目中

由于 Taildwind 默认推荐使用的是 PostCSS,但其需要的是 PostCSS 7 或者 8 ,但 WXA.js 提供的 PostCSS 插件使用的是 6 ,所以这里我就选择不将其作为 PostCSS 插件来安装。

在 WXA 项目根目录中执行如下命令,会在你的项目根目录中生成一个 tailwindcss.config.js,它会作为后续你的项目配置的配置文件。

npx tailwindcss-cli@latest init
Code language: CSS (css)

随后,在你的项目根目录创建一个 tailwind.css 文件,并在其中加入如下代码,这个文件作为你后续样式基础文件。

@tailwind base;
@tailwind components;
@tailwind utilities;
Code language: CSS (css)

添加完成后,你就可以执行如下命令,来生成一个默认的 tailwindcss 样式文件。

npx tailwindcss-cli@latest build ./src/tailwind.css -o ./src/tailwind.css
Code language: CSS (css)

生成的效果如下,可以看到,未任何处理的情况下,整个 CSS 文件足足有 3.81 MB,不过不用担心,我们可以清除其中的样式。

未做清理

如果你希望后续不输入这个命令,可以将其添加到你的项目的 package.json 中。

2. 移除默认的浏览器自动添加的 prefix

由于不同浏览器在不同的样式上可能有所不同,tailwindcss 会在生成的时候帮助我们生成一些特定的前缀。但小程序不涉及到浏览器的兼容性问题,所以我们可以关闭 taildwindcss 的 autoprefixer。

将刚刚的生成命令中加入 --no-autoprefixer 的参数,就可以生成不含 prefix 的 CSS 文件

npx tailwindcss-cli@latest build  --no-autoprefixer  ./src/tailwind.css -o ./src/tailwind.css
Code language: CSS (css)

可以看到,去除 prefix 后,我们的文件缩小至 3.46MB。

去除 prefix

3. 移除不用的样式

tailwindcss 提供了根据页面结构分析使用样式的功能,从而可以实现在构建生产版本之时,移除没有使用的样式,从而可以达到缩小样式的目的。

在项目中的配置 purge 属性,就可以实现 tailwindcss 自动分析 wxa 文件,从而移除没有用到的样式。

module.exports = {
    purge: ['./src/**/*.wxa'],
    darkMode: false, // or 'media' or 'class'
    theme: {
        extend: {},
        screens: [],
    },
    variants: {
        extend: {},
    }
}
Code language: JavaScript (javascript)

配置了 purge 属性后,可以看到,样式文件锐减到 9.93KB (因为我使用的样式很少)

移除后的效果

4. 在 wxa.js 中引入

修改生成文件的命令,使生成的文件的后缀为 wxsss,从而可以继续使用微信小程序的 @import 语法。

npx tailwindcss-cli@latest build --no-autoprefixer  -o ./src/tailwind.wxss
Code language: CSS (css)

重新生成样式文件后,只需要在 app.wxa 文件中的 style 块中加入如下引入代码,在项目中引入 tailwindcss。

因为 tailwindcss 只生成一个样式文件,因此,只需要在 app.wxa 中引入,即可确保所有页面都可以正常使用 tailwindcss

@import "./tailwind.wxss" 
Code language: JavaScript (javascript)

优化

实际上,taildwindcss 的体积还可以进一步优化,你可以完全移除掉那些你没有用到的属性,从而让你的 css 文件特别小,从而控制小程序样式的大小。

turned on flat screen monitors

用好 Mixins

一直以来,我都没有使用过 Mixins 这个功能,因为一直以来,我都会倾向于在不同的页面承载不同的功能。

但最近在做 NESHouse Pro 的时候,也确实遇见单个页面承载了大量的逻辑,因此,我决定使用 Mixins 来分割逻辑。

9gy0h

我将页面的逻辑和功能按照模块,拆分成了三个不同的 mixins。之所以这样拆分,是因为这三个模块都有一些跟随函数的变量,我不希望这些变量出现在主要的页面逻辑中,而是以抽象出函数的方式来调用,因此,通过 Mixins 来组合 Methods 和 Data 是一个不错的方式。

MacBook Pro with images of computer language codes

MySQL 遭遇 Out of sort memory, consider increasing server sort buffer size 怎么办?

当你将线上数据拖到本地进行执行的时候,可能会出现 mysql Sort aborted: Out of sort memory, consider increasing server sort buffer size 的错误,出现这样的错误,是因为你的 MySQL 的 SortBufferSize 太小导致的。你可以在 my.cnf 中添加配置。

sort_buffer_size=3M

参考文献

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sort_buffer_size

MacBook Pro with images of computer language codes

如何在服务器和本地互传 SQL?

在本地开发模拟线上数据的时候,难免需要从线上服务器上拉取数据到本地进行导入。

这个时候,你可以在执行 mysqldump 的时候加入 where 参数来筛选数据,

但依然会遇见文件比较大的情况。

在这种情况下,你可以选择使用 gzip 来压缩你导出的 SQL 文件,命令也非常简单

gzip xxx.sql
Code language: CSS (css)

执行完成后,你会获得一个 xxx.sql.gz 文件,接下来只要使用 scp 之类的软件,将文件拖回本地即可。

通过 Gzip 压缩,可以将一个原本 1.5G 的 SQL 文件压缩到 100M 左右,大大的提升了数据的传输速度。

green and black digital device

用 Docker 解决端口错误的问题

在进行嵌入式设备的编写的时候,一个很大的问题是重新刷写应用程序的成本较高,因此,在一些场景下, 我们尽可能通过修改服务端的应用,来解决嵌入式端的错误问题,而尽可能避免对嵌入式设备重新刷写。

我是在处理 Awtrix 2.0 的时候想到这个办法的。

Docker 在启动应用的时候,可以设置端口监听,通过 docker -p host_port:container_port 来创建容器,可以指定容器内部端口和主机监听端口的映射。

假设业务监听的是 80 端口,你可以通过 -p 81:80 将容器的 80 转发到宿主机的 81 端口上。同样的,你可以在遇见端口问题的时候,通过修改相应的宿主机端口,在外层加一层转发,从而解决掉端口编写错误的问题。

不过,需要注意的是,毕竟是加了一层应用程序的转发,相应的,性能会有所损耗,如果可以的话,尽可能还是修改嵌入式设备,减少性能损耗的点。