常用命令

conda

  • 查看所有conda环境:conda env list conda info -e
  • 删除环境:conda remove -n envname --all
  • 复制环境:conda create -n new_envname --clone source_envname

linux

  • 根据管道符查找进程:ps -aux | grep app.py
  • 后台运行进程且关闭终端不结束并输出日志:nohup python manage.py runserver 0.0.0.0:8989 > runoob.log 2>&1 &
  • 查看当前目录下空间使用情况:du -h --max-depth=1 |sort -rh
  • 为git远程仓库生成ssh密钥:
1
2
ssh-keygen -t rsa -C "email"
cat home/username/.ssh/id_rsa.pub

vue

  • vue2 创建项目vue init webpack "项目名称"

JavaScript

  • 判断对象为空:JSON.stringify(obj) == '{}'

i.i.d,iid或者IID

独立同分布independent and identically distributed (i.i.d.)

HEXO 插入图片

图片

2008 BeiJing
 2022 CUMT

配置流程(参考自https://www.jianshu.com/p/f72aaad7b852)

第一步:安装插件,在hexo根目录打开Git Bash,执行

1
npm install hexo-asset-image --save

第二步:打开hexo的配置文件_config.yml

找到 post_asset_folder,把这个选项从false改成true

第三步:打开/node_modules/hexo-asset-image/index.js

将内容更换为下面的代码,(在此感谢Ericam_ 大神:https://blog.csdn.net/xjm850552586)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
'use strict';
var cheerio = require('cheerio');

// http://stackoverflow.com/questions/14480345/how-to-get-the-nth-occurrence-in-a-string
function getPosition(str, m, i) {
return str.split(m, i).join(m).length;
}

var version = String(hexo.version).split('.');
hexo.extend.filter.register('after_post_render', function(data){
var config = hexo.config;
if(config.post_asset_folder){
var link = data.permalink;
if(version.length > 0 && Number(version[0]) == 3)
var beginPos = getPosition(link, '/', 1) + 1;
else
var beginPos = getPosition(link, '/', 3) + 1;
// In hexo 3.1.1, the permalink of "about" page is like ".../about/index.html".
var endPos = link.lastIndexOf('/') + 1;
link = link.substring(beginPos, endPos);

var toprocess = ['excerpt', 'more', 'content'];
for(var i = 0; i < toprocess.length; i++){
var key = toprocess[i];

var $ = cheerio.load(data[key], {
ignoreWhitespace: false,
xmlMode: false,
lowerCaseTags: false,
decodeEntities: false
});

$('img').each(function(){
if ($(this).attr('src')){
// For windows style path, we replace '\' to '/'.
var src = $(this).attr('src').replace('\\', '/');
if(!/http[s]*.*|\/\/.*/.test(src) &&
!/^\s*\//.test(src)) {
// For "about" page, the first part of "src" can't be removed.
// In addition, to support multi-level local directory.
var linkArray = link.split('/').filter(function(elem){
return elem != '';
});
var srcArray = src.split('/').filter(function(elem){
return elem != '' && elem != '.';
});
if(srcArray.length > 1)
srcArray.shift();
src = srcArray.join('/');
$(this).attr('src', config.root + link + src);
console.info&&console.info("update link as:-->"+config.root + link + src);
}
}else{
console.info&&console.info("no src attr, skipped...");
console.info&&console.info($(this));
}
});
data[key] = $.html();
}
}
});

第四步:复制图片到对应文件夹

hexo new image-atrical之后在source/_posts生成image-atrical.md文件和image-atrical文件夹,把要插入的图片复制到image-atrical文件夹内,然后在md中即可正常引入图片并显示了!

1
![This is my photo](./image-atrical/CumtCs.jpg)

mysql基本使用与注意事项

连接远程数据库

  1. 语法:mysql -h host -P port -u user -ppassword
    注意:大写P表示端口,小写p表示密码,且小写p参数与密码之间不能有空格,否则将会被识别为连接的数据库名称

使用

  1. 查看表内数据数量:select count( colume_name ) from table_name
  2. 创建表:
    1
    2
    3
    4
    create table `table_name`(
    `colume_name` int not null primary key,
    `colume_name` datetime null,
    )
    注意:列命和表名需要使用反引号!

Vue笔记

Vue基础语法

  • v-text 设置文本;
  • v-html 设置文本,可解析html;
  • v-on 绑定事件,简写为@,例@click="f" @mouseover="over", 同时可在事件后面添加.修饰符对事件进行限制,例<input type="text" @keyup.enter="fe">仅在键盘输入enter键后进行触发fe函数;
  • v-show 通过display属性控制元素是否显示;
  • v-if 是否加载该元素dom树;
  • v-bind 绑定属性,简写为:,例 :src="imgSrc";
  • v-for 根据数据生成列表结构<li v-for="item in arr">{{ item }}</li>;
  • v-model 实现表单元素的双向绑定<input type="text" v-model="message">;

es6 语法

  1. 箭头函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 传统写法
    const f = function(){
    ...
    }

    // 箭头函数(一个参数小括号可省略)
    const f = () => {
    ...
    }

    // 箭头函数(只有一行代码省略写法)
    const f1 = (num1, num2) => num1 + num2

    // 等效f1
    const f2 = (num1,num2) => {
    return num1 + num2
    }



  2. 箭头函数this指向: 向外层作用域中逐个查找,直到有this的定义
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 箭头函数this指向问题
    const obj = {
    f1() {
    setTimeout(function(){
    console.log(this); //window
    })

    setTimeout(() => {
    console.log(this); //obj对象
    })
    }
    }

vue-cli

npm run build卡住
运行

1
npm config set registry http://registry.cnpmjs.org

重新build即可

预推免面试准备

深度学习的理解

  1. 本质原理:实现非线性映射;(神经网络的节点和参数非常多,通过梯度下降可以使模型适用于绝大多数问题)
  2. 不同任务之间的本质区别:通过设置不同的目标函数(LossFunction)、或输出的模式结构(比如GAN\TRANSFORMER)
  3. 网络结构:不同的网络的内部结构起到的就是提升模型性能的作用(提高准确度、提高训练速度、提高模型速度等)

实用新型专利

  1. 解决问题:
    1. 基于交通大数据背景,通过交通视频系统获取需要交通疏导地点,提高出警速度;
    2. 交警动作映射到交通指挥等中,实现交警动作和指挥灯信号的同步;
  2. 工作流程:
    1. 首先对HRnet网络 2d姿态估计模型和videopose3d姿态估计模型进行训练,得到得到基本的交通指挥手势信息库
    2. 对交警动作进行识别并将交通信息响应到交通灯中;
    3. 对为识别动作可进行模型的增量学习;
  3. 算法:
    1. YOLO:目标检测
    2. HRNet:用于2d人体姿态估计
      • 传统网络结构:高分辨率->低分辨率->恢复为高分辨率,是一种串联结构;
      • HRNET:整个网络过程都保持高分辨率表征,从网络第一阶段开始,逐步增加网络的低分辨率子网,形成更多阶段,然后将多分辨率子网进行连接,是一种并联结构;
    3. VIDEOPOSE3D:3d人体姿态估计

国创

  1. 结构:
    • 数字孪生部分:6自由度机械臂+web端的3d模型实现二者姿态的实时映射
    • 控制部分:直接控制+视觉控制,视觉控制部分使用yolo算法+videopose3d获取人体姿态,将手臂数据作用在机械臂上
    • 服务:深度学习服务器 + 边缘设备(机械臂)微型服务器 + Threejs的WEB前端模型
  2. 难点:
    • 姿态控制时高,网络性能有限,需要网络结构优化(使用YOLOX)
    • 精度低:视觉识别控制难以满足高精度作业,难以解决(需要使用高精度传感器)
  3. yolo:寻求速度与准确度的平衡!
    • 网络输出:x,y,h,w,classes(confidence )
    • 锚点:在锚点上选择较优的锚框再进行回归,直接回归h和w难度较大
    • https://blog.csdn.net/leviopku/article/details/82660381
    • yoloV1:
      • 结构: 7个卷积层 + flatten + 全连接层
      • 损失函数:误差平方和计算(bounding box损失+confidence损失+class损失)
      • 缺点:
        1. 群体性目标检测差:一群鸟
        2. 目标出现新尺寸时预测效果差
    • yolov2:CVPR2017
      • 每个卷积层添加BatchNormalization层,同时一处dropout层,减小过拟合,加快收敛
      • 更高分辨率分类器:448*448
      • 使用基于anchor的边界框预测,使用网络更加易于收敛
      • 使用k-means获得priors(anchor)
    • yolov3:做大做强,再创辉煌
  4. HRNet:用于人体姿态识别
    • 将不同分辨率的feature map进行并联
    • 在并联的基础上,添加不同feature map的交互(fusion),交互方法为:
      • 相同分辨率feature map直接复制
      • 升分辨率使用bilnear upsample +1*1卷积讲channel数统一
      • 降分辨率使用strid为3*3的卷积(3x3卷积是为了通过学习的方式,降低信息的损耗)
      • 3个featuremap的融合是相加

数据挖掘基本算法:

  1. 贝叶斯:根据先验概率计算属于某个类别的后验概率,最后取概率最大的分类
  2. 决策树:id3,4.5,CART
  3. K-MEANS:无监督、聚类迭代
  4. svm:核函数,通过升维达到使用线性方法解决非线性问题的能力

transformer和bert模型-nlp任务

  1. 基于mindspore框架实现,
  2. Transfomer:encoder和decoder,编码器+解码器,input->编码器编码->解码器解码输出->output;
    • encoder: 输入部分(embedding编码)、注意力机制和前馈神经网络
    • decoder:相对于encoder多了Masked Mutil-head-Attention,用于覆盖decoder还未见过的单词
  3. Bert结构:Transfomer中多个encoder结构堆叠在一起构成网络结构;
  4. 模型训练:
    1. 预训练:无监督训练过程,包括掩码语言模型和句子关系模型(时间很长)
    2. fine-tune:微调训练,根据下游任务进行模型微调训练(速度较快)
  5. Bert优缺点:准确率高,在各类nlp任务中都达到了极高的准确率,但是速度较慢,难以应用于线上任务

推荐系统

  1. UserBaseCF:找到用户的相似性矩阵,推荐相似用户所购买的物品
  2. ItemBaseCF:找到物品的相似性矩阵,推荐相似物品

夏令营

由于前5学期成绩处于保研边缘,大三下学期把主要精力放在课程考试上了,在考试基本全结束后投递了一些院校(此时大部分院校已经截至了),投了大概7、8所,最终只有西电入营了,最后挂了。

西电

  1. 自我介绍两分钟
    光准备英文自我介绍了,中文的却一下子懵了,说的比较乱
  2. 问了简历上gpu多线程的课程设计,问怎么体现多线程的性能优势的,多大的数据量(其实就是win32的多线程程序设计,没用到大规模数据,回答的很烂)
  3. 问了决策树的原理,有哪几种决策树
    原理回答感觉还可以(但是逻辑不够清晰),后面决策树我就记得id3和c4.5,回答了个信息增益和信息增益率,答的很不完全
  4. 数学建模时间序列模型是什么模型,我真不知道,我以为时间序列模型就是一种模型,当时就用spss处理的,原理一点不知道

    总结

    当时抱着随便试试的心态,也是第一次面试不知道准备点什么。面试结束竟然自我感觉良好,现在复盘才发现回答的太烂了。

改进点

  1. 简历优化:主要优化项目经历,加点干货
  2. 简历复盘:对简历上的内容充分复习,基本都会问
  3. 搜集目标院校信息,尽快联系老师!(不知道8月份联系老师是否合适)
  4. 英语准备:自我介绍、专业词汇、常见英文问题(知乎有收藏)、简历问题英文准备(有时间的话)
  5. 专业课复习
  6. 算法:5 per day

预退免

计算机组成原理

计算机系统概论

  1. 分类:专用机、通用机
  2. 发展:电子管计算机->晶体管计算机->中小规模集成电路计算机->大规模集成电路计算机->巨大规模集成电路计算机
    • 性能指标:
      1. 吞吐量:一台计算机再某一时间间隔内处理的信息量
      2. 响应时间:从输入有效到系统产生响应的时间
      3. 总线宽度:cpu内部运算器和存储器之间互连的内部总线二进制位数
      4. 存储器带宽:单位时间从存储器读出二进制数信息量
      5. 主频:cpu工作受主时钟控制,主频指主时钟的频率
        3.计算机硬件
    • 运算器(ALU, arithmetic logical unit):算术运算和逻辑运算
    • 存储器:存储器有很多存储单元、存储单元的编号成为“地址”
    • 控制器
      1. 指令形式:指令码+地址码
        • 指令数码化后,存储器的任何位置既可存数据也可存指令
        • 冯诺依曼结构:指令和数据存放在同一个存储器(存储程序并按地址顺序执行)
        • 哈佛结构:指令和数据分别存放在两个存储器(速度更快)
      2. 控制器基本任务:
        • 取指令->将操作码交给译码器分析->执行指令->继续取指令
        • 取指周期:取指令的一段时间
        • 执行周期:执行指令的时间
      3. 指令流和数据流:
        • 字:一个字至少由一个以上字节组成
        • 字长:一个字的二进制位数
        • 数据字、指令字
        • 指令流:取值周期中从内存读出的信息流,流向控制器
        • 数据流:执行周期中从内存读出的信息流,流向运算器
    1. 计算机软件

      第2章 运算方法和运算器

      1. 原码、反码、补码:
      • 引入补码的概念是因为ALU运算器在进行减法运算时比较困难,使用补码不需要进行减法运算
      • 引入反码是因为原码直接求补码仍需要进行减法运算,通过反码计算补码则简单的多
      • 正数的原码、反码和补码全部相同
      • 负数的反码符号位不变,其余按位取反,补码为在反码的基础上加1

数据库原理

常见问题

  1. 数据库事务和事务的ACID特性:
    1. 事务是访问并操作数据的操作序列,是一个数据库的逻辑运行工作单位,一个事务中的操作序列要么全部执行,要么全部不执行
    2. 数据库的ACID特性(事务的四大特性):
      • 原子性:指事务是一个不可再分割的工作单位,事务中的操作要么全部执行,要么全部不执行
      • 一致性:事务在执行前后数据库保持一致性状态(满足数据库完整性约束)
      • 隔离性:并发事务在操作和访问数据时进行数据封锁(事务间时隔离的),一个事务不会影响其他事务的结果
      • 持久性:即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中(通过日志等备份实现)
  2. 数据库的范式
    1. 范式就是关系型数据库的规范要求,范式越高数据库冗余越小
    2. 数据库3大范式:
      • 第一范式(1NF):确保列的原子性,既某个属性不存在子属性(没一列为最小数据单元)
      • 第二范式(2NF):在一范式的基础上,非主属性完全依赖于任何一个候选码
      • 第三范式(3NF):在二范式的基础上,不存在传递依赖(任何非主属性不依赖于其他非主属性)
  3. 视图、游标
    1. 视图:视图是一种虚拟的表,对视图的修改不会影响基本表,更安全;
    2. 游标:从结果集中提取一条记录的机制(利用游标可单独操作结果集中的每一行)

c++ winapi 多线程通信之事件机制

功能介绍

本次作业实现了使用event事件机制进行线程间通信控制,控制两个子进程实现1到100000的累加,第一个子进程thread1负责偶数的累加,第二个子进程thread2负责基数的累加,最终得出计算结果为5000050000,经过res函数验证结果正确。

实现代码 c++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<Windows.h>
#include<iostream>
#include<string>
using namespace std;
long long sum = 0;
int maxn = 100000;
CRITICAL_SECTION cs;
DWORD WINAPI thread1(PVOID pvParam) {
//进入临界区后进行屏幕输出,防止两个线程同时输出导致输出混乱
EnterCriticalSection(&cs);
cout << "Threat1 is running!" << endl;
LeaveCriticalSection(&cs);
//打开event1事件
HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, TRUE, TEXT("event1"));
for (int i = 0; i <= maxn; i += 2) {
//等待event1为受信状态后向下执行
WaitForSingleObject(hEvent, INFINITE);
//cout << "hevent1 is true" << endl;
//设置event1 为未受信状态,防止其他线程操作
//ResetEvent(hEvent);
sum += i;
//操作结束后更改event1为受信状态,允许其他子线程访问
SetEvent(hEvent);
}
return 0;
}
DWORD WINAPI thread2(PVOID pvParam) {
EnterCriticalSection(&cs);
cout << "Threat2 is running!" << endl;
LeaveCriticalSection(&cs);
HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, TRUE, TEXT("event1"));
for (int i = 1; i <= maxn; i += 2) {
WaitForSingleObject(hEvent, INFINITE);
//ResetEvent(hEvent);
sum += i;
SetEvent(hEvent);
}
return 0;
}
long long res() {
long long s = 0;
for (int i = 1; i <= maxn; i++) {
s += i;
}
return s;
}
int main() {
InitializeCriticalSection(&cs);
//创建事件event1
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("event1"));
//CreateEvent()参数分别表示安全属性、人工重置选项、初始受信状态、对象名,第二个False表示不使用人工重置即自动重置,在event被获取到后(WaitForSingleObject)自动变为未受信状态,不需要使用ResetEvent进行状态变更
//text()作用是实现对字符处理的透明化,不论是否使用 unicode 字符集,使用 TEXT 宏都可以使程序正常使用,
//如果程序中有 unicode 宏的,那么就使用宽字符,否则使用单字节字符,保证程序的可移植性
cout << "event1 was created and fIinitialState is False \n";
//设置event1事件为受信状态
SetEvent(hEvent);
//创建子进程threat1和threat2
HANDLE hThreat1 = CreateThread(NULL, 0, thread1, NULL, 0, NULL);
HANDLE hThreat2 = CreateThread(NULL, 0, thread2, NULL, 0, NULL);
EnterCriticalSection(&cs);
cout << "threat1 and threat2 were created!\n";
LeaveCriticalSection(&cs);

//ResumeThread(hThreat1);
//ResumeThread(hThreat1);
HANDLE hThreats[2] = { hThreat1,hThreat2 };
WaitForMultipleObjects(2, hThreats, TRUE, INFINITE);
cout << "Mutil threats result of the sum from 1 to "<<maxn<<" is " << sum << endl;
cout << "Right result of the sum from 1 to " << maxn << " is " << res() << endl;
return 0;
}

linux容器

vector

查询快,插入删除慢

list

查询慢,插入删除快

deque

结合上面两种有点,查询快,同时实现了插入和删除快

面向对象的优点

  • 可维护
  • 可复用
  • 可扩展

面向对象的特点

封装、继承、多态

简单工厂模式

红黑树 Red Black Tree

  • 红黑树是将二元树平衡化的技巧

平衡树:左右子枝相当
不平衡树:左右子枝不平衡

红黑树特点:

  • 红黑节点交替出现
  • 根节点为黑色
  • 每条路径上黑色节点数目相等
  • 每次新增加的节点为红色