Git常见符号

..

表示对比

git log test..master
test 是由 master 建立的分支,在 test 进行开发多次提交完成对应功能后,切回 master 分支;
在合并 test 分支的时候,如果 master 分支在建立 test 分支之后有新的提交,则尝尝需要 rebase 进行变基让提交历史更加美观,
通过如上命令来查看 master 独有的提交(相较于 test)
如果没有直接显示’(END)’
若果有则有提交相关信息。如下图所示:

Git常见符号20220302163532

表示连续

阅读全文

ESLint与Prettier使用

Linter 与 Prettier

常用的 Linter 有 ESLint/TSLint/stylelint 等。

Linter 大致分为两类校验规则:

  • 代码格式
  • 代码语法

代码格式规定了缩进、空格、换行等
代码语法重点关注未使用变量(no-unused-vars)、隐式全局变量(no-implicit-globals)等问题

Prettier 无关代码语法,她可补充 Linter 规定代码格式。

总之,一个常见的方案为,使用 Linter 来捕获语法问题和 Bug,Prettier 来格式化代码。

ESLint 与 Prettier 共用

ESLint、Prettier 都分别有 NPM 包和 VSCode 插件。
ESLint 的 VSCode 插件可以在让我们在写代码过程中实时发现波浪标红的错误,提升工作效率。
当然,插件其实不是必须的,我们可以通过 eslint --fix npx prettier --write 修复部分相关问题。
但是部分无法自动修复的问题需要我们提交代码时一一排查。
ESLint、Prettier 在 VSCode 中对应的插件用以提高我们编码效率,在插件商店搜索安装即可。
在项目中将具体的配置分别放在项目根目录下.eslintrc.js 与 prettierrc.json 中。
一个简单的 ESLint 配置如下

module.exports = {
root: false,
env: {
node: true,
// 'vue/setup-compiler-macros': true
},
extends: ['plugin:vue/recommended', '@vue/standard'],
rules: {
'no-debugger': 'off',
indent: ['off', 2],
},
parserOptions: {
parser: 'babel-eslint',
},
}

rules 的规则如下

  • “off” 或 0 - 关闭规则
  • “warn” 或 1 - 开启规则,错误警告而不退出
  • “error” 或 2 - 开启规则,错误退出

一个简单的 prettier 配置如下

{
"printWidth": 100, // 超过最大值换行
"tabWidth": 4, // 缩进字节数
"useTabs": false, // 缩进不使用tab,使用空格
"semi": true, // 句尾添加分号
"singleQuote": true, // 使用单引号代替双引号
"proseWrap": "preserve", // 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行
"arrowParens": "avoid", // (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号
"bracketSpacing": true, // 在对象,数组括号与文字之间加空格 "{ foo: bar }"
"disableLanguages": ["vue"], // 不格式化vue文件,vue文件的格式化单独设置
"endOfLine": "auto", // 结尾是 \n \r \n\r auto
"eslintIntegration": false, //不让prettier使用eslint的代码格式进行校验
"htmlWhitespaceSensitivity": "ignore",
"ignorePath": ".prettierignore", // 不使用prettier格式化的文件填写在项目的.prettierignore文件中
"jsxBracketSameLine": false, // 在jsx中把'>' 是否单独放一行
"jsxSingleQuote": false, // 在jsx中使用单引号代替双引号
"parser": "babylon", // 格式化的解析器,默认是babylon
"requireConfig": false, // Require a 'prettierconfig' to format prettier
"stylelintIntegration": false, //不让prettier使用stylelint的代码格式进行校验
"trailingComma": "es5", // 在对象或数组最后一个元素后面是否加逗号(在ES5中加尾逗号)
"tslintIntegration": false // 不让prettier使用tslint的代码格式进行校验
}

prettier 具体配置项常见官网

让插件格式化的生效策略同样是就近原则,寻找被格式化文件系统目录层级中最近的配置文件,越近优先级越高。
要在保存代码时自动触发 ESLint 修复与 Prettier 格式化,需要在 VSCode 配置文件 setting.json 中添加如下代码
ESLint

"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"eslint.validate": ["javascript", "javascriptreact", "typescript", "html", "vue"],

Prettier

"editor.formatOnSave": true,
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},

同时也可在项目根目录下创建.vscode 文件夹创建 setting.json 文件并提交仓库,将对应配置共享给项目开发成员。

共用冲突

阅读全文

Latex语法

Latex 简介

Latex 用于编辑数学公式,目前较为友好支持 Latex 语法的笔记相关软件有

  • quiver(Mac)
  • 幕布

基础

Latex 语法可在 markdown 文件中进行书写,其标记为$
在行内展示对应公式,标记为

$ $

例如

$ \frac{a+1}{b+1} \quad $

展示为$ \frac{a+1}{b+1} \quad $

换行展示对应公式,标记为

$$ $$

例如

$$ \frac{a+1}{b+1} \quad $$

展示为 $$ \frac{a+1}{b+1} \quad $$

符号

阅读全文

力扣题解63-不同路径-ii

题目

63.不同路径-ii
本题采用动态规划解法。

分析

此题在未进行空间优化使用二维数组的方案时,可以很好地解决边界问题。
若需要优化空间,处理边界问题为要务。
此处把输入的数组的行用 r(row)表示,列用 c(column)表示
dp[r][c]表示到达对应位置拥有的方法数,此时在网格位置用 pos 标记
则有如下情况:

pos 处有障碍物

dp[r][c] = 0

pos 处在上边界(r == 0)

# dp[r][c] 在上边界第一个障碍物处分界,障碍物左边为 1,右边为 0,单独进行边界处理
dp[r][c] = 0 || 1

pos 处在左边界(c == 0)

dp[r][c] = dp[r - 1][c]

其他普通情况

1: pos只左边有障碍物 dp[r][c] = dp[r][c - 1]
2: pos只上边有障碍物 dp[r][c] = dp[r - 1][c]
3: pos左边上边都有障碍物 dp[r][c] = 0
4: pos都无障碍物 dp[r][c] = dp[r][c - 1] + dp[r - 1][c]

力扣题解63-不同路径-ii20220713165512

上述分析可以得到一个初步的代码版本

class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:

columnLen = len(obstacleGrid[0])
rowLen = len(obstacleGrid)
note = [0] * columnLen

# 处理初始上边界并用记事本note保存
for i,v in enumerate(obstacleGrid[0]):
if v == 1:
break
note[i] = 1

if rowLen == 1:
return note[-1]

ret = 0
for r in range(1, rowLen):
for c in range(columnLen):

# 当前位置为障碍物
if obstacleGrid[r][c] == 1:
ret = 0
note[c] = 0
continue

# 当前位置位于左边界
if c == 0:
ret = note[c]
continue

# 普通情况
if obstacleGrid[r - 1][c] == 1:
if obstacleGrid[r][c - 1] == 1:
ret = 0
note[c] = 0
else:
note[c] = ret
else:
if obstacleGrid[r][c - 1] == 1:
ret = note[c]
else:
ret = ret + note[c]
note[c] = ret

return ret

普通情况可进行合并

普通情况合并
1: pos只左边有障碍物 dp[r - 1][c] = 0, dp[r][c] = dp[r][c - 1] + dp[r - 1][c]
2: pos只上边有障碍物 dp[r][c - 1] = 0, dp[r][c] = dp[r][c - 1] + dp[r - 1][c]
3: pos左边上边都有障碍物 dp[r - 1][c] = 0, dp[r][c - 1] = 0, dp[r][c] = dp[r][c - 1] + dp[r - 1][c]
4: pos都无障碍物 dp[r][c] = dp[r][c - 1] + dp[r - 1][c]

即普通情况下

dp[r][c] = dp[r][c - 1] + dp[r - 1][c]

力扣题解63-不同路径-ii20220713173148
则解法如下

class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:

columnLen = len(obstacleGrid[0])
rowLen = len(obstacleGrid)
note = [0] * columnLen
ret = 0

# 处理初始上边界并用记事本note保存(滚动数组)
for i,v in enumerate(obstacleGrid[0]):
if v == 1:
break
note[i] = 1

if rowLen == 1:
return note[-1]

for r in range(1, rowLen):
for c in range(columnLen):

# 当前位置为障碍物
if obstacleGrid[r][c] == 1:
ret = 0
note[c] = 0
continue
# 当前位置位于左边界
if c == 0:
ret = note[c]
continue

# 普通情况
ret = ret + note[c]
note[c] = ret

return ret

BMW WARNING

阅读全文

Python中list使用

list 常见方法

Name Desc Eg
append 列表新增元素 list.append(obj)
count 统计某个元素在列表中出现的次数 list.count(obj)
index 从列表中找出某个值第一个匹配项的索引位置
remove 移除列表中某个值的第一个匹配项 list.remove(obj)
pop 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 list.pop([index=-1])
insert 将对象插入列表 list.insert(index, obj)
reverse 反向列表中元素 list.reverse()
sort 对原列表进行排序 list.sort(cmp=None, key=None, reverse=False)
extend 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表),函数返回None list.extend(seq)

list 常见使用

用法表

阅读全文

Shell中chmod的使用

文件权限

权限查看

通过ls -lh命令可以查看文件权限

已拿到某个文件夹的权限drwxr-xr-x+ 7 macmini staff 238B Jun 15 16:39 Docs为例,其含义如下

文件格式 所有者权限(u) 群组权限(g) 其他人权限(o) ACL 权限 引用计数 所有者 所在组 大小 最后修改日期 文件名
d rwx r-x r-x + 5 macmini staff 238B Jun 15 16:39 Docs

第一位为文件格式,其字符含义对照如下

字符 含义
- 文件
d 文件夹(directory)
l 连接(link)
c 字符设备(char)
b 块设备(block)
s 套接字(sockets)
p 管道(pipe)

其余 2-10 位位权限位,以 3 个为 1 组,且均为『rwx』 的 3 个参数的组合。

要注意的是,这三个权限的位置不会改变,如果没有权限,该位置以[ - ]占位。

权属调整

阅读全文

ES文件下载实现

文件处理

文件下载一般有两种,一种为后端接口返回连接浏览器打开即可。
本文主要为另一种,接口返回文档字节流,前端使用浏览器内置对象 Blob,用隐藏的 link 来触发下载操作。
响应内容如下:
ES文件下载实现20220628151413

代码实现

export function transFile(res, name = '导出.xlsx') {
let fileName = res.headers['content-disposition']
? res.headers['content-disposition']
.split(';')[1]
.split('filename=')[1]
.replace(/^\"|\"$/g, '')
: name

fileName = decodeURI(fileName)
const fileNameUnicode =
res.headers &&
res.headers.hasOwnProperty('content-disposition') &&
res.headers['content-disposition'].split(';')[1].split('filename=')[1]
if (fileNameUnicode) {
//解决中文乱码问题
fileName = decodeURIComponent(fileNameUnicode)
}
let blob = new Blob([res.data], {
// type: 'application/zip;charset=UTF-8',
// type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel',
// type: res.headers['content-type'],
})
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, fileName)
} else {
let link = document.createElement('a')
let evt = document.createEvent('HTMLEvents')
evt.initEvent('click', false, false)
link.href = URL.createObjectURL(blob)
link.download = fileName
link.style.display = 'none'
document.body.appendChild(link)
link.click()
window.URL.revokeObjectURL(link.href)
document.body.removeChild(link)
}
}

常见问题

阅读全文

PicGo

程序员的笔记

VSCode 编辑器的 Web 版 上线极大的方便了在 GitHub 上做笔记,在 Github 仓库主页,按一下小数点(.)这个键,或将地址栏的 com 换成 dev 即可。
在市面的大多数笔记软件中,Quiver Markdown 优化不错,但是同步基本没有,并且官方近两年没更新。Notion 用户界面比较舒适,但是基本不支持 Markdown 语法。
Notion 笔记示例 如下
PicGo20210918152058

如 Quiver 一样,大多数笔记软件导出 Markdown 会将图片集中一个单独的文件,如果想要把导出的 Markdown 用在其他地方,不等不同时拷贝对应的图片的本地文件夹,将笔记中的图片放在图床中,是一个很好的处理方式。
PicGo 作为一个图床上传工具,在 VSCode 提供了对应的插件

相关配置

Github

阅读全文


Copyright © 2017 - 2024 鹧鸪天 All Rights Reserved.

skyline 保留所有权利