【杂记】Node-sass、Node.JS版本管理以及其他
试图在另一台设备上就着node v16重新配置搭建了一遍electron-vue的环境,又踩了一些坑,不过理解也稍微深了一点。
总的概括就是——活用修改package.json。
Node.js降级?⁍
看到许多包出问题时,网上的解答大多都是给Node.js降级,我一开始也是这么做的,包需要哪个版本的node,我就装哪个版本的。
但是这样也带来一些问题——
之前装一个什么东西说需要node v10,但是后面又变成v12,运行项目时仍是v10
Element-theme安装时告诉我要node v12以上,但运行et -i报错我又需要v11及以下,事实上因为本来是v12的环境,就还是会报错
所以现在我更倾向于升包的等级。
在package.json中将某些包升级,再重新yarn
但有些包是依赖关系,比如说安装a包里的b包出错,
事实上,可以修改node_modules/a/package.json里面b包的版本,然后在node_modules/a目录下执行yarn
node-sass⁍
这个无疑是装vue环境时最令人头秃的东西了,不仅需要你的nodejs版本对应,还需要你有msbuil ...
Electron-vue开发实战(三)| Render进程开发
对于electron-vue而言,renderer进程其实大部分就是在写我们平时常写的前端页面
安装Element UI⁍
Element UI⁍
Element UI是饿了么开发的一套开源的基于Vue的UI框架,属于Javascript UI框架,与CSS UI框架(Bootstrap等)不同,除了提供CSS的修饰,还提供了更加遍历的控件操作方法。[1]
通过组件 | Element快速查看可用的组件。
安装Element UI并更换主题⁍
组件 | Element
1yarn add element-ui
(未成功)安装主题工具⁍
1yarn add element-theme --dev
安装白垩主题
1yarn add element-theme-chalk -D
初始化变量文件
主题生成工具安装成功后,如果全局安装可以在命令行里通过 et 调用工具,如果安装在当前目录下,需要通过 node_modules/.bin/et 访问到命令。执行 -i 初始化变量文件。默认输出到 element-variables.scss,当然你可以传参数指定文件输出目录。
1et -i [可以自 ...
Electron-vue开发实战(二)| Main进程开发
认识目录⁍
使用vue-cli创建的electron工程文件目录大体结构[1]如下:
12345678910111213141516171819202122232425262728293031323334353637my-project├─ .electron-vue│ └─ <build/development>.js files├─ build│ └─ icons/├─ dist│ ├─ electron/│ └─ web/├─ node_modules/├─ src│ ├─ main # 主进程│ │ ├─ index.dev.js # 开发模式│ │ └─ index.js # 主进程│ ├─ renderer # 渲染进程│ │ ├─ components/│ │ ├─ router/│ │ ├─ store/│ │ ├─ App.vue│ │ └─ main.js│ └─ index.ejs├─ static/ # 资源文件├─ test│ ├─ e2e│ │ ├─ specs/│ │ ├─ index.js│ ...
Leetcode|位运算
常用位运算总结⁍
作用
公式
代码(JAVA)
举例
改变num第i位(1->0,0->1)
num^(1<<i)
num^=(1<<i)
num: 1001(9)i: 31<<i: 1000–> num = 1
判断num的第i位是不是0
num&(1<<i) == 0
000001(0)000
获得一个二进制数最右边的一个1
b &(-b) = b&(~b+1)
num = b&(-b)
b: 10100-b: 01100–> num = 00100b
(接上)最右边的1在第几位
Integer.bitCount(num - 1)
num-1就相当于把1000变成了111,1的个数就相当于第几位(从0开始)
无进位相加
a^b
r = a^b
a: 1001(9)b: 1111(15)a^b: 110
计算(保存)进位
(a&b)<<1
c = (a&b)<<1
a&b: 1001–> ...
Leetcode|回溯算法
基本知识[1][2]⁍
虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法。
因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。
回溯法问题总结⁍
组合问题:N个数里面按一定规则找出k个数的集合
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
排列问题:N个数按一定规则全排列,有几种排列方式
棋盘问题:N皇后,解数独等等
组合无序,排序有序
回溯法模板⁍
回溯法解决的问题都可以抽象为树形结构,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。
123456789101112void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; ...
Hexo文章锚点设置
当前文章锚点跳转⁍
使用 markdown 内置的链接方式即可,其中如果有空格,需要把空格换成连字符 - ,如下:
1[跳转到本文锚点](#hexo-标题与-id-关系)
站内文章链接⁍
官方有标签插件实现站内文章链接,如下:
1post_link官方文档{% post_link 'hexo blog' %}
注意: 这儿优先使用文章 Front-matter 中的permalink字段,如果没有 permalink ,则使用 文件名字!
站内其他文章锚点链接⁍
上面的 post_link 方式链接站内文章好用,但是不支持文章的锚点链接,我们需要换一种方式。
官方文档还有一个 post_path ,用于获取文章路径,结合 markdown 内置的链接方式,即可实现锚点超链接,如下:
1post_path官方文档[hexo 安装]({% post_path 'hexo blog' %}#安装)
也可以使用 html a 标签实现,如下:
1<a href="{% post_path ...
JAVA学习(十三)| 多线程
多线程基础⁍
操作系统调度的最小任务单位是线程。
进程 vs 线程⁍
多进程的 缺点 在于:
开销更大,尤其是在Windows系统上;
进程间通信比线程间通信要慢,因为线程间通信就是读写同一个变量,速度很快。
多进程的 优点 在于:
稳定性更高,
因为在多进程的情况下,一个进程崩溃不会影响其他进程,
而在多线程的情况下,任何一个线程崩溃会直接导致整个进程崩溃。
多线程⁍
Java语言内置了多线程支持:
一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法内部,我们又可以启动多个线程。此外,JVM还有负责垃圾回收的其他工作线程等。
多线程编程的特点在于:多线程经常需要读写共享数据,并且需要同步。
Java多线程编程的特点又在于:
多线程模型是Java程序最基本的并发模型;
后续读写网络、数据库、Web开发等都依赖Java多线程模型。
创建新线程⁍
1234567891011121314151617181920212223242526272829303132333435363738// 方法一public class M ...
Leetcode|二叉树
基础知识[1]⁍
二叉树的定义⁍
123456789101112public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; }}
二叉树种类⁍
满二叉树: 每一层都是满的,第k层有2k-1个节点
完全二叉树: 最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h-1 个节点。
优先级队列其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系。
二叉搜索树: 有 数值 , 二叉搜索树是一个有序树 。
若它的左子 ...
JAVA学习(十二)| 加密与安全
* BigInteger⁍
1public BigInteger(int signum, byte[] magnitude)
将BigInteger的符号幅度表示转换为BigInteger。
符号表示为整数符号值:-1表示负数,0表示零,或1表示正数。 大小是big-endian字节顺序的字节数组:最重要的字节是第0个元素。
允许使用零长度数组,并且将导致BigInteger值为0,无论signum是-1,0还是1.假定magnitude数组在构造函数调用期间保持不变。
参数
signum - 数字的符号(-1表示负数,0表示零,1表示正数)。
magnitude - 数字大小的big-endian二进制表示。
BigInteger(1, x)就代表根据x字节流生成正数
编码算法⁍
URL编码⁍
如果字符是A~Z, a~z, 0~9以及-、_、.、*,则保持不变;
如果是其他字符,先转换为UTF-8编码,然后对每个字节以%XX表示。
Java标准库提供了一个URLEncoder类来对任意字符串进行URL编码,Java标准库的URLDecoder就可以解码:
12345 ...
JAVA学习(十一)| 单元测试
单元测试[1]⁍
利用Java平台最常用的测试框架JUnit,并详细介绍如何编写单元测试。
编写JUnit测试⁍
测试驱动开发TDD⁍
所谓测试驱动开发,是指先编写接口,紧接着编写测试。编写完测试后,我们才开始真正编写实现代码。在编写实现代码的过程中,一边写,一边测,什么时候测试全部通过了,那就表示编写的实现完成了:
12345678910111213 编写接口 │ ▼ 编写测试 │ ▼┌─> 编写实现│ ││ N ▼└── 运行测试 │ Y ▼ 任务完成
JUnit⁍
一个JUnit测试包含若干@Test方法,并使用Assertions进行断言,注意浮点数assertEquals()要指定delta。
Assertion还定义了其他断言方法,例如:
assertEquals(expected, actual): 期待结果为true
assertTrue(): 期待结果为true
assertFalse(): 期待结果为false
assertNotNull(): 期待结果为非null
assertArr ...