Misaka-xxw的博客

昨日种种,皆成今我

css好玩捏

Re:从零开始的实习之旅

2025 年 6月26日 星期四 实习第一天
2025 年 9月30日 星期二 第一阶段结束

转眼间到了厦门的盛夏,期末考试结束了,我决定专心找实习。我留在了厦门。希望能在实习期间学到更多的知识和技能,为将来的职业发展打下坚实的基础。

实习第一天进入公司,上午主要先办理入职,然后拿起上一位实习生配置好的 c++ 代码就看。


Python,启动!

2025 年 10月15日 星期三

今天装了Pycharm、anaconda、Pytorch,跑机器学习模型案例。Pycharm和anaconda的配置还挺熟悉的,anaconda之前卸了装、装了卸的。Pytorch要装GPU版的,也是装过。机器学习也能跑,怎么调参还是要好好学习原理呢。


ollama 本地部署大模型帮助数据分类

2025 年 10月19日 ☁ 星期日 Ollama替我工作

很好,我装了个ollama,试了一下效果还不错。用的是qwen3:8b-q4_K_M模型,似乎跑的有点慢,就换成了qwen3:4b-q4_K_M。快了一点点。操作挺傻瓜的,下载安装一气呵成,然后下载模型也很快。直接在命令行里输入

1
ollama pull qwen3:4b-q4_K_M

alt text

效果还不错!


2025 年 10月22日 ☁ 星期三 小小实习生,小小汇报

望着奇奇怪怪的计算几何算法,我一筹莫展。考虑的特殊情况和问题太多了!机器学习倒是能跑。导师让我做个小汇报,我自己快把自己说糊涂了。后面我可能要碰一点点前后端,自己跑成功了再留下文档。


C++ 未定义行为打赏

2025 年 10月29日 星期三 野指针领域大神

今天写 c++,主要把之前写的几乎没法维护的代码,简化一下。之前完全按照大牛的论文来复现了,伪代码变成真代码太难了。然而,简化却出现了更多的问题。

比较键导致优先队列出现未定义行为

虽然std::set的比较键comp,当comp(a,b)comp(b,a)都返回false时,ab视为一样的值,不重复插入,但是,std::setcomp(a,b)comp(b,a)不能都返回false,否则会出现诡计多端的未定义行为。这还是我自己的逻辑问题,不会报错,糟糕极了。

无论是 comp(a, b)comp(b, a) 都返回 false,还是都返回 true,都破坏了优先队列依赖的严格弱序关系,会导致未定义行为

比较器必须同时满足:

  • 非自反性comp(a, a) 必须为 false
  • 非对称性:如果 comp(a, b)true,则 comp(b, a) 必须为 false
  • 传递性:如果 comp(a, b)truecomp(b, c)true,则 comp(a, c) 必须为 true
比较场景 合规结果 (满足严格弱序) 违规情况一 违规情况二
comp(a, b) true (表示 a < b) false true
comp(b, a) false false true
对严格弱序的违反 - 违反完备性(无法确定a和b的关系) 违反非对称性(a<b和b<a同时成立)
对优先队列的影响 正常构建堆结构 元素关系不确定,堆结构可能错乱 堆结构的逻辑基础完全崩塌

对于整数等基本类型,最安全的方法是使用标准库提供的比较函数对象(如 std::less)或避免使用可能产生歧义的自定义比较逻辑。对于自定义类型,可以使用 std::tie 来构造可靠的比较器。

我犯的错误是双false,有的时候它正常排序了,有的时候第一个元素的一个重要值给我替换成了一个接近零的浮点数?十分诡异。而且一开始我优先队列里还装指针,雪上加霜了

迭代器加指针是画蛇添足

迭代器已经很智能了,外部再记录不需要再使用“迭代器指针”了。
相当于stl已经帮你封装好了优化的迭代器。迭代器对象生命周期与所属的对象自然绑定,迭代器对象本身也不大。我却没事干搞了个双重指针,一个erase还没有delete,一不小心就把堆给破坏掉了,弊远大于利。

std::vector可能导致原来的内存失效

我将指针指向了std::vector里装的东西,因为push_back扩容时,需要新开辟一块空间再复制进去,原空间废弃无主,所以原来的指针就变成了不美味的野生指针。std::list作为权宜之计,可以规避这个问题,但也要小心指针。

conda命令速查表

功能类别 核心命令 说明/示例
环境管理 conda create -n <env_name> python=<version> 创建指定Python版本的新环境
conda activate <env_name> 激活进入指定环境
conda deactivate 退出当前环境
conda env listconda info --envs 列出所有已创建的环境
conda remove -n <env_name> --all 删除整个环境及其所有包
conda create --name <new_env> --clone <old_env> 克隆一个已存在的环境
包管理 conda install <package_name> 在当前环境安装包
conda install <package_name>=<version> 安装指定版本的包
conda install -n <env_name> <package_name> 在指定环境安装包
conda list 列出当前环境下所有已安装的包
conda update <package_name> 更新特定包
conda update --all 更新当前环境下所有包
conda remove <package_name> 从当前环境卸载包
环境配置共享 conda env export > environment.yml 导出当前环境的精确配置(包括版本号)
conda env create -f environment.yml 根据 YAML 文件创建一模一样的环境
conda env export --from-history > environment.yml 导出环境(仅包含明确安装的包,不包含依赖)
配置与清理 conda config --add channels <channel_url> 添加镜像源以加速下载
conda clean --allconda clean -y --all 清理所有安装包和索引缓存

下载安装anaconda

anaconda的下载安装参考此链接:https://blog.csdn.net/zwLoneranger/article/details/138743242

下载anaconda:https://www.anaconda.com/download/success

和教程一模一样的下载安装

配置镜像源

查看镜像源

1
2
conda config --show-sources
conda config --get channels

选择喜欢的镜像源,选一行填,例如

1
2
3
4
5
6
7
8
9
10
11
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/

conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge/

gitignore 未及时响应

如果想要屏蔽的文件已经被 Git 跟踪(已添加到版本库),.gitignore 就不会再生效。要先将这些文件从 Git 缓存中移除

1
git rm --cached .idea/copilot.data.migration.*.xml

根除commit记录

跳转早期博客

新建一个空分支

1
2
3
git checkout --orphan 新分支
git rm -rf .
git commit --allow-empty -m "初始化新分支"

合并两个不相关的仓库

我将第一学期学习资料的仓库开源了,现在想把春季学期学习资料的仓库合并到秋季学期。它们并不是分支关系,也可以合并

1
2
3
4
5
cd path/to/秋
git remote add second-semester https://github.com/用户名/春.git
git fetch 春
git checkout 新分支
git merge 春/main --allow-unrelated-histories

然后,可能会提示有所冲突,比如说两个仓库的 README.md,可以用 visual studio code 打开冲突文件,删删减减,解决冲突。

1
2
git commit -m "合并第二学期仓库的所有提交历史到空分支"
git push origin 新分支

如果不需要接收春季学期的更新了,可以选择

1
git remote remove 春

jetbrain同时绑定github和gitee

出门在外有时不能使用github,其实jetbrain轻松推送两个仓库。在插件市场中下载git和gitee插件,在gitee网页端的设置中也领个 token
alt text
这样可以愉快地存双倍代码了!

git命令行中文显示八进制编码

1
git config --global core.quotepath false

RAID ( Redundant Array of Independent Disks )即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。

RAID级别 别名/原理 最小磁盘数 容量利用率 容错能力 读写性能特点 典型应用场景
RAID 0 条带化 2 100% 无。任一磁盘故障导致全部数据丢失。 读写性能最高。 对性能要求高、数据可丢失的场景,如视频编辑缓存、临时数据处理。
RAID 1 镜像 2 50% 可容忍单盘故障。提供100%数据冗余。 读性能高,写性能较低(需写入两份数据)。 对数据安全性要求极高的场景,如操作系统盘、关键数据库。
RAID 2 海明码校验(已过时) 3(通常需更多) 较低(需多块专用校验盘) 可纠正单比特错误,允许单个磁盘故障。 大数据量连续读写性能尚可;小文件随机读写性能差。校验盘易成瓶颈。 超级计算机、大型机(现已基本被淘汰)。
RAID 3 字节级条带化 + 专用校验盘 3 (N-1)/N 单磁盘容错(允许数据盘或校验盘之一故障)。 持续读取性能好;随机写入性能差(专用校验盘是瓶颈)。 大文件连续读写场景(如视频编辑),现已较少使用。
RAID 5 条带化 + 分布式奇偶校验 3 (N-1)/N 单磁盘容错,允许1块磁盘故障。 读性能高;写性能中等(需计算校验位)。 读多写少的应用,如文件服务器、中小企业存储。
RAID 6 条带化 + 双分布式奇偶校验 4 (N-2)/N 双磁盘容错,允许2块磁盘同时故障。 读性能高;写性能较低(需计算双重校验位)。 对数据安全性要求极高的大容量存储,如医疗影像、档案备份。
RAID 10 镜像 + 条带化 (RAID 1+0) 4 50% 高。允许每组镜像中的一块磁盘故障。 读写性能均很高。 对性能和冗余都有高要求的场景,如高并发数据库、虚拟化平台。

前言

众所周知,二叉搜索树的性质是,节点的左子树键值都比节点的小,右子树键值都比节点的大。当单调增加或减少的值一一插入时,插入等时间复杂度严重退化成线性。所以我们要控制左右子树的高度差,作为平衡因子,将一次操作的时间复杂度控制在对数级内。

在实习的应用场景中,我想将一个时间复杂度高达 的算法,降到 ,以便于给后面的 算法腾出点儿时间(划掉)。查询资料,我选择了 Avl 树作为底层数据结构。接下来,我将写一个针对那个问题的c++模板类,以便于后续的更改。

(以后要不要来点酸爽的红黑树呢?)

实现

时间复杂度测试

alt text

![alt text](avltree/image-1.png)![alt text](avltree/image-2.png)

%%%
计算机系统结构的GCD法引发的深思

求模与求余的区别

这是我们小学二年级就会的除法运算。

$
\begin{aligned}
5\div3&=1\cdots2\\
(-5)\div3&=(-1)\cdots(-2)\\
(-5)\div(-3)&=1\cdots(-2)\\
5\div(-3)&=(-1)\cdots2
\end{aligned}
$

数学定义

求模和求余的主要区别在于处理负数的方式。
首先,商的符号永远由被除数和除数一起决定。

  • 求余操作 (a % b)
    • 数的符号与被除数相同
    • 商 = abs(a)/abs(b)*sign(a)*sign(b)
    • 余数 = a-b*商 = abs(a)%abs(b)*sign(a)
  • 求模操作 (a mod b)
    • 的符号与除数相同
    • 商 = abs(a)/abs(b)-(sign(a)*sign(b)==1?0:abs(b))
    • 模 = a-b*商 = abs(abs(a)%abs(b)-(sign(a)*sign(b)==1?0:abs(b))*sign(b)

其中sign(a)为取a的正负符号,正为1,负为-1,0为0

实际对比

对于正数,两者结果相同:
对于负数,结果可能不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<bits/stdc++.h>
using namespace std;
int main() {
//求余
int a[]={5,-5,-5,5},b[]={3,3,-3,-3};
for(int i=0;i<4;++i){
cout<<a[i]<<" div "<<b[i]<<" = "<<a[i]/b[i]<<"···"<<a[i]%b[i]<<endl;
}
return 0;
}
//result
5 div 3 = 1···2
-5 div 3 = -1···-2
-5 div -3 = 1···-2
5 div -3 = -1···2
1
2
3
4
5
6
7
8
9
10
11
# 求模
a=[5,-5,-5,5]
b=[3,3,-3,-3]
for i in range(4):
print(f'{a[i]} div {b[i]} = {a[i]//b[i]}···{a[i]%b[i]}')

# result
5 div 3 = 1···2
-5 div 3 = -2···1
-5 div -3 = 1···-2
5 div -3 = -2···-1

表格对比

表达式 求余 (C/Java) 求模 (Python)
5 % 3 2 2
-5 % 3 -2 1
-5 % -3 -2 -2
5 % -3 2 -1

转换公式

默认求模的程序语言:Python, Ruby
默认求余的程序语言:C, C++, Java, JavaScript

如果想在求余的语言中实现求模:

1
2
3
4
int mod(int a, int b) {
int r = a % b;
return r < 0 ? r + abs(b) : r;
}

如果想在求模的语言中实现求余:

1
2
3
4
5
def remainder(a, b):
r = a % b
if (a < 0 and b > 0) or (a > 0 and b < 0):
return r - b
return r

模意义下的加减乘除

$
(a+b)\bmod c=((a\bmod c)+(b\bmod c))\bmod c\\
(a-b)\bmod c=((a\bmod c)-(b\bmod c))\bmod c\\
(a\times b)\bmod c=((a\bmod c)\times (b\bmod c))\bmod c
$

但是注意,除法就不是这样的了

$
(a\div b)\bmod c=(a\times b^{-1})\bmod c=((a\bmod c)\times (b^{-1}\bmod c))\bmod c
$

$b^{-1}$是逆元

🚧施工中🚧

排序之间的比较

排序算法 时间复杂度 空间复杂度 稳定性 适合链式存储?
最好情况 平均情况 最坏情况
直接插入排序 折半插入:❌;直接插入:✅
冒泡排序
简单选择排序
希尔排序
快速排序
堆排序
二路归并排序
基数排序

习题

有序的排序

(没好好看题全做错了)
对 n 个基本有序的整数进行排序:

  1. 若采用插入排序算法,则时间和空间复杂度分别为( );
  2. 若采用快速排序算法,则时间和空间复杂度分别为( )。

正确答案

  1. 插入排序:时间复杂度 ,空间复杂度 .
  2. 快速排序:时间复杂度 ,空间复杂度 .

解析

  1. 插入排序

    • 时间复杂度:当数据基本有序时,插入排序只需进行少量的比较和移动操作,因此时间复杂度为
    • 空间复杂度:插入排序只需常数级的额外空间(如临时变量等),因此空间复杂度为 .
  2. 快速排序

    • 时间复杂度:快速排序在最坏情况下(如数据已完全有序),每次划分只能将数组分成一个元素和 个元素的两部分,此时递归深度为 ,时间复杂度为 .
    • 空间复杂度:快速排序主要是在原数组上进行操作,无需额外的存储空间,因此空间复杂度为 .

这不是某大学期末考试考的东西,不要背。

信息安全

信息的特性:

密码体制和加密算法

  • 对称加密/共享密钥
    • 加密密钥与解密密钥都是用相同密钥
    • 对大量明文加密时,考虑效率,一般采用对称加密
    • 常用算法:AES、DES、3DES、RC-5
  • 非对称加密/公钥加密
    • 使用不同的加密密钥与解密密钥。公钥加密,私钥解密
    • 常见算法:RSA、ECC、EIGamma、背包算法
  • 流加密
    • 加密和解密双方使用相同伪随机加密数据流作为密钥,明文数据每次与密钥数据流顺次对应加密,得到密文数据流
    • 常见算法:RC4、ORYX、SEAL
  • 分组加密
    • 将明文分为等长的模块,使用确定的算法和对称密钥对每组分别加密解密
    • 常见算法:DES、AES
  • 数字摘要/消息摘要算法
    • 一个唯一对应一个消息或文本的固定长度的值
    • 单向Hash加密函数
    • 常见算法:MD5、SHA、MAC

X.509数字证书推荐使用的密码算法:RSA
国密SM2数字证书采用的密码算法:ECC

数字签名与数字证书

数字签名

  • 功能 :保证信息的完整性不可否认性。确保信息在传输过程中未被篡改,同时让接收方确认消息确实来自发送方且发送方无法否认其发送过该消息。
  • 密钥使用 :发送方使用自己的私钥对信息生成数字签名,接收方用发送方的公钥验证签名,验证通过则确认信息完整性和身份。

数字证书

  • 功能 :用于证明身份和确保公钥可信度。就像网络上的身份证,由权威机构颁发,验证持有者身份及公钥归属。
  • 密钥使用 :证书中包含公钥,证书颁发机构用自己的私钥对证书签名。接收方收到证书后,用颁发机构公钥验证证书合法性,验证通过则可安全使用证书中的公钥。

防火墙

防火墙

  • 控制进出网络的数据包和数据流向
  • 提供流量信息的日志和审计
  • 隐藏内部IP以及为网络结构细节
  • 记录访问工程、包过滤、代理

在出口防火墙上配置ACL(Access Control List,访问控制列表)功能可以组织外部未授权用户访问内部网络。

防火墙三个区域,受保护程度:外网<DMZ<内网
通常把Web服务器置于DMZ区(隔离区、非军事化区)

包过滤防火墙对网络层

一些网络协议

IPsec
工作在网络层,主要用于在两台设备之间建立加密连接,保护数据传输不被窃听和篡改。常用于虚拟专用网络(VPN),让远程办公人员安全访问公司内部网络。

PPP(点对点协议)
位于数据链路层,用于在点对点链路上传输数据,比如拨号上网。它负责建立和维护连接,进行数据封装等,为上层协议提供服务。
PPP的安全协议是CHAP,密文采用MD5加密。

HTTPS
是加密版的 HTTP,在应用层工作。通过加密和身份验证,保护用户访问网站时的数据安全,比如网上购物、银行转账等场景,防止信息泄露。

TLS(传输层安全协议)
工作在传输层,是 HTTPS 的基础安全协议。用于在互联网通信中提供加密和身份验证,确保数据传输的机密性和完整性,广泛应用于各种网络应用。

未分类知识

有效防止SQL注入的手段:

  • 对用户输入做关键字过滤
  • Web应用防火墙
  • 定期扫描系统漏洞并及时修复

入侵检测技术有:专家系统、模型检测、简单匹配

知识产权的分类:

使

知识产权的特点:

  • 无形性
  • 双重性
  • 确定性
  • 独占性
  • 地域性
    • 本国法律保护
  • 时间性

《计算机软件保护条例》保护对象:

  • 软件程序
    • 源程序
    • 目标程序
  • 文档

软件著作权无明确规定,由开发者所有。

同样的发明只能授予一项专利

专利权:谁先申请就给谁;同时申请则商量
商标权:谁先申请就给谁;同时申请,谁先使用就给谁;均未使用或者无法证明,先协商;协商不了则抽签

烟草必须注册商标

著作权时间期限

  • 永久保护:
    • 普通著作权作品的署名权、修改权、保护作品完整权
    • 软件著作权的署名权、修改权
  • 其他作品保护期限是作者终身及其死后50年
  • 商标权可以续延长
  • 商业秘密权保密期限不确定

普通

软件名 功能 官网
Snipaste 截图和剪贴板置顶 https://zh.snipaste.com/download.html
Color 屏幕取色板 https://www.den4b.com/news/3044/colors-3-2
ScreenToGif Gif录屏、编辑和转换,很全面 https://www.screentogif.com/downloads
Ultimate Vocal Remover 强大的人声分离和去除混音软件 https://ultimatevocalremover.com/
OpenUtau 开源歌声合成,古法调教或鬼畜 https://www.openutau.com/#download
Joplin 多设备Markdown格式记事本 https://joplinapp.org/download/

专业

软件名 功能 官网
filezilla ftp https://www.filezilla.cn/
MobaXterm ssh https://mobaxterm.mobatek.net/
IDA 反汇编 https://hex-rays.com/ida-free
0%