12-19
1 将mac设置信任任意来源的应用
sudo spctl --master-disable
说明:显示,并设置"任何来源"选项
[1] sudo spctl --master-disable.https://blog.csdn.net/qq_31251767/article/details/53141786
2 为什么class中,要调用一次super?Js中没有类的概念吗?
TODO
3 基于Github Actions自动化部署、版本回退
这里着重讨论版本回退
版本回退
❓ 问题一:如何获取当前推送的tag版本?
通过写入变量到 $GITHUB_ENV
环境变量中实现
name: test-get-tag
on:
push:
tags:
- 'v*.*.*'
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set env
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
#如果只截取数字,则可以加一个v
#- name: Set env
# run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/v}" >> $GITHUB_ENV
- name: Test
run: |
echo $RELEASE_VERSION
echo ${{ env.RELEASE_VERSION }}
- name: Test in other shell
run: |
./sh/test-get-tag.sh
那脚本中如何获取到刚刚设置的tag变量呢?
#!/bin/sh
echo 'starting---------'
echo $RELEASE_VERSION #✅正确写法
echo '$RELEASE_VERSION' #❌错误写法
echo 'ending-----------'
4 关于Git Commit规范-编写指南
首先来看一下commit格式,分为三部分:Header,Body 和 Footer
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
Header必须,Body和Footer可以省略。
Header
Header格式为:type
(必需)、scope
(可选)和subject
(必需)。
type一共有7种:
- feat:新功能(feature)
- fix:修补bug
- docs:文档(documentation)
- style: 格式(不影响代码运行的变动)
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- test:增加测试
- chore:构建过程或辅助工具的变动
subject
subject
是 commit 目的的简短描述,不超过50个字符。
- 以动词开头,使用第一人称现在时,比如
change
,而不是changed
或changes
- 第一个字母小写
- 结尾不加句号(
.
)
完整示例:
style: change some things
[1] Commit message 和 Change log 编写指南.https://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html
5 自动生成changelog
Vscode有一个插件:whatchanged
注意:好像只支持三种,feat、fix和BREAKING CHANGE脚注
[1] whatchanged.https://github.com/release-lab/whatchanged
6 版本匹配的正则
(\d{1,3}\.){2}\d{1,3}
7 编写Github Actions的一些注意事项
一共分为3个方面:yml脚本、sh脚本以及docker脚本方面
yml脚本方面
- node版本问题
- 环境变量问题
- yarn.lock还是package-lock.json
8 无法下载nvm的问题
原因:host
9 Sed相关操作
一些常见操作[1]
# 追加
sed -i '$a\456' a.txt
# 删除行
sed -i '$d' a.txt
# 替换 用456去替换123
# 要注意内部包含/需要进行转义 \\/
sed -i 's/123/456/g'
Mac中的sed与linux中行为一致?
brew install gnu-sed
alias sed=gsed
详见[2]
三大文本处理工具
在 linux 系统中,有三个强大的文本分析处理工具:grep sed awk,其中[3]:
grep 用于搜索文本内容 => linux grep 命令常见用法
sed 用于编辑文本内容 => linux sed 命令常见用法
awk 用于处理和生成报表 => linux awk 命令常见用法
TODO
[1] linux sed命令.https://www.cnblogs.com/starof/p/4181985.html
[2] mac上遇到的错误sed command a expects followed by text.https://www.jianshu.com/p/87a57a12d5e6
[3] linux sed 命令常见用法.https://www.cnblogs.com/xiaoxie2014/p/12911241.html
10 /usr/bin/env: node: No such file or directory
背景:通过ssh连接,并执行的node脚本,提示找不到node
原因:在通过ssh连接的时候,有些环境变量并没有被正确设置,所以找不到node
解决方法:指明确定的node文件
#!/root/.nvm/versions/node/v14.18.2/bin/node
console.log('i am running')
11 shell脚本头,#!/bin/sh与#!/bin/bash的区别
解释:#!是一种特殊的表示符,其后面跟的是此解释此脚本的 shell 的路径
关系:sh
是 bash --posix
的别名
不同点:
sh脚本出错了,不再执行
bash脚本出错了,继续执行
[1] shell脚本头,#!/bin/sh与#!/bin/bash的区别..https://www.cnblogs.com/jonnyan/p/8798364.html
12 Pseudo-terminal will not be allocated because stdin is not a terminal
伪终端将无法分配,因为标准输入不是终端
解决方案:
#加上tt参数,强制伪终端分配
ssh -tt [email protected]
原因,具体请参见[1]:
-T Disable pseudo-tty allocation.
-t Force pseudo-tty allocation. This can be used to execute arbitrary
screen-based programs on a remote machine, which can be very useful,
e.g. when implementing menu services. Multiple -t options force tty
allocation, even if ssh has no local tty.
背景:出现在使用node通过child_process.execFile()执行shell脚本。
[1] Pseudo-terminal will not be allocated because stdin is not a terminal.https://stackoverflow.com/questions/7114990/pseudo-terminal-will-not-be-allocated-because-stdin-is-not-a-terminal
[2] shell脚本ssh到远程服务器并执行命令.https://blog.csdn.net/u014532775/article/details/98178260
13 Node执行shell脚本
const child_process = require('child_process')
function exec(command) {
return new Promise((resolve, reject) => {
const child = child_process.exec(command, (error, stdout, stderr) => {
if (error) {
reject({ error, child });
}
resolve({
stdout,
stderr,
child,
});
});
});
}
注意:Node的异常并不会导致shell断停,因为异常返回的退出码为0(正常退出)
所以,如果需要出异常后,停止执行,则需要手动exit(1)
process.exit(1)
14 String和Array在访问元素的行为
const str = '1'
const arr = [1]
str[100]
=>> undefined
str.charAt(100)
=>> ''
arr[100]
=>> undefined
总结:通过[]去访问元素,并不会出现角标越界的异常,如果不存在,则返回undefined
15 Sheel中的单双引号
TODO
单引号是完全字符串,双引号会对字符串求值
name='Jhon'
'abc$name'
=>> abc
"abc$name"
=>> abcJhon
16 IIFE-立即调用函数
IIFE (Immediately Invoked Function Expression)
一般有多种形式,下面是其中常见的两种:
//前面加void和;都可以,避免解释器混乱
void (function(){
...
})()
;(function(){
...
})()
[1] https://developer.mozilla.org/en-US/docs/Glossary/IIFE
17 自己动手写编译器
TODO
[1] https://pandolia.net/tinyc/index.html
18 Js中Bigint类型
Bigint是bigint的包装类,用于表示大于 25^3 - 1
的整数,在数字后面加上 n
表示一个bigint
//字面量形式
const big = 1234567890191911919n
//对象包装形式
const big1 = Bigint('1234567890191911919')
它有一些限制:
综上
限制较多,所以针对于大数,建议用Bignumber库
[1] Bignumber.https://mikemcl.github.io/bignumber.js/
19 Js中的Symbol
每个从Symbol()
返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。
[1] Symbol.https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol
20 Js中如何实现精确zero-delay?精确1秒延迟呢?
🏷 Js定时器 zero-delay 精确定时器
精确0延迟可以实现,精确1秒无法实现,因为Js是单线程。
但可以利用日期+修正实现一个 偏移量小
的计时器方案,这被称为 自调整计时器
❓ 问题一:如何实现一个高精度倒计时?
/**
[delay](offset): 7
[delay](offset): 14
[delay](offset): 6
[delay](offset): 7
[delay](offset): 6
[delay](offset): 5
[delay](offset): 6
[delay](offset): 6
*/
function highSetTimeout() {
const interval = 1000
const serverOffset = 100 //server - local
let lastTime = new Date().getTime() + serverOffset + interval
step(interval)
function step(delay) {
setTimeout(() => {
const offset = new Date().getTime() + serverOffset - lastTime
console.log('[delay](offset):', offset)
lastTime += interval
// remove offset
step(Math.max(0, interval - offset))
}, delay)
}
}
highSetTimeout()
[1] 超高精度的秒杀倒计时.https://segmentfault.com/a/1190000039725594
21 TradingView
思想:
数据更新
图表库并不包含市场数据,你必须提供所需格式的数据。示例使用了Quandl历史数据。图表可以用两种方式接收数据:
使用推模型技术实时更新,例如通过WebSocket。这样你的图表将会自动更新价格。为了达到这个目的,你必须使用
JavaScript API
并且准备好自己的传输方法。使用拉模型/脉冲(pulse)/刷新为基础进行更新(如当今大多数基于Web的图表),其中图表数据每X秒更新一次(图表客户端将要求服务器模拟推模型更新),或者被用户手动重新加载。 为此,请使用
UDF协议
并编写自己的datafeed包装类。
22 添加-清除终端代理的方法
🏷 终端代理 清除终端代理
示例:
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
开启代理很简单,就是用 export 命令设置全局变量 http_proxy 和 https_proxy:
export http_proxy="http://127.0.0.1:7070"
export https_proxy="http://127.0.0.1:7070"
关闭代理就是用 unset 命令把全局变量清空:
unset http_proxy
unset https_proxy
[1] Mac 终端开启和关闭代理的方法.https://yuhenabc.com/2018/12/29/proxy/
23 写一个自己的博客
TODO
背景:由于公司团队匿名性,简历中不能出现相关项目,那对我刚毕业的我,岂不是没有项目可写?NO,NO,NO,没有项目,创造项目。
选择博客的原因:
- 可行性:
- 知识覆盖性:
博客技术栈:
- 前端
- 前台:NuxtJs
- 后台:CRA
- 后端:NestJs
规划(TODO)
阶段 | 描述 |
---|---|
思考 | 思考,1可行性 2具体任务、花费时间等 |
24 React的useState、useRef,以及自写的hooks会随着组件刷新而刷新吗?
🏷 React
TODO
结论:
在组件不销毁的情况下,useState、useRef初始化只会执行一次,而自写hooks,需要手动控制
25 Github OAuth-授权登录
🏷 OAuth Github 授权登录
TODO