你好!
我是 Tsukimaru Oshawott,一只普通的水水獭。
可以使得音乐更松弛,更软,略微增加弹性
可以使得音乐更有力度
温暖感提升,但是清晰度也会下降
声音会向前靠,且硬度明显增加
略微向前靠(不明显),主要是会有刺激感,过多会刺耳
声音变脆,穿透力,冰冷感 / 清晰度提升
磁性感,呲呲的、后面的声音
人声增加通透感,大部分时候没必要
首先:能衰减就不用提升
EQ 的三种作用:
可以采用频扫的方式作细微调整
第一临界点:从软变硬的时间
第二临界点:从硬变弹性的时间
调为 $\frac {60}{\text{BPM}} \times 2^k$($k \in \Z$),否则会导致律动被打断
偏短可使得声音有力度、中高频更多,偏长可使得声音更自然柔和
一般高压缩比配高阈值,低压缩比配低阈值
高压可使得声音更有力度,低压可使得声音更自然
什么也不会,直接干懵了。
git status
git status
:查看当前状态git status -s
:简化输出1 | $ git status |
.gitignore
可以使用 glob
模式匹配。
1 | # 忽略所有前缀长度 >= 2 的 .a 文件,例如忽略 foo.a 但不忽略 p.a |
git diff
git diff
:比较工作和暂存git diff --staged
:比较暂存和最新提交git commit
git commit -a
:自动将已跟踪文件 updategit add -A
git rm
git rm <file>
:也会移除工作区文件--cached
避免git mv <old_file> <new_file>
git log
-p -2
:显示最近两次提交的差异--pretty=online
:单行显示--graph
:显示分支的树形图git commit --amend
:修补最后一次提交git reset HEAD <file>
:撤销文件的暂存git checkout -- <file>
:撤销文件的修改(危险)git remote -v
:查看远程仓库名称和 urlgit remote add <shortname> <url>
:添加远程仓库git remote show <remote>
:查看远程仓库的更多信息rename/remove
git fetch <remote>
:从远程仓库拉取数据git push <remote> <branch>
:推送数据到远程仓库查询:
git tag
:列出标签-l "v1.8.5*"
:列出所有符合模式的标签git show <tagname>
:查看标签信息创建:
git tag -a <tagname> -m "my version 1.4"
:创建附注标签git tag <tagname>
:创建轻量标签git tag -a <tagname> 9fceb02
:补办标签删除:
git tag -d <tagname>
:删除标签标签不会在 git push
时自动推送,必须手动推送标签:
git push origin <tagname>
或 git push origin --tags
git push origin --delete <tagname>
git config --global alias.unstage 'reset HEAD --'
git unstage <file>
:等价于 git reset HEAD -- <file>
git config --global alias.visual '!echo hello'
git visual
:等价于 echo hello
Git 储存三种对象:
commit
:储存 commit 信息,指向对应快照的 tree
根节点tree
:储存路径树结构blob
:储存文件HEAD
指向当前所在分支。
git branch <newbranch>
git branch -d <branch>
git checkout <branch>
也可以用 git checkout -b <newbranch>
直接创建并切换。
git merge <branch>
:HEAD = merge(HEAD, branch)
--no-ff
:禁用快进合并快进:若 HEAD
是 branch
的祖先,则可以直接跳到 branch
,称为快进。
如果出现冲突,需要手动去对应文件里修改,再用 git add
和 git commit
。
1 | <<<<<< HEAD:index.html |
1 | git checkout experiment |
变基:提取当前分支(experiment
)中到最近公共祖先引入的修改,然后在目标分支(master
)上重新应用,并修改当前分支的提交。(即 HEAD' = branch + (HEAD - LCA)
)
整合结果相同,但历史更加简洁。
进阶:
git rebase --onto master server client
,将 client
减去 server
的修改应用到 master
上。git rebase master server
,将 server
的修改应用到 master
上。变基前:
变基后:
风险:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。——也就是说,只在本地分支上使用变基。
Figure 47. 你将相同的内容又合并了一次,生成了一个新的提交
高级魔法:用 git rebase teamone/master
可以实现智能变基合并(丢弃 C4 和 C6)。
合并和变基的区别:
至此,你已在实战中学习了变基和合并的用法,你一定会想问,到底哪种方式更好。 在回答这个问题之前,让我们退后一步,想讨论一下提交历史到底意味着什么。
有一种观点认为,仓库的提交历史即是 记录实际发生过什么。 它是针对历史的文档,本身就有价值,不能乱改。 从这个角度看来,改变提交历史是一种亵渎,你使用 谎言 掩盖了实际发生过的事情。 如果由合并产生的提交历史是一团糟怎么办? 既然事实就是如此,那么这些痕迹就应该被保留下来,让后人能够查阅。
另一种观点则正好相反,他们认为提交历史是 项目过程中发生的事。 没人会出版一本书的第一版草稿,软件维护手册也是需要反复修订才能方便使用。 持这一观点的人会使用 rebase 及 filter-branch 等工具来编写故事,怎么方便后来的读者就怎么写。
总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。
1 | <head> |
效果:
其中 <script>
里的 defer
是让浏览器加载完全部的 HTML 后再运行该脚本。
1 | <ol> |
1 | <input type="text" placeholder="请输入" /> |
1 | * { |
标准盒:
替代盒(常用):
1 | * { |
标准盒的 width
等于内容宽度,替代盒的 width
等于内容宽度、边框宽度和 padding
宽度的总和。
position: static
:默认跟随文档流position: relative
:相对于自身位置移动一点点,但是会占位position: absolute
:相对最近的非 static
祖先元素定位,不占位position: fixed
:相对视窗定位position: sticky
:正常显示时为 static
,但如果滚动到相对容器的特定位置则变为 fixed
(由 top, left, right, bottom
指定)1 | a[attr^="value"] /* 以 value 开头 */ |
1 | .a { |
1 | #f0e1a6 |
1 |
用于响应式设计。min-width
属性表示最小宽度,限制 width
必定不小于 min-width
。
px
em
:本元素的 font-size
rem
:<html>
的 font-size
vh / vw
vmin / vmax
%
:相对父元素的大小1 | ; |
在 $[-2^{53} + 1, 2^{53} - 1]$ 之间的整数可以精确表示,但过大的整数 / 任意小数难以精确表示。
可以考虑:
parseFloat(res.toFixed(12))
,缺点是大数仍然会出错;bignumber.js,decimal.js,以及 big.js 采用第三种方案。
在 JavaScript 中, null 用于对象, undefined 用于变量,属性和方法。
对象只有被定义才有可能为 null,否则为 undefined。
如果我们想测试对象是否存在,在对象还没定义时将会抛出一个错误。
错误的使用方式:
1 | if (myObj !== null && typeof myObj !== "undefined") |
正确的方式是我们需要先使用 typeof 来检测对象是否已定义:
1 | if (typeof myObj !== "undefined" && myObj !== null) |
在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象。
在下面实例中,当我们使用 person2 作为参数来调用 person1.fullName 方法时, this 将指向 person2, 即便它是 person1 的方法:
1 | var person1 = { |
1 | let obj = JSON.parse(json); |
void(func)
会使用 js 计算 func
,但返回的值固定为 undefined
。
1 | <a href="javascript:void(0)">死链接</a> |
相当于 python 里的 args。
1 | function sumAll() { |
1 | \d{4} // 4 个数字 |
1 | const a = new Promise((resolve, reject) => { |
注意:resolve, reject
不会暂停该 Promise 的运行,例如若 resolve(a); console.log("hi");
则根本不会等待 a
变为 fulfilled
就直接输出 hi
。
1 | const pack = (() => { |
1 | class ClassName { |
call
:正常传参apply
:传入参数数组bind
:返回一个新函数,可以生成回调函数1 | func.call(this, arg1, arg2); |
1 | let element = document.getElementById("id"); |
冒泡:里面先触发。可以看作从里往外,气泡不断向上级冒出的过程。
捕获:外面先触发。可以看作从外往里捕捉的过程。
1 | [...a] // 展开 |
用 function* func(...) { ... }
来创建一个生成器,在生成器里写 yield value
或 yield* [value1, value2, ...]
可以卡住生成器并暂时返回该值。
用 let it = func(...)
来创建一个迭代器(**注意没有 new
**),it.next().value
或 it.next().done
判断是否结束。
也可以直接使用 for-in
循环、[...it]
等语法展开。
也可以在 Person[Symbol.iterator] = function* () { ... }
里定义迭代器,使得该 object 支持迭代。
实例:
1 | function* makeRangeIterator(start = 0, end = Infinity, step = 1) { |
next()
yield value
也有返回值,会返回 it.next(arg)
中的参数 arg
(可选)。
1 | function* fibonacci() { |
1 | export { name as newName, func, func2 }; |
1 | import { newName, draw as newDraw, reportPerimeter } from "./module.js"; |
在 HTML 中:
1 | <script type="module" src="main.js"></script> |
import(path)
返回一个 Promise 对象,其 resolve
的返回值为 Module
本身,可以用 then
来处理 。
1 | squareBtn.addEventListener("click", () => { |
id = setInterval(fn, delay, ...args), clearInterval(id)
Number
:
Number.parseInt
Number.parseFloat
String
:
String.fromCharCode
/ String.charCodeAt
String.match
String.indexOf
/ String.lastIndexOf
String.toUpperCase
/ String.toLowerCase
String.split
String.substring(begin, end)
(等价于特殊判断的 String[begin:end]
)
begin > end
时会交换,当 begin < 0
时会取 0
,当 end > len
时会取 len
Array.slice(begin, end)
(可取负值)