Post
Git
Git 的基础安装不在此赘述,在此记叙些 Git 相关的其它知识。
## 使用 GPG 签名
在基础安装后,其实我们还能做一些有趣的事情 —— 对于我来说,是注意到 Git 提交记录中“未验证”的橙色 Badge 而感兴趣的 —— 就是使用 GPG 来给我们的提交签名 —— 从而使 Badge 变成绿色的“已验证”。
其实我在时间上是更早就在 Git 中使用了 GPG 签名,而 [SSH](/post/SSH) 是更晚接触的,照理,他们可以使用同一套 GPG 公私钥,我应该会在以后统一为一个密钥。
配置方法略,还请自行搜索。
## 使用简洁、明确的标题与约定俗成的提交类型
- 每个提交信息应以一个简短的动词(通常是过去式)开始,描述这次提交的主要修改。
- 标题应简洁明了,尽量不超过 50 个字符。
- 标题后不要加句号 `.`。
示例:
- `feat`: 新功能
- `fix`: 修复 bug
- `docs`: 文档更新
- `style`: 代码格式相关(空格、分号等)
- `refactor`: 代码重构
- `test`: 测试相关
- `chore`: 其他杂项任务
- `fix: Fix login button alignment`
- `feat: Add user
```plaintext
refactor: extract authentication logic into middleware
This makes the authentication logic reusable across multiple routes
and reduces duplication of code.
```
## 使用小而频繁的提交
避免一次写很多功能,专注于一处,每个提交解决一个问题或完成一个功能。这有助于代码的审查、回滚和后期维护。
## 避免 WIP 提交
如果提交不完整,应该避免推送到主分支。可以使用 `git commit --amend{:bash}` 来修改最后一次提交,其用法和注意事项如下:
1. 修改提交消息
```bash
git commit --amend
```
2. 添加忘提交的文件
```bash
git add <missing_file>
git commit --amend
```
3. 移除误提交的文件
```bash
git rm --cached <wrong_file>
git commit --amend
```
<Alert
color={'warning'}
title={'影响提交历史'}
description={
"使用 `--amend` 会改变提交的哈希值,因此如果提交已经被推送到远程仓库,修改提交后需要强制推送。\n这可能影响其他协作者的工作,因此慎用。"
}
/>
Next.js 和 React 使用报告(二)
咳咳,本博客已经转向 Next.js,足以证明 Next.js 框架的先进(自卖自夸)。
遗憾的是至今都没有对 Vue 感兴趣,所以本期使用报告并不会有那样的对比,但还是有别的内容的。
## Vercel
之前自己的博客是搭建在 GitHub Pages 上的,而 GitHub Pages 是一个静态网页托管平台,这说明网页的内容是静态的,这很适合博客这一类更新频率低,不需要用户登录交互的场景。
这次转向 Vercel 单纯是因为其对 Next.js 有很好的支持 —— 因为 Vercel 就是搞 Next.js 的那群人做出来的。
可玩性比 GitHub Pages 要搞多了,不局限于原先的 Hexo 框架和 Butterfly 主题,任何地方都能自己去设计。
Vercel 还提供了 Analytics 和 Speed Insight 功能,可以查看网页状态,开箱即用非常方便。
其实之前也想用 GitHub Actions 来监视仓库变化,以自动构建、部署网页,但总之还是麻烦的,后面不了了之。而 Vercel 在链接到 GitHub 仓库后就能自动 CI/CD,极度方便线上做一些简单的改变 —— 用 GitHub 客户端写个 MDX 的事。
## International
国际化一直是我很喜欢做的一件事,mercurius 就实现了 en、zh-CN、ja 三种语言,我也想博客支持多语言。
国际化的资料还是比较少,直到 Next.js 15 才内置了这个功能 —— 虽然说在此之前我也不知道国际化是个什么情况就是了。
其实我一度想用 [Docusaurus](https://docusaurus.io) 来搭建博客,但正如前面提到的,不想被某个框架局限,最终还是决定自己搭建。
但这也带来了一个问题,该如何对 MDX 内容进行国际化?目前我还没有想到一个好方法。
## 字体
前面的国际化同样会带来一个问题,如何对字体进行国际化。要知道汉字在不同的国家和地区会有不同的字形 ……
总之先摸鱼了,优先度比较低的 Issue 总是这样,被忽略,被拖延 ……
## NextUI
我很喜欢 NextUI 这个 UI 库,其更新频度挺高的,可惜目前我重写博客的时机好像有点不太好,卡在 Next.js 14 到 15、Tailwind CSS 从 v3 到 v4、NextUI 更新 v2.6 版本、ESLint 结束 v8.x 版本维护的这个时间点,许多从网上找的教程还是基于老版本的,也就带来了不便。
好像有点偏题了,说回 UI。
我不会设计颜色,或者说我想要使用的颜色很难去找到一个好看的色盘:
就以彩虹上出现的七种颜色来说,红色用于 Error,橙色用于 Warning,绿色用于 Success,蓝色用于 Primary,紫色用于 Secondary。但我一旦想把橙色作为 Primary,一下就很难设计一个好看、直观的色盘了。
对于背景色,我直接抄的 One Dark Pro 的颜色,这真的好看吧。
还有一点,我已经很久没使用亮色模式了,所以对于设计出的亮色模式下的配色,我是极度的感到不适应 ……
其实博客只想支持暗色模式的,但 ~~挑战自己,逆境翻盘~~ 这就当作是学习了 —— 实际上还不应该拘泥于 light 和 dark 两种模式,多主题不是更好?
## 包管理器
目前我使用的是 yarn v4 版本,目前我还是挺喜欢这个包管理器的,但像是 pnpm、bun 我也非常想尝试,什么时候会转向 pnpm 或者 bun 也说不定,特别是 bun,一个挺厉害的 JavaScript 运行时,还加了很多好东西 ……
但我之前在 Windows 安装后升级出了一点问题来着,也就暂时搁置了。
## 总结
Next.js 确实是很不错的网页前端框架,别急,与 Vue 的对比总会来的,实际上,我已经对 Vue 有一点看法了,按下不表喵。
Test
## 标题
在标题文字前使用 1 到 6 个 <Kbd>#</Kbd> 符号生成标题。其数量决定了标题的级别与字号大小。
```markdown {1} showLineNumbers /标题/
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
```
## 文本样式
| Style | Syntax | Example | Output |
| :--------------------: | :---------------: | :--------------------------------------: | :------------------------------------: |
| Bold | `** **` | `**This is bold text**` | **This is bold text** |
| Italic | `_ _` | `_This text is italicized_` | _This text is italicized_ |
| Strikethrough | `~~ ~~` | `~~This was mistaken text~~` | ~~This was mistaken text~~ |
| Bold and nested italic | `** **` and `_ _` | `**This text is _extremely_ important**` | **This text is _extremely_ important** |
| All bold and italic | `**_ _**` | `**_All this text is important_**` | **_All this text is important_** |
| Subscript | `<sub> </sub>` | `This is a <sub>subscript</sub> text` | This is a <sub>subscript</sub> text |
| Superscript | `<sup> </sup>` | `This is a <sup>superscript</sup> text` | This is a <sup>superscript</sup> text |
| Underline | `<ins> </ins>` | `This is an <ins>underlined</ins> text` | This is an <ins>underlined</ins> text |
## 引用
使用 <Kbd>></Kbd> 引用文字
```markdown
> Quoted text is indented, with a different style.
```
> Quoted text is indented, with a different style.
## 代码
You can call out code or a command within a sentence with single backticks. The text within the backticks will not be formatted. You can also press the <Kbd keys={'command'}>E</Kbd> (Mac) or <Kbd keys={'ctrl'}>E</Kbd> (Windows/Linux) keyboard shortcut to insert the backticks for a code block within a line of Markdown.
```markdown
Use `git status` to list all new or modified files that haven't yet been committed.
```
To format code or text into its own distinct block, use triple backticks.
````markdown
Some basic Git commands are:
```bash
git status
git add
git commit
```
````
在反引号后接编程语言名称,代码会按其语法高亮。
## 链接
You can create an inline link by wrapping link text in brackets `[ ]`, and then wrapping the URL in parentheses `( )`. You can also use the keyboard shortcut <Kbd keys={'command'}>K</Kbd> to create a link. When you have text selected, you can paste a URL from your clipboard to automatically create a link from the selection.
`This site was built using [GitHub Pages](https://pages.github.com/).`
## 列表
You can make an unordered list by preceding one or more lines of text with <Kbd>-</Kbd>, <Kbd>\*</Kbd>, or <Kbd>+</Kbd>.
```markdown
- George Washington
* John Adams
- Thomas Jefferson
```
- George Washington
* John Adams
- Thomas Jefferson
To order your list, precede each line with a number.
```markdown
1. James Madison
2. James Monroe
3. John Quincy Adams
```
1. James Madison
2. James Monroe
3. John Quincy Adams
### 嵌套列表
You can create a nested list by indenting one or more list items below another item.
To create a nested list using the web editor on or a text editor that uses a monospaced font, like [Visual Studio Code](https://code.visualstudio.com/), you can align your list visually. Type space characters in front of your nested list item until the list marker character (<Kbd>-</Kbd> or <Kbd>\*</Kbd>) lies directly below the first character of the text in the item above it.
```markdown
1. First list item
- First nested list item
- Second nested list item
```
1. First list item
- First nested list item
- Second nested list item
To create a nested list in the comment editor on , which doesn't use a monospaced font, you can look at the list item immediately above the nested list and count the number of characters that appear before the content of the item. Then type that number of space characters in front of the nested list item.
In this example, you could add a nested list item under the list item `100. First list item` by indenting the nested list item a minimum of five spaces, since there are five characters (`100. `) before `First list item`.
```markdown
100. First list item
- First nested list item
```
100. First list item
- First nested list item
You can create multiple levels of nested lists using the same method. For example, because the first nested list item has seven characters (`␣␣␣␣␣-␣`) before the nested list content `First nested list item`, you would need to indent the second nested list item by at least two more characters (nine spaces minimum).
```markdown
100. First list item
- First nested list item
- Second nested list item
```
100. First list item
- First nested list item
- Second nested list item
For more examples, see the [GitHub Flavored Markdown Spec](https://github.github.com/gfm/#example-265).
## 任务清单
To create a task list, preface list items with a hyphen and space followed by [ ]. To mark a task as complete, use [x].
```markdown
- [x] #739
- [ ] https://github.com/octo-org/octo-repo/issues/740
- [ ] Add delight to the experience when all tasks are complete 🎉
```
- [x] #739
- [ ] https://github.com/octo-org/octo-repo/issues/740
- [ ] Add delight to the experience when all tasks are complete 🎉
## 段落
You can create a new paragraph by leaving a blank line between lines of text.
## 脚注
You can add footnotes to your content by using this bracket syntax:
```mdx
Here is a simple footnote[^1].
A footnote can also have multiple lines[^2].
[^1]: My reference.
[^2]:
To add line breaks within a footnote, prefix new lines with 2 spaces.
This is a second line.
```
The footnote will render like this:
Here is a simple footnote[^1].
A footnote can also have multiple lines[^2].
[^1]: My reference.
[^2]:
To add line breaks within a footnote, prefix new lines with 2 spaces.
This is a second line.
> The position of a footnote in your Markdown does not influence where the footnote will be rendered. You can write a footnote right after your reference to the footnote, and the footnote will still render at the bottom of the Markdown. Footnotes are not supported in wikis.
## Alerts
We using MDX NextUI component to implement Alerts.
Use alerts only when they are crucial for user success and limit them to one or two per article to prevent overloading the reader. Additionally, you should avoid placing alerts consecutively. Alerts cannot be nested within other elements.
To add an alert, use a special blockquote line specifying the alert type, followed by the alert information in a standard blockquote. Six types of alerts are available:
```mdx
<Alert
title={'Default Style'}
description={'Some normal information content.'}
/>
<Alert
color={'primary'}
title={'Primary Style'}
description={
'Useful information that users should know, even when skimming content.'
}
/>
<Alert
color={'secondary'}
title={'Secondary Style'}
description={'Helpful advice for doing things better or more easily.'}
/>
<Alert color={'success'} title={'Success Style'} description={'We did it!'} />
<Alert
color={'warning'}
title={'Warning Style'}
description={
'Urgent info that needs immediate user attention to avoid problems.'
}
/>
<Alert
color={'danger'}
title={'Danger Style'}
description={'Advises about risks or negative outcomes of certain actions.'}
/>
```
<Alert
title={'Default Style'}
description={'Some normal information content.'}
/>
<Alert
color={'primary'}
title={'Primary Style'}
description={
'Useful information that users should know, even when skimming content.'
}
/>
<Alert
color={'secondary'}
title={'Secondary Style'}
description={'Helpful advice for doing things better or more easily.'}
/>
<Alert color={'success'} title={'Success Style'} description={'We did it!'} />
<Alert
color={'warning'}
title={'Warning Style'}
description={
'Urgent info that needs immediate user attention to avoid problems.'
}
/>
<Alert
color={'danger'}
title={'Danger Style'}
description={'Advises about risks or negative outcomes of certain actions.'}
/>
## 注释
You can tell to hide content from the rendered Markdown by placing the content in an HTML comment.
```mdx
{/* This content will not appear in the rendered Markdown */}
```
Result:
{/* This content will not appear in the rendered Markdown */}
Yes, the content is hidden.
## Ignoring Markdown formatting
You can tell to ignore (or escape) Markdown formatting by using <Kbd>\\</Kbd> before the Markdown character.
```markdown
Let's rename \*our-new-project\* to \*our-old-project\*.
```
Let's rename \*our-new-project\* to \*our-old-project\*.
For more information on backslashes, see Daring Fireball's "[Markdown Syntax](https://daringfireball.net/projects/markdown/syntax#backslash)."
> The Markdown formatting will not be ignored in the title of an issue or a pull request.
SSH
## 奔向命令行
大家第一次使用命令行或见到终端是什么时候呢?大多是第一次编写 C 语言程序吧。
我是小学用 `bat` 文件开 Minecraft 服务器时接触的,当时就想这个界面可真丑,黑咕隆咚的 —— 现在不一样了,尽情美化喵。
终端是那个展示 shell 的窗口,而 shell 的话,Windows 有 `cmd`、`PowerShell`、`Windows PowerShell`,macOS、Linux 有 `bash`,Android 可以使用 [Termux](https://github.com/termux/termux-app),也相当于是 Linux 了 —— 有关 Termux 的配置详见 [Termux 高级终端安装使用配置教程](https://www.sqlsec.com/2018/05/termux.html)。
macOS 和 Linux 的关系更近,总之都能使用 `zsh` 而不是 `bash` 作为 shell,有关 `zsh` 的配置参见 [这篇文章](https://www.mintimate.cn/2021/02/05/configZsh)。
`zsh` 相比 `bash` 能提供命令行历史补全的功能,在 Windows 上,这需要下载 [PowerToys](https://github.com/microsoft/PowerToys) 并启用里面的 `未找到命令` 功能 —— 看起来命令行补全是 `PowerShell` 的功能,但总之这样配置之后就没问题。
在 macOS 上,自带的终端并没有那么“好看”,总之转用了 [iTerm2](https://iterm2.com),相关的配置略。
## 奔向 SSH
在购入了 Mac mini 后,除了写 SwiftUI 外,也想用 Mac mini 做些别的什么 —— 我是用不来 macOS,操作逻辑相比 Windows 总是有太多别扭的地方,我是应该还会把 Windows 作为主要的开发环境的。
于是看视频,了解到 Mac mini 可以作为软路由、NAS、服务器 …… 诶,服务器。
正好最近在玩 Minecraft,而 Mac mini 完全适合 Minecraft 开服 —— 其实就是我想试试看,总之能分担一下我这台 Windows 笔记本的压力吧,让 Mac mini 专心逻辑处理,Windows 笔记本专心渲染。
这就牵扯到远程操作了 —— 这其实不算“远程”,只在内网操作嘛,但 —— 我曾经发病莫名其妙的购买阿里云的服务器,完全不了解自己为什么要用、该怎么去用服务器,总之我确实对 SSH 连接这一步有印象。
具体开启 SSH 的流程就不在此赘述了,现在再来谈个别的事。
SSH 支持免密登录,总之使用 GPG 的非对称加密 —— 我其实对椭圆曲线的数学性质特别感兴趣,但目前找到的一些资料都是用到了抽象代数的方法的那种,没有传统解析几何的那种解释。
> 加密:公钥加密,私钥解密
> 公钥公开,任何公钥持有者都可以将想要发送给私钥持有者的信息进行加密后发送,这个信息只有私钥持有者能解密。
>
> 签名:私钥加密,公钥解密
> 公钥公开,任何持有公钥的人都能解密私钥加密过的密文,这个过程并不能保证消息的安全性,但是它却能保证消息来源的准确性和不可否认性,也就是说,如果使用公钥能正常解密某一个密文,那么就能证明这段密文一定是由私钥持有者发布的,而不是其他第三方发布的,并且私钥持有者不能否认他曾经发布过该消息。
## 奔向 PowerShell
配置好 Windows 和 macOS 上的 SSH 服务后,成功使用 Windows 远程连接到 macOS,相对应的,macOS 也可以远程连接到 Windows,但是远程连接后默认进入的 shell 居然是 `cmd`,这个实在是有点搞笑了。
[SSH 连接 Windows 默认启用 PowerShell](https://learn.microsoft.com/zh-cn/windows-server/administration/OpenSSH/openssh-server-configuration#configuring-the-default-shell-for-openssh-in-windows)
[WSL 默认目录](https://whlit.github.io/linux/wsl-default-dir.html)
如上配置好后,尽情使用 SSH 带来的便利吧。
## BUG
是的,从 Windows 访问 macOS 使用 `ls/ll` 命令列出含有中文文件的文件夹内容时,会有如下的乱码:
```bash
➜ mods git:(main) ✗ ll
total 80440
-rw-r--r-- 1 cierra_runis staff 2.0M Oct 28 04:33 ???Fabric API???fabric-api-0.92.2+1.20.1.jar
-rw-r--r-- 1 cierra_runis staff 6.3M Oct 28 04:50 ???Kotlin ?????????fabric-language-kotlin-1.9.5+kotlin.1.8.22.jar
-rw-r--r-- 1 cierra_runis staff 533K Oct 28 05:15 ???Masa ????????????malilib-fabric-1.20.1-0.16.3.jar
...
```
答案是去 `.zsh_rc` 里取消如下的注释,使 `LANG` 得以固定为 `en_US.UTF-8`:
```bash
# You may need to manually set your language environment
export LANG=en_US.UTF-8
```
Minecraft
最近在折腾 Minecraft 服务器,有了想写的东西,也就一并写在这里。
## Minecraft Java Edition
这真的是对我影响最大的游戏,没有之一了。可惜的是,我已经完全没有自己接触的这款游戏时的任何记忆了,想讲的事情很多。
当时玩的最多的单人版本还是 `1.7.2`,其他的比如 `1.6.4`、`1.7.10`、`1.8`、`1.10.2` 这几个比较有记忆点的版本相比之下玩得比较少。而服务器的话,就看服务器是用的哪个版本。
电脑上用的是一款名为“麦块我的世界盒子”的软件,当时我完全没学过 Java,只知道 Minecraft 是用 Java 编写的,不知道 Minecraft 本身不能像 EXE 程序一样双击启动,而是需要启动器启动。启动器也就是包了一层 GUI,方便配置一些启动参数,最后也是一条命令行启动 —— 也是,EXE 是 Windows 系统的可执行文件,而 Minecraft Java Edition 又不是只支持 Windows 的,macOS 和 Linux 都行。~~真的有人会在 Linux 玩游戏吗?~~
现在比较流行的有 [HMCL](https://github.com/HMCL-dev/HMCL) 和 [PCL2](https://github.com/Hex-Dragon/PCL2) 两款启动器,和麦块一样,只是麦块还带有一些论坛性质,记得还能在上面看相关视频来着。
手机上用的就是“多玩我的世界盒子”啦,当时里面的很多视频都是转载自 Youtube 的,像是粉红羊、钻石哥啥的。
这里提两个视频。第一个严谨来说是系列视频,官方名称叫 [Minecraft for Noobs](https://youtube.com/playlist?list=PLjxIP-vsTvu3Xg6zWYVNB_urX6dXoI3nY),是个动画视频,推荐看看。第 10 集用到了 [OMFG-Hello](https://www.youtube.com/watch?v=ih2xubMaZWI) 这首歌,总之挺好听的(现在觉得有点土就是了)。
其次是
实际上 Minecraft 是付费游戏,但官方对于盗版的态度很平和,没有进行打压,这也让不少像我这样没有钱买游戏的小朋友玩到它。对于盗版行为,我在以后会写篇文章议论一下。我当时确实很想获取正版账号,因为盗版账号是没有皮肤的,默认为 Steve;以及部分服务器开启了“正版验证”,即只允许有正版账号的玩家加入。
当时的价格为 165 人民币,我是实在都不可能搞到这么多钱,更何况网购还卡脖子,直到初三后才有了网购能力。而 2022 年 5 月 13 日,鉴于 Minecraft 买基岩版送 Java 且价格非常实惠,也就终于入正了,作为这么多年来陪伴的感谢。
在没有正版账号的时候,皮肤可以用皮肤站进行修改,像是现在都还在运营的 [LittleSkin](https://littleskin.cn/),而具体的皮肤文件,则可以到 mcbbs 或是我的世界中文下载站找喜欢的,当然也可以自己制作。我自己是不会画的,我找了一个自己喜欢的皮肤,浅浅的修改一下,便有了使用至今的这个皮肤。
“在铁路上”是 Minecraft 中的一个成就(进度?),它要求玩家“通过矿车旅行,移动到至少离出发点 500 米的位置”,然而不知道为什么,我就是无法获得这个成就 —— 为此还铺设了很长很长的一条轨道,消失在无穷远点的那种 —— 现在想想,可能是创造模式不能获取成就吧。
## 服务器
///TODO: 玩服务器
后面开始自己搭建服务器。第一次写 `bat` 文件,面对黑窟窟的 `cmd` 和一堆 log,着实让我头大。
当初选的是 [Sponge](https://spongepowered.org/) 端 —— 官网说今年 10 周年,看来这是 14 年之后的事 —— 教程按 MCBBS 来的,现在看来 Sponge 端不温不火的,我现在应该是不会再选这个端了 —— 不一定呢,或许哪天起兴致了会把所有端都体验一次呢。
Sponge 端用的是 plugin 而不是传统的 mod,当初应该是放在 `mods` 文件夹下就是了,现在是 `plugins` 文件夹。这也使得 Sponge 成为了一个比较特殊的端。
## 再出发
大家好啊,我是日本游学
现在的话,大致能写点东西了。
## 飞机
我认知里的交通工具里,最有技术含量的就是飞机,其次是地铁。地铁有幸在小时候就体验过了,飞机则一直没有乘坐 —— 因为我确乎没有这样的需求,家里人就算行程较远也会选择长途汽车,再就是也从来没有出国旅游、工作、学习。
这次游学之前,有接触到 [ACI](https://space.bilibili.com/358422)(Air Crash Investigation,空中浩劫)这部系列纪录片,讲空难的,也就对飞机感兴趣了。
这次来日本,是先飞到上海再飞到日本的。先到昌北机场把行李托运后给了登机牌,等到登机就上去咯。
这段机程确实没什么餐食,单单给了一个小红豆面包,找到自己位置后做到了靠窗的座位,这样正好可以看着窗外。但这排三个位子只有我一个人,确乎有点害怕。
飞机缓慢(?)地滑行到起飞滑道,然后停住。照纪录片,这里开始确认检查清单。然后便是和滑行时完全不同感觉的加速,加速,[rotate](<https://en.wikipedia.org/wiki/Rotation_(aeronautics)>),起飞。那时候感觉自己就像坐在一个无轨过山车上,一直向上冲刺。
到新的“重力加速度”稳定下来,不依赖窗外的天际线,不仔细观察,确乎很难发现飞机的姿态是向上的。着实稍微理解了什么是空间迷向。
耳压确实能感到变化,但“打开咽鼓管”这种事情我小时候就会了,简简单单就平衡了耳压 —— 据说为了防止机体膨胀回缩造成疲劳,延长飞机的寿命,机内的压强是尽可能低的,低到人体开始感觉异常的临界点。
## 生活
### 住
### 食
一般都会在便利店或自动贩卖机买饮料,有纯净水、咖啡、可乐、麦茶等,但大多数看下来,除了很明显会是甜的东西外,它们大多都是无糖、低糖的。无糖一坨。低糖依托。
自己这次喝到了《命运石之门》里捏他的饮料 [Dr Pepper](https://en.wikipedia.org/wiki/Dr_Pepper),味道,非常,独特。第一次喝还真有点不适应,但味道非常上头,倒是挺喜欢喝。
再就是吃饭。很大的感受就是,咸。我曾多次别扭的表达自己想少放点盐,但我用“少し”而不是“少なめ”,动词变形这块纯纯没学过。此外倒是没有什么,都挺好吃的。就是价格有点贵 ……
对了,杏仁豆腐。杏仁的味道,怪!但好吃。但有次傻逼日本人给了我一袋绿绿的东西,我以为是抹茶什么的,结果是芥末。虽然这只加一点点不是很辣,但我真的有被恶心到。
芥末,我这辈子都吃不来。记得是高中?有同学带了条芥末,试了一点点,那种恶心的、化学刺激性药物的味道,完全不像是辣味了。当时我以为这是什么整蛊专用食品啥的,谁知道真的芥末就这个味。难以忘怀了。
### 行
日本的交通以电车(地铁?轻轨?火车?)为主,我们从成田机场拿着发的切符(きっぷ)乘到(有换乘)锦系町(きんしちょう)。
相比国内,日本电车里的广告很多,查看站台信息的地方少。日本电车的运行噪声比国内大,平稳度也没国内好。电车里会看到有人看书,虽然说多数还是会看手机。对了,有关书籍的开本后面我们再谈谈。
一开始我们用的是纸质票,后面也有说给我们统一办 Suica 卡什么的,但总之被拒绝了,明明可以自己搞的东西。我自己办了一张 Suica 的实体卡,这卡不仅能用在乘车,还能用在售货机,虽然不是很懂为什么要支持这种功能就是了。
## 项目
编程杂谈
## 变量不变性
自学习 C 语言的时候我们就学会了如何给变量赋值:
```c
int testVariable = 0;
```
并且可以对变量 **重新赋值**:
```c
testVariable = 1;
```
而到后来学习了 Java,有个 `final` 关键字,但还是不清楚这有什么作用。接触 Dart 后才切实的了解了为什么会有 `final` 关键字,以及它为什么存在。
很多时候我们编程的流程就是将一个变量处理成另一个变量,而不是对原先的变量进行重新赋值,
ArkUI 使用报告(二)
不想说好话,因为鸿蒙 ArkUI 就是纯纯的一坨。
给目前自己接触过的大前端框架拍个名的话:
| 名次 | 框架 | 备注 |
| :--: | :-------------: | :------------------------------------------------------: |
| 1 | Flutter | 当之无愧 |
| 2 | SwiftUI | 除了文档没有示例,代码格式化不舒服外,框架本身是没问题的 |
| 3 | Next.js | 前端的神 |
| 4 | Electron | 桌面端的神,但我不喜欢什么东西都是浏览器套壳 |
| 5 | React Native | 页面路由麻烦,开发工具不方便 |
| 6 | Jetpack Compose | 半成品 |
| 7 | ArkUI | 残次品 |
它的 IDE 弱智到什么程度呢?连最起码的变量类型都显示不对,Linter 诡异莫测完全不起作用,代码补全完全残废,连 Code Fix 也没有。
有人真要是能对这坨东西骄傲的说有多么厉害那还是屎吃多了不知道饭是咋样的。
状态管理是抄都抄不懂啊!就连最简单的父组件的给子组件传参,父组件的状态变化了不影响子组件,要多在子组件参数加上 `@Link` 注解,那这样我要是子组件有很多参数依赖是不是得把参数都加上 `@Link` 注解?那如此的话模板代码量不就又上去了?
完全不看好 ArkUI 未来的发展,希望早日暴毙。
ArkUI 使用报告
大家好啊,今天来点大家不想看的东西啊。
## ArkTS 语言
> [ArkTS](https://developer.huawei.com/consumer/cn/arkts/) 是鸿蒙生态的应用开发语言。
>
> 它在保持 [TypeScript](https://www.typescriptlang.org/) 基本语法风格的基础上,进一步通过规范强化静态检查和分析,使得在程序运行之前的开发期能检测更多错误,提升代码健壮性,并实现更好的运行性能。
>
> 同时,提供了声明式 UI 范式、状态管理支持等相应的能力,让开发者可以以更简洁、更自然的方式开发高性能应用。
官网是这样说的,但我只能呃呃。可能是华为没有那样的能力去创建一门属于自己的语言吧,最后把 TypeScript 变成了与 Swift 或者说是 Kotlin 缝合的缝合怪。一些令我厌烦的写法,如匿名函数 `.bind(this){:ts}`、模板字符串要用反引号 ``const str = `Show: ${another} value`{:ts}``,也遗传了下来,特别是组件内引用 `state{:ts}` 时也要带上 `this{:ts}`,这肯定是受到语言实现的限制吧。
同样的,我不喜欢 ArkTS:
1. 必须使用 DevEco Studio 才能使用 ArkTS 语言
2. DevEco Studio 自带的代码格式化结果一坨:
```ts
.toolBar({ items: [
{ value: "Plunger", icon: "house", action: () => {
} },
{ value: "Intelligent", icon: "house", action: () => {
} },
{ value: "Shop", icon: "house", action: () => {
} },
{ value: "Me", icon: "house", action: () => {
} },
]
})
```
真看不下去吧,这都和 Xcode 学一样?
3. 格式化风格不统一,和 Swift 一样,加几个回车和空格格式化结果就不一样了,多人协同我不敢想会是怎么样的
4. 没有热更新,但和 SwiftUI 一样提供了 `Preview` 功能 —— 因为如果连 `Preview` 功能都没有的话,对于连模拟器都不支持的 DevEco Studio 来说,没有鸿蒙设备就别想搞鸿蒙开发了
## DevEco Studio
我去,这不是我们 Android Studio 吗,啊不对,这不是我们 IntelliJ IDEA 吗?下次发布记得标注。
其实就是没能力自研 IDE 啦,所以选择“基于 IntelliJ IDEA Community 开源版本打造”。这个选择是正确的,但结果只能说不尽人意。
首先是代码格式化的问题,这个上面讲过了,那么接下来说点别的。
插件未免太少了,因为自己最常用的代码编辑器是 VSCode 嘛 —— 其实在我心目中这玩意可以说是和 IDE 一样的存在了 —— 所以键位肯定也想按 VSCode 的来,在 IntelliJ IDEA 和 Android Studio 上都有 VSCode KeyMap 的插件可以从 VSCode 导入键位,但 Dev Studio 上就是没有。
难道说华为就完全没有在使用 VSCode 的吗 …… 我去,Xcode 也没有,这下破案了。
代码补全一坨,这是做的极差的。感觉代码补全完全没有根据上下文,也就是光标目前所处的地方该填什么类型的东西、默认能填什么东西,来提示补全内容 —— 原版 TypeScript 在 VSCode 上的代码补全可谓是反向的极端,过度依赖上下文以至于有时我想要的结果反而不在补全结果里。
本地化做的不到位,照理说这还是国内公司的软件本地化应该做的更好,但很多地方都没有翻译到 —— 有人可能会说全英文界面更好,开发者就应该多接触英文,可,~~我不懂英文~~ 我更喜欢待在一个更熟悉的环境里啦。
## ArkUI
你们的文档也是和 Apple 学的?ArkUI、SwiftUI、Jetpack Compose 以及基于 XML 视图的 Android 文档怎么都是一个样子?
这样才有教程书的生存空间是吧。
官方入门教程里的界面也太丑了吧,还是说 Harmony Design 就是这样的?实际上,我都不知道这算不算的上 Harmony Design,因为真的很丑。
我该怎么使用图标呢?我真的得将一堆 SVG 下载下来然后再作为资源文件使用吗?鸿蒙是有自己的图标库的,能否像 Flutter 或者 SwiftUI 那样更加和 ArkTS 结合起来呢?
我看到有 `Symbol` 啦,但是一样,示例代码呢?后面是找到了示例代码,但现在要我再去找一次,那我真不知道在哪里翻出来的示例代码。
```ts
SymbolGlyph($r('sys.symbol.ohos_trash'))
.fontWeight(FontWeight.Lighter)
.fontSize(96);
```
```ts
Text() {
SymbolSpan($r('sys.symbol.ohos_trash'))
.fontWeight(FontWeight.Normal)
.fontSize(96)
}
```
我去,我怎么没有 `SymbolGlyph` 和 `SymbolSpan`,有版本要求吗?下次记得标注。
一样没有组件 Gallery 展示 Harmony Design 的默认组件样式,别学 Apple 啊,你能做的更好的啊。
## 总结
累人。
高中数学
## 函数、导数、积分
### 基本知识
#### 多阶导数的记法
对 $f(x)$,记 $f'(x)$ 为一阶导,$f''(x)$ 为二阶导,$f'''(x)$ 为三阶导,任意阶导都可为 $f^{(n)}(x)$
#### 极值点判别法则
对函数 $f(x)$ 在 $x = x_0$ 处若存在 $n \in \N^*$ 使得
$f'(x_0) = f''(x_0) = \dots = f^{(n - 1)}(x_0) = 0$,$f^{(n)}(x_0) > 0$,则当 $n$ 为偶数时,$x_0$ 为极小值点
$f'(x_0) = f''(x_0) = \dots = f^{(n - 1)}(x_0) = 0$,$f^{(n)}(x_0) < 0$,则当 $n$ 为偶数时,$x_0$ 为极大值点
当 $n$ 为奇数时 $x_0$ 既不是极大值点,也不是极小值点
一般取 $n = 2$,即一般来说
$f'(x_0) = 0$,$f''(x_0) > 0$ 即有 $x_0$ 为极小值点
$f'(x_0) = 0$,$f''(x_0) < 0$ 即有 $x_0$ 为极大值点
注意 18 年全国三卷导数题(2)问
### 琴生不等式
$\forall x \in D,f''(x) \ge0 \Leftrightarrow \forall x_1, x_2 \in D,\dfrac{f(x_1) + f(x_2)}{2} \ge f(\dfrac{x_1 + x_2}{2})$
$\forall x \in D,f''(x) \le0 \Leftrightarrow \forall x_1, x_2 \in D,\dfrac{f(x_1) + f(x_2)}{2} \le f(\dfrac{x_1 + x_2}{2})$
这在图像上显然成立,证明略
### ALG 不等式
$\forall x_1, x_2 \in \R^* \Rightarrow \dfrac{x_1 + x_2}{2} > \dfrac{x_1 - x_2}{\ln{x_1} - \ln{x_2}} > \sqrt{x_1x_2}$
### 一个不等式
(1) 若 $f'''(x) > 0$ 且 $f(x)$ 有两零点 $x_1, x_2$,则 $f'(\dfrac{x_1 + x_2}{2}) < 0$
(2) 若 $f'''(x) < 0$ 且 $f(x)$ 有两零点 $x_1, x_2$,则 $f'(\dfrac{x_1 + x_2}{2}) > 0$
现使用虚设函数法证明式 (1)
记 $g(x) = f(x) - f(a - x)$,其中 $a = x_1 + x_2$,且令 $x_1 < \dfrac{a}{2} < x_2$
则 $g'(x) = f'(x) + f'(a - x)$
$g''(x) = f''(x) - f''(a - x)$
$g'''(x) = f'''(x) + f'''(a - x) > 0$
由 $g''(\dfrac{a}{2}) = 0$ 得 $g'(x) \ge g'(\dfrac{a}{2}) = 2f'(\dfrac{a}{2})$
假设 $f'(\dfrac{a}{2}) \ge 0$,则 $g'(x) \ge 0$,$g(x)$ 单调递增
但 $g(\dfrac{a}{2}) = 0 \Rightarrow f(x_1) < f(x_2)$ 与 $f(x_1) = f(x_2) = 0$ 的题设相悖
故 $f'(\dfrac{a}{2}) < 0$,即 $f'(\dfrac{x_1 + x_2}{2}) < 0$
### 利用隐函数求导求曲线上一点切线斜率
有 $F(x,y) = x^2 + 2x + y^2 = 0$
则上一点 $(x,y)$ 切线斜率
$k = \dfrac{\mathrm{d}y}{\mathrm{d}x} = -\dfrac{\dfrac{\partial F}{\partial x}}{\dfrac{\partial F}{\partial y}} = -\dfrac{2x + 2}{2y}= -\dfrac{x + 1}{y}$
其中 $\dfrac{\partial F}{\partial x}$ 表示对 $F$ 求 $x$ 的偏导,即将除了 $x$ 的其他变量视为未知常数进行求导
同理 $\dfrac{\partial F}{\partial y}$ 表示对 $F$ 求 $y$ 的偏导
### 利用隐函数求导求约束条件下的函数最值
已知约束条件 $F(x,y) = 0$,求 $G(x,y)$最值
例:$F(x,y) = x^2 + y^2 + xy - 4 = 0$,求 $G(x,y) = x^2 + y^2$ 最值
解:令 $-\dfrac{\dfrac{\partial F}{\partial x}}{\dfrac{\partial F}{\partial y}} = -\dfrac{\dfrac{\partial G}{\partial x}}{\dfrac{\partial G}{\partial y}}$
化简得 $y = \pm x$
与 $F(x,y) = 0$ 联立解得 $(\pm\dfrac{2}{\sqrt{3}}, \pm\dfrac{2}{\sqrt{3}}), (\pm2, \mp2)$
可得代入得 $G(x,y)$ 最大值为 $8$,最小值为 $\dfrac{8}{3}$
不完全严谨,但确实很多时候有用。
### 圆锥曲线上一点切线方程
| 方程 | 过 $P(x_0, y_0)$ 的切线方程 |
| :---------------------------------------: | :-----------------------------------------: |
| $(x - a)^2 + (y - b)^2 = R^2$ | $(x - a)(x_0 - a) + (y - b)(y_0 - b) = R^2$ |
| $\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} = 1$ | $\dfrac{xx_0}{a^2} + \dfrac{yy_0}{b^2} = 1$ |
| $\dfrac{x^2}{a^2} - \dfrac{y^2}{b^2} = 1$ | $\dfrac{xx_0}{a^2} - \dfrac{yy_0}{b^2} = 1$ |
| $\dfrac{y^2}{b^2} - \dfrac{x^2}{a^2} = 1$ | $\dfrac{yy_0}{b^2} - \dfrac{xx_0}{a^2} = 1$ |
| $y^2 = 2px$ | $yy_0 = p(x + x_0)$ |
| $x^2 = 2py$ | $xx_0 = p(y + y_0)$ |
### 极值点偏移
例:$f(x) = x(\ln{x} - \dfrac{x}{2} + a - 1)$ 有两极值点 $x_1, x_2, x_1 < x_2$
1. 求 $a$ 范围
2. 证明 $2 \ln{x_1} + \ln{x_2} < 0$
(1) 解:由 $f'(x) = \ln{x} - x + a$,$f''(x) = \dfrac{1}{x} - 1$ 得
$f'(x)_{max} = f'(1) = a - 1$
由题 $f'(x)_{max} > 0$,故 $a \in (1, +\infty)$
(2) 证:由 (1) 可得 $0 < x_1 < 1 < x_2$,所证原式即 $x_2 < \dfrac{1}{x_1^2}$
由 $0 < x_1 < 1$ 得 $\dfrac{1}{x_1^2} > 1$
因为 $\dfrac{1}{x_1^2}$ 和 $x_2$ 都在 $(1, +\infty)$ 范围内
且 (1) 有 $f'(x)$ 在 $(1, +\infty)$ 上单调递减
则所证 $x_2 < \dfrac{1}{x_1^2}$ 即 $f'(\dfrac{1}{x_1^2}) < f'(x_2) = 0$
而 $f'(\dfrac{1}{x_1^2}) = \ln{\dfrac{1}{x_1^2}} - \dfrac{1}{x_1^2} + a$
其中的 $a$ 又可由 $f'(x_1) = \ln{x_1} - x_1 + a = 0$ 得到
则代入得 $f'(\dfrac{1}{x_1^2}) = \ln{\dfrac{1}{x_1^2}} - \dfrac{1}{x_1^2} + x_1 - \ln{x_1}$
记 $g(x) = \ln{\dfrac{1}{x^2}} - \dfrac{1}{x^2} + x - \ln{x} = -3 \ln{x} + x - \dfrac{1}{x^2}, x \in (0, 1)$
则证明 $g(x) < 0$ 即可
因为 $g'(x) = \dfrac{(x - 1)(x^2 - 2x - 2)}{x^3} > 0$ 在 $(0, 1)$ 上成立
则 $g(x) < g(1) = 0$,故题得证
## 数列
### 不动点的概念与性质
一般对函数 $f(x)$,若 $\exist x_0 \in \R$ 使 $f(x_0) = x_0$,则称 $x = x_0$ 为 $f(x)$ 的一阶不动点
同时有 $f(f(x_0)) = x_0$,易得一阶不动点也是二阶不动点
一般对数列 $\{x_n\}$ 有递推式 $x_{n+1} = f(x_n)$,若 $\exist x_0 \in \R$ 使 $f(x_0) = x_0$,则称 $x = x_0$ 为 $\{x_n\}$ 的不动点
易得若从某项 $x_k$ 为不动点则后数列恒定不变
要是数列 $\{x_n\}$ 中的项取不到不动点 $x_0$,但足够接近,且后来的项越来越接近 $x_0$,即收敛为 $x_0$
值得注意的是不动点可能为复数,也可能不存在
### 不动点的稳定性
### 一阶线性递推数列
即 $\{x_n\}$ 有 $x_{n+1} = f(x_n) = px_n + q$,求 $\{x_n\}$ 通项公式
1. $p = 1$ 时为等差数列
2. $p \neq 1$ 时解方程 $x_0 = f(x_0)$ 得不动点 $x_0 = \dfrac{q}{1 - p}$ 后,则 $\{x_n - x_0\}$ 为等比数列
### 分式递推数列
即 $x_n$ 有 $x_{n + 1} = f(x_n) = \dfrac{ax_n + b}{cx_n + d}$,求 $\{x_n\}$ 通项公式
这里先解方程 $x_0 = f(x_0)$ 得 $cx_0^2 + (d - a)x_0 - b = 0$
1. 当只有一解 $x_0$ 时,$\{\dfrac{1}{x_n - x_0}\}$ 为等差数列
2. 当有俩解 $\alpha, \beta$ 时(注意复数解也是两个),$\{\dfrac{x_n - \alpha}{x_n - \beta}\}$ 为等比数列
### 一般情形
一般情形下先考虑解方程 $x_0 = f(x_0)$ 得到不动点 $x_0$
再在 $x_{n + 1} = f(x_n)$ 两边同时减去 $x_0$
即 $x_{n + 1} - x_0 = f(x_n) - x_0$
进行代数变形后一般能得到等差数列或等比数列形式
### 不动点为零、复数或不存在时
为零时应当考虑倒数或增项后进行因式分解
为复数时数列必是周期数列
不存在时考虑其他方法
### 二阶线性递推数列
即 $\{x_n\}$ 有 $x_{n + 1} = F(x_n, x_{n - 1}) = px_n + qx_{n - 1}$,求 $\{x_n\}$ 通项公式,已知 $x_1, x_2$
设 $\exist a, b$ 使 $x_{n + 1} - ax_n = b(x_n - ax_{n - 1})$
有 $a + b = p, ab = -q$,即 $a, b$ 为 $x^2 - px - q = 0$ 的解
解得 $a, b$ 后,代入原先的等比数列,解得
$x_n = \dfrac{x_2 - bx_1}{a - b}a^{n - 1} + \dfrac{x_2 - ax_1}{b - a}b^{n - 1}$
### 一个求和式
求 $\displaystyle\sum_{i = 1}^{n} i \cdot i!$
注意到 $(n + 1)! = (n + 1) \cdot n! = n \cdot n! + n!$
故 $\displaystyle\sum_{i = 1}^{n} i \cdot i! = \displaystyle\sum_{i = 1}^{n} [(i + 1)! - i!] = (n + 1)! - 1$
### 构造函数证明数列不等式
#### 累加例
求证 $\displaystyle\sum_{i = 1}^{n} \dfrac{1}{i + 1} < \ln{(1 + n)}$
解:利用 $a_{n + 1} = S_{n + 1} - S_n$ 试将 $\ln{(1 + n)}$ 写成累加形式为 $\displaystyle\sum_{i = 1}^{n} \ln{\dfrac{i + 1}{i}}$
则试证 $\dfrac{1}{x + 1} < \ln{\dfrac{x + 1}{x}}$ 对 $\forall x \ge 1$ 成立
记 $f(x) = \ln{\dfrac{x + 1}{x}} - \dfrac{1}{x + 1}, (x \ge 1)$
$f'(x) = -\dfrac{1}{x(x + 1)^2} < 0$
故 $f(x) > \displaystyle\lim_{x \to +\infty} f(x) = 0$
即 $\dfrac{1}{x + 1} < \ln{\dfrac{x + 1}{x}}$ 对 $\forall x \ge 1$ 得证
故题得证
#### 累乘例
求证 $\dfrac{2}{n(n + 2)} < \displaystyle\prod_{i = 2}^{n} \ln{i}$
解:利用 $a_{n + 1} = \dfrac{T_{n + 1}}{T_n}$ 试将 $\dfrac{2}{n(n + 2)}$ 写成累乘形式为 $\displaystyle\prod_{i = 2}^{n} \dfrac{i - 1}{i + 1}$
则试证 $\dfrac{x - 1}{x + 1} < \ln{x}$ 对 $\forall x \ge 2$ 成立
下略,得题得证
由例可得我们可以通过寻找累加(乘)式以试证累加(乘)对应各项的大小,通过取值并求导得证后回推即题得证,避免了对构造函数不知所措。
## 向量
### 基本知识
向量点乘 $\vec{a} \cdot \vec{b} = |\vec{a}| |\vec{b}| \cos{\theta}$,其中 $\theta$ 为向量 $\vec{a}, \vec{b}$ 所夹角的大小,几何意义略
二维向量伪叉乘 $|\vec{a} \times \vec{b}| = |\vec{a}| |\vec{b}| \sin{\theta}$,其中 $\theta$ 为向量 $\vec{a}, \vec{b}$ 所夹角的大小,几何意义为向量 $\vec{a}, \vec{b}$ 所夹平行四边形面积
两向量 $\vec{a}, \vec{b}$ 夹角为锐角的充要条件为 $\vec{a} \cdot \vec{b} > 0, |\vec{a} \times \vec{b}| \ne 0$
两向量 $\vec{a}, \vec{b}$ 夹角为钝角的充要条件为 $\vec{a} \cdot \vec{b} < 0, |\vec{a} \times \vec{b}| \ne 0$
### 叉乘
#### 二维
叉乘应该主要是三维向量间的计算,我们先谈论其在二维中的应用
二维向量伪叉乘 $|\vec{a} \times \vec{b}| = |\vec{a}| |\vec{b}| \sin{\theta}$
若 $\vec{a} = \begin{bmatrix}m \\ n \end{bmatrix} = (m, n), \vec{b} = \begin{bmatrix}r \\ s \end{bmatrix} = (r, s)$
则 $|\vec{a} \times \vec{b}| = |\det(\begin{bmatrix}m & r \\ n & s \end{bmatrix})| = |\begin{vmatrix}m & r \\ n & s \end{vmatrix}| = |ms - nr|$
其中 $\det()$ 用来求矩阵行列式,具体可看线性代数相关知识
通过上述介绍,我们可以很快求出两向量所夹平行四边形的面积
#### 三维
三维向量叉乘 $\vec{a} \times \vec{b}$ 所输出的是一个新的向量 $\vec{n}$
其中 $|\vec{n}|$ 等于向量 $\vec{a}, \vec{b}$ 所夹平行四边形面积,$\vec{n}$ 为该平行四边形的法向量
且方向可右手掌心朝面,收起无名指和小指,中指指向自己,此时 $\vec{a}$ 为食指,$\vec{b}$ 为中指,$\vec{n}$ 为大拇指
![right hand](/post/right_hand.png)
此处可注意到 $\vec{a} \times \vec{b} = -\vec{b} \times \vec{a}$
若 $\vec{a} = \begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} = (a_1, a_2, a_3), \vec{b} = \begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} = (b_1, b_2, b_3)$
则我们列表 $\begin{vmatrix} a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \end{vmatrix}$
则 $\vec{a} \times \vec{b} = (n_1, n_2, n_3)$ 中
$n_1$ 为挡住所列表第一列后的行列式 $\begin{vmatrix} a_2 & a_3 \\ b_2 & b_3 \end{vmatrix}$
$n_2$ 为挡住所列表第二列后的行列式 $\textcolor{red}{-}\begin{vmatrix} a_1 & a_3 \\ b_1 & b_3 \end{vmatrix}$
$n_3$ 为挡住所列表第三列后的行列式 $\begin{vmatrix} a_1 & a_2 \\ b_1 & b_2 \end{vmatrix}$
通过上述介绍,我们可以很快求出法向量
### 立体几何中的应用
#### 求体积
对于共起点的三维向量 $\vec{a}, \vec{b}, \vec{c}$ 有以该向量所围成的平行六面体的体积 $V_1 = |(\vec{a} \times \vec{b}) \cdot \vec{c}|$
所围成的三棱锥的体积 $V_2 = \dfrac{V_1}{6}$
#### 求二面角
在求如 $E-AB-F$ 的二面角余弦值时,由于法向量求法不同而导致法向量夹角非二面角,要自主判断其正负,容易引发错误,现介绍一种方法避免错误:
求 $E-AB-F$ 二面角余弦
则平面 $ABE$ 一个法向量 $\vec{n_1} = \overrightarrow{AB} \times \overrightarrow{AE}$
平面 $ABF$ 一个法向量 $\vec{n_2} = \overrightarrow{AB} \times \overrightarrow{AF}$
![dihedral angle](/post/dihedral_angle.png)
则由图易得 $E-AB-F$ 即 $\vec{n_1}, \vec{n_2}$ 的夹角
![dihedral angle side](/post/dihedral_angle_side.png)
故可求得二面角余弦值
### 等和线、等差线、等积线、等商线、等平方和线
#### 等和线
#### 等差线
## 复数
### 复数四则运算的几何意义
加法和减法略,我们着重介绍乘法
例:$(2 + \mathrm{i}) \cdot \mathrm{i} = -1 + 2\mathrm{i}$
从复平面上看,$2 + \mathrm{i}$ 逆时针旋转了 $\dfrac{\pi}{2}$
再例:$(\sqrt{3} + \mathrm{i})(1 + \sqrt{3}\mathrm{i}) = 4\mathrm{i}$
从复平面上看,两者辐角相加,模长相乘
证明:对复平面上一复数 $z$ 记模长为 $l$,辐角为 $\theta$
则 $z = l \cos{\theta} + \mathrm{i} \cdot l \sin{\theta} = l(\cos{\theta} + \mathrm{i} \sin{\theta})$
设 $z_1$ 对应 $l_1, \theta_1$,$z_2$ 对应 $l_2, \theta_2$
则 $z_1z_2 = l_1(\cos{\theta_1} + \mathrm{i} \sin{\theta_1}) \cdot l_2(\cos{\theta_2} + \mathrm{i} \sin{\theta_2})= l_1l_2 [\cos{(\theta_1 + \theta_2)} + \mathrm{i} \sin{(\theta_1 + \theta_2)}]$
故得证
由上有复数相乘,模长相乘,辐角相加
同理有复数相除,模长相除,辐角相减
对于某些运算能缩短用时
### 复数的指数运算
推广 $n$ 个复数相乘,有下式成立
$$
\prod_{k = 1}^{n} a_k + b_k \mathrm{i} = \prod_{k = 1}^{n} \sqrt{a_k^2 + b_k^2} \cdot \left[\cos{\left(\sum_{k = 1}^{n} \arctan{\dfrac{b_k}{a_k}} \right)} + \mathrm{i} \sin{\left(\sum_{k = 1}^{n} \arctan{\dfrac{b_k}{a_k}} \right)} \right]
$$
其中 $a_k, b_k \in \R, n \in \N^*$
特殊的 $a_k = a, b_k = b$ 时
$$
(a + b\mathrm{i})^n = \left(\sqrt{a^2 + b^2} \right)^n \cdot \left[\cos{\left(n \arctan{\dfrac{b}{a}} \right)} + \mathrm{i} \sin{\left(n \arctan{\dfrac{b}{a}} \right)} \right]
$$
更特殊的,$a = \cos{\theta}, b = \sin{\theta}$ 时
$$
(\cos{\theta} + \mathrm{i} \sin{\theta})^n = \cos{n\theta} + \mathrm{i} \sin{n\theta}
$$
由二项式定理有
$$
(\cos{\theta} + \mathrm{i} \sin{\theta})^n = \sum_{k = 0}^{n} \mathrm{C}_n^k \cos^{n - k}{\theta} (\mathrm{i} \sin{\theta})^k
$$
拆项对应实部虚部得 $n$ 倍角公式
$$
\cos{n\theta} = \sum_{k = 0}^{\lfloor n / 2 \rfloor} \mathrm{C}_{n}^{2k} (-1)^k \cos^{n - 2k}{\theta} \sin^{2k}{\theta}
$$
$$
\sin{n\theta} = \sum_{k = 0}^{\lfloor n / 2 \rfloor} \mathrm{C}_{n}^{2k + 1} (-1)^k \cos^{n - 2k - 1}{\theta} \sin^{2k + 1}{\theta}
$$
其中 $\lfloor n / 2 \rfloor$ 表示向下取整
## 圆锥曲线
### 圆锥曲线与隐函数求导
圆锥曲线上一点切线方程 —— 见 [利用隐函数求导求曲线上一点切线斜率](#利用隐函数求导求曲线上一点切线斜率)
圆锥曲线外一点两切线切点连线(又称切点弦)形式同上
### 蒙日圆
椭圆两垂直切线交点轨迹为定圆 $x^2 + y^2 = a^2 + b^2$
### 焦点三角形面积
对 $\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} = 1 (a > b > 0)$ 有 $S_{\triangle{PF_1F_2}} = b^2 \cdot \tan{\dfrac{P}{2}}$
对 $\dfrac{x^2}{a^2} - \dfrac{y^2}{b^2} = 1 (a > b > 0)$ 有 $S_{\triangle{PF_1F_2}} = b^2 \cdot \cot{\dfrac{P}{2}}$
抛物线无两焦点,无焦点三角形
### 通径
对 $\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} = 1, (a > b > 0)$ 有通径长 $\dfrac{2b^2}{a}$
对 $\dfrac{x^2}{a^2} - \dfrac{y^2}{b^2} = 1, (a > b > 0)$ 有通径长 $\dfrac{2b^2}{a}$
对 $y^2 = 2px, (p \ne 0)$ 有通径长 $|2p|$
### 焦点弦
对离心率为 $e$ 的圆锥曲线,过焦点的弦 $AB$ 与焦点所在轴交角若为 $\theta$,$|AF| = \lambda|FB|$
则 $|e \cdot \cos{\theta}| = |\dfrac{\lambda - 1}{\lambda + 1}|$
结合三角函数和斜率 $k$ 可变形为其他形式
### 判别式
对 $\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} = 1$ 与 $Ax + By + C = 0, (A \cdot B \ne 0)$
1. 相切 $\Leftrightarrow A^2 a^2 + B^2 b^2 = C^2$
2. 相交 $\Leftrightarrow A^2 a^2 + B^2 b^2 > C^2$
3. 相离 $\Leftrightarrow A^2 a^2 + B^2 b^2 < C^2$
对 $\dfrac{x^2}{a^2} - \dfrac{y^2}{b^2} = 1$ 与 $Ax + By + C = 0, (A \cdot B \ne 0)$
1. 相切 $\Leftrightarrow A^2 a^2 - B^2 b^2 = C^2$
2. 相交 $\Leftrightarrow A^2 a^2 - B^2 b^2 < C^2$
3. 相离 $\Leftrightarrow A^2 a^2 - B^2 b^2 > C^2$
### 费马定理与圆锥曲线的光学性质
费马定理:光从一点传至另一点的用时总是最短(均匀介质中表现为路程最短)
假定圆锥曲线都为镜面,则
1. 从圆心发出的光反射后总回到圆心
2. 从椭圆一焦点发出的光反射后到另一焦点
3. 从抛物线焦点发出的光反射后总是垂直于其准线
4. 从双曲线焦点发出的光反射后所在直线过另一焦点
可以利用以上性质求某些距离和(差)的最值
且利用初中知识作切线和法线有反射角等于入射角
### 一个性质
一动直线恒过圆锥曲线内一定点且交其于两点,则这两点切线交点在其外的某定直线上,反之也成立(与切点弦有相似之处)
对 $\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} = 1$,若定点为 $(x_0, y_0)$,则定直线为 $\dfrac{x x_0}{a^2} + \dfrac{y y_0}{b^2} = 1$
对 $\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} = 1$,若定直线为 $Ax + By + C = 0$,则定点为 $(-\dfrac{A a^2}{C}, -\dfrac{B b^2}{C})$
对 $\dfrac{x^2}{a^2} - \dfrac{y^2}{b^2} = 1$,若定点为 $(x_0, y_0)$,则定直线为 $\dfrac{x x_0}{a^2} - \dfrac{y y_0}{b^2} = 1$
对 $\dfrac{x^2}{a^2} - \dfrac{y^2}{b^2} = 1$,若定直线为 $Ax + By + C = 0$,则定点为 $(-\dfrac{A a^2}{C}, \dfrac{B b^2}{C})$
对 $y^2 = 2px$,若定点为 $(x_0, y_0)$,则定直线为 $y y_0 = p(x + x_0)$
对 $y^2 = 2px$,若定直线为 $Ax + By + C = 0$,则定点为 $(\dfrac{C}{A}, -\dfrac{pB}{A})$
### 共焦点的椭圆与双曲线
考研数学
请确保已经了解了 [高中数学](https://note-of-me.top/posts/35170) 相关知识
## 一元函数微分
### 一元函数极值点、拐点的判定
- 极值点:看 $x_0$ 左右两侧是否为局部最大(小)值;极值点是横坐标
- 拐点:看 $f''(x)$ 是否在 $x_0$ 左右两侧异号,该点本身可以不可导,且 $f''(x) > 0$ 时为凹函数,$f''(x) < 0$ 时为凸函数;拐点是点
#### 极值点判别法则
对函数 $f(x)$ 在 $x = x_0$ 处若存在 $n \in \N^*$ 使得
- $f'(x_0) = f''(x_0) = \dots = f^{(n - 1)}(x_0) = 0$,$f^{(n)}(x_0) > 0$,则当 $n$ 为偶数时,$x_0$ 为极小值点
- $f'(x_0) = f''(x_0) = \dots = f^{(n - 1)}(x_0) = 0$,$f^{(n)}(x_0) < 0$,则当 $n$ 为偶数时,$x_0$ 为极大值点
当 $n$ 为奇数时 $x_0$ 既不是极大值点,也不是极小值点
一般取 $n = 2$,即一般来说
- $f'(x_0) = 0$,$f''(x_0) > 0$ 即有 $x_0$ 为极小值点
- $f'(x_0) = 0$,$f''(x_0) < 0$ 即有 $x_0$ 为极大值点
### 利用泰勒展开求极限
展开公式见 [泰勒级数](#泰勒级数) 一节,这里使用例略,因为太简单了
### 斯特林公式
$$
n! = \sqrt{2 \pi n} (\dfrac{n}{e})^n, n \to +\infty
$$
### 一元函数高阶求导
#### 高阶求导转为等比数列求和
$f(x) = \dfrac{1}{x^2 - x +1}$,求 $f^{(2022)}(0)$
由立方和公式 $a^3 + b^3 = (a + b)(a^2 - ab + b^2)$
得 $f(x) = \dfrac{1 + x}{1 + x^3} = \dfrac{1}{1 + x^3} + x\dfrac{1}{1 + x^3}$
而 $\dfrac{1}{1 + x^3} = \displaystyle\sum_{k = 0}^{\infty} (-x^3)^k, |x^3| < 1$
故 $f(x) = \displaystyle\sum_{k = 0}^{\infty} (-1)^k x^{3k} + \displaystyle\sum_{k = 0}^{\infty} (-1)^k x^{3k + 1}, |x^3| < 1$
故 $f^{(2022)}(0)$ 应该为 $x^{2022}$ 的系数乘以 $2022!$
可得系数为 $(-1)^{674} = 1$,故答案为 $2022!$
除利用立方和公式外,还可利用立方差公式等
#### 高阶求导转为泰勒展开式
$f(x) = x^2\ln{(1 + x)}$,求 $f^{(n)}(0)$
因为 $\ln{(1 + x)} = \displaystyle\sum_{k = 1}^{\infty} \dfrac{(-1)^{k + 1} x^k}{k}$
故 $f(x) = \displaystyle\sum_{k = 1}^{\infty} \dfrac{(-1)^{k + 1} x^{k + 2}}{k}$
故 $f^{(n)}(0)$ 应为 $x^{n}$ 的系数乘以 $n!$
可得系数为 $\dfrac{(-1)^{n - 1}}{n - 2}$,故答案为 $\dfrac{(-1)^{n - 1}}{n - 2} n!$
### 一元函数极限
求 $\displaystyle\lim_{x \to a} f(x)$ 时,要考查 $\displaystyle\lim_{x \to a^+} f(x)$ 和 $\displaystyle\lim_{x \to a^-} f(x)$
若 $\displaystyle\lim_{x \to +\infty} f(x) = 0, \displaystyle\lim_{x \to +\infty} g(x) = +\infty$,则 $\displaystyle\lim_{x \to +\infty} (1 + f(x))^{g(x)} = \exp{\lim_{x \to +\infty} f(x)g(x)}$
当分子或分母为根式相加减时,可尝试分子或分母有理化
若有 $\displaystyle\lim_{x \to x_0} \dfrac{f(x)}{g(x)} = a$,则可以转写为在 $x = x_0$ 的某个领域内 $f(x) = ag(x)$
对于 $\displaystyle\lim_{n \to +\infty} f(\dfrac{1}{n})$,不可使用 $x = \dfrac{1}{n}$ 的代换,必须保留 $\dfrac{1}{n}$ 的形式
对于 $\displaystyle\lim_{n \to +\infty} x_n = +\infty, \displaystyle\lim_{n \to +\infty} y_n = \displaystyle\lim_{n \to +\infty} z_n = a$,有 $\displaystyle\lim_{n \to +\infty} x_n [f(y_n) - f(z_n)] = \displaystyle\lim_{n \to +\infty} x_n (y_n - z_n) f'(\xi)$,其中 $\xi$ 在 $y_n, z_n$ 之间
### 极限四则运算存在性
- 若 $\displaystyle\lim_{x \to a} f(x) = A$,$\displaystyle\lim_{x \to a} g(x)$ 不存在,则 $\displaystyle\lim_{x \to a} f(x) + g(x)$ 不存在;当 $A \neq 0$ 时,又有 $\displaystyle\lim_{x \to a} f(x)g(x)$ 不存在,$A = 0$ 时不确定
- 若 $\displaystyle\lim_{x \to a} f(x)$ 和 $\displaystyle\lim_{x \to a} g(x)$ 均不存在,则 $\displaystyle\lim_{x \to a} f(x) + g(x)$ 和 $\displaystyle\lim_{x \to a} f(x)g(x)$ 均不确定
### 一元函数连续、可导、可微的判定和关系
#### 一元函数连续的判定
- 若 $\displaystyle\lim_{x \to x_0} f(x) = f(x_0)$,则称 $f(x)$ 在 $x = x_0$ 处连续
- 若 $\displaystyle\lim_{x \to x_0^-} f(x) = f(x_0)$,则称 $f(x)$ 在 $x = x_0$ 处左连续,右连续略
#### 一元函数可导的判定
- 若 $\displaystyle\lim_{x \to x_0} \dfrac{f(x) - f(x_0)}{x - x_0}$ 存在,则称 $f(x)$ 在 $x = x_0$ 处可导
- 若 $\displaystyle\lim_{x \to x_0^-} \dfrac{f(x) - f(x_0)}{x - x_0}$ 存在,则称 $f(x)$ 在 $x = x_0$ 处左可导,右可导略
#### 一元函数可微的判定
- 若 $\Delta{y} = f(x_0 + \Delta{x}) - f(x_0) = A\Delta{x} + \omicron(\Delta{x})$,则称 $f(x)$ 在 $x = x_0$ 处可微,且微分 $\mathrm{d}y = A\Delta{x} = A\mathrm{d}x$
#### 一元函数连续、可导、可微的关系
$$
可微 \iff 可导 \implies 连续
$$
没标注的箭头表示无法推出
### 导数极限和导数的关系
$\displaystyle\lim_{x \to x_0} f'(x)$ 存在,无法判断 $f(x)$ 是否在 $x = x_0$ 处连续
- 若 $\displaystyle\lim_{x \to x_0} f'(x) = A$,且 $f(x)$ 在 $x = x_0$ 处连续,则 $f'(x_0) = A$,否则不存在
- 若 $\displaystyle\lim_{x \to x_0} f'(x) = \infty$,则 $f'(x_0)$ 不存在
- 若 $\displaystyle\lim_{x \to x_0} f'(x)$ 不存在且不为 $\infty$,则需要利用 [一元函数可导的判定](#一元函数可导的判定) 小节中的判断
### 间断点
#### 第一类间断点
- 可去间断点:$\displaystyle\lim_{x \to x_0} f(x)$ 存在,但其于 $f(x_0)$ 不相等或 $f(x_0)$ 无定义
- 跳跃间断点:$\displaystyle\lim_{x \to x_0^+} f(x)$ 与 $\displaystyle\lim_{x \to x_0^-} f(x)$ 存在但不相等
#### 第二类间断点
$\displaystyle\lim_{x \to x_0^+} f(x)$ 与 $\displaystyle\lim_{x \to x_0^-} f(x)$ 任一不存在
### 曲率和曲率半径
$$
K = \dfrac{|x'y'' - x''y'|}{(x'^2 + y'^2)^{\frac{3}{2}}}
$$
$$
R = \dfrac{1}{K}
$$
### 曲率半径的推导
若 $x = x(t), y = y(t)$,令 $(x - a)^2 + (y - b)^2 = R^2$ 是其在点 $(x, y)$ 的曲率圆
对曲率圆求关于 $t$ 的偏导、二次偏导:
$$
\left\{
\begin{align*}
(x - a)x' + (y - b)y' &= 0\\
x'^2 + y'^2 + (x - a)x'' + (y - b)y'' &= 0\\
\end{align*}
\right.
$$
解得
$$
\left\{
\begin{align*}
x - a &= -\dfrac{x'^2 + y'^2}{x'y'' - x''y'} y'\\
y - b &= \dfrac{x'^2 + y'^2}{x'y'' - x''y'} x'\\
\end{align*}
\right.
$$
故 $R^2 = \dfrac{(x'^2 + y'^2)^3}{(x'y'' - x''y')^2}$
一般题目会让你求单点的曲率,可以直接代入解上面的方程组
### 渐近线
先看间断点:左右极限任一为无穷 $\implies$ 铅直渐近线
再看水平或斜渐近线 $y = ax + b$,同样要考查 $x \to +\infty$ 和 $x \to -\infty$ 两个方向
## 一元函数积分
### 不定积分
#### 原函数存在定理
- 若 $f(x)$ 在 $[a, b]$ 上连续,则在 $[a, b]$ 上存在原函数
- 若 $f(x)$ 在 $[a, b]$ 上有跳跃间断点,则在 $[a, b]$ 上一定不存在原函数
$f(x)$ 不连续时,原函数存在性与定积分存在性可以各不相干
由原函数定义,$F'(x) = f(x)$,故 $F(x)$ 连续
#### 好用的式子
- $\displaystyle\int{ e^{ax} \cos{bx} \mathrm{d}x} = e^{ax} \dfrac{a \cos{bx} + b \sin{bx}}{a^2 + b^2} + C$
- $\displaystyle\int{ e^{ax} \sin{bx} \mathrm{d}x} = e^{ax} \dfrac{a \sin{bx} - b \cos{bx}}{a^2 + b^2} + C$
当 $P(x)$ 为多项式时以下三个式子非常好用
- $\displaystyle\int{ P(x)e^{ax} \mathrm{d}x} = e^{ax} (\dfrac{P}{a} - \dfrac{P'}{a^2} + \dfrac{P''}{a^3} - \cdots) + C$
- $\displaystyle\int{ P(x)\cos{ax} \mathrm{d}x} = \cos{ax} (\dfrac{P'}{a^2} - \dfrac{P'''}{a^4} + \cdots) + \sin{ax} (\dfrac{P}{a} - \dfrac{P''}{a^3} + \cdots) + C$
- $\displaystyle\int{ P(x)\sin{ax} \mathrm{d}x} = \sin{ax} (\dfrac{P'}{a^2} - \dfrac{P'''}{a^4} + \cdots) - \cos{ax} (\dfrac{P}{a} - \dfrac{P''}{a^3} + \cdots) + C$
#### 如何快速拆开分式多项式
例:对 $f(x) = \dfrac{7x - 2}{(2x - 1)(x + 1)} = \dfrac{A}{2x - 1} + \dfrac{B}{x + 1}$
在式子两边同时乘以 $2x - 1$ 得 $\dfrac{7x - 2}{x + 1} = A + \dfrac{2x - 1}{x + 1}B$,令 $x = \dfrac{1}{2}$ 得 $A = 1$
在式子两边同时乘以 $x + 1$ 得 $\dfrac{7x - 2}{2x - 1} = \dfrac{x + 1}{2x - 1}A + B$,令 $x = -1$ 得 $B = 3$
#### 欧拉公式在积分中的应用
令 $y = e^{\mathrm{i}x}$,则
- $2\mathrm{i} \sin{x} = y - \dfrac{1}{y}, 2 \cos{x} = y + \dfrac{1}{y}$
- $2\mathrm{i} \sin{kx} = y^k - \dfrac{1}{y^k}, 2 \cos{kx} = y^k + \dfrac{1}{y^k}, k \in \N$
使用例:
求 $I = \displaystyle\int{\cos^4{x}} \mathrm{d}x$
因为 $(2\cos{x})^4 = (y + \dfrac{1}{y})^4 = y^4 + \dfrac{1}{y^4} + 4(y^2 + \dfrac{1}{y^2}) + 6 = 2 \cos{4x} + 8 \cos{2x} + 6$
故 $\cos^4{x} = \dfrac{\cos{4x}}{8} + \dfrac{\cos{2x}}{2} + \dfrac{3}{8}$
故得 $I = \dfrac{\sin{4x}}{32} + \dfrac{\sin{2x}}{4} + \dfrac{3x}{8} + C$
对不出现奇数次幂的正弦函数的积分都好用,如果出现了,则一般按 $\sin{x} \mathrm{d}x = -\mathrm{d}\cos{x}$ 处理
#### 费曼积分法
若 $f(x, t)$ 在 $R[x \in [a, A], t \in [b, B]]$ 内有定义且连续,且 $\dfrac{\partial{f}}{\partial{t}}$ 在 $R$ 内连续,则有
$$
\dfrac{\mathrm{d}}{\mathrm{d}t} \int_{a}^{A} f(x, t) \mathrm{d}x = \int_{a}^{A} \dfrac{\partial{f}}{\partial{t}} \mathrm{d}x
$$
更一般情况下,当下限为 $u(t)$ 上限为 $v(t)$ 且 $t \in (b, B)$ 时 $u(t) \in [a, A], v(t) \in [a, A]$,则有
$$
\dfrac{\mathrm{d}}{\mathrm{d}t} \int_{u(t)}^{v(t)} f(x, t) \mathrm{d}x = f(v(t), t) \cdot v'(t) - f(u(t), t) \cdot u'(t) + \int_{u(t)}^{v(t)} \dfrac{\partial{f}}{\partial{t}} \mathrm{d}x
$$
例:求 $I = \displaystyle\int \dfrac{\mathrm{d}x}{(1 + x^2)^2}$
构造 $f(x, t) = \displaystyle\int \dfrac{\mathrm{d}x}{t^2 + x^2}$,则 $\dfrac{\partial{f}}{\partial{t}} = \displaystyle\int\dfrac{-2t \mathrm{d}x}{(t^2 + x^2)^2}$
有 $[\dfrac{\partial{f}}{\partial{t}}]_{t \to 1} = -2I$
故
$$
\begin{align*}
I &= -\dfrac{1}{2} [\dfrac{\partial{f}}{\partial{t}}]_{t \to 1}\\
&= -\dfrac{1}{2} [\dfrac{\partial{\displaystyle\int \dfrac{\mathrm{d}x}{t^2 + x^2}}}{\partial{t}}]_{t \to 1}\\
&= -\dfrac{1}{2} [\dfrac{\partial{\dfrac{1}{t} \arctan{\dfrac{x}{t}}}}{\partial{t}}]_{t \to 1}\\
&= -\dfrac{1}{2} [-\dfrac{1}{t^2} \arctan{\dfrac{x}{t}} - \dfrac{x}{t^3} \dfrac{1}{1 + (\dfrac{x}{t})^2}]_{t \to 1}\\
&= \dfrac{\arctan{x} + \dfrac{x}{1 + x^2}}{2} + C
\end{align*}
$$
更多信息见 [此链接](http://mathmarch.com/knowledge/0d9388502e0811eabe02815ed3256640/)
### 定积分
#### 反常积分敛散性的判定
反常积分有以下两种可能:
- 无穷限的反常积分 —— 积分上下限任一为无穷:$\displaystyle\int_{a}^{+\infty} f(x) \mathrm{d}x$、$\displaystyle\int_{-\infty}^{b} f(x) \mathrm{d}x$、$\displaystyle\int_{-\infty}^{+\infty} f(x) \mathrm{d}x$
- 无界函数的反常积分 —— 积分区间内某点(瑕点)函数值为无穷:$\displaystyle\int_{a}^{b} f(x) \mathrm{d}x$ 且 $\exist{x_0} \in{[a, b]}$ 使 $f(x_0) = \infty$
当然这两种可能可以同时成立,接下来给出判定方法:
首先对无穷限判定,记 $\displaystyle\lim_{x \to \infty} x^p f(x) \mathrm{d}x = A$
- 若存在 $p > 1$ 使 $A$ 存在则收敛
- 若存在 $p \leqslant 1$ 使 $A$ 为无穷或非零数则发散
不是说上面就完事了,还有其他地方需要判定
再判定瑕点,记 $\displaystyle\lim_{x \to x_0^+} (x - x_0)^p f(x) = A$
- 若存在 $p < 1$ 使 $A$ 存在则收敛
- 若存在 $p \geqslant 1$ 使 $A$ 为无穷或非零数则发散
当然你还得判定 $\displaystyle\lim_{x \to x_0^-} (x_0 - x)^p f(x) = A$
只有当各处均收敛时才能判定为收敛
##### 奇偶函数反常积分的敛散性
- 若 $\displaystyle\int_{-\infty}^{+\infty} f(x) \mathrm{d}x$ 收敛,则
$$
\displaystyle\int_{-\infty}^{+\infty} f(x) \mathrm{d}x =
\left\{
\begin{align*}
&0 & f(x) 为奇函数\\
&2 \int_{0}^{+\infty} f(x) & f(x) 为偶函数\\
\end{align*}
\right.
$$
- 若 $\displaystyle\int_{-\infty}^{+\infty} f(x) \mathrm{d}x$ 即 $\displaystyle\lim_{A \to +\infty, B \to -\infty}\int_{B}^{A} f(x) \mathrm{d}x$ 存在,则 $\displaystyle\lim_{R \to +\infty} \int_{-R}^{R} f(x)$ 存在;后者无法推出前者
##### 反常积分和的敛散性
| $\displaystyle\int_{a}^{+\infty} f(x) \mathrm{d}x$ | $\displaystyle\int_{a}^{+\infty} g(x) \mathrm{d}x$ | $\displaystyle\int_{a}^{+\infty} [f(x) \pm g(x)] \mathrm{d}x$ |
| :------------------------------------------------: | :------------------------------------------------: | :-----------------------------------------------------------: |
| 收敛 | 收敛 | 收敛 |
| 收敛 | 发散 | 发散 |
| 发散 | 发散 | 不确定 |
| $\displaystyle\int_{-\infty}^{a} f(x) \mathrm{d}x$ | $\displaystyle\int_{a}^{+\infty} f(x) \mathrm{d}x$ | $\displaystyle\int_{-\infty}^{+\infty} f(x) \mathrm{d}x$ |
| :------------------------------------------------: | :------------------------------------------------: | :------------------------------------------------------: |
| 收敛 | 收敛 | 收敛 |
| - | - | 发散 |
#### 三角函数的积分特性
以下性质均由区间重现推出
- $\displaystyle\int_{0}^{\pi} xf(\sin{x}) \mathrm{d}x = \dfrac{\pi}{2} \displaystyle\int_{0}^{\pi} f(\sin{x}) \mathrm{d}x$
- $\displaystyle\int_{0}^{\frac{\pi}{2}} f(\sin{x}) \mathrm{d}x = \displaystyle\int_{0}^{\frac{\pi}{2}} f(\cos{x}) \mathrm{d}x$
#### Wallis 公式
$$
\begin{align*}
I &= \displaystyle\int_{0}^{\frac{\pi}{2}} \sin^m{x} \cos^n{x} \mathrm{d}x\\
&= \displaystyle\int_{0}^{\frac{\pi}{2}} \cos^m{x} \sin^n{x} \mathrm{d}x\\
&= \left\{
\begin{align*}
&\dfrac{(m - 1)!!(n - 1)!!}{(m + n)!!} & m,n 不均为偶数\\
&\dfrac{(m - 1)!!(n - 1)!!}{(m + n)!!} \cdot \frac{\pi}{2} & m,n 均为偶数\\
\end{align*}
\right.
\end{align*}
$$
#### 周期函数的积分特性
- 若 $f(x)$ 为周期为 $T$ 的连续函数,则 $\displaystyle\int_{a}^{a + T} f(x) \mathrm{d}x = \displaystyle\int_{b}^{b + T} f(x) \mathrm{d}x$
#### 一元函数积分转多元函数积分
- 对 $\rho = \rho(\theta)$ 有 $S = \dfrac{1}{2} \displaystyle\int_{\theta_1}^{\theta_2} \rho^2 \mathrm{d}\theta$,故求 $I = \displaystyle\int_{a}^{b} f^2(\sin{\theta}, \cos{\theta}) \mathrm{d}\theta$ 时,令 $\rho = f(\sin{\theta}, \cos{\theta}), x = \rho \cos{\theta}, y = \rho \sin{\theta}$,转化为二重积分且 $I = 2S$
- 对 $I = \displaystyle\int_{0}^{+\infty} \dfrac{f(x)}{x} \mathrm{d}x$,令 $\dfrac{1}{x} = \displaystyle\int_{0}^{+\infty} e^{-xy} \mathrm{d}y$,可得 $I = \displaystyle\int_{0}^{+\infty} \mathrm{d}y \cdot \displaystyle\int_{0}^{+\infty} f(x) e^{-xy} \mathrm{d}x$,这对于 $f(x) = e^{ax}$、$f(x) = a \sin{bx} + c \cos{dx}$ 都很好用
参见 [此链接](https://www.bilibili.com/video/av1604217605/) 与 [此链接](https://www.bilibili.com/video/av368640102/)
#### 傅汝兰尼积分
$f(x)$ 在 $[0, +\infty)$ 上连续,$a, b > 0$,记 $I =\displaystyle\int_{0}^{+\infty} \dfrac{f(ax) - f(bx)}{x} \mathrm{d}x$
- 若 $\displaystyle\lim_{x \to +\infty} f(x) = A$,则 $I = [f(0) - A] \ln{\dfrac{b}{a}}$
- 若 $\exist k > 0$ 使 $\displaystyle\int_{k}^{+\infty} \dfrac{f(x)}{x}$ 收敛,则 $I = f(0) \ln{\dfrac{b}{a}}$
- 若 $\exist k > 0$ 使 $\displaystyle\int_{0}^{k} \dfrac{f(x)}{x}$ 收敛,则 $I = -f(+\infty) \ln{\dfrac{b}{a}}$
#### 定积分的应用
##### 平面图形面积
直角坐标 $y = f(x)$ 和 $x = \varphi(y)$ 易推导,极坐标 $S = \dfrac{1}{2} \displaystyle\int_{a}^{b} \rho^2{(\theta)} \mathrm{d}\theta$ 也易推导,更多参看 [雅可比矩阵](#雅可比矩阵)
##### 平面曲线弧长
参数方程易推导,直角坐标 $y = f(x)$ 套用参数方程,极坐标 $l = \displaystyle\int_{a}^{b} \sqrt{\rho^2(\theta) + \rho'^2(\theta)} \mathrm{d}\theta$,更多参看 [曲线积分与曲面积分](#曲线积分与曲面积分)
##### 旋转体体积
在此对易推导的情况不做讨论,我们着重介绍以极坐标形式给出时的求法,参见 [此链接](https://www.bilibili.com/video/av554024399/),更多参看 [雅可比矩阵](#雅可比矩阵)
极坐标下,绕极轴旋转的旋转体体积微元 $\mathrm{d}V = \dfrac{2\pi}{3} \rho^3 \sin{\theta} \mathrm{d}\theta$,推导如下:
考虑角度 $\theta$ 有极小变化 $\mathrm{d}\theta$,则其扫过的扇形所旋转得到的体积 $\mathrm{d}V$ 由其上与原点不同距离的最小面积微元 $\mathrm{d}S$ 旋转得到的最小体积微元 $\mathrm{d}v$ 求和而得
有 $\mathrm{d}S = \rho \mathrm{d}\theta \mathrm{d}\rho$,这是一个小长方形
有 $\mathrm{d}v = \mathrm{d}S \cdot 2\pi\rho\sin{\theta}$,再将这个小长方形旋转
有 $\mathrm{d}V = \displaystyle\int_{0}^{\rho} \mathrm{d}v = \int_{0}^{\rho} 2\pi\rho^2\sin{\theta} \mathrm{d}\theta \mathrm{d}\rho = 2\pi\sin{\theta} \dfrac{\rho^3}{3} \mathrm{d}\theta$,注意这里是对 $\rho$ 积分,将与原点不同距离的 $\mathrm{d}v$ 求和
##### 旋转曲面面积
直角坐标易推导,参数方程套用参数方程,更多参看 [曲线积分与曲面积分](#曲线积分与曲面积分)
## 向量与空间解析几何
### 直线方程的几何意义
一般式表示两平面的交线:
$$
\left\{
\begin{align*}
A_1x + B_1y + C_1z + D_1 = 0\\
A_2x + B_2y + C_2z + D_2 = 0\\
\end{align*}
\right.
$$
其方向向量与两个平面的法向向量垂直,故可令 $\vec{l} = \vec{n_1} \times \vec{n_2}$
对称式和参数式都很容易理解,略
### 点到平面距离公式的几何意义
$A = (x_0, y_0, z_0)$ 到 $Ax + By + Cz + D = 0$ 的距离 $d = \dfrac{|Ax_0 + By_0 + Cz_0 + D|}{\sqrt{A^2 + B^2 + C^2}}$
取平面上一点 $B = (x_1, y_1, z_1)$ 故显然 $\overrightarrow{BA}$ 在法向量的投影即距离,故 $d = \dfrac{|(A, B, C)(x_1 - x_0, y_1 - y_0, z_1 - z_0)|}{|(A, B, C)|}$,下略
### 点到直线距离公式的几何意义
$A = (x_0, y_0, z_0)$ 到通过 $B = (x_1, y_1, z_1)$ 方向向量为 $\vec{n}$ 的直线距离 $d = \dfrac{|\overrightarrow{BA} \times \vec{n}|}{|\vec{n}|}$
因为 $\overrightarrow{BA}$ 和 $\vec{n}$ 所夹平行四边形面积为 $|\overrightarrow{BA} \times \vec{n}|$,故除以底 $|\vec{n}|$ 得高 $d$
### 空间曲线的切线与法平面方程的几何意义
#### 以参数方程给出时空间曲线的切线与法平面方程的几何意义
若曲线参数方程为:
$$
\left\{
\begin{align*}
x = x(t)\\
y = y(t)\\
z = z(t)\\
\end{align*}
\right.
$$
则其上一点的切向量 $\vec{l} = (x', y', z')$
结合物理意义来看,将 $t$ 视为时间,那么各个方向,如 $x$ 方向上位置关于时间的函数 $x(t)$ 的导数 $x'(t)$ 就是该方向上速度,有 $\vec{l_x} = (x', 0, 0)$,又因为速度是矢量,故叠加得到 $\vec{l}$
有了切向量,那么切线和法平面的方程的几何意义很明显了,略
#### 以方程组给出时空间曲线的切线与法平面方程的几何意义
若曲线方程组为:
$$
\left\{
\begin{align*}
F(x, y, z) = 0\\
G(x, y, z) = 0\\
\end{align*}
\right.
$$
其表示两曲面的交线,我们考虑交线上一点 $(x_0, y_0, z_0)$,在 $F$ 上有法向量 $\vec{n_1}$,具体求法见 [以隐函数给出时空间曲面的切平面与法线方程的几何意义](#以隐函数给出时空间曲面的切平面与法线方程的几何意义),在 $G$ 上有法向量 $\vec{n_2}$,显然交线上该点的方向向量 $\vec{l} = \vec{n_1} \times \vec{n_2}$
可以注意到 [直线方程的几何意义](#直线方程的几何意义) 就是本节的一个特例
### 空间曲面的切平面与法线方程的几何意义
#### 以隐函数给出时空间曲面的切平面与法线方程的几何意义
若曲面方程为 $F(x, y, z) = 0$:
考虑曲面上原来一点 $(x_0, y_0, z_0)$ 经过微小变动到底曲面上另一点 $(x_0 + \Delta x, y_0 + \Delta y, z_0 + \Delta z)$
故由全增量公式有 $F(x_0 + \Delta x, y_0 + \Delta y, z_0 + \Delta z) = F(x_0, y_0, z_0) + \dfrac{\partial{F}}{\partial{x}} \Delta x + \dfrac{\partial{F}}{\partial{y}} \Delta y + \dfrac{\partial{F}}{\partial{z}} \Delta z = 0$
而 $F(x_0, y_0, z_0) = 0$,故 $\dfrac{\partial{F}}{\partial{x}} \Delta x + \dfrac{\partial{F}}{\partial{y}} \Delta y + \dfrac{\partial{F}}{\partial{z}} \Delta z = 0$
其可视作为两个向量 $\vec{n} = (\dfrac{\partial{F}}{\partial{x}}, \dfrac{\partial{F}}{\partial{y}}, \dfrac{\partial{F}}{\partial{z}})$、$\vec{l} = (\Delta{x} ,\Delta{y} ,\Delta{z})$ 的点积,这说明两向量垂直
又由于 $\vec{l}$ 是我们任意取的,而 $\vec{n}$ 对于所有的 $\vec{l}$ 都有垂直关系,因而 $\vec{n}$ 就是该点的法向量
此外其 $\vec{n}$ 也被称为梯度,利用 [Nabla 算子、环量、旋度、格林公式与斯托克斯公式](#nabla-算子环量旋度格林公式与斯托克斯公式) 一节中的知识,我们将其记作 $\vec{\nabla}F$,注意这里的 $F$ 与 $\vec{\nabla}$ 的运算与向量数乘类似,其结果是个向量
#### 以显函数给出时空间曲面的切平面与法线方程的几何意义
若曲面以 $z = f(x, y)$ 的形式给出:
利用 [以隐函数给出时空间曲面的切平面与法线方程的几何意义](#以隐函数给出时空间曲面的切平面与法线方程的几何意义) 的结论,取 $F(x, y, z) = f(x, y) - z = 0$ 即可
## 多元函数微分
### 多元函数求导
- 若 $z = z(x, y)$ 则
$$
\mathrm{d}z = \dfrac{\partial{z}}{\partial{x}} \mathrm{d}x + \dfrac{\partial{z}}{\partial{y}} \mathrm{d}y
$$
- 若 $z = z(u, v), u = u(x, y), v = v(x, y)$ 则
$$
\dfrac{\partial{z}}{\partial{x}} = \dfrac{\partial{z}}{\partial{u}} \dfrac{\partial{u}}{\partial{x}} + \dfrac{\partial{u}}{\partial{v}} \dfrac{\partial{v}}{\partial{x}}
$$
$$
\dfrac{\partial{z}}{\partial{y}} = \dfrac{\partial{z}}{\partial{u}} \dfrac{\partial{u}}{\partial{y}} + \dfrac{\partial{u}}{\partial{v}} \dfrac{\partial{v}}{\partial{y}}
$$
- 若 $I(x) = \displaystyle\int_{u(x)}^{v(x)} f(t) \mathrm{d}t$,则 $\dfrac{\mathrm{d}I}{\mathrm{d}x} = f(v) v' - f(u) u'$,当积分内不单为关于 $t$ 的函数时,需要代换变量,注意该式和 [费曼积分法](#费曼积分法) 中式子的不同
### 二元函数极限
若有 $\displaystyle\lim_{(x, y) \to (x_0, y_0)} \dfrac{F(x, y)}{G(x, y)} = a$,则可以转写为在 $(x_0, y_0)$ 的某个领域内 $F(x, y) = aG(x, y)$
错误使用例:
设 $f(x, y)$ 在点 $(0, 0)$ 的某去心领域内连续,且满足 $\displaystyle\lim_{x \to 0, y \to 0} \dfrac{f(x, y) - f(0, 0)}{x^2 + 1 - x\sin{y}} = -3$,则函数 $f(x, y)$ 在点 $(0, 0)$ 处 \_\_\_\_
这题若转写了,那么 $f(x, y) = -3(x^2 + 1 - x\sin{y}) + f(0, 0)$,以此推导会得出非极值点的结论,但我们假定的这个函数是有问题的,代入 $(0, 0)$ 会发现 $f(0, 0)$ 无解,即不存在那样的连续的、二阶可导的函数满足题意,实际上题目也提醒了去心,而我们这个心是有问题的,所以不能转写
这种题还是利用定义做好些
### 二元函数连续、偏导存在、偏导连续、可微的判定和关系
#### 二元函数连续的判定
若 $\displaystyle\lim_{(x, y) \to (x_0, y_0)} f(x, y) = f(x_0, y_0)$,则称 $f(x, y)$ 在 $(x_0, y_0)$ 处连续
可令 $x = \rho\cos{\theta}, y = \rho\sin{\theta}$ 进行代换,若极限结果与 $\theta$ 相关不等于 $f(x_0, y_0)$,则不连续
#### 二元函数偏导存在的判定
- 若 $\displaystyle\lim_{x \to x_0} \dfrac{f(x, y_0) - f(x_0, y_0)}{x - x_0}$ 存在,则称 $f(x, y)$ 在 $(x_0, y_0)$ 关于 $x$ 的偏导存在,记作 $f'_x(x_0, y_0)$
- 若 $\displaystyle\lim_{y \to y_0} \dfrac{f(x_0, y) - f(x_0, y_0)}{y - y_0}$ 存在,则称 $f(x, y)$ 在 $(x_0, y_0)$ 关于 $y$ 的偏导存在,记作 $f'_y(x_0, y_0)$
#### 二元函数偏导连续的判定
- 若 $\displaystyle\lim_{(x, y) \to (x_0, y_0)} \dfrac{\partial{f(x, y)}}{\partial{x}} = f'_x(x_0, y_0)$,则称 $f(x, y)$ 在 $(x_0, y_0)$ 关于 $x$ 的偏导连续
- 若 $\displaystyle\lim_{(x, y) \to (x_0, y_0)} \dfrac{\partial{f(x, y)}}{\partial{y}} = f'_y(x_0, y_0)$,则称 $f(x, y)$ 在 $(x_0, y_0)$ 关于 $y$ 的偏导连续
#### 二元函数可微的判定
先判定 $f'_x(x_0, y_0)$ 和 $f'_y(x_0, y_0)$ 是否都存在,存在则进行下一步,否则不可微
考查极限
$$
\lim_{(\Delta{x}, \Delta{y}) \to (0, 0)} \dfrac{f(x_0 + \Delta{x}, y_0 + \Delta{y}) - f(x_0, y_0) - f'_x(x_0, y_0) \Delta{x} - f'_y(x_0, y_0) \Delta{y}}{\sqrt{\Delta{x}^2 + \Delta{y}^2}}
$$
是否为零,是则称 $f'(x, y)$ 在 $(x_0, y_0)$ 可微,否则不可微
#### 二元函数连续、偏导存在、偏导连续、可微的关系
$$
\begin{align*}
二元函数两个偏导都在 (x_0, y_0) 连续 \implies& f(x, y) 在 (x_0, y_0) 可微 \implies f(x, y) 在 (x_0, y_0) 连续\\
&\Downarrow\\
&二元函数两个偏导都存在
\end{align*}
$$
没标注的箭头表示无法推出
### 多元函数极值点的判定
对 $z = F(x, y)$ 在 $(x_0, y_0)$ 有连续的二阶偏导数,且 $f'_x = 0, f'_y = 0$,记 $f''_{xx} = A, f''_{xy} = B, f''_{yy} = C$,则
- $AC - B^2 > 0$,且 $A > 0$ 时取极小值,$A < 0$ 时取极大值
- $AC - B^2 < 0$,不是极值点
- $AC - B^2 = 0$,不能确定,用定义讨论
## 多元函数积分
### 轮换对称性
若 $D \subset \R^2$ 且 $\forall{(x, y) \in D}$ 都有 $(y, x) \in D$,则 $D$ 具有轮换对称性
例:求 $I = \displaystyle\iint_{D} (\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2}) \mathrm{d}x\mathrm{d}y$,$D = \{(x, y) | x^2 + y^2 \leqslant R^2\}$
因为 $D$ 满足轮换对称性,故 $I = \displaystyle\iint_{D} (\dfrac{y^2}{a^2} + \dfrac{x^2}{b^2}) \mathrm{d}x\mathrm{d}y$
故 $2I = (\dfrac{1}{a^2} + \dfrac{1}{b^2}) \displaystyle\iint_{D} (x^2 + y^2) \mathrm{d}x\mathrm{d}y$,下略
当然对于更高维也有相似结论,此处略
### 雅可比矩阵
在进行二元函数积分时我们想进行换元,但 $\mathrm{d}x\mathrm{d}y$ 该换成什么呢?
我们来探讨一下令 $x = x(u, v)$,$y = y(u, v)$ 到底是什么意思 —— 是这样的一个函数 $F$ 作用于向 $\begin{bmatrix}u\\v\end{bmatrix}$ 后输出 $\begin{bmatrix}x(u, v)\\y(u, v)\end{bmatrix}$
我们考虑极小区域上输入的微小变动与输出的微小变动,其可视作线性变换,记 $J = \begin{bmatrix}k_1 & k_3 \\ k_2 & k_4\end{bmatrix}$,我们来推导该值
对于 $\begin{bmatrix}\mathrm{d}u \\ 0\end{bmatrix}$,有 $J \begin{bmatrix}\mathrm{d}u \\ 0\end{bmatrix} = \begin{bmatrix}k_1\mathrm{d}u \\ k_2\mathrm{d}u\end{bmatrix}$
而这又对应参数方程的极小方向向量,故
$k_1 \mathrm{d}u = \dfrac{\partial{x}}{\partial{u}} \cdot \mathrm{d}u \implies k_1 = \dfrac{\partial{x}}{\partial{u}}$
$k_2 \mathrm{d}u = \dfrac{\partial{y}}{\partial{u}} \cdot \mathrm{d}u \implies k_2 = \dfrac{\partial{y}}{\partial{u}}$
同理 $k_3 = \dfrac{\partial{x}}{\partial{v}}$,$k_4 = \dfrac{\partial{y}}{\partial{v}}$
故 $J = \begin{bmatrix}\dfrac{\partial{x}}{\partial{u}} & \dfrac{\partial{x}}{\partial{v}} \\ \dfrac{\partial{y}}{\partial{u}} & \dfrac{\partial{y}}{\partial{v}}\end{bmatrix}$
又有面积微元比例 $\mathrm{abs}\det{J} \cdot \mathrm{d}u\mathrm{d}v = \mathrm{d}x\mathrm{d}y$
详情可见 [3Blue1Brown 《雅可比矩阵下:所谓的雅可比行列式》](https://www.bilibili.com/video/av82535620/)
且由此可见平面直角坐标转极坐标时 $\mathrm{abs} \det{J}$ 就等于 $\rho$
这对多元函数也是成立的,如三维直角坐标转极坐标时 $\mathrm{abs} \det{J} = \rho^2\sin{\varphi}$
### 曲线积分与曲面积分
该节内容不严谨,很多讨论都只限于二维、三维情况
部分参照 [此链接](https://zhuanlan.zhihu.com/p/52347499?utm_psn=1791998179333525505)
> 更多相关视频:
>
> [中英双语 可视化讲解格林定理](https://www.bilibili.com/video/BV1dg4y1v7RP/)
>
> [散度与旋度:麦克斯韦方程组、流体等所用到的语言](https://www.bilibili.com/video/BV19s41157Z4/)
>
> [nabla 算子 与梯度、散度、旋度](https://www.bilibili.com/video/BV1a541127cX/)
#### 第一类曲线积分
第一类曲线积分与积分方向无关,这适用于标量场
例线密度 $\rho(x, y)$,则线质量 $M = \displaystyle\int_{L} \rho(x, y) \mathrm{d}s$
而第一类曲线积分的解法也通常是找到这样一个变量 $t$,使得 $x = x(t), y = y(t)$ 且保向
从而 $\mathrm{d}x = x'(t) \mathrm{d}t, \mathrm{d}y = y'(t) \mathrm{d}t \implies \mathrm{d}s = \sqrt{\mathrm{d}x^2 + \mathrm{d}y^2} = \sqrt{x'^2 + y'^2} \mathrm{d}t$
对于更高维的可以类比推理
实际上,第一类曲线积分也可以换元,详见 [此链接](https://open.163.com/newview/movie/free?pid=WHLGTKCPS&mid=XIAM50G16),但这疑似记不住故仅供了解,但极坐标代换还是要记的,曲线微元 $\mathrm{d}s = \sqrt{\rho^2 + \rho'^2} \mathrm{d}\theta$
#### 第二类曲线积分
第二类曲线积分与积分方向有关,这适用于矢量场
例力场 $\vec{F}(x, y) = \begin{bmatrix}F_x(x, y) \\ F_y(x, y)\end{bmatrix}$,则做功
$$
W_{\vec{L}} = \displaystyle\int_{\vec{L}} \vec{F}\mathrm{d}\vec{s} = \displaystyle\int_{\vec{L}} F_x\mathrm{d}x + F_y\mathrm{d}y
$$
且显然有 $W_{\vec{L}} = -W_{-\vec{L}}$
类似于第一类曲线积分,可以使用参数方程求解
对于封闭曲线,见下小节;对于非封闭曲线,补全曲线为封闭曲线,并对补线使用参数方程法
##### Nabla 算子、环量、旋度、格林公式与斯托克斯公式
当 $L$ 为闭合曲线时,该曲线积分即 $\vec{F}$ 沿着曲线 $L$ 的环量
利用 $W_{\vec{L}} = -W_{-\vec{L}}$,我们可以将环所包面域分割为无穷多小面域 $\mathrm{d}\vec{S}$
$$
\displaystyle\oint_{\partial{D}}\vec{F}\mathrm{d}\vec{s} = \displaystyle\iint_{D} \vec{\nabla} \times \vec{F} \mathrm{d}\vec{S}
$$
这里 $D$ 与 $\partial{D}$ 的定义略,这里的 $\vec{\nabla}$ 称作 Nabla 算子,也称哈密顿算子
$$
\vec{\nabla} = \begin{bmatrix}\dfrac{\partial}{\partial{x_1}} \\ \vdots \\ \dfrac{\partial}{\partial{x_n}}\end{bmatrix}
$$
要提醒的一点是 $\vec{\nabla} \times \vec{F}$ 不完全是叉乘,而是表示求旋度的意思,即 $\mathrm{rot} \vec{F}$,其反应了某点角动量的大小
不同于梯度和散度,旋度不能简单的推广到其他维度,但是只有在三维中其结果为向量
对于二元函数来说,该式子即格林公式
$$
\displaystyle\oint_{\partial{D}}\vec{F}\mathrm{d}\vec{s} = \displaystyle\iint_{D} \vec{\nabla} \times \vec{F} \mathrm{d}x\mathrm{d}y = \displaystyle\iint_{D} \det{\begin{bmatrix} \dfrac{\partial}{\partial{x}} & \dfrac{\partial}{\partial{y}} \\ F_x & F_y \end{bmatrix}} \mathrm{d}x\mathrm{d}y
$$
对于三元函数来说,该式子即斯托克斯公式
$$
\displaystyle\oint_{\partial{D}}\vec{F}\mathrm{d}\vec{s} = \displaystyle\iint_{D} \vec{\nabla} \times \vec{F} \cdot \begin{bmatrix}\mathrm{d}y\mathrm{d}z \\ \mathrm{d}z\mathrm{d}x \\ \mathrm{d}x\mathrm{d}y\end{bmatrix}
$$
##### 线积分路径无关的判定
无旋场,即 $\mathrm{rot} \vec{F} \equiv \vec{0}$ 就有路径无关 —— 因为角动量抵消,所以在线上的积分恒为 $0$
#### 第一类曲面积分
第一类曲面积分与积分方向无关,这适用于标量场
例面密度 $\rho(x, y, z)$,则面质量 $M = \displaystyle\iint_{\varSigma} \rho(x, y, z) \mathrm{d}S$
一般来说,该面 $\varSigma$ 会以 $z = z(x, y)$ 的形式给出,从而有 $\mathrm{d}S = \sqrt{1 + (\dfrac{\partial{z}}{\partial{x}})^2 + (\dfrac{\partial{z}}{\partial{y}})^2} \mathrm{d}x\mathrm{d}y$
其推导如下:
在曲面 $z = z(x, y)$ 取点 $(x_0, y_0, z_0)$
其在 $x$ 方向上有极小变动 $\mathrm{d}x$,则变动向量 $\vec{v_1} = (1, 0, \dfrac{\partial{z}}{\partial{x}}) \mathrm{d}x$
同理 $y$ 方向有 $\vec{v_2} = (0, 1, \dfrac{\partial{z}}{\partial{y}}) \mathrm{d}y$
可得面积微元即两个向量的叉积的大小,即:
$\mathrm{d}S = |\vec{v_1} \times \vec{v_2}|$
对于其他情况也一样
这里再多提一个技巧,即若被积函数 $\rho(x, y, z) = F(x, y) \cdot z$ 而 $z\dfrac{\partial{z}}{\partial{x}}$、$z\dfrac{\partial{z}}{\partial{y}}$ 又好算的情况,则有
$$
M = \iint_{\varSigma} F(x,y) z\mathrm{d}S = \iint_{D} F(x, y) \sqrt{z^2 + (z\dfrac{\partial{z}}{\partial{x}})^2 + (z\dfrac{\partial{z}}{\partial{y}})^2} \mathrm{d}x\mathrm{d}y
$$
这在球面、锥面上极其好用
##### 第一类曲面积分的参数方程法
推导来自 [此链接](https://zhuanlan.zhihu.com/p/687347554) 和 [此链接](https://zh.wikipedia.org/wiki/%E6%9B%B2%E9%9D%A2%E7%A7%AF%E5%88%86)
度表示为 $\vec{\nabla} F$,这不是点乘操作,因为 $F$ 是标量函数,其结果为向量
$$
\vec{\nabla} F = \begin{bmatrix}\dfrac{\partial{F}}{\partial{x_1}} \\ \cdots \\ \dfrac{\partial{F}}{\partial{x_n}}\end{bmatrix}
$$
梯度本身和该换元法本身没什么联系,但一是这里使用 Nabla 算子更加简便,二是既然介绍了旋度以及下节的散度,少个梯度怪可惜的。 -->
被积曲面为 $F(x, y, z) = 0$,令 $x = x(u, v)$,$y = y(u, v)$,$z = z(u, v)$ 满足该式且 [保定向](https://zh.m.wikipedia.org/wiki/%E5%8F%AF%E5%AE%9A%E5%90%91%E6%80%A7) —— 你可能会想这怎么可能,其实代换到生活中经纬度和地球上某点的映射就理解了
其在 $u$ 方向上有极小变动 $\mathrm{d}u$,则变动向量 $\vec{v_1} = (\dfrac{\partial{x}}{\partial{u}}, \dfrac{\partial{y}}{\partial{u}}, \dfrac{\partial{z}}{\partial{u}}) \mathrm{d}u$
同理 $v$ 方向有 $\vec{v_2} = (\dfrac{\partial{x}}{\partial{v}}, \dfrac{\partial{y}}{\partial{v}}, \dfrac{\partial{z}}{\partial{v}}) \mathrm{d}v$
可得面积微元即两个向量的叉积的大小,即:
$$
\mathrm{d}S = |\vec{v_1} \times \vec{v_2}| = |(\dfrac{\partial{(y, z)}}{\partial{(u, v)}}, \dfrac{\partial{(z, x)}}{\partial{(u, v)}}, \dfrac{\partial{(x, y)}}{\partial{(u, v)}}) \mathrm{d}u\mathrm{d}v|
$$
其中 $\dfrac{\partial{(y, z)}}{\partial{(u, v)}} = \begin{vmatrix}\dfrac{\partial{y}}{\partial{u}} & \dfrac{\partial{y}}{\partial{v}} \\ \dfrac{\partial{z}}{\partial{u}} & \dfrac{\partial{z}}{\partial{v}}\end{vmatrix}$
故也可注意到上节的代换其实就是本节的一个特例
使用例:
求 $I = \displaystyle\iint_{\frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} = 1} \sqrt{\dfrac{x^2}{a^4} + \dfrac{y^2}{b^4} + \dfrac{z^2}{c^4}} \mathrm{d}S$
令 $x = a\sin{\varphi}\cos{\theta}, y = b\sin{\varphi}\sin{\theta}, z = c\cos{\varphi}$
有 $\mathrm{d}S = |\vec{v_1} \times \vec{v_2}| = abc \sin{\varphi} \sqrt{\dfrac{x^2}{a^4} + \dfrac{y^2}{b^4} + \dfrac{z^2}{c^4}} \mathrm{d}\varphi \mathrm{d}\theta$
即
$$
\begin{align*}
I &= \displaystyle\int_{0}^{2\pi} \mathrm{d}\theta \int_{0}^{\pi} abc (\dfrac{\sin^3{\varphi} \cos^2{\theta}}{a^2} + \dfrac{\sin^3{\varphi} \sin^2{\theta}}{b^2} + \dfrac{\sin{\varphi} \cos^2{\varphi}}{c^2}) \mathrm{d}\varphi \\
&= abc (\dfrac{2 \dfrac{2!!}{3!!} \cdot 4 \dfrac{1!!}{2!!} \dfrac{\pi}{2}}{a^2} + \dfrac{2 \dfrac{2!!}{3!!} \cdot 4 \dfrac{1!!}{2!!} \dfrac{\pi}{2}}{b^2} + \dfrac{ 2 \dfrac{0!!1!!}{3!!} \cdot 2\pi}{c^2}) \\
&= \dfrac{4\pi abc}{3} (\dfrac{1}{a^2} + \dfrac{1}{b^2} + \dfrac{1}{c^2})
\end{align*}
$$
#### 第二类曲面积分
第二类曲面积分与积分方向有关,这适用于矢量场
例 [磁场](https://zh.m.wikipedia.org/wiki/%E7%A3%81%E5%A0%B4#B%E5%A0%B4%E8%88%87H%E5%A0%B4) $\vec{B}(x, y, z) = \begin{bmatrix}B_x(x, y, z) \\ B_y(x, y, z) \\ B_z(x, y, z)\end{bmatrix}$,则磁通量
$$
\varPhi_{\vec{S}} = \displaystyle\iint_{\vec{S}} \vec{B}\mathrm{d}\vec{S} = \displaystyle\iint_{\vec{S}} B_x\mathrm{d}y\mathrm{d}z + B_y\mathrm{d}z\mathrm{d}x + B_z\mathrm{d}x\mathrm{d}y
$$
且显然有 $\varPhi_{\vec{S}} = -\varPhi_{-\vec{S}}$
类似于第一类曲面积分,可以使用参数方程求解
##### 第二类曲面积分的参数方程法
同理
$$
\mathrm{d}\vec{S} = \vec{v_1} \times \vec{v_2} = (\dfrac{\partial{(y, z)}}{\partial{(u, v)}}, \dfrac{\partial{(z, x)}}{\partial{(u, v)}}, \dfrac{\partial{(x, y)}}{\partial{(u, v)}}) \mathrm{d}u\mathrm{d}v
$$
故
$$
\vec{B}\mathrm{d}\vec{S} = (B_x \dfrac{\partial{(y, z)}}{\partial{(u, v)}} + B_y \dfrac{\partial{(z, x)}}{\partial{(u, v)}} + B_z \dfrac{\partial{(x, y)}}{\partial{(u, v)}}) \mathrm{d}u\mathrm{d}v
$$
我们来看特例:
若有向曲面 $\vec{S}$ 以 $z = z(x, y)$ 的形式给出,其在 $xOy$ 面上的投影为 $D$,故
$$
\vec{B}\mathrm{d}\vec{S} = ( -\dfrac{\partial{z}}{\partial{x}} B_x -\dfrac{\partial{z}}{\partial{y}} B_y + B_z) (\pm \mathrm{d}x\mathrm{d}y)
$$
且当 $\vec{S}$ 与 $z$ 轴同向时取 $+$,反之取 $-$
##### 通量、散度与高斯公式
不像环量有闭曲线的要求,第二类曲面积分即称为通量,我们研究闭曲面上的通量
散度表示为 $\vec{\nabla} \cdot \vec{F}$,这是完全的点乘操作,其结果是个数值,也记作 $\mathrm{div} \vec{F}$,其反应了某点流出物质与流入物质的多少
利用 $\varPhi_{\vec{S}} = -\varPhi_{-\vec{S}}$,我们可以将曲面所包体域分割为无穷多小体域 $\mathrm{d}V$
$$
\begin{align*}
I &= \oiint_{\partial{V}} \vec{F} \mathrm{d}\vec{S} \\
&= \iiint_{V} \vec{\nabla} \cdot \vec{F} \mathrm{d}V \\
&= \iiint_{V} (\dfrac{\partial{F_x}}{\partial{x}} + \dfrac{\partial{F_y}}{\partial{y}} + \dfrac{\partial{F_z}}{\partial{z}}) \mathrm{d}V
\end{align*}
$$
这就是高斯公式
##### 面积分路径无关的判定
无散场(也称无源场),即 $\mathrm{div} \vec{F} \equiv 0$ 就有路径无关 —— 因为流入和流出抵消,所以在面上的积分恒为 $0$
#### 曲线积分与曲面积分中的奇点处理
/// TODO:
#### 泊松曲面积分
$f(x)$ 在 $\R$ 上连续,则
$$
\iint_{x^2 + y^2 + z^2 = 1} f(ax + by + cz) \mathrm{d}S = 2\pi \int_{-1}^{1} f(\sqrt{a^2 + b^2 + c^2} t) \mathrm{d}t
$$
证明如下,推导参考自 [此链接](https://www.bilibili.com/video/av571611163/):
首先进行正交变换旋转坐标系为 $u-v-w$,考虑原坐标系过曲面上一点 $(x_0, y_0, z_0)$ 的平面 $ax + by + cz = ax_0 + by_0 + cz_0$,并规定其法向量为 $(a, b, c)$,该旋转使 $w$ 轴与该法向量方向一致,可得在新坐标下左式等于
$$
\iint_{u^2 + v^2 + w^2 = 1} f(F(u, v, w)) \mathrm{d}S'
$$
这里的 $F(u, v, w)$ 还需要我们求出来
有新坐标系坐标 $(u_0, v_0, w_0)$ 中 $w_0$ 即原坐标系中点到面 $ax + by + cz = 0$ 的有正负的距离,可得 $w_0 = \dfrac{ax_0 + by_0 + cz_0}{\sqrt{a^2 + b^2 + c^2}}$
即进行了 $ax + by + cz = \sqrt{a^2 + b^2 + c^2} w$ 的代换,故我们想要的 $F(u, v, w) = \sqrt{a^2 + b^2 + c^2} w$
则令 $u = \sqrt{1 - t^2} \cos{\theta}, v = \sqrt{1 - t^2} \sin{\theta}, w = t$
由 [第一类曲面积分的换元法](#第一类曲面积分的换元法) 可得 $\mathrm{d}S' = \mathrm{d}t \mathrm{d}\theta$
> 这其实说明了圆柱面和对应的球面两者的面积元素大小一样,参见 [【官方双语】为什么球的表面积是同样半径圆的面积的四倍?](https://www.bilibili.com/video/BV1Et411W7oM/)
故式子即
$$
\int_{0}^{2\pi} \mathrm{d}\theta \int_{-1}^{1} f(\sqrt{a^2 + b^2 + c^2}t) \mathrm{d}t = 2\pi \int_{-1}^{1} f(\sqrt{a^2 + b^2 + c^2} t) \mathrm{d}t
$$
故得证
## 微分方程
### 可以分离变量的微分方程
若 $\dfrac{\mathrm{d}y}{\mathrm{d}x} = f(x) g(y)$,则 $\dfrac{\mathrm{d}y}{g(y)} = f(x) \mathrm{d}x$,两边分别积分即可
### 齐次微分方程
若 $\dfrac{\mathrm{d}y}{\mathrm{d}x} = f(\dfrac{y}{x})$,则令 $u = \dfrac{y}{x} \implies \dfrac{\mathrm{d}y}{\mathrm{d}x} = xu' + u$ 代入化为 $\displaystyle\int{\dfrac{\mathrm{d}u}{f(u) - u}} = \ln{|x|} + C$,后略
当然若 $\dfrac{\mathrm{d}x}{\mathrm{d}y} = f(\dfrac{x}{y})$,则换个视角看看即可
事实上这种方法不局限于 $\dfrac{y}{x}$,应当灵活使用代换
### 一阶线性微分方程
对 $y' + P(x)y = Q(x)$,有通解 $y = \dfrac{C + \displaystyle\int{Q(x)I(x) \mathrm{d}x}}{I(x)}$,其中 $I(x) = \exp{\displaystyle\int{P(x)} \mathrm{d}x}$
### 二阶常数零式
对 $y'' + py' + qy = 0$,注意特征方程 $r^2 + pr + q = 0$
- 两不等实根时,通解 $y = C_1e^{r_1x} + C_2e^{r_2x}$
- 两相等实根时,通解 $y = e^{rx} (C_1 + C_2x)$
- 共轭根 $\alpha + \beta i$ 时,通解 $y = e^{\alpha x}(C_1 \cos{\beta x} + C_2 \sin{\beta x})$
### $n$ 阶常数零式
对 $y^{(n)} + p_1y^{(n - 1)} + \cdots + p_ny = 0$,注意特征方程 $r^n + p_1 r^{n - 1} + \cdots + p_n = 0$,由代数基本定理其有 $n$ 个根,其中
- 单根对应 $Ce^{rx}$
- $k$ 重实根对应 $e^{rx} \displaystyle{\sum_{i = 1}^{k} C_ix^{i - 1}}$
- 一对共轭根 $\alpha + \beta i$ 对应 $e^{\alpha x}(C_1 \cos{\beta x} + C_2 \sin{\beta x})$
- $k$ 对共轭根 $\alpha + \beta i$ 对应 $e^{rx} (\cos{\beta x} \displaystyle{\sum_{i = 1}^{k} A_ix^{i - 1}} + \sin{\beta x} \displaystyle{\sum_{i = 1}^{k} B_ix^{i - 1}})$
### 二阶常数非零式
对 $y'' + py' + qy = f(x)$,其通解为其对应的二阶常数零式的通解加上一个满足其的特解,接下来我们使用微分算子法来给出这样的特解
我们将 $\dfrac{\mathrm{d}}{\mathrm{d}x}$ 记为 $D$,称作微分算子,且有 $D^n = \dfrac{\mathrm{d}^n}{\mathrm{d}x^n}$
那么特解 $y^* = \dfrac{f(x)}{D^2 + pD + q}$
> 要注意的一点,上式不完全是等式,注意微分算子是一个作用,而不是单纯的“未知数”,而为什么我们能在下面的一些例子中把它当作未知数计算呢?这就牵扯到微分其实是线性的,在此不做展开
#### $f(x) = e^{kx}$ 时
见 $D$ 代入 $k$ 即可
若 $k^2 + pk + q = 0$,则 $y^* = x\dfrac{e^{kx}}{2D + p}$;若 $2k + p = 0$,则 $y^* = x^2\dfrac{e^{kx}}{2}$
#### $f(x) = \sin{ax}$ 或 $f(x) = \cos{ax}$ 时
见 $D^2$ 代入 $-a^2$ 即可
$y^* = \dfrac{f(x)}{q - a^2 + pD} = \dfrac{(q - a^2) - pD}{(q - a^2)^2 - p^2D^2} f(x) = \dfrac{(q - a^2)f(x) - pf'(x)}{(q - a^2)^2 + p^2a^2}$,当 $p = 0$ 时极方便
当分母为 0 时同 $f(x) = e^{kx}$ 一样分子乘 $x$,分母求导
#### $f(x)$ 为多项式时
设 $y^*$ 为高一次的多项式代入求解(这里使用微分算子疑似有点恶心)
#### $f(x) = e^{kx} \cdot g(x)$ 时
先把 $e^{kx}$ 移到式子前,再按前面的方法处理即可
$y^* = \dfrac{e^{kx} \cdot g(x)}{D^2 + pD + q} = e^{kx} \dfrac{g(x)}{(D + k)^2 + p(D + k) + q}$
## 无穷级数
### 数列极限
/// TODO:
### Stolz 定理
对于以下两种情况
- 对实数列 $\{a_n\}, \{b_n\}$ 且 $\{b_n\}$ 严格单调递增,并有 $\displaystyle\lim_{n \to +\infty} b_n = +\infty$
- 对实数列 $\{a_n\}, \{b_n\}$ 且 $\{b_n\}$ 严格单调递减,并有 $\displaystyle\lim_{n \to +\infty} a_n = \displaystyle\lim_{n \to +\infty} b_n = 0$
有若 $\displaystyle\lim_{n \to +\infty} \dfrac{a_{n + 1} - a_n}{b_{n + 1} - b_n} = A$,则 $\displaystyle\lim_{n \to +\infty} \dfrac{a_n}{b_n} = A$ 成立
### 常数项级数
设有数列 $\{u_n\}$,则称 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 为无穷级数
$S_n = \displaystyle\sum_{k = 1}^{n} u_k$,则称 $\{S_n\}$ 为 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 的部分和数列
若 $\displaystyle\lim_{n \to \infty} S_n = S$,则称 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 收敛到 $S$,$r_n = S - S_n$ 为级数 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 的余部
#### 级数的性质
- $\displaystyle\sum_{k = 1}^{\infty} u_k$ 收敛 $\implies \displaystyle\lim_{k \to \infty} u_k = 0$
- 级数去掉有限项不影响级数敛散性
- 级数加括号后收敛,原级数不一定收敛;级数加括号后发散,原级数一定发散
##### 级数和的敛散性
类似 [反常积分和的敛散性](#反常积分和的敛散性) 有:
| $\displaystyle\sum_{k = 1}^{\infty} u_k$ | $\displaystyle\sum_{k = 1}^{\infty} v_k$ | $\displaystyle\sum_{k = 1}^{\infty} (u_k \pm v_k)$ |
| :--------------------------------------: | :--------------------------------------: | :------------------------------------------------: |
| 绝对收敛 | 绝对收敛 | 绝对收敛 |
| 绝对收敛 | 条件收敛 | 条件收敛 |
| 条件收敛 | 条件收敛 | 收敛 |
| 收敛 | 发散 | 发散 |
| 发散 | 发散 | 不确定 |
#### 级数的敛散性判别法
##### 比较判别法
对 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 和 $\displaystyle\sum_{k = 1}^{\infty} v_k$ 有
1. $\displaystyle\sum_{k = 1}^{\infty} v_k$ 绝对收敛且对所有足够大的 $k$ 有 $|u_k| \leqslant |v_k|$,则 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 也绝对收敛
2. $\displaystyle\sum_{k = 1}^{\infty} v_k$ 不绝对收敛且对所有足够大的 $k$ 有 $|u_k| \geqslant |v_k|$,则 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 也不绝对收敛
注意:第二种情况 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 可能条件收敛
##### 极限比较判别法
对 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 和 $\displaystyle\sum_{k = 1}^{\infty} v_k$ 且对 $\forall{k \in \N^*}$ 有 $u_k, v_k \geqslant 0$,记 $I = \displaystyle\lim_{k \to \infty} \dfrac{u_n}{v_n}$
- $I$ 不存在时 $\displaystyle\sum_{k = 1}^{\infty} v_k$ 发散则 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 发散
- $I = 0$ 时 $\displaystyle\sum_{k = 1}^{\infty} v_k$ 收敛则 $\displaystyle\sum_{k = 1}^{\infty} u_k$ 收敛
- $I > 0$ 时两者同敛散
##### 比值判别法
对 $\displaystyle\sum_{k = 1}^{\infty} u_k$,若 $\displaystyle\lim_{k \to \infty} |\dfrac{u_{k + 1}}{u_k}| = \rho$,则
- $\rho < 1$ 时绝对收敛
- $\rho > 1$ 时发散
- $\rho = 1$ 时不确定
证明如下:
$\rho < 1$ 时,存在 $r \in (\rho, 1)$ 和 $N \in \N^*$ 使 $k > N$ 时有 $|u_{k + 1}| < r|u_k|$,故可得对 $i \in \N^*$ 有 $|u_{k + i}| < r^i |u_k|$
而 $\displaystyle\sum_{i = 1}^{\infty} |u_{k + i}| < |u_k| \displaystyle\sum_{i = 1}^{\infty} r^i$
且右式收敛,得左式收敛,而左式由原级数去掉有限项得到,故原级数收敛
$\rho > 1$ 时同理可得发散,$\rho = 1$ 时举例即可
##### 积分判别法
/// TODO:
### 泰勒级数
$e^x = 1 + x + \dfrac{x^2}{2!} + \cdots + \dfrac{x^n}{n!} + \omicron(x^n)$
$a^x = 1 + x \ln{a} + \dfrac{x^2}{2!} \ln^2{a} + \cdots + \dfrac{x^n}{n!} \ln^n{a} + \omicron(x^n)$
$\sin{x} = x - \dfrac{x^3}{3!} + \dfrac{x^5}{5!} - \dfrac{x^7}{7!} + \cdots + (-1)^n \dfrac{x^{2n + 1}}{(2n + 1)!} + \omicron(x^{2n + 1})$
$\cos{x} = 1 - \dfrac{x^2}{2!} + \dfrac{x^4}{4!} - \dfrac{x^6}{6!} + \cdots + (-1)^n \dfrac{x^{2n}}{(2n)!} + \omicron(x^{2n})$
$\tan{x} = x + \dfrac{x^3}{3} + \dfrac{2x^5}{15} + \omicron(x^5)$
$\ln{(1 + x)} = x - \dfrac{x^2}{2} + \dfrac{x^3}{3} - \dfrac{x^4}{4} + \cdots + (-1)^{n - 1} \dfrac{x^n}{n} + \omicron(x^n)$
$\arcsin{x} = x + \dfrac{x^3}{6} + \dfrac{3x^5}{40} + \cdots$
$\arctan{x} = x - \dfrac{x^3}{3} + \dfrac{x^5}{5} - \dfrac{x^7}{7} + \cdots + (-1)^{n - 1} \dfrac{x^{2n - 1}}{2n - 1} + \omicron(x^{2n - 1})$
$(1 + x)^{1 / x} = e - \dfrac{ex}{2} + \dfrac{11ex^2}{24} - \dfrac{7ex^3}{16} + \dfrac{2447ex^4}{5760} + \omicron(x^4)$
$(1 + x)^n = 1 + \dfrac{n}{1!} x + \dfrac{n (n - 1)}{2!} x^2 + \dfrac{n (n - 1) (n - 2)}{3!} x^3 + \cdots$
$(1 + x)^{1 / n} = 1 + \dfrac{x}{n} - \dfrac{n - 1}{2!} \dfrac{x^2}{n^2} + \dfrac{(n - 1) (2n - 1)}{3!} \dfrac{x^3}{n^3} - \dfrac{(n - 1) (2n - 1) (3n - 1)}{4!} \dfrac{x^4}{n^4} + \cdots$
### 傅里叶级数
非考研重点,参看 [23 年考了!24 年也考了!今年再考一次?傅里叶级数的所有考法及原理 30 分钟搞定](https://www.bilibili.com/video/av1554776715) 即可
## 向量空间与线性变换
我们正式进入线性代数这一单元,在此之前请观看:
> [线性代数的本质](https://b23.tv/I25Kyqf)
>
> [无痛线代](https://www.bilibili.com/video/BV1wu411T7dj/)
>
> [二次型究竟是个啥?二次型的几何意义](https://www.bilibili.com/video/BV12N4y1H7Rn/)
我们说一个矩阵 $A$ 对应一个线性变换,$A\vec{x} = \vec{y}$ 即 $\vec{x}$ 经 $A$ 的线性变换得到 $\vec{y}$,而 $AB = C$ 即将 $B$ 的每一个列向量经 $A$ 的线性变换得到 $C$
显然对 $A$ 所有可能的输出向量 $\vec{y}$ 构成了一个集合,我们在此简单的将这个集合称为 $A$ 的 [向量空间](https://zh.wikipedia.org/wiki/%E5%90%91%E9%87%8F%E7%A9%BA%E9%97%B4),把所有可能的输入向量的集合称为原向量空间
## 秩
其几何含义详见 [线性代数的本质](https://b23.tv/I25Kyqf),我们在此基础上解释一些常用结论
- $A$ 的秩 $= A$ 的行秩 $= A$ 的列秩
> 取矩阵 $A_{m \times n}$,记 $A$ 列秩为 $r$,故 $A$ 的列空间的维度是 $r$
>
> 令 $\vec{c_1}, \cdots, \vec{c_r}$ 是 $A$ 的列空间的一组基构成矩阵 $C_{m \times r}$
>
> 使得 $A$ 的每个列向量是 $C$ 的 $r$ 个列向量的线性组合,即存在矩阵 $P$ 使得 $A = CP$
>
> 那么有 $A$ 的每个行向量都是 $P$ 的行向量的线性组合,故 $A$ 行向量组的向量空间在 $P$ 的行向量组的向量空间内
>
> 故 $A$ 的行秩 $\leqslant P$ 的行秩 $\leqslant r = A$ 的列秩
>
> 再考虑 $A^T$,则有 $A$ 的列秩 $= A^T$ 的行秩 $\leqslant A^T$ 的列秩 $= A$ 的行秩
>
> 综上故两者相等
- 矩阵 $A$ 与 $B$ 等价 $\iff$ 矩阵 $A$ 与 $B$ 同型且 $r(A) = r(B)$
> 原本的定义 $B_{m \times n} = Q_{m \times m}A_{m \times n}P_{n \times n}$ 且 $P, Q$ 均可逆其实就暗含了这点
>
> 两者对应了同一向量空间
- $0 \leqslant r(A_{m \times n}) \leqslant \min{\{m, n\}}$
> 极其显然,秩同时被向量所在的维度和向量的个数限制
- $r(A) = r(A^T) = r(AA^T) = r(A^TA)$
> 第一个等号显然,证明 $A\vec{x} = \vec{0}$、$A^TA\vec{x} = \vec{0}$ 同解即证明第二个等式,同理证明第三个
## 基础解系
我们说 $A \vec{x} = \vec{0}$ 实际上就是一个 $\vec{x}$ 向量经过矩阵 $A$ 的变换变成了一个零向量
我们求解的过程正是求怎样的 $\vec{x}$ 会经变换变成零向量
如果 $A$ 是满秩的,说明 $A$ 的变换没有出现降维,这说明所有原非零向量变换后都是非零向量,那么我们的解只有零解(不是零个解)
反之一定存在一个空间里的所有向量都变成了零向量(我们求基础解系就是在求这个空间的基底)
这里我们以三维空间为例
$$
\begin{bmatrix}
1 & 3 & 5\\
2 & 4 & 6\\
3 & 6 & 9\\
\end{bmatrix}
\begin{bmatrix}
x_1\\
x_2\\
x_3\\
\end{bmatrix}
=\begin{bmatrix}
0\\
0\\
0\\
\end{bmatrix}\\
$$
这里你可以写出对应的方程组
因为 $\det{A} = 0$,故 $A$ 不满秩,也就是 $A$ 实际上是个三维空间里的一部分
实际上,由于
$$
A \to
\begin{bmatrix}
1 & 0 & -1\\
0 & 1 & 2\\
0 & 0 & 0\\
\end{bmatrix}
, r(A) = 2 < 3
$$
故以 $A$ 为基的空间(实际上基底要求线性无关,这里更加标准的说法是“以 $A$ 的列向量张成的空间”)是个三维空间里的二维平面,这时存在非零解
那么
$$
\begin{bmatrix}
1 & 0 & -1\\
0 & 1 & 2\\
0 & 0 & 0\\
\end{bmatrix}\begin{bmatrix}
x_1\\
x_2\\
x_3\\
\end{bmatrix}
=\begin{bmatrix}
0\\
0\\
0\\
\end{bmatrix}
$$
也就是
$$
\left\{
\begin{align*}
x_1 & = x_3\\
x_2 & = -2x_3
\end{align*}
\right.\\
$$
这里自由的是 $x_3$,说明 $\vec{x}$ 有一个自由度,也就是 $\vec{x}$ 在一条直线(一维空间)上
实际上,解系的维度就是原向量空间的维度减去矩阵的秩,即 $n - r(A)$
而我们所谓基础解系就是只要找这个空间的基底即可,因为这里是一维,仍取非零 $x_3$ 都可以得到基底
这里取 $x_3 = 1$,故基础解系为
$$
\vec{\xi_1} =
\begin{bmatrix}
1\\
-2\\
1\\
\end{bmatrix}
$$
再例
$$
\begin{bmatrix}
1 & 2 & 3 & 4\\
5 & 6 & 7 & 8\\
9 & 10 & 11 & 12\\
13 & 14 & 15 & 16\\
\end{bmatrix}
\begin{bmatrix}
x_1\\
x_2\\
x_3\\
x_4\\
\end{bmatrix}
=\begin{bmatrix}
0\\
0\\
0\\
0\\
\end{bmatrix}\\
$$
因为
$$
A \to
\begin{bmatrix}
1 & 0 & -1 & -2\\
0 & 1 & 2 & 3\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 0\\
\end{bmatrix}
, r(A) = 2
$$
从四维压至二维,存在非零解,也就是
$$
\left\{
\begin{align*}
x_1 & = x_3 + 2x_4\\
x_2 & = -2x_3 - 3x_4
\end{align*}
\right.\\
$$
这里自由的是 $x_3$ 和 $x_4$,说明 $\vec{x}$ 有两个自由度,也就是 $\vec{x}$ 在一个平面(二维空间)上
为了求这个空间的基底,我们要保证线性无关,那么最方便的就是令 $x_3 = 1, x_4 = 0$,再令 $x_3 = 0, x_4 = 1$
那么
$$
\vec{\xi_1} =
\begin{bmatrix}
1\\
-2\\
1\\
0\\
\end{bmatrix}
, \vec{\xi_2} =
\begin{bmatrix}
2\\
-3\\
0\\
1\\
\end{bmatrix}
$$
## 特征向量
## 行列式
### 行列式的几何意义
代数意义真的很没意思,什么狗屎逆序数滚远点
有关几何意义参见 [线性代数的本质](https://b23.tv/I25Kyqf),我们以此说明部分式子
- $\det{AB} = \det{A} \cdot \det{B}$
> 矩阵 $AB = ABE$,即把矩阵 $E$ 进行两次线性变换,经过两次分别的线性变换 $B$、$A$ 后的空间和一次整体的线性变换 $AB$ 后的空间的缩放比例自然相等,且数值上相乘
### 抽象行列式
以下证明部分来自 [此链接](http://www.ee.ic.ac.uk/hp/staff/dmb/matrix/proof003.html)
#### 分块矩阵的行列式
分块矩阵的行列式以下式为起点:
$$
\det{
\begin{bmatrix}
A & O\\
C & D\\
\end{bmatrix}
} = \det{A} \cdot \det{D}
$$
证明如下:
根据广义初等变换相关知识,原分块矩阵即
$$
\begin{bmatrix}
A & O\\
O & E\\
\end{bmatrix}
\begin{bmatrix}
E & O\\
C & E\\
\end{bmatrix}
\begin{bmatrix}
E & O\\
O & D\\
\end{bmatrix}
$$
证明下略
实际上广义初等变换矩阵要求矩阵可逆,但这里式子是成立的,我感觉直接称为变换矩阵就行了,以后不再特殊说明
接下来说明以下式子:
$$
\det{
\begin{bmatrix}
A & B\\
C & D\\
\end{bmatrix}
} = |A| \cdot |D - CA^{-1}B|
= |D| \cdot |A - BD^{-1}C|
$$
根据广义初等变换相关知识,原分块矩阵即
$$
\begin{bmatrix}
E & O\\
CA^{-1} & E\\
\end{bmatrix}
\begin{bmatrix}
A & B\\
O & D - CA^{-1}B\\
\end{bmatrix}
$$
第一个等号成立
同理还可以表示为
$$
\begin{bmatrix}
E & BD^{-1}\\
O & E\\
\end{bmatrix}
\begin{bmatrix}
A - BD^{-1}C & O\\
C & D\\
\end{bmatrix}
$$
第二个等号成立
除此之外还有如下表示方法
$$
\begin{bmatrix}
A & B - AC^{-1}D\\
C & O\\
\end{bmatrix}
\begin{bmatrix}
E & C^{-1}D\\
O & E\\
\end{bmatrix}
$$
以及
$$
\begin{bmatrix}
O & B\\
C - DB^{-1}A & D\\
\end{bmatrix}
\begin{bmatrix}
E & O\\
B^{-1}A & E\\
\end{bmatrix}
$$
要注意的是这里有
$$
\det{
\begin{bmatrix}
M & N_{u \times u}\\
R_{v \times v} & O\\
\end{bmatrix}
} = (-1)^{uv} \det{N} \cdot \det{R}
$$
关于记忆方法,注意到前两个式子矩阵出现顺序为“选定、对角、顺时针、中间一开始的逆”
后两个式子为“$-1$ 的某次方、选定、对角、逆时针、中间一开始的逆”即可
#### 矩阵运算的行列式
$$
|X_{m \times m} + A_{m \times n} B_{n \times m}| = |X_{m \times m}| |E_{n \times n} + B_{n \times m} X_{m \times m}^{-1} A_{m \times n}|
$$
证明如下:
由 [分块矩阵的行列式](#分块矩阵的行列式) 得
$$
右式 = \det{
\begin{bmatrix}
X_{m \times m} & A_{m \times n}\\
-B_{n \times m} & E_{n \times n}\\
\end{bmatrix}
} = 左式
$$
由此,若
$$
M_{m \times m} = N_{m \times m} + k \begin{bmatrix}
1\\
\vdots\\
1\\
\end{bmatrix}
\begin{bmatrix}
1 & \cdots & 1
\end{bmatrix}
$$
则
$$
\det{M} = \det{N} + k \sum_{i = 1}^{m} \sum_{j = 1}^{m} N_{ij}
$$
其中 $N_{ij}$ 表示 $N$ 在 $i$ 行 $j$ 列的代数余子式
## 相似对角化
### 为什么有 $n$ 个线性无关特征向量一定能相似对角化?
记 $\vec{\xi_1}, \cdots, \vec{\xi_n}$ 是 $n$ 阶矩阵 $A$ 的 $n$ 个无关特征向量,各自对应特征值 $\lambda_1, \cdots, \lambda_n$
则有 $A\vec{\xi_1} = \lambda_1 \vec{\xi_1}, \cdots, A\vec{\xi_n} = \lambda_n \vec{\xi_n}$,记
$$
P = \begin{bmatrix}
\vec{\xi_1} & \cdots & \vec{\xi_n}
\end{bmatrix}
$$
故得 $AP = P\varLambda$,其中 $\varLambda = \mathrm{diag}(\lambda_1, \cdots, \lambda_n)$
又因为 $P$ 由 $n$ 个线性无关的向量组成,故 $P$ 满秩可逆,故 $P^{-1}AP = \varLambda$,得证
### 为什么实对称矩阵一定能相似对角化?
> 没有这么复杂,对角化无非就是配成平方,所以问题就是:实二次型一定能配成完全平方。
>
> 高中生都知道怎么做,最简单的就是用贪心法一个个配就是。
参见 [此链接](https://www.zhihu.com/question/38801697/answer/3157831805) 和 [此链接](https://www.zhihu.com/question/38801697/answer/2584722969)
### 为什么是正交变换?
任意 $n$ 元实二次型 $f(\vec{x}) = \vec{x}^T A \vec{x}$,其中 $A$ 为实对称矩阵,都存在正交变换 $\vec{x} = Q\vec{y}$ 将其化为标准型:
$$
f(\vec{x}) = \vec{x}^T A \vec{x} = (Q\vec{y})^T A Q\vec{y} = \vec{y}^T Q^T A Q\vec{y} = \vec{y}^T \varLambda \vec{y} = \sum_{k = 1}^{n} \lambda_{k} y_k^2
$$
其中 $\varLambda = Q^T A Q = \mathrm{diag}(\lambda_1, \cdots, \lambda_n)$
其解法通常是这样的:
1. 求出 $n$ 个特征值 $\lambda_1, \cdots, \lambda_n$
2. 求出 $n$ 个线性无关的特征向量 $\vec{\xi_1}, \cdots, \vec{\xi_n}$
3. 将 $n$ 个特征向量正交化、单位化为 $\vec{e_1}, \cdots, \vec{e_n}$
4. 将 $\vec{e_1}, \cdots, \vec{e_n}$ 按列排序构成矩阵 $Q$
5. 写出经过正交变换后的标准型或对应的对角矩阵 $\varLambda = \mathrm{diag}(\lambda_1, \cdots, \lambda_n)$
其实最重要的一点就是,找到某种矩阵 $Q$ 使其满足 $Q^T A Q = \varLambda$
观察这个式子,我们会发现这和矩阵相似是很类似的
实际上对于实对称矩阵,必然存在可逆矩阵 $P$ 有 $P^{-1} A P = \varLambda$ —— 有的题会要求求出通解,即所有可能的 $P$
若这样的矩阵 $P$ 同时也满足 $P^{-1} = P^{T}$,那么这样的 $P$ 实际上就是我们想找的矩阵 $Q$ —— 只要令通解满足这样的性质也就是我们想要的 $Q$ 了,但这种做法过于繁琐
具有这样性质的矩阵也被称为正交矩阵,有关正交矩阵的性质在此不再赘述
这下我们回来看上面的步骤,前两步很好理解,用正交变换法将二次型化为标准型就是实对称矩阵的相似对角化的应用之一
第三步正交化、单位化是实际上是正交矩阵的性质要求的 —— 正交矩阵的所有列(行)向量之间相互正交且为单位向量
有关“为什么将正交化、单位化后的特征向量按列排序构成的矩阵 $Q$ 仍然能保证有 $Q^{-1} A Q = \varLambda$”在此不做深入讨论
第四步和第五步就是纯粹的解题步骤了
## 正定矩阵、半正定矩阵、负定矩阵、半负定矩阵、不定矩阵
有关二次型的几何意义参见 [二次型究竟是个啥?二次型的几何意义](https://www.bilibili.com/video/BV12N4y1H7Rn/)
二次型 $\vec{x}^T A \vec{x}$ 实际上就是将向量 $\vec{x}$ 经过 $A$ 的线性变换后再与自己点乘的结果,而向量点乘的结果的正负标示着两向量的夹角情况
具体来说,为正夹角小于 $\dfrac{\pi}{2}$,为 $0$ 两者垂直,为负夹角大于 $\dfrac{\pi}{2}$,在此我们简单分别称三种情况为同向、垂直、反向
若这样的矩阵 $A$ 能使得原向量空间的所有非零向量经过线性变换后保持同向,则称 $A$ 为正定矩阵,若保持不反向则为半正定矩阵,对于其他的正定情况也可类比定义
对了,这种情况是广义的正定矩阵,考研考查狭义的正定矩阵,即对 $A$ 再加上了实对称的限制
我们在此基础上来看看一些正定矩阵的相关结论
- $A$ 的特征值均为正
个人觉得这是最能体现同向这一概念的结论,假定 $A$ 的有特征值为 $0$,那么其对应的特征向量在变换之后就和自己垂直;假定有特征值为负,那么变换之后和自己反向
通过这个结论能推导的等价命题有:
1. $A_{n \times n}$ 的正惯性指数为 $n$
2. $A$ 与 $E$ 合同,因为 $A$ 可以用谱分解定理分解,然后把特征值开根号塞进单位向量即可,或者说 $A$ 是正定矩阵就意味它能化成系数全为 $1$ 的规范型,而这个化法肯定对应一个线性变换
3. 各阶顺序主子式为正
我们再来看看半正定二次型:$f(x_1, x_2, x_3) = (x_1 + x_2)^2 + (x_2 + x_3)^2 + (x_3 - x_1)^2$
它显然不能为负,且存在 $x_1 = x_3 = -x_2 \neq 0$ 使 $f = 0$,那么显然这是个半正定矩阵
同样的,半正定矩阵的特征值均非负,在加上之前正定矩阵特征值均为正的结论,则半正定矩阵必有特征向量为 $0$
根据上述结论和对角化不改变矩阵秩的性质,我们能很快写出该二次型对应的规范型为 $y_1^2 + y_2^2$
对于负定矩阵、半负定矩阵、不定矩阵的性质不再赘述,这里点出一点负定矩阵的判定方法:
奇数阶顺序主子式为负,偶数阶顺序主子式为正
## 常见概率分布、期望与方差
### 常见离散型随机变量的概率分布、期望与方差
| 名称 | 记法 | 意义 | 分布 $P(X = k)$ | 期望 | 方差 |
| :--------: | :-------------------: | :----------------------------------------------------: | :--------------------------------------: | :-------------: | :-----------------------------------------------------: |
| 二项分布 | $B(n, p)$ | 记 $X$ 为 $n$ 次实验中出现次数 | $C_n^k p^k (1-p)^k$ | $np$ | $np(1 - p)$ |
| 0-1 分布 | $B(1, p)$ | 略 | 略 | 略 | 略 |
| 超几何分布 | $H(n, M, N)$ | 记 $X$ 为含 $M$ 特殊的总体 $N$ 中取 $n$ 次所取特殊体数 | $\dfrac{C_M^k C_{N - M}^{n - k}}{C_N^n}$ | $\dfrac{nM}{N}$ | $\dfrac{nM}{N} (1 - \dfrac{M}{N}) \dfrac{N - n}{N - 1}$ |
| 负二项分布 | $Nb(r, p)$ | 记 $X$ 为事件第 $r$ 次出现时的实验次数 | $C_{k - 1}^{r - 1} p^r (1-p)^{k - r}$ | $\dfrac{r}{p}$ | $\dfrac{r(1 - p)}{p^2}$ |
| 几何分布 | $Nb(1, p)$ 或 $Ge(p)$ | 略 | 略 | 略 | 略 |
| 泊松分布 | $P(\lambda)$ | 略 | $\dfrac{\lambda^k}{k!}e^{-\lambda}$ | $\lambda$ | $\lambda$ |
### 常见连续型随机变量的概率分布、期望与方差
| 名称 | 记法 | 意义 | 概率密度 $f_X(x)$ | 期望 | 方差 |
| :------: | :----------------: | :--: | :--------------------------------------------------------------------: | :------------------: | :---------------------: |
| 均匀分布 | $U[a, b]$ | 略 | $\dfrac{1}{b - a}, x \in [b, a]$ | $\dfrac{a + b}{2}$ | $\dfrac{(b - a)^2}{12}$ |
| 正态分布 | $N(\mu, \sigma^2)$ | 略 | $\dfrac{1}{\sqrt{2\pi\sigma^2}} \exp{-\dfrac{(x - \mu)^2}{2\sigma^2}}$ | $\mu$ | $\sigma^2$ |
| 指数分布 | $Exp(\lambda)$ | 略 | $\lambda e^{-\lambda x}, x \geqslant 0$ | $\dfrac{1}{\lambda}$ | $\dfrac{1}{\lambda^2}$ |
## 二维随机变量
## 切比雪夫不等式、大数定律、中心极限定理
有关大数定律、中心极限定理,参看
> [一个视频教你快速区分和记住大数定律以及中心极限定理](https://www.bilibili.com/video/av745826370/)
>
> [【官方双语】但是什么是中心极限定理?](https://www.bilibili.com/video/av612459403/)
### 切比雪夫不等式
/// TODO:
### 辛钦大数定律与伯努利大数定律
#### 辛钦大数定律
若随机变量 $X_1, \cdots, X_n, \cdots$ 独立同分布,也记作 $\mathrm{i.i.d}$,且它们所遵循的分布的期望为 $\mu$,则有
$$
\dfrac{1}{n} \displaystyle\sum_{i = 1}^n X_i \overset{P}{\longrightarrow} \mu
$$
我们举个生活中的例子来解释这个式子所表达的意思:
现在有道数学题让你求某个随机变量的期望,你发现这道题好像有问题,想看看答案给出的期望是不是正确的,你正好会使用 Python 进行 $n$ 次模拟实验,那么你自然会将 $n$ 次模拟出来的结果加起来除以 $n$,用算出的频率当作期望
而辛钦大数定律就是这样做的正确性的根据
证明如下:
我们将讨论随机变量所遵循的分布的方差 $\sigma^2$ 存在时的特例,因为 **辛钦大数定律本身不要求此方差存在**
将 $\dfrac{1}{n} \displaystyle\sum_{i = 1}^n X_i$ 记作随机变量 $Y_n$,易得 $E(Y_n) = \mu$ 且 $D(Y_n) = \dfrac{\sigma^2}{n}$
由切比雪夫不等式,有 $P(|Y_n - \mu| < \varepsilon) \geqslant 1 - \dfrac{\sigma^2}{n\varepsilon^2}$
取极限有 $\displaystyle\lim_{n \to +\infty} P(|Y_n - \mu| < \varepsilon) = 1$,故得证
#### 伯努利大数定律
若随机变量 $X_n \sim B(n, p), n \in \N^*$,则有
$$
\dfrac{X_n}{n} \overset{P}{\longrightarrow} p
$$
据说伯努利大数定律就是辛钦大数定律的一个特例,但很多书都没有具体的推导过程
这里参考 [【概率论】大数定律与中心极限定理(2)从辛钦大数定律到伯努利大数定律](https://www.bilibili.com/video/av745161573) 给出证明
假定随机变量 $x_1, \cdots, x_n, \cdots$ 独立同分布,遵循两点分布 $B(1, p)$,这也被称为伯努利试验,其期望为 $p$
那么随机变量 $X_n \sim B(n, p)$ 实际上就是在考查这 $n$ 次实验中成功的次数,显然有 $X_n = \displaystyle\sum_{i = 1}^{n} x_i$
可以注意到本节中的 $X_n$ 对应 [辛钦大数定律](#辛钦大数定律) 一节中的 $Y_n$,$x_i$ 对应 $X_i$,故
$$
\dfrac{X_n}{n} = \dfrac{1}{n} \displaystyle\sum_{i = 1}^n x_i \overset{P}{\longrightarrow} p
$$
### 中心极限定理
1
1
1
1
1
1
1
1
1
1
1
1
SwiftUI 使用报告
## Swift 语言
[Swift](https://developer.apple.com/swift/) 是 [Apple ](https://www.apple.com/) 开发的一门编程语言 —— 不像 [某为](https://www.huawei.com/) 什么 [ArkTS 语言](https://developer.huawei.com/consumer/cn/arkts/) 就是给 [TypeScript](https://www.typescriptlang.org/) 套皮 —— 用的范围也很小,就它自家的产品开发用。
Swift 和 [Kotlin](https://kotlinlang.org/) 非常相似,创新了一些比较奇妙的语法比如:
```dart
callFunction(parma1, (value) {
final value2 = value * 2;
print(value2);
});
```
这种最后一个参数是函数时,可以写作:
```swift
callFunction(parma1) { value in
let value2 = value * 2
print(value2)
}
```
你说代码好看了嘛是好看了,但代码格式化时不会自动格式化到这种好看的格式,要写这种格式代码补全又不给我补全成这样,到后面反而是浪费了时间。
我不是很喜欢 Swift,究其原因如下:
1. 必须使用 Xcode 才能使用 Swift 语言
2. Xcode 不自带代码格式化,需要自己找插件
3. 格式化风格不统一
4. 没有热更新(Dart 都可以不依赖 Flutter 进行热更新)
在寻找 Swift 相关项目时看到了能使 Swift 热更新的 [InjectIII](https://github.com/johnno1962/InjectionIII) 项目,为什么 Apple 不加?
> 2024-07-05 12:50:35
> 修正:Swift 可以在 macOS、Linux、Windows 上使用,详见 [官方文档](https://www.swift.org/getting-started/)
> 这下更喜欢 Swift 了 🥰
## Xcode
我真的很想吐槽:这是人用的 IDE?
真的很难想象 Xcode 没有 Internationalization,以及它的那些面板排布为什么这么反人类,文件管理视图为什么这么让人憋屈。
我知道 Xcode 和 Android Studio 一样都有个项目视图,但 Android Studio 还能让人切到文件视图,但 Xcode,我的选项呢?
`Preview` 功能是需要表扬的,因为 SwiftUI 不支持热更新所以连 `Preview` 都没有的话就更写不下去了。
但它这 `Preview` 是会丢失状态的,所以还是有点不行。
## SwiftUI
我要骂死你们的 Document 啊,你们是不舍得给例子吗?光有文字描述我怎么知道我怎么使用这个组件、函数、类啊?
`List` 也是神鬼莫测,文档不说明它会自动给子组件加背景和分割线,我在思考。
有个 `LabeledContent` 这么好的组件你怎么忍心让它吃灰呢?我一开始一直都是用 `HStack { Label() Space() Text() }` 这样实现类似 Flutter 里的 `ListTile` 组件的。
它要是像 Flutter 那样有一个 [组件 Gallery](https://flutter.github.io/samples/web/material_3_demo/#/) 给你展示出来多好啊,可就是没有。
要称赞的一点就是它的 `Text` 组件,能直接写 Markdown 转 URL 链接:
```swift
Text("[byrdsaron@gmail.com](mailto://byrdsaron@gmail.com)")
```
## 总结
资料好少,我好伤心。
自己在用 SwiftUI 写一个手写字体创建软件,我要了解 [Unicode](https://home.unicode.org/)、字体、字形的相关知识,特别是怎么在 SwiftUI 里实现这件事,因为这需要涉及到一些比较低级的函数和接口。
但资料少的一批,官方文档简略的一批,鼠鼠我伤心的一批 😢。
更好的排版
自写日记开始,自己就越来越注重文字排版。
我是希望自己编写出来的东西是被精心设计过的,被别人看到时别人会感到舒适的,所以会去了解、学习一些相关知识。
故在此摘录并补充如下来源的一些规则:
- [中文文案排版指北](https://github.com/sparanoid/chinese-copywriting-guidelines/)
- [Requirements for Chinese Text Layout - 中文排版需求](https://www.w3.org/International/clreq/)
## 使用居中的省略号
> 其呈现上占两个汉字空间、包含六个省略点且在水平和垂直方向均位于字面正中,通常使用两个连续的 `U+2026 HORIZONTAL ELLIPSIS […]` 来实现。
>
> 在 Unicode 标准第 14 版的 6.2 章中,也推荐使用 `U+22EF MIDLINE HORIZONTAL ELLIPSIS [⋯]` 作为省略号。
>
> 此符号配合适当的转向与取代机制,在显示上无论直横排,省略点皆居中,更符合排版需求。
但据 [此评论](https://github.com/sparanoid/chinese-copywriting-guidelines/issues/58#issuecomment-355893405) 指出,后者是隶属于数学符号的 —— 应该就是 LaTeX 里 `\cdots` 对应的字符 —— 加之 [此评论](https://github.com/sparanoid/chinese-copywriting-guidelines/issues/58#issuecomment-356473325) 指出 <Kbd>^</Kbd> 默认映射为前者,我个人还是会使用前者的。
本网站为实现居中省略号,特地使用了字形为居中样式的字体。
<Alert color={'warning'} title={'注意'} description={'暂未实装'} />
## 使用标准的专有名词
例如 GitHub,官方使用该词时都是 **G**it**H**ub,从来不会使用什么 github、gitHub。
Xcode 也是,c 是小写的,而 VSCode,C 是大写的。
当然,编程里有 `camelCase` 这样的命名规范,那么这时 GitHub 对应什么?是 `github` 还是 `gitHub` 呢?
有兴趣的读者可参见 [camelCase 英文维基百科](https://en.m.wikipedia.org/wiki/Camel_case) 中的 Programming and coding 一节。
我是这样想的,人家既然这样设计了,必然保留人家的特征是最好的。
在此列表列出个人会最终采用的命名:
| 类别 | 命名法 | 例 |
| :----------: | :-----------: | :------------------------------------: |
| 专有名词 | - | GitHub、SurviRed、API、JSON |
| 变量、函数名 | camelCase | `gitHub`、`surviRed`、`api`、`json` |
| 类名 | PascalCase | `GitHubAPI`、`SurviRedJSON`、`APIJSON` |
| 常量名 | CONSTANT_CASE | `SURVIRED_API` |
| 文件名、URL | kebab-case | `github-json` |
## 不再过分使用括号
括号一层一层嵌套会使得意思极其“扭曲”,理解起来需要绕弯子,同时存在一堆右括号连在一起的情况,这很不美观。特别是如果存在括号内多重括号完后接下句,其所指的前文是很难很快找到的。
例文:
> 我是知道但没心思听(我一向屏蔽东西还算厉害(不过上次周测理综(语文(?))考试时外面在办丧事,丧乐把我人搞没了)的),旁边的同学倒是听得津津有味。
更好的做法当然是尽可能不使用括号,将想要表达的内容尽可能展开(flatten)来,出现跳跃性的句子可以使用破折号。
修改:
> 我是知道但没心思听 —— 我一向屏蔽东西还算厉害的,不过上次周测理综(语文?)考试时外面在办丧事,丧乐把我人搞没了 —— 旁边的同学倒是听得津津有味。
## 中英文混排时添加空格
在绝大多数情况下,在半角字符和全角字符直接加入空格就能给人一种文章没那么挤的感受。
比如接下来的这句话:
```plaintext
我喜欢吃apple,不喜欢吃peach和orange。
```
加入空格:
```plaintext
我喜欢吃 apple ,不喜欢吃 peach 和 orange 。
```
这里在每个单词左右两边都加了空格。
但这里实际上 apple 和 orange 后面接续的是一个全角的标点符号,且这个标点符号视觉上可以看作一个半角符号和一个空格,所以我们可以把后面的空格删去。
```plaintext
我喜欢吃 apple,不喜欢吃 peach 和 orange。
```
但像“——”“……”这种会占满整个宽度的标点符号,现在看来它们确实有点挤,建议加上空格。
这也带来了一个好处,让我说明白一些:
我们在编辑一段文本的时候,经常使用 <Kbd keys={'left'} /> 或 <Kbd keys={'right'} /> 来跳转光标,但是这过于的不方便。
而我们可以使用 <Kbd keys={['ctrl', 'left']} /> 或 <Kbd keys={['ctrl', 'right']} /> 进行快速跳转,对于像 Microsoft Word 这样的编辑器,其会智能的将中文词汇分段,所以在跳转时会跳到词的开头或结尾,而不是整个句子的开头或结尾。
而对于未实现中文分词的编辑器,加上的空格就作为了一个“跳板”,更加方便跳转。
除此之外,还有计量单位的事。
1 kg,1 m,1 s。在数字和单位之间需要空格 —— 这实际上就是英文排版要求 —— 而类似 100%,百(千)分号不需要。
类似 4G(第四代移动通信技术)这样的词,它本身是一个专业名词,所以之间不需要空格,但 4 G 确实可以表示类似“四倍重力”“四个金币”的意思,所以这就得看上下文了。
同时说说苹果在这方面的细节,他们会如上细微调整半角和全角字符之间的间隔(kerning),看上去和加了空格差不多,反而因为自己加了空格可能会显得间隔过大。
但考虑到不是所有的设备都有这样的特性,自己加上空格还是更普适的。
Next.js 和 React 使用报告
使用报告系列开新坑了,今天要谈的是 [Next.js](https://nextjs.org/docs) 14。为什么是 14 呢,因为我从 14 学的,别叫。
先做个介绍吧,最新的 Next.js 官网上其称自己为“The React Framework for the Web”,记得之前有多加一个“专为生产环境”的头衔,总之,人家是框架,开发的方方面面都体贴的为你想到了。
对了,可能还要再介绍 [React](https://react.dev/learn),它自己介绍自己为“JavaScript library”,在我看来,它就是将原先命令式的 JavaScript 操作,改为了更加简约的声明式组件,提升了组件的复用性。
对,大学课程里教过我们使用 jQuery 来操作 HTML 元素,但这玩意怎么还没死啊?这不累死个人?这不老古董?
以及,React 操作的是 [DOM](https://developer.mozilla.org/zh-CN/docs/Web/API/Document_Object_Model/Introduction) 节点,通过 `Link` 组件,其能在“跳转页面”时不再真正跳转页面,而是根据新获取的信息更新当前页面,直观来说就是浏览器左上角不再出现转圈圈的刷新图标,使单页应用成为可能。
我是不是还要再解释一下什么是 [单页应用](https://developer.mozilla.org/zh-CN/docs/Glossary/SPA)(?)。
## 非常好路由
Next.js 一大好处就是基于文件系统的路由,它抹去了原 React 提供的注册路由的方案,以及其提供的动态路由。
具体的不细讲,但我应该说明一点,就是即便 React Native 也有基于文件系统的动态路由,我也不会喜欢 React Native,因为移动端是移动端,网页是网页,如果真喜欢网页这一套,那还不如真就 `WebView` 跑网页完事。
## 组件设计
Next.js 是 React 的框架,所有为 React 开发的 UI 库都能在 Next.js 里使用(不像某个 React Native(指指点点.jpg))。
之前和谢佬参赛时使用的是 [MUI](https://mui.com/) 下的 [Joy UI](https://mui.com/joy-ui/getting-started/),但 React 的生态太广阔了,不局限于 Joy UI,自己转用了 [NextUI](https://nextui.org/docs/components/avatar) 和 [Ant Design](https://ant.design/components/overview-cn/),前者和开发 Next.js 的 Vercel 公司没有任何关系,但 UI 看起来很像,后者则是蚂蚁集团开发的。
使用别人的组件基本上就按它们的文档来就行,它们提供的属性一般就足够了。
但我们还是有自己写点样式的,这里就不得不提到 [TailwindCSS](https://tailwindcss.com/docs/installation) 了。
## 组件的修改
内联样式如果使用 `style` 属性来配置,会变得极为冗长,TailwindCSS 能大大改善这点,并对响应式的支持更好 —— 比如对界面大小的响应、暗黑模式的响应、打印状态的响应。
更不用说我不喜欢的外置 CSS 文件了。
## 服务器组件和客户端组件
这我看过教程,但教程里的方法是 Next.js 14 之前的,我理解还是不太清楚,经常到了报错说要用 `"use client"` 时才反应过来。
这个还得再了解了解。
## 状态管理和 Hook
React 本身有带 [状态管理](https://react.dev/learn/passing-data-deeply-with-context) 和一些简单的 [Hooks](https://react.dev/reference/react/hooks),因为我在学 Flutter 时对 Flutter 本身自带的、也是通过 `context` 向上查找根组件保存的状态的 [状态管理](https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html),以及 [flutter_hooks](https://pub.dev/packages/flutter_hooks) 包里的 Hooks 有一些了解,或者说 Flutter 和 flutter_hooks 本身就从 React 学习了很多,我也就大致对 React 的状态管理和 Hooks 有了一些概念。
具体深造还是得靠写项目的,原理可以不清楚,但总不可以不会用吗 —— 虽然说面试可能也会问到就是了。
和 Flutter 有社区的状态管理方案一样,React 也有其它的状态管理方案 —— [Redux](https://redux.js.org/)(实际上 Flutter 社区就有 [同名包](https://docs.flutter.dev/data-and-backend/state-mgmt/options#redux)),但我不会用。
而且据谢佬说这东西太复杂了,给我推荐了 [zustand](https://github.com/pmndrs/zustand),到时候都学学看就是了。
而 Hooks 方面,我不太理解 `useEffect` 是用来干什么的,感觉 `useState` 就足够了 —— 我看 `useEffect` 的一个应用的网络请求,但我明显找到了一个更牛逼的 Hooks —— [useSWR](https://swr.vercel.app/zh-CN/docs/getting-started),其也是由 Next.js 背后的同一团队创建的。
真的非常有用这玩意,我甚至从它身上看到了 mercurius 的未来(指数据同步)。
## 总结
Next.js 和 React 的组合非常适合网页开发,可能之后学习 [Vue](https://vuejs.org/) 的时候会再来一个它们间的对比,所以说本报告肯定会有第二期。
React Native 使用报告(二)
被恶心到了,我要狠狠的吐槽。
最近在恶补 React、Next.js、React Native,我先谈谈这个 React Native。
## 语言不行?
几个月下来,对 TypeScript 的了解更深了,能基本使用 TypeScript 了,像是它的解构,挺有趣的。自己也用 TypeScript 开发了一个 [VSCode 插件](https://github.com/Cierra-Runis/based_vscode_extension),可以说是这个项目后才对 TypeScript 有了好感。
有关它的类型,我还是不太能看懂,特别是我想要知道一个类型到底是怎样的时候,也就是翻源码的时候,要在很多联合类型直接跳转,这挺麻烦的。而之前也谈过,Dart 很直观,没有这么绕 —— 但我也确实想要 Dart 加入联合类型就是了。
对了,补充一点,之前说到 Java 没有空安全检查,这不太对,因为后面较新版本的 Java 有空安全,我也看到有的 Java 使用了 `@Nullable` 注释。
我不确定现在公司里都用的什么版本的 Java,不会还是 Java 8 吧?我是建议一直跟最新的,不管是语言还是框架,它们为什么要更新呢?因为它们加入了一些新东西,这些东西肯定是被好好讨论后才加入的,而被 deprecate 的那些东西,终将是会被删掉的,不升级还不行。新版本一般也会修复一些 bug、提升些性能,向后兼容的版本范围也可能变小,总之更新是好事。
但也要求这个过程是渐进的,不然出 bug 会很难受,比如说 Windows 升级,我甚至不想让它自动更新。
## 框架不行?
### 组件设计
这个我还是要批评的,基础组件太少,布局写起来很麻烦。
这时候我就去找组件库,找到个 [React Native Paper](https://reactnativepaper.com/) 库,用的是 [Material Design 3](https://m3.material.io/) 的设计,但也没有像 Flutter 里 `Scaffold` 的存在,凑合凑合还算过得去。
### 组件修改
样式确实可以不放在另一个文件夹里,能写内联的,在 React Native 里经常使用 `style` 属性修改,在谈 Next.js 我还会再说个 TailwindCSS。
Lint 提示确实还是不太好,有些属性名和原来的 CSS 属性名还有区别,我可不想被累死。
### 组件在多平台下的表现
这个我就不多谈了,React Native 表现挺差的,但我现在只搞 Android 这边的,随他去吧。
### Navigation 导航
我草死你的妈啊😅,难用一匹 —— 我现在使用的是 [@react-navigation](https://reactnavigation.org/docs/getting-started/) 这个包。
首先,我还是不喜欢命名路由,对 Flutter 来说一样。第一这意味着路由名称是硬编码的字符串,一旦重构会很麻烦;第二传参变得毫无类型可言,我该怎么判断它有没有我要的参数,我难道要每个需要传参的页面(路由、提示框)里都写 `as`?而且我如果修改了参数类型,在 `navigation.navigate` 这边是不会有任何提示的。
对了,这个 `navigate` 函数本身的类型好像有问题,不知道为什么它要求的是 `never`,而我需要传入字符串和给页面的传参,但是它也只是有个 lint 报错在那,用还是能用。
再就是这个在 Flutter 里称作 `AppBar` 的东西 —— 谁要你自动给我每个路由里的界面都带上了?但这样我人又懵了,对哦,那我自己要写 `AppBar` 对吧,嗯,React Native Paper 里有个叫 `Appbar` 的东西,挺好的 …… 等一下,返回按钮不是自动 implement 的,因为这两个包直接没有关系。也就是说我还要自己写一个 `AppBar` 组件,自己看看这个组件上级有没有路由,有就像 Flutter 那样自动 implement。
唯一一点好处就是,这个页面间跳转动画挺好看,因为跳转动画是 Android 自带的,因为跳转是使用了原生的。
## Debug 工具不方便
对,今天开个第三节继续吐槽 React Native。
我是使用 VSCode 和 React Native Cli 进行开发的,还使用了 Microsoft 开发的一个插件。
首先恶心人的地方是启动,不能 F5 启动(或者说我不知道怎么配置),要 `ctrl + shift + p` 在面板里选择。这还行,但接下来我人晕了,VSCode 没有进入调试模式 —— 就是底下状态条没黄,这说明它没有 VSCode debugger,这?(刚找到篇 [文章](https://blog.logrocket.com/debugging-react-native-vs-code/) 说有插件能,等我用了之后再补充)
我出错了不知道具体错误在哪,鼠标不会自动跳到出问题的代码去,
而且我这玩意不能热重启,我只能重载 VSCode 再启动 —— 而热更新也是,很多时候我都不知道它有没有更新,特别是在出 bug 后,保持黑屏,还得自己重启。
## 结尾
总之写起来很累,相比较 Flutter,无论是布局、导航、编程语言、调试工具,React Native 都没有很大的优势 —— 它最大的优势可能就是沾了 React 的光,“熟悉 Web 前端开发的技术人员只需很少的学习就可以进入移动应用开发领域”,但 React 嘛,还是让它好好搞网页开发吧,移动应用真不适合。
PS:本报告可能会有第三期。
多设备协同与自定义
大家好啊,今天来点大家想看的东西啊。
![otto](/post/otto.gif)
一人多设备的情况已经很常见了,在此分享一下自己的多设备协同体验。
## 设备清单
| 设备 | 型号 | 备注 |
| :--------: | :-----------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------: |
| 手机 | Redmi K70 | 单 Type-C 口;蓝牙 5.4 |
| 平板 | iPad Pro 2021 11' | 蓝牙 5.0;单 Type-C 口,支持雷雳 / USB 4,向下兼容 DP、雷雳 3、USB 4、USB 3.1 gen2 |
| 蓝牙耳机 | AirPods Pro II | 单 Type-C 口;蓝牙 5.3 |
| Mac | Mac mini M2 | 双 Type-C 口,均支持雷雳 / USB 4,向下兼容 DP、雷雳 3、USB 4、USB 3.1 gen2;双 Type-A 口;单 HDMI 2.0 口;略 |
| 显示器 | 泰坦军团 P2SA2V 4K 144 Hz | 单 DP 1.4 口;双 HDMI 2.1 口;支持 DSC;单 Type-C 口,支持 DP 输出、PD 65 W 供电;单 Type-B 口;两者其一作为双 Type-A 口上行,均支持 USB 3.0;单音频接口 |
| 笔记本电脑 | 拯救者 R7000P 2021 | 蓝牙 5.1;单 HDMI 2.1 口;双 Type-C 口,均支持 DP 1.4,其一支持 PD 100 W 供电、USB 3.2;四 Type-A 口,均支持 USB 3.1;单千兆网口;单音频接口 |
| 键盘 | 狼蛛客制化旗舰 F99 系列 | 单 Type-C 口,回报率 1000 Hz;蓝牙 5.0,回报率 125 Hz;无线 2.4 G,回报率 1000 Hz;电池 8000 mAh |
| 鼠标 | 罗技 G502 HERO | 支持按键宏编程;双模式疾速滚轮 |
## 硬件互连
将各个设备用物理连接起来着实废了一番心思。
即便 Type-C 能统一接口,各个接口具体支持什么协议也是模糊不清,要在网上搜每个设备的接口支持什么协议,并且还要有能满足这些协议的线材。有够烦人。
总之先讲讲我这套怎么搭的。
### 共享键鼠
首先显示器和笔记本电脑用 Type-C 转 DP 的线连接起来,显示器能以 4K 144 Hz 的预期模式显示画面,接着将鼠标有线连接至显示器 Type-A 口,键盘 2.4 G 接收器至显示器 Type-A 口。
问题出现了,照理说这两外设应该连上笔记本电脑的,DP 协议是能够运送双向 USB 信号的,总之再连了根 Type-C 转 Type-B 的线,显示器设置使 Type-B 作为上行。
再就是显示器和 Mac 用双 Type-C 的线连接起来,显示器能以 4K 60 Hz 的 **惨淡** 模式显示画面。
不知道为什么,当显示器从 DP 信号源调转至 Type-C 信号源时,Type-C 会夺走 Type-B 上行身份,也就是这根 Type-C 线同时传输了视频信号和 USB 信号。
总之这样键盘和鼠标就能自如的在笔记本电脑和 Mac 之间切换了,更何况键盘还有 Android、Windows、macOS、iOS 四种模式,使用 Fn+? 快捷键即可切换,非常方便。
### 共享音频
在这里点名批评 Mac 的狗屎设计,连接显示器后就不能在状态栏调整音量了,想调只能去按显示器,纯傻逼 —— 据说有人为此就要买 Mac 不买 Windows 设备,因为 Windows 音质是有损的才能随意调音量 —— 巨傻逼,那我缺的这个音量调节谁给我补啊。
总之在试过几款软件后都觉得不尽人意,我就直接禁止 Mac 播放声音了。
对,解决办法是使用 AirPods Pro 无线连接 Mac,这样调节音量就扫扫耳机柄就行,更好的是,AirPods Pro 支持 Apple 设备音频串流,也就是说 Mac 和 iPad 能同时在一个耳机里播放,就像成了一个设备。
而笔记本电脑由于能随意调整音量,所以外放 OK,当然连耳机也行。
再说个有关蓝牙耳机的事,自我开始用 AirPods Pro 我才知道,原来其他设备是能在已有设备与耳机连接时打断连接并连接上的,这应该是蓝牙耳机都有的功能就是了。
多个题外话,Mac 能投屏至 iPad、能鼠标流转操作 iPad(两者意思不同),这个我真觉得很厉害,~~不觉得很酷吗?~~
## 软件互联
### 文件传输
非常推荐 [LocalSend](https://github.com/localsend/localsend) 喵!其是基于 Flutter 开发的全平台文件传输软件,只要是在一个局域网下的设备就能互传。
那我为什么不使用 SMB 或 FTP 呢?因为太繁琐了,IP 地址会随着网络环境不同而改变,主机名、用户名、域、密码我还不知道哪个对应哪个,以及各个设备没有一个统一的界面,学习成本高。
当然,如果非要使用 FTP 的话我有个推荐软件 [MaterialFiles](https://github.com/zhanghai/MaterialFiles),其之前在 [云盘同步及 Obsidian 相关](https://note-of-me.top/posts/2308/) 介绍过,能在 Android 设备上启动 FTP 服务器。
### Android 投屏至电脑
非常推荐 [scrcpy](https://github.com/Genymobile/scrcpy) 喵!其是一款特别厉害的投屏软件,支持有线连接(好像也能无线?因为我第一次用这个的时候感觉它和 adb 挺像的)、鼠标控制、高刷 ……
具体的不多说了,稍微有点门槛的就是这是个没有 GUI 的软件,当然也可以去找人家包的 GUI。
## 杂项
### 桌面自定义
Windows 的可玩性比 macOS 高多了,[Wallpaper Engine](https://store.steampowered.com/app/431960/Wallpaper_Engine/) 这玩意要是能有 macOS 版那我会笑醒,接下来大多讲的还是 Windows 方面的东西。
#### 程序坞
macOS 上有程序坞,Windows 有任务栏,但我可不想把程序全“固定到任务栏”,所幸有款名为 [LightFrame](https://lightframe.vertillusion.xyz/) 的软件,其有一个组件是 Minecraft 物品栏程序坞,这可真是绝妙的点子,所以狠狠地用 —— 但它也有不足之处:作者不开源,加上年龄较小(?),代码很可能是一坨;存在置底设置经常失效的问题、存在不适配多显示器的问题(把它拖到外接显示器上,以后只用笔记本就看不到了)、存在不响应 DPI 变化的问题(显示器之间拖动大小不发生改变)。
最大的问题是,我想在 macOS 上也用它,但是完全不支持。
个人是想在 Flutter 实现无头应用(没有 GUI 也能后台运行的运用)和多视图(支持 0 个及 1 个以上的窗口)后自己实现一个。
#### 鼠标宏
罗技鼠标支持按键宏编程,也就是支持按键映射,而且 Windows 和 macOS 都支持。
- 对 Microsoft Edge:左右推中键能 `返回标签页` 和 `重做标签页`,也就是浏览器历史跳转;拇指上下键能 `重开标签页` 和 `关闭标签页`。
- 对 Minecraft:G Shift 键能间隔攻击,对于刷怪塔 AFK 很有帮助
- 对 VSCode:G Shift 键映射为 F5,方便调试;拇指上下键能 `跳转至上个位置` 和 `跳转至下个位置`,也就是光标位置历史跳转
玩法特别多,帮助也很大。
#### 全局工具
在 Windows 上推荐 [PowerToys](https://github.com/microsoft/PowerToys) 的 [PowerToys Run](https://learn.microsoft.com/zh-cn/windows/powertoys/run),macOS 上推荐 [Raycast](https://www.raycast.com/)。
使用什么快捷键来呼出快捷栏呢?在 Windows 上我是 `ctrl + win + alt + space`,在 macOS 上 ……
我哪知道,macOS 的键位好奇怪,我键盘切换到 macOS 模式后把 `win` 和 `alt` 互调了,然后我又在 macOS 设置里将 `command` 和 `ctrl` 对调了,这样才使得 macOS 的键位和 Windows 一致。
![macOS_shortcut](/post/macOS_shortcut.png)
在此,macOS 上的要做的更好,扩展多(翻译、词典、ChatGPT 对话等等,不过有些功能要订阅制付费),能给每个功能自定义全局快捷键,界面还挺舒适 —— 相比之下 Windows 一开始的样式丑的我根本不想用 —— 补足了很多 macOS 本应该有的功能。
如:Windows 上 `win + v` 的剪切板,QQ 提供的 `ctrl + alt + a` 截图功能,`Windows` 上的 `Everything` 全局搜索功能。
对了,讲讲 [Everything](https://www.voidtools.com/support/everything/),这是 Windows 上很强力的一款全局搜索软件,能秒搜出结果,还支持正则表达式。
在它的最新版本 `1.5a (1.5.0.1366a)` 还支持了暗色模式,纯属鉴作!
#### 更好的 Windows 11
更好的 Windows 11 就是 Windows 10,Windows 11 有些地方真的不如 Windows 10,那么 [ExplorerPatcher](https://github.com/valinet/ExplorerPatcher) 就是把 Windows 11 改造的更像 Windows 10 的一个工具,部分功能如下:
- 自由切换 Win 10 和 Win 11 任务栏,支持设置标签合并、功能显示等。
- 恢复 Win 10 右键菜单和文件管理器命令栏。
- 切换开始菜单版本、禁用推荐、自动打开所有应用页面。
- 自定义应用切换器,可选 Win 11、Win 10、Win NT 等风格。
😤 微软,你好好看开发者怎么教你做事 😤
### 其他
更多的见 [此 GitHub 仓库](https://github.com/Cierra-Runis/desktop_modified),里面分享了更多自定义工具。
杂货
## 一些招聘要求
- HTML5、CSS3、ES6、React、Vue、Node.js、Webpack、Gulp、Git
- Redux、EmberJS
- 计算机组成原理、计算机网络、数据结构、算法、设计模式、软件架构、操作系统、编译原理、数据库
- C/C++、Java、Kotlin、Objective-C、Swift、PHP、Python、Go、Rust、Dart、JavaScript、TypeScript、SQL
- React Native、Weex 、Hippy、Flutter、Hybrid
- 前端性能优化方案,工程化优化方案
- 有开源作品,GitHub 上有独立作品
- 了解多线程编程
- IOS、Android、Windows Phone 开发经验
- 深入理解 Windows 操作系统的内存管理、文件系统、进程、线程
- 熟悉 Windows 界面实现机制;QT、DuiLib、CEF
## 系列作品
| 名称 | 来源 | 介绍 | 链接 |
| :-------: | :----: | :-------------------------------------: | :--: |
| Zeus | 宙斯 | 基于 Next.js 开发的个人简历网站 | |
| Sol | 太阳 | QT 桌面项目管理软件 | |
| Mercurius | 水星 | 基于 Flutter 开发的开源、跨平台日记软件 | |
| Venus | 金星 | 基于 Next.js 开发的宠物生活分享网站 | |
| Terra | 地球 | 原生 Android 虚拟植树软件 | |
| Luna | 月球 | 月相变化及事件查询微信小程序 | |
| Mars | 火星 | | |
| Iuppiter | 木星 | | |
| Saturnus | 土星 | 基于 React Native 开发的 每日一字 软件 | |
| Uranus | 天王星 | | |
| Neptunus | 海王星 | | |
| Pluto | 冥王星 | 原生 iOS 卡片对战游戏 | |
## 怎么这么多东西
![meme](/post/meme.jpg)
| 名称 | 介绍 | 名称 | 介绍 |
| :-------------------------: | :----------------------------------: | :------------------: | :-------------------------: |
| [GitLab] | 代码托管平台 | [JetBrains 全家桶] | 一堆 IDE |
| [JetBairns AI] | AI 代码生成 | [Visual Studio Code] | 微软的轻量级代码编辑器 |
| [Visual Studio] | 适用于大型项目的 IDE | [JetBrains Fleet] | AI 代码生成 |
| [GitHub Copilot] | AI 代码生成 | [GitHub] | 全球最大代码托管平台 |
| [Vue] | 网页开发框架 | [Vite] | 前者的构建工具 |
| [Android Studio] | 安卓开发 | [XCode] | Apple 生态下的 IDE |
| [DevEco Studio] | HarmonyOS 应用 IDE | [Unity] | 游戏引擎 |
| [团结引擎] | Unity 中国版 | [Qt] | C++ 跨平台开发框架 |
| [Electron] | 基于网页的跨平台开发框架 | [Tauri] | 基于网页的跨平台开发框架 |
| [React] | 网页开发 JavaScript 库 | [Cocos] | 国产游戏引擎 |
| [Unreal Engine] | 游戏引擎 | [.NET] | .NET 跨平台开发框架 |
| [七牛云] | 云储存、云计算服务 | [Codeberg] | 代码托管平台 |
| [Stack Overflow] | 开发问答求助网站 | [Node.js] | JavaScript 后端技术 |
| [Angular] | 与 React、Vue 并列的第三类方案 | [Bitbucket] | 代码托管平台 |
| [微信小程序] | 微信小程序 | [Chromium] | 开源浏览器内核 |
| [Firefox Developer Edition] | 火狐浏览器开发者版本 | [NervJS] | 京东的类 React 网页开发框架 |
| [Taro] | 支持 React/Vue/Nerv 等用于小程序开发 | [Reqable] | 类 Postman API 调试应用 |
| [Gitee] | 幽默国产类 GitHub 代码托管平台 | [Flutter] | Dart 跨平台应用开发框架 |
| [npm] | Node 包管理器,处理依赖 | [Firebase] | 谷歌一站式后端服务 |
| [Gradle] | 构建工具,用于 Java/Kotlin/Android | [CODEPEN] | 网页前端代码设计分享网站 |
| [eclipse] | 一款已经不怎么好用的 IDE | | |
[GitLab]: https://about.gitlab.com/
[JetBrains 全家桶]: https://www.jetbrains.com/ides/
[JetBairns AI]: https://www.jetbrains.com/ai/
[Visual Studio Code]: https://code.visualstudio.com/
[Visual Studio]: https://visualstudio.microsoft.com/
[JetBrains Fleet]: https://www.jetbrains.com/fleet/
[GitHub Copilot]: https://github.com/features/copilot/
[GitHub]: https://github.com/
[Vue]: https://vuejs.org/
[Vite]: https://vitejs.dev/
[Android Studio]: https://developer.android.com/studio
[XCode]: https://developer.apple.com/xcode/
[DevEco Studio]: https://developer.huawei.com/consumer/cn/deveco-studio/
[Unity]: https://unity.com/
[团结引擎]: https://unity.cn/tuanjie/tuanjieyinqing
[Qt]: https://www.qt.io/
[Electron]: https://www.electronjs.org/
[Tauri]: https://tauri.app/
[React]: https://react.dev/
[Cocos]: https://www.cocos.com/
[Unreal Engine]: https://www.unrealengine.com/
[.NET]: https://dotnet.microsoft.com/
[七牛云]: https://www.qiniu.com/
[Codeberg]: https://codeberg.org/
[Stack Overflow]: https://stackoverflow.com/
[Node.js]: https://nodejs.org/
[Angular]: https://angular.io/
[Bitbucket]: https://bitbucket.org/
[微信小程序]: https://developers.weixin.qq.com/miniprogram/dev/framework/
[Chromium]: https://www.chromium.org/
[Firefox Developer Edition]: https://www.mozilla.org/en-US/firefox/developer/
[NervJS]: https://github.com/NervJS
[Taro]: https://taro-ui.jd.com/
[Reqable]: https://reqable.com/
[Gitee]: https://gitee.com/
[Flutter]: https://flutter.dev/
[npm]: https://www.npmjs.com/
[Firebase]: https://firebase.google.com/
[Gradle]: https://gradle.org/
[CODEPEN]: https://codepen.io/
[eclipse]: https://www.eclipse.org/
## 算法题
[棋盘覆盖问题](https://blog.csdn.net/q547550831/article/details/51541527)
[棋盘覆盖问题](https://blog.csdn.net/SongXJ_01/article/details/112439322)
[天平称硬币问题的通解](https://sighsmile.github.io/2017-08-02-weighing-puzzle)
[主定理](https://zhuanlan.zhihu.com/p/100531135)
## 其他
[驳人性论人注定是自私自利的吗](http://telegra.ph/驳人性论人注定是自私自利的吗-09-24-2)
[有机无机中“机”的意思](https://www.zhihu.com/question/342054227/answer/945310389)
[命运石之门 0 在线观看](https://www.yhmgo.com/vp/18194-3-0.html)
[连连看实现](https://www.jianshu.com/p/c1490cc49670)
[Git 仓库瘦身](https://ost.51cto.com/posts/24232)
[网道互联网开发文档](https://wangdoc.com/)
[深度剖析 Minecraft](https://blog.fallenbreath.me/zh-CN/2019/deeply-dissecting-minecraft_1/)
[Dart 异步实现](https://juejin.cn/post/7161215037078503454)
React Native 使用报告
最近邀请我参加一个七牛云的校园编程竞赛,我觉得自己能学到些什么,所以就半同意下来了。
昨天晚上三个人简要谈了谈之后,说是要决定一下选什么框架好,目前就两个方向 —— `React Native` 和 `Flutter`,前者是我只听说过但没实际了解的东西,后者则是自去年 `11` 月份就在学的东西。
于是昨天配置好 `RN` 的基础环境后,今天就看教程去了,但是嘛,越看就越觉得 `RN` 不好用,我来具体分析一下。
## 语言不行
首先,`RN` 使用 `JS/TS` 语言来编写程序,而前者 `JS` 是我认为最令人难受的语言(`PHP` 好像也挺垃圾的),它的变量类型可以说是一塌糊涂,动态类型 `Python` 也有,但 `Python` 我就用来写点小东西,要我用它开发程序 …… 我也不是没写过,`WordCloud` 就是用 `Python` 写的,体验也是非常糟糕。除此之外我还非常讨厌它有 `==` 和 `===` 的区别,隐式转换是坏文明。
后者 `TS` 我就直白的说,我看不懂!`Python` 里加入类型检查的方法是在变量后面冒号然后一个类型,而且重要的是,即便没给全部的变量都加上类型,程序仍然能跑起来,相当于只是给个 `lint` 提示一下,但 `TS` 要写类型就得全部写完,类型还不直观,之前学 `React` 的时候想转 `TS` 都转不了,后面对 `React` 就没多大兴趣了。
再来聊聊 `Flutter` 使用的语言 `Dart`,这是我用的最喜欢的一门语言。
![Most Used Languages](https://github-readme-stats.vercel.app/api/top-langs/?username=Cierra-Runis&show_icons=true&title_color=ad80FF&icon_color=ff8000&text_color=9f9f9f&bg_color=22272E&layout=compact&langs_count=10&border_radius=16&size_weight=1&count_weight=0&hide=cmake,c%2B%2B)
首先,他非常像 `Java`,而我曾经写过一段时间的 `Java` 程序,所以很快就上手了。而且相比 `Java`,它有空安全检查,也就是一个变量只有在其类型后面接上个问号时才能赋值为 `null`。相比之下,`Java` 就没有这样的要求,就容易抛出空指针错误。它的语法比 `Java` 简约,`new` 关键字不再是必要的。它还有动态类型,所以动态类型的好处 `Dart` 也有。
其次,我非常喜欢它的 `extension` 方法,可以在已有的一个类(如 `DateTime`)里,注入自己需要的一些便捷方法,这是非常好的,`pub.dev` 上还有一个包专门收录了许多的 `extension`,极大方便了开发。
## 框架不行
### 包管理
`React` 和 `React Native` 都会搞出一个极大的 `node_modules` 文件夹,这是非常屎的一个设计,我就不多吐槽了,`npm`、`yarn`、`pnpm` 都是为了解决这个烂玩意的,见 [此博客](https://gadzan.com/npm-yarn-pnpm) 。
而 `RN` 一个令我难受的点是,其 `core` 核心组件太少了,像是 `Navigation` 导航都要引入一个包,听说之前它是在 `core` 里的,之后被分离出去了 …… 嗯 ……
再来聊聊 `Flutter` 的包管理,它没有什么外置的包管理器,要么一句 `flutter pub add <包名>` 解决,要么自己在 `pubspec.yaml` 文件里添加一行 `<包名>: <版本号>` 就行,甚至版本号都不填,留个冒号在那里,`Flutter` 自己会获取最新且兼容的包,一手包办的感觉太爽了。
那 `Flutter` 的包是放在哪的呢?在 `%LOCALAPPDATA%\Pub\Cache\hosted` 下,它按源的不同,分多个文件夹,一般来说是 `pub.dev` 文件夹和 `pub.flutter-io.cn` 文件夹,进 `pub.dev` 文件夹能看到很多包的不同版本的文件夹,就统计下来连 `2 GB` 都没有。
```powershell
PS > "{0} MB" -f [math]::round((Get-ChildItem -Path "$env:LOCALAPPDATA\Pub\" -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB, 2)
1301.09 MB
```
高下立判。
### 组件设计
`React` 和 `RN` 的类组件和 `Flutter` 的组件非常相似,但没有明显区分自己管理状态和无状态的组件,换言之,都是继承自 `Component`,都有一个 `state`,只是看你用不用就是了。
相似的点在于,前者的 `constructor` 相当于后者的 `initState`,前者的 `render` 相当于后者的 `build`,生命周期非常相似。
`Flutter` 是分了 `StatelessWidget` 和 `StatefulWidget` 的,前者只会要重写一个 `build` 方法,后者则是可重写整个生命周期。
### 组件的修改
这是我很不喜欢的一点,所有的,对于一个组件的修改,都要在一个远离组件的一个键值对里配置,这非常割裂。
其实我在学 `HTML` 和 `CSS` 的时候就有这样的感觉,样式为什么要放到另一个文件里?紧靠着不是更方便吗?没办法,网页这样搞是历史原因,`React` 也是搞网页的所以能理解,但 `RN` 的话 …… 当我知道它不是在各平台的 `WebView` 里跑 `React` 时我就不理解了。
而且写的配置,对 `key` 是没有 `lint` 提示的,我鼠标移到上面,它不会提示我这个组件有哪些可以修改的属性,加重了记忆负担。`value` 更是离谱,绝大多数都是字符串,都是同一个类型,要是打错了怎么办,要是没有代码补全怎么办?
相比之下,`Flutter` 的组件的配置要更加舒服,在其构造函数里填入配置的属性即可,而且 `lint` 会显示构造函数的参数和参数类型,还有 `dartDoc` 显示示例。除此之外,全局的主题配置也是可以的,像是 `MaterialApp` 就有 `theme` 属性,给其子组件树应用上。
### 组件在多平台下的表现
`RN` 说是一套代码跑多个平台,但我觉得它的表现不尽人意,多平台的表现差距太大。就拿圆形加载器组件举例,大小属性值怎么可以只在安卓有效?
这是受到原生组件的限制导致的,`iOS` 没有大小属性值 ……
而 `Flutter`,实际上也有多平台适配,部分已多平台适配的组件如 `AlertDialog` 是有个 `adaptive` 方法的,而且不会有“受原生组件限制”这一说法。
### Navigation 导航
我人都麻了,不知道是不是我会错意了,所有进入路由的组件都要受改造,还要在 `Navigation` 根组件里登记命名路由?
`Flutter` 哪来那么多事,在 `MaterialApp` 的 `home` 属性填初始路由(也就是 `"/"` 的命名路由),再用 `Navigator.push` 方法压入未命名的路由,或者和 `RN` 类似地在 `MaterialApp` 填命名路由,然后用 `Navigator.pushNamed` 方法压入命名路由。
灵活性比 `RN` 强太多了。
## 我了解不够
这里是我自己的一些问题,以上都是刚接触一天所体验到的,可能了解上面的一些问题也早都有了解决方案。
LaTeX 使用报告
## 介绍
`LaTeX` 是一个文档准备系统(`Document Preparing System`),它非常适用于生成高印刷质量的科技类和数学类文档。它也能够生成所有其他种类的文档,小到简单的信件,大到完整的书籍。`LaTeX` 使用 `TeX` 作为它的排版引擎。
总之是以代码的形式生成很漂亮的 `pdf` 文档!相比 `Word` 他虽然不够直观,但,漂亮决定一切(((
## 使用
你以为我会教你怎么安装吗?当然不会,可以去谷歌一下。
但你说我真的喜欢 LaTeX 吗?实际上 LaTeX 体积过于庞大,而且总给我一种这仍是上个世纪的产物(它确实是),生硬,但又忠实的反应了其结果。
相比 LaTeX,更常用的是 markdown,markdown 的语法简单,扩展性强,只是想要个数学公式功能的话 markdown 也能很好的胜任。
但 markdown 并没有一个统一的语法,就比如 `_斜体_` 和 `*斜体*` 其结果都是 _斜体_ 一样,这就导致了各种 markdown 渲染器的渲染结果有所不同,更不用说一些平台的扩展语法了。
那 markdown 的创始人在干什么?
## 一些不便
1. `Emoji` 插入不便
2. 自定义字体不便
3. 错误排查不便
Python 包与 Email 提醒
## 缘起
在使用 `python` 写监听器的时候经常使用邮件提醒监听器变化,一开始就是简单一句话提醒就行,后面想着这玩意应该能和自己以前收到的邮件一样好看,所以开始试着发送 `html` 格式而不是纯文本的邮件,经过一番折腾,最后搞出来了个 `python` 包 [listener_email](https://github.com/Cierra-Runis/listener_email) 。
## 问题
参考了苹果购物详情邮件:
![Email](/post/email.png)
可是在修改过程中发现各个平台显示出的结果都不一样,其中:
- `QQ` 邮箱网页版支持最好,能不使用 `<table>` `<tbody>` `<tr>` `<td>` 等标签,而是普通的 `<div>` 和 `css` 里的 `display: flex` 属性进行布局,其他的邮箱都不可以;能使用 `github.com` 域名下的图片,而不是非要使用 `raw.githubusercontent.com` 域名下的图片,其他的邮箱都不可以;唯一的缺点是没有暗色模式
- `iPad` 版 `Gmail` 只能使用 `<table>` `<tr>` `<td>` 等标签进行布局,使用 `<tbody>` 标签 `Gmail` 会把里面的东西掏出来,从而破坏布局,且不支持自定义字体
- 网页版 `Gmail` 同上,但背景强制显示为白色,即便开启了暗色模式
- `iPad` 自带 `邮件` 同上,同时在 `系统设置 > 邮件 > 隐私保护` 里的 `保护“邮件”活动` 若未关闭,且下方 `阻止所有远程内容` 未关闭,则默认不能查看图片
- `QQ` 手机版 `QQ 邮箱提醒` 里的邮件不支持自定义字体,且若在 `QQ 侧拉栏设置 > 通用 > 模式选择` 里选择 `体验模式` ,则背景强制显示为白色,反之选择 `普通模式` 则背景在夜间模式下能显示为黑色
- `微信` 手机版 `QQ 邮箱提醒` 里的邮件最差劲,不会自动识别邮箱为链接,不支持自定义字体,链接颜色会被一致改为蓝色,整个页面根本没做暗色模式,连上面 `发件人` 的样式都丑的一批,鉴定为 `“小而美”`
排查了好久才总结出以上信息,最后才写出来一个较为满意的 `html` ,想着这东西可以写成个包方便使用,也就开始了写包历程。
## Python 包
答案是国内资源太少,姑且把包 [listener_email](https://github.com/Cierra-Runis/listener_email) 上传使用了。
但我想着一般包都是 `import listener_email` 然后 `listener_email.sent_email()` 来使用函数,而不是 `from listener_email import sent_email, ListenerEmail` 然后 `sent_email()` 来使用函数 ……
不懂,暂且懒了 ——
有关符号链接的小问题
## 符号链接与云盘同步
在之前的 [云盘同步及 Obsidian 相关](/posts/Cloud-Drive-Sync-And-Obsidian-Related/) 文章里有提到:
> 兜兜转转还得是微软的 `OneDrive`,在 `cmd` 使用:
>
> ```bash
> mklink /d "D:\OneDrive\Songs" "D:\osu\Songs"`
> ```
>
> 创建链接使 `D:\OneDrive` 这个我个人设定的 `OneDrive` 文件夹(默认在哪来着不记得了)里出现一个 `Songs` 文件夹,进去一看好家伙是 `D:\osu\Songs` 里的东西,这样 `Windows` 方面成功。
其中使用的指令创建了一个符号链接,其中真正的文档处在后者 `D:\osu\Songs` 中,而前者 `D:\OneDrive\Songs` 是指向后者的一个符号链接,注意前者原先是不能存在 `Songs` 文件夹的,否则无法创建符号链接。
这种方案这会引发 `OneDrive` 无法正确显示是否已同步文件的问题,解决办法是先转移文件到别的地方,右键删除符号链接:
> 在网上查询了许多方法都不管用,会出现删除后无法创建同名文件夹,文件夹会自动添加 `2` 后缀的 bug,感觉没死一样阴魂不散。
>
> 解决办法是直接将符号链接改名为一串极度不会重复的名称(比如一串哈希值什么的)后右键删除,这样就能新建同名文件夹
并将文件转移至网盘,再使用 `mklink /d "D:\osu\Songs" "D:\OneDrive\Songs"` 即可。
## 符号链接与 VSCode 和 Git
根据以上步骤网盘存储真实数据,使用处使用符号链接将我项目里的 `_post` 文件夹改为指向 iCloud 里的 `帖子` 文件夹后,用 VSCode 打开项目文件夹会看到 `_post` 文件夹后提示这是一个符号链接,和平常一样没有任何问题。
但问题出现在 Git 同步上,`git push` 后并不会将符号链接所指向的文件夹上传至 GitHub,而是符号链接本身。
对于我来说这并不影响,因为我使用 `.release_tool/main.py` 进行构建并发布至两个仓库 —— 一个是源文件仓库,一个是构建后的 GitHub Pages 仓库 —— 但如此提醒我们不要滥用符号链接。
**因为这玩意又难删资料又这么少玩死了没人管你😡️**
新主页,新气象
## 旧版的不适应之处
首先,原先的主题已经很久很久没有实质性更新了,而且自己在自定义方面处处碰壁,于是开始寻找其他博客主题。
## 新版的好处
首先,好看多了,很多地方也能进行自定义。自己还花了一点小钱在 [阿里云](https://www.aliyun.com/) 买了个域名,现在这个网站既可以通过 [https://cierra-runis.github.io/](https://cierra-runis.github.io/) 访问,也可以通过 [https://note-of-me.top](https://note-of-me.top) 进行访问。
当然,经过配置之后,现在:
- [https://cierra-runis.github.io/](https://cierra-runis.github.io/)
- [https://www.note-of-me.top/](https://www.note-of-me.top/)
都是重定向到了 [https://note-of-me.top](https://note-of-me.top) 的,有时前面 `www` 没被隐去的情况也存在就是了
除此之外,还使用了 [去不图床](https://7bu.top/) 作为网站图片的图床,价格也是特别的亲民,对于大陆用户的速度有一定提升。
## 需要解决的问题
因为自己也有使用 `Obsidian` 进行博客编辑的习惯,那么在 `iPad` 上编辑时上传图片就略显复杂,试着寻找插件解决问题罢。
云盘同步及 Obsidian 相关
之前在某个直播间看到有人在用一个看起来又是很新的玩意写 `markdown` 于是非常好奇的下载了 `Obsidian` ,在看到官方的同步价格贵的一批之后在直播间里进行吐槽获得了能自搭同步的情报,于是进行一个 `iCloud` 的利用~
## iCloud 与 Obsidian
具体来说,苹果官方在 `Windows` 端推出了个 [云盘同步工具](https://www.microsoft.com/store/productId/9PKTQ5699M62),安装登陆后就能在电脑上看到已和 `iPad` 文件管理器中同步了的 `iCloud 云盘` 一项,在 `iPad` 端的 `Obsidian` 软件里选择在 `iCloud` 创建仓库后,便能在 `iCloud 云盘` 里看到 `Obsidian` 文件夹,进行软件配置、文件创建、修改、删除都会很快同步,当然 `iCloud` 有时抽风给你在那把文件“高高挂起”也不是不可能😡。
个人觉得每月给 `iCloud` 交的 `6` 块钱特别的值,便宜好用就是值 —— 于是这同步空间可不能浪费,把自己原先囤积在电脑上的图片、音乐、文件都传了上来,算是减轻了因装了很多开发工具而臃肿不堪的电脑的压力。
哦,原先想着自己的一些“私密文件”也传上来方便些,但因为 **举头三尺有神明** ,铁拳还是有可能砸到云上贵州的,所以转向了其他云盘。
## Google Drive
`Google Drive` 因为一些懂得都懂的原因,是不能直接访问的,那么这里就可以很好保存“私密文件”。毕竟自己鉴赏这些东西时,也会同时使用技术手段进行一个维基百科的查、用 `iPad` 里特别好的 `GoodNotes` 进行一个笔记的做,也就给 `GoodNotes` 的备份网盘设定成了 `Google Drive`~
## OneDrive 与 MaterialFiles 和 FolderSync
前面主要还是关注 `iPad` 和 `Windows` 之间的文件同步,但很明显 `Android` 阵营也有话说。
自己有在玩 `osu!`,它有官方 `stable` 版、`lazer` 版,[MATRIX-夜翎](https://space.bilibili.com/305637715) 从 `lazer` 版 `fork` 出来所维护的 `mfosu` 版,[摆烂好久都不更新](https://github.com/osudroid/osu-droid) 再这样下去什么时候我自己 `fork` 一个来更新的 `osu!droid` 版,其中我玩的是 Windows 上的 `stable` 版和 Android 上的 `osu!droid` 版。它们很好的一点就是文件层次是互通的,简单同步俩者的 `Songs` 文件夹即可。
可就是这么简单的方案实现起来也很累人。
首先需要选择同步云盘,因为 `iCloud` 没有支持安卓,且 `Google Drive` 需要那样的技术手段,便考虑别的方法。
在这里其实有另一套方案,这里我没有继续下去的原因就是有点晕人,再就是速度有点慢,但姑且也作一个记录。在 `bilibili` 里也能看见有介绍 `Syncthing` 这款软件的视频,特点是 `P2P` 安全迅速(存疑),设定双设备相互加对方好友并都设置目标文件夹后,只要连接成功就会开始同步,只可惜我这边连接不稳定 —— 仔细想想这也并不是很符合我的使用场景,这要求俩者都在线且成功连接,所以也就放弃了。
兜兜转转还得是微软的 `OneDrive`,在 `cmd` 使用:
```bash
mklink /d "D:\OneDrive\Songs" "D:\osu\Songs"`
```
创建链接使 `D:\OneDrive` 这个我个人设定的 `OneDrive` 文件夹(默认在哪来着不记得了)里出现一个 `Songs` 文件夹,进去一看好家伙是 `D:\osu\Songs` 里的东西,这样 `Windows` 方面成功。
问题出在 `Android` 方面,这边比 `iCloud` 不能自选任意文件夹同步更屑,连在文件管理器里都不显示 ——
> 这里需点明的是不同安卓手机的文件管理器不一样,但自 `Android 13` 开始都是用底层的文件管理器才能打开 `data` 文件夹,在这个底层文件管理器里能看到 `OneDrive` 网盘,但也没什么用,没法管任意文件夹。
经过一系列的搜索,这里推荐 `MaterialFiles` 作文件管理器, `FolderSync` 作文件同步管理器。
[前者](https://github.com/zhanghai/MaterialFiles) 是特别简洁的一款使用 `Material Design` 风格的文件管理器,其几大特点分别是:
- 能直接访问 `data` 文件夹
- 能使用 `FTP` 远程访问
- 安装包体积小至 `8 MB`,占用不超 `20 MB`
简而言之非常好用~
[后者](https://play.google.com/store/apps/details?id=dk.tacit.android.foldersync.lite) 则是能自选任意文件夹和超多同步云盘服务的文件同步管理器,具体的不介绍了,创建“文件夹对”进行文件同步即可 —— 虽然我文件快两万个同步起来确实有些吃力就是了。
## 总结
苹果的东西在它自家用起来是很方便的,安卓的好处是自定义程度很高~什么 `Windows`?再好不过啦!
Flutter 使用报告
## Flutter 介绍
`Flutter` 是 `Google` 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 `Dart` 语言开发 `App`,一套代码同时运行在 `iOS` 和 `Android` 平台。`Flutter` 提供了丰富的组件、接口,开发者可以很快地为 `Flutter` 添加 `Native` 扩展。
在此记录些常用资料:
| 文档 | 文章 |
| :---------------------------------------------: | :---------------------------------------------------------------------------------------------------: |
| [官方网站](https://flutter.dev/) | [Flutter 最佳实践和编码准则](https://ducafecat.com/blog/flutter-best-practices-and-coding-guidelines) |
| [官方英文文档](https://docs.flutter.dev/) | [iPad 大屏 & Flutter 多引擎适配之路](https://zhuanlan.zhihu.com/p/589939547) |
| [官方中文文档](https://flutter.cn/docs) | [详解 android:elevation 的使用](https://www.python100.com/html/91048.html) |
| [官方 Package 站](https://pub.dev/) | [Flutter elevation 属性名称的含义](https://blog.csdn.net/gaoyp/article/details/123126394) |
| [Flutter 实战](https://book.flutterchina.club/) | [Android 中 elevation 的设置方法](https://www.jianshu.com/p/09959db18a4b) |
| | [模式匹配](https://juejin.cn/post/7304930607133655059) |
| 工具 | 包 |
| :----------------------------------------: | :---------------------------------------------------------: |
| [Json to Dart](https://jsond.bytex.space/) | [图片缓存](https://pub.dev/packages/cached_network_image) |
| | [BasedWidget](https://github.com/Cierra-Runis/based_widget) |
| | [QWeatherIcons](https://pub.dev/packages/qweather_icons) |
## 使用 index.dart 文件简化导入
规定文件目录结构如下:
```plaintext
lib
│ index.dart
│ main.dart
│
├─pages
│ home_page.dart
│ index.dart
│ setting_page.dart
│
└─widgets
│ index.dart
│
├─dialog
│ dialog_confirm_widget.dart
│ dialog_from_json_widget.dart
│ index.dart
│
└─diary
│ index.dart
│
├─list
│ diary_list_item_place_holder_widget.dart
│ diary_list_item_widget.dart
│ diary_list_view_widget.dart
│ index.dart
│
└─page
diary_page_item_share_button_widget.dart
diary_page_item_widget.dart
diary_page_view_widget.dart
index.dart
```
则在 `lib/index.dart` 内 `export` 所有子文件夹下的 `index.dart` 文件:
```dart
export 'main.dart';
export 'pages/index.dart';
export 'widgets/index.dart';
```
在 `pages/index.dart` 内 `export` 所有该文件夹下的 `*.dart` 文件:
```dart
export 'home_page.dart';
export 'setting_page.dart';
```
在所有 `*.dart` 文件(包括 `main.dart` 文件)内尽绝大可能 `import 'package:<项目名>/index.dart';` 即可简化导入。
同时当要引入外部包时,只要在 `lib/index.dart` 文件内导入即可,当然,有时会出现不同包之间的类名冲突,此时在需要使用到该包的地方单独 `import` 即可,或者使用 `hide/show` 语法限制,具体例子如下:
```dart
/// 各路由下的 index.dart
export 'main.dart';
export 'pages/index.dart';
export 'widgets/index.dart';
/// flutter 相关
/// [RefreshCallback] 和 `export 'package:flutter/material.dart'` 冲突,两者近似
export 'package:flutter/cupertino.dart' hide RefreshCallback;
export 'package:flutter/services.dart'
show DeviceOrientation, SystemChrome; // 设备服务
/// [Badge] 和 `export 'package:badges/badges.dart'; // 小红点提示` 冲突,我想用外部包
export 'package:flutter/material.dart' hide Badge;
export 'package:flutter/gestures.dart';
/// dart 相关
export 'dart:async' show Timer, StreamSubscription;
export 'dart:convert';
export 'dart:io';
export 'dart:ui' show ImageFilter;
/// 外部包相关
export 'package:badges/badges.dart'; // 小红点提示
/// [Interval] 和 `package:flutter/src/animation/curves.dart` 冲突,两者结构完全不同,但外部包里的这个用不到
export 'package:dart_date/dart_date.dart' hide Interval; // 日期工具
/// [Text] 和 `export 'package:flutter/material.dart` 冲突,两者结构完全不同,但外部包里的这个用不到
export 'package:flutter_quill/flutter_quill.dart' hide Text; // 富文本
```
## 版本号构建问题
`Flutter` 使用 `android/app/build.gradle` 来打包 `apk`, 且其引入了 `flutter.gradle` 并指向 `flutter.groovy` 如 `D:\Flutter\packages\flutter_tools\gradle\src\main\groovy\flutter.groovy`
约在 `flutter.groovy` 的 `993` 行
```groovy
if (shouldSplitPerAbi()) {
variant.outputs.each { output ->
def abiVersionCode = ABI_VERSION.get(output.getFilter(OutputFile.ABI))
if (abiVersionCode != null) {
output.versionCodeOverride =
abiVersionCode * 1000 + variant.versionCode
}
}
}
```
我们知道 `flutter` 将判断是否使用了 `'split-per-abi'` 命令, 是则在 `ABI_VERSION` 选择一个版本 `*1000` 再加上构建号
官方解释见 [此链接](https://developer.android.com/studio/build/configure-apk-splits)
我们只需修改 `ABI_VERSION map` 如下
```groovy
private static final Map ABI_VERSION = [
(ARCH_ARM32) : 0,
(ARCH_ARM64) : 0,
(ARCH_X86) : 0,
(ARCH_X86_64) : 0,
]
```
**_注意若进行了 `Flutter` 版本更新,应重新修改该 `flutter.groovy` 文件_**
## `vivo` 系手机无法调试 `Flutter` 程序
`vivo` 系列手机升至 `Origin3` 后发现调试 `Flutter` 应用卡在启动页,并且没有任何报错,详见 [github issue](https://github.com/flutter/flutter/issues/117019),简化自 [此链接](https://blog.csdn.net/qq910689331/article/details/128790897)
答案是 `vivo` 系统发大病连日志都隐藏,我们需要提供 `IMEI 1` 码至 `vivo` 官方进行授权
1. 拨号盘输入 `*#06#` 复制 `IMEI 1` 值
2. 添加企业 QQ 号 `3002261823`(或通过 [官方网站](https://dev.vivo.com.cn/connectus/customerService?from=header) 联系)
3. 提交相关问题和信息,要求一键授权自己的手机
4. 等待授权成功后拨号盘输入 `*#*#112#*#*`,`“右上角按钮”->“更多”->“一键授权”` 即可
## `AlertDialog` `content` 传入 `ListView` 时在调试模式下报错
这是个怪问题,`release` 版本正常运行,解决方法如下:
```dart
AlertDialog(
title: (...),
content: SizedBox(
width: double.minPositive, // 可选 double.maxFinite 但建议为 double.minPositive,
child: ListView(
shrinkWrap: true,
children: (...),
),
),
contentPadding: (...),
actions: (...),
);
```
## ard 语法
详见 [此页面](https://my.oschina.net/lemos/blog/5559979)
## 代码规范
1. 尽可能使用 `''` 而不是 `""` 来表示字符串
2. 尽量不使用 `StatefulWidget / ConsumerStatefulWidget` 而是 `StatelessWidget / ConsumerWidget`
3. 尽量不要使用 `const MyWidget({Key? key}) : super(key: key);` 而是 `const MyWidget({super.key});`,对于其他变量也是如此
4. 对 `StatelessWidget / ConsumerWidget` 组件,其结构如下
```dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
void _myFunction() {
(...)
}
@override
Widget build(BuildContext context) {
return Container();
}
Future<void> _myFuture() {
(...)
}
}
```
```dart
class MyWidget extends ConsumerWidget {
const MyWidget({super.key});
void _myFunction() {
(...)
}
@override
Widget build(BuildContext context, WidgetRef ref) {
return Container();
}
Future<void> _myFuture() {
(...)
}
}
```
5. 对 `StatefulWidget / ConsumerStatefulWidget` 组件,其结构如下
```dart
class MyWidget extends StatefulWidget {
const MyWidget({super.key});
(...)
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
(...)
@override
void initState() {
super.initSate();
(...)
}
@override
void dispose() {
(...)
super.dispose();
}
void _myFunction() {
(...)
}
@override
Widget build(BuildContext context) {
return Container();
}
Future<void> _myFuture() {
(...)
}
}
```
```dart
class MyWidget extends ConsumerStatefulWidget {
const MyWidget({super.key});
(...)
@override
ConsumerState<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends ConsumerState<MyWidget> {
(...)
@override
void initState() {
super.initSate();
(...)
}
@override
void dispose() {
(...)
super.dispose();
}
void _myFunction() {
(...)
}
@override
Widget build(BuildContext context) {
return Container();
}
Future<void> _myFuture() {
(...)
}
}
```
## 感想
- `Flutter` 的使用非常简单,上手也快,非常有意思
- 自己用 `Flutter` 写了很多项目,这里来个 `Mercurius` 日记软件的 [仓库链接](https://github.com/Cierra-Runis/mercurius)