当前位置: 首页 > news >正文

【计算机网络】网络编程套接字

文章目录

    • 理解源IP地址和目的IP地址
    • 理解端口号和进程ID
    • 理解源端口号和目的端口号
    • 认识TCP协议
    • 认识UDP协议
    • 网络字节序
    • socket编程接口
      • socket网址查看
      • socket常见API
      • UDP协议实现网络通信
        • UDP创建socket文件描述符
        • sockaddr结构
        • UDP绑定端口号
        • UDP接收发送网络数据
    • 简单的UDP网络程序
      • TCP协议实现网络通信
        • TCP创建socket文件描述符
        • TCP绑定端口号
        • TCP建立连接
        • TCP接收请求
        • TCP发起连接
        • TCP接收发送网络数据
    • 简单TCP网络程序
      • 多进程优化TCP服务器
      • 多线程优化TCP服务器
      • 线程池优化TCP服务器
    • socket编程总结
    • TCP协议三次握手四次挥手
    • 学习路线规划

理解源IP地址和目的IP地址

IP地址:公网IP,用于唯一标识互联网中的一台主机

源IP,目的IP:对于一个报文来讲,从哪来,到哪去。

源IP指将数据发送过来的IP地址,目的IP指将数据发送给下一个设备的IP地址(mac地址的变化)

意义: 指导一个报文该如何进行路径选择,目的IP是让我们根据目标进行路径选择的依据

理解端口号和进程ID

IP仅仅是解决了两台物理机器之间的相互通信,但是我们还要考虑如何保证双方的用户之间可以看到发送的和接受的数据。所以网络通信传输数据是使用进程来发送和接受的,pid唯一标识一台主机上的一个进程,port端口号也是唯一标识一台机器上的一个进程, 互联网世界本质上就是一个进程通信的世界

IP + PORT = socket(网络套接字)能够标识互联网中的唯一一个进程

端口号(port)是传输层协议的内容

  • 端口号是一个2字节16位的整数
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据需要交给哪一个进程来处理
  • IP地址+端口号可以标识网络上某一台主机的某一个进程
  • 一个端口号只能被一个进程占用

进程PID vs PORT 为什么PID已经可以标识一台机器上的一个进程了,为啥还要创造PORT端口号呢??

这就像身份证号和学号的关系一样,身份证号和学号都可以唯一标识一名学生。若不使用学号只使用身份证号会出现以下问题:

1、如果身份证号的格式发生变化,那么学校的系统就不能用了

2、身份证号可能并不能标识一个学生在学校里的信息,比如入学年份、学院、专业、班级等,而只需要一个学号就可以获得这些信息,便于筛选查询数据

所以PORT的创建是为了网络部分和操作系统部分进行解耦

另外一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定

理解源端口号和目的端口号

传输层协议(TCP和UDP)的数据段中有两个端口号,分别叫做源端口号和目的端口号。就是描述"数据是谁发的,要发给谁"

计算机本身不产生数据,产生数据的是人。人通过特定的客户端产生数据通过网络通信被传送到服务器中。所以所谓的网络通信本质上就是进程间通信 ,比如:抖音的app客户端(进程)<->抖音的服务器(也是一个进程)

认识TCP协议

TCP(Transmission Control Protocol 传输控制协议)特性:

  • 传输层协议
  • 有连接
  • 不可传输
  • 面向数据报

认识UDP协议

UDP(USser Datagram Protocol 用户数据报协议)特性:

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

TCP 可靠,UDP不可靠。TCP需要使用更多的资源,具体使用哪个必须根据使用场景决定

网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
  • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
  • 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
  • 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

为了使网络程序具有可移植性,使用同样的C代码在大端和小端计算机上编译后都能够正常运行,可以调用以下库函数做网络字节序和主机字节序转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-003WDtyy-1673836199573)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230114135903412.png)]

这些函数名非常好记 h(host 主机) to n(net 网络) l(32位长整型) s(16位短整型)

例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。

如果主机是小端字节序,这些函数会将参数做相应的大小端转换然后返回

如果主机是大端字节序,这些函数不做转换,将参数原封不动的返回

socket编程接口

socket网址查看

PING + 网址 (查看IP + PORT)

socket常见API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)      
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

可以看到bind(), accept(), connect()函数的参数中都含有一个const struct sockaddr *address,这是因为网络通信的标准方式有多种,例如基于IP的网络通信,AF_INET,原始套接字,域间套接字等的通信方式。为了系统结构的统一化,程序员们设计出一种结构sockaddr作为一个参数标识通信方式,让我们可以使用同一个接口来完成通信

UDP协议实现网络通信

UDP创建socket文件描述符

man socket # 查看文档
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
DESCRIPTION// socket函数创建一个通信端点并且返回一个描述符socket() creates an endpoint for communication and returns a descriptor.The  domain  argument specifies a communication domain; this selects the protocol family which will be used for communication.  These families are defined in <sys/socket.h>.// 目前已知的具体格式包含The currently understood formats include:
Name                Purpose                          Man page//有点多就不全部复制过来了,最常用的就是这个AF_INET             IPv4 Internet protocols          ip(7)The socket has the indicated type, which specifies the communication semantics.  Currently defined types are://TCP协议使用 提供有序,可靠,双向,基于连接的字节流,可以支持带外数据传输机制SOCK_STREAM     Provides sequenced, reliable, two-way, connection-based byte streams.  An out-of-band data transmission mechanism may be supported.//UDP协议使用 支持数据报(固定最大长度的无连接、不可靠消息)SOCK_DGRAM      Supports datagrams (connectionless, unreliable messages of a fixed maximum length).
RETURN VALUE     //成功返回文件描述符,若出现错误返回-1,并正确设置errnoOn success, a file descriptor for the new socket is returned.  On error, -1 is returned, and errno is set appropriately.
第一个参数:domain参数指定一个通信域,domain参数选择用于通信的协议族,这些协议族被定义在<sys/socket.h>头文件中
AF_INET             IPv4 Internet protocols          ip(7)第二个参数:type 套接字有指定的类型,它指定通信语义,当前定义的类型有(这里也是列举了两个最常用的)
TCP协议使用 提供有序,可靠,双向,基于连接的字节流,可以支持带外数据传输机制SOCK_STREAM     Provides sequenced, reliable, two-way, connection-based byte streams.  An out-of-band data transmission mechanism may be supported.
UDP协议使用 支持数据报(固定最大长度的无连接、不可靠消息)
SOCK_DGRAM      Supports datagrams (connectionless, unreliable messages of a fixed maximum length).第三个参数:protocol 指定协议,通常只有一个协议支持特定套接字类型,所以在这种情况下协议可以指定为零
返回值:成功返回一个文件描述符,失败返回-1

示例代码

// 1、创建套接字,打开网络文件
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0){std::cerr << "socket create errno:" << errno << std::endl;return 1; 
}

sockaddr结构

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同.

在这里插入图片描述

  • IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16 位端口号和32位IP地址.

  • IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容.

  • socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;
    在这里插入图片描述

注意:

在socket API中sockaddr和sockaddr_un都可以使用sockaddr_in类型表示,当我们传入sockaddr_in类型的结构体对象指针,接口会拿出前16位地址类型判断使struct sockaddr还是structaddr_un。在使用的时候需要强制转化成sockaddr_in.

这里可能会有小伙伴感觉奇怪,为啥不使用void*传入参数而是从新创建一个结构体sockaddr_in呢?这是因为当时的C语言还并不支持 void *语法,为了方便两种接口的统一就这样设计的

UDP绑定端口号

想要使用绑定端口号函数首先要先初始化填充sockaddr结构体对象,需要填充三个参数

#include <sys/socket.h>int bind(int socket, const struct sockaddr *address,socklen_t address_len);
第一个参数:socket      一个文件描述符,指定绑定的网络文件
第二个参数:address     一个结构体指针,用于指定协议类型
第三个参数:address_len ssize_t类型的重命名,用于指定address结构体对象的大小
返回值: 成功返回0,失败返回-1

查看address_in 类型的定义,编辑器用的是vscode,右击类型转到定义就可以查看了

struct sockaddr_in{__SOCKADDR_COMMON (sin_);in_port_t sin_port;			/* Port number.  */struct in_addr sin_addr;		/* Internet address.  *//* Pad to size of `struct sockaddr'.  */unsigned char sin_zero[sizeof (struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof (in_port_t) -sizeof (struct in_addr)];};struct in_addr{in_addr_t s_addr;};
// 2 、服务器绑定端口和ip(特殊处理)
struct sockaddr_in local;
local.sin_family = AF_INET;        //sockaddr 初始化1
//此处的端口号,是我们计算机上的变量,是主机序列
local.sin_port = htons(port); 	   //sockaddr 初始化2
//a.需要将人识别的点分十进制,字符串风格的IP地址,转换成4字节整数iP
//b.也要考虑大小端 
//云服务器不允许用户直接bind公网IP,另外,实际正常编写的时候也不会指明IP
//local.sin_addr.s_addr = inet_addr("43.2.2.2");
//INADDR_ANY: 如果你bind的是确定的IP(主机),意味着只有发到该IP主机上面的数据才会
//交给你的网络进程,但是一般的服务器右多个网卡,配置多个IP,我们需要的不是某个IP上的数据
//我们需要的是,所有发送到该主机,发送到该端口的数据
local.sin_addr.s_addr = INADDR_ANY;//sockaddr 初始化3
if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0){
std::cerr << "bind errno" << errno << std::endl;
return 2; 
}

UDP接收发送网络数据

UDP接受和发送网络数据一般使用这组接口。UDP使用的是数据报格式的数据传输,所以不可以使用字节流式接口

#include <sys/types.h>
#include <sys/socket.h>
// UDP发送网络数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
// UDP接受网络数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
recvfrom()
第一个参数: sockfd 网络文件描述符
第二个参数: buf 传输的数据
第三个参数: len 传输数据的大小是多少个字节
第四个参数: flags 设置为0
第五个参数: *dest_addr 输出型参数,是谁给我这个进程发送数据的
第六个参数: addrlen 输出型参数用于标记dest_addr的大小
返回值 成功返回0 失败返回-1sendto()
第一个参数: sockfd 网络文件描述符
第二个参数: buf 传输的数据
第三个参数: len 传输数据的大小是多少个字节
第四个参数: flags 设置为0
第五个参数: *dest_addr 我需要将这个数据发送给谁
第六个参数: addrlen 数用于标记dest_addr的大小
返回值 成功返回0 失败返回-1

示例代码

// 3、提供服务
bool quit = false;
#define NUM 1024
char buffer[NUM];
while (!quit){struct sockaddr_in peer;socklen_t len = sizeof(peer);ssize_t cnt = recvfrom(sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&peer, &len); //网络中只有数据报和字节流,不需要传送'\0'if (cnt > 0){buffer[cnt] = 0;std::cout << "client# " << buffer << std::endl;std::string echo_hello = "hello client";sendto(sock, echo_hello.c_str(), echo_hello.size(), 0, (struct sockaddr*)&peer, len);}
}
return 0;
}

简单的UDP网络程序

服务器代码

#include <iostream>
#include <string>
#include <cerrno>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>void Usage(std::string proc){std::cout << "Usage: " << proc << "port" << std::endl; 
}
int main(int argc, char* argv[]){if (argc != 2){Usage(argv[0]);return -1;}uint16_t port = atoi(argv[1]);// 1、创建套接字,打开网络文件int sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0){std::cerr << "socket create errno:" << errno << std::endl;return 1; }// 2 、服务器绑定端口和ip(特殊处理)struct sockaddr_in local;local.sin_family = AF_INET;//此处的端口号,是我们计算机上的变量,是主机序列local.sin_port = htons(port); //a.需要将人识别的点分十进制,字符串风格的IP地址,转换成4字节整数iP//b.也要考虑大小端 //云服务器不允许用户直接bind公网IP,另外,实际正常编写的时候也不会指明IP//local.sin_addr.s_addr = inet_addr("43.2.2.2");//INADDR_ANY: 如果你bind的是确定的IP(主机),意味着只有发到该IP主机上面的数据才会//交给你的网络进程,但是一般的服务器右多个网卡,配置多个IP,我们需要的不是某个IP上的数据//我们需要的是,所有发送到该主机,发送到该端口的数据local.sin_addr.s_addr = INADDR_ANY;if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0){std::cerr << "bind errno" << errno << std::endl;return 2; } // 3、提供服务bool quit = false;#define NUM 1024char buffer[NUM];while (!quit){struct sockaddr_in peer;socklen_t len = sizeof(peer);ssize_t cnt = recvfrom(sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&peer, &len);if (cnt > 0){buffer[cnt] = 0;std::cout << "client# " << buffer << std::endl;std::string echo_hello = "hello client";sendto(sock, echo_hello.c_str(), echo_hello.size(), 0, (struct sockaddr*)&peer, len);}}return 0;
}

客户端代码

#include <iostream>
#include <string>
#include <cerrno>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>void Usage(std::string proc){std::cout << "Usage:\n\t" << proc << " server_ip server_port" << std::endl;
}int main(int argc, char* argv[]){if (argc != 3) {Usage(argv[0]);return 3;}//1、创建套接字,打开网络文件int sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0){std::cerr << "socket error : " << errno << std::endl;return 1; }//2、客户端也必须显示的bind的吗?//a、首先,客户端必须也要有ip和port//b、但是,客户端不需要显示bind!一旦显示bind,就必须明确,client要和哪一个port关联//client指明端口号,在client一定存在吗??会不会已经被其他人绑定了呢??一旦port被占用则无法使用服务//server要求port必须明确,并且不变,但client只要有就可以!一般是OS自动给我们bind()//当client正常发送数据的时候,OS会自动给你bind,采用随机端口的方式,自动帮你匹配合适端口//2.使用服务while (true){std::string message;std::cout << "输入#";std::cin >> message;//a、你的数据从哪里来//b、你要发给谁sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(atoi(argv[2]));server.sin_addr.s_addr = inet_addr(argv[1]);sendto(sock, message.c_str(), message.length(), 0, (struct sockaddr*)&server, sizeof(server));struct sockaddr_in tmp;socklen_t len = sizeof(tmp);char buffer[1024];int cnt = recvfrom(sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&tmp, &len);if (cnt > 0){buffer[cnt] = 0;std::cout << "server echo#" << buffer << std::endl;}}return 0;
}

TCP协议实现网络通信

TCP创建socket文件描述符

客户端服务端都需要

//1.创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0){std::cerr << "socket create errno" << errno << std::endl;return 2;
}

TCP绑定端口号

服务端需要显示绑定,客户端OS自动绑定

//2.bind
uint16_t port = atoi(argv[2]);
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(port);
local.sin_family = AF_INET;if (bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0){std::cerr << "bind errno" << errno << std::endl;return 3;
}

TCP建立连接

服务端需要

// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog); //第二个参数传5即可

阅读文档

DESCRIPTION //描述
//listen函数所指的sockfd套接字标记为被动套接字,就是这个套接字将使用accept(2)标准接收过来的连接请求
listen() marks the socket referred to by sockfd as a passive socket, that is, as a socket that will be used to accept incoming connection requests using accept(2).The sockfd argument is a file descriptor that refers to a socket of type SOCK_STREAM or SOCK_SEQPACKET.//backlog参数定义sockfd的挂起连接队列可能增长的最大长度。如果连接请求在队列已满时到达客户端可能会收到带有ECONNREFUSED指示的错误,或者,如果底层协议支持重传,则可以忽略该请求,以便稍后重新尝试连接成功。The  backlog  argument defines the maximum length to which the queue of pending connections for sockfd may grow.  If a connection request arrives when the queue is full, theclient may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a  later  reattempt
at connection succeeds.

示例代码

//3.因为tcp是面向连接的,所以在通信之前必须要建立连接
//连接一定是有人主动建立(客户端),一定有人被动接收连接(服务器)
const int back_log = 5;
if (listen(sock, back_log) < 0){std::cerr << "listen error" << std::endl;return 4;
}

TCP接收请求

服务端需要

上文创建的套接字为监听套接字,用于与端口号绑定。accept()函数用于接收监听套接字获得到的请求,并与其建立连接,会返回一个新的文件描述符用于数据传输

// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);

阅读文档

accept()系统调用用于基于连接的套接字类型(SOCK_STREAM、SOCK_SEQPACKET)。它提取侦听套接字挂起连接队列中的第一个连接请求sockfd,创建一个新的连接套接字,并返回一个引用该套接字的新文件描述符。新创建的套接字未处于侦听状态。原始套接字sockfd不受此调用的影响。The  accept() system call is used with connection-based socket types (SOCK_STREAM, SOCK_SEQPACKET).  It extracts the first connection request on the queue of pending connec‐tions for the listening socket, sockfd, creates a new connected socket, and returns a new file descriptor referring to that socket.  The newly created socket is not  in  the
listening state.  The original socket sockfd is unaffected by this call.

示例代码

//accept for ( ; ; ){struct sockaddr_in peer;socklen_t len = sizeof(peer);int new_sock = accept(listen_sock, (struct sockaddr*)&peer, &len); //接收请求if (new_sock < 0){		//如果接收失败则跳过continue;   }//提供服务while (true){}}

TCP发起连接

客户端需要

struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_addr.s_addr = inet_addr(svr_ip.c_str());
server.sin_family = AF_INET;
server.sin_port = htons(svr_port);
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0){std::cerr << "connect errno" << errno << std::endl;return 3;
}

TCP接收发送网络数据

因为TCP协议使用字节流的流式传输格式,所以也可以使用read(), write(),recv(), send()等方法流式写入读取的方法进行接收和发送数据

ssize_t s = read(sock, buffer, sizeof(buffer) - 1);
if (s > 0){//将获取的内容当作字符串buffer[s] = 0;std::cout << "client# " << buffer << std::endl;std::string echo_string = ">>>server<<<";echo_string += buffer;echo_string += "...";write(sock, echo_string.c_str(), echo_string.size());
}

简单TCP网络程序

经过上面的学习,我们可以将示例代码进行拼接,很轻松就可以写出一个服务器和客户端

服务器代码

#include <iostream>
#include <cstring>
#include <cerrno>
#include <string>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>void Usage(std::string s){std::cout << "Usage :" << "\n\t" << s << " port " << std::endl;
}int main(int argc, char* argv[]){if (argc != 2){Usage(argv[0]);return 1;}//1.创建套接字int listen_sock = socket(AF_INET, SOCK_STREAM, 0);if (listen_sock < 0){std::cerr << "socket create errno" << errno << std::endl;return 2;}std::cout << "listen success" << std::endl;//2.binduint16_t port = atoi(argv[1]);struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_addr.s_addr = INADDR_ANY;local.sin_port = htons(port);local.sin_family = AF_INET;if (bind(listen_sock, (struct sockaddr*)&local, sizeof(local)) < 0){std::cerr << "bind errno" << errno << std::endl;return 3;}std::cout << "bind success" << std::endl;//3.因为tcp是面向连接的,所以在通信之前必须要建立连接//连接一定是有人主动建立(客户端),一定有人被动接收连接(服务器)const int back_log = 5;if (listen(listen_sock, back_log) < 0){std::cerr << "listen error" << std::endl;return 4;}//accept for ( ; ; ){struct sockaddr_in peer;socklen_t len = sizeof(peer);int new_sock = accept(listen_sock, (struct sockaddr*)&peer, &len);if (new_sock < 0){continue;   }std::cout << "get a link ..." << std::endl; //提供服务while (true){char buffer[1024];memset(buffer, 0, sizeof(buffer));ssize_t s = read(sock, buffer, sizeof(buffer) - 1);if (s > 0){//将获取的内容当作字符串buffer[s] = 0;std::cout << "client# " << buffer << std::endl;std::string echo_string = ">>>server<<<";echo_string += buffer;echo_string += "...";write(sock, echo_string.c_str(), echo_string.size());}else if (s == 0){std::cout << "client quit ..." << std::endl;break;}else {std::cerr << "read errno" << errno << std::endl;break;}}}
}

客户端代码

#include <iostream>
#include <stdlib.h>
#include <cerrno>
#include <cstring>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
void Usage(std::string s){std::cout << "Usage :" << "\n\t" << s << " server_ip server_port " << std::endl;
}
int main(int argc, char* argv[]){if (argc != 3){Usage(argv[0]);return 1;}std::string svr_ip = argv[1];uint16_t svr_port = atoi(argv[2]);int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock < 0){std::cerr << "socket errno" << errno << std::endl;return 2;} struct sockaddr_in server;memset(&server, 0, sizeof(server));server.sin_addr.s_addr = inet_addr(svr_ip.c_str());server.sin_family = AF_INET;server.sin_port = htons(svr_port);if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0){std::cerr << "connect errno" << errno << std::endl;return 3;}//进行正常的业务请求while (true){std::cout << "Please Enter# ";char buffer[1024];fgets(buffer, sizeof(buffer) - 1, stdin);write(sock, buffer, strlen(buffer));ssize_t s = read(sock, buffer, sizeof(buffer) - 1);if (s > 0){buffer[s] = 0;std::cout << "server echo# " << buffer << std::endl;}}
}

但是以上代码有一个非常明显的问题,那就是一个服务器在接收一个客户端的连接后为这个客户端提供服务,而主进程就死循环执行服务代码了,无法继续接收其他客户端的连接,导致我们的服务器在同一时刻只能服务一个客户端,接下来我们会使用操作系统的知识对服务器进行优化

多进程优化TCP服务器

我们可以让服务器主进程接收客户端的连接,然后创建子进程来为客户端提供服务。

方法一 在信号章节我们学过signal()函数,其可以自定义信号的处理方式

#include <signal.h>
signal(SIGCHLD, SIG_IGN); // 在Linux中父进程忽略子进程的SIGCHILD信号,子进程会自动退出释放资源

在子进程退出时会给父进程发送SIGCHILD信号,告诉父进程我推出了,如果我们让父进程忽略SIGCHILD信号,那么子进程就会自动退出并且释放资源,父进程就无需等待

方法二 让父进程进行waitpid(),子进程马上退出,让孙子进程执行服务,孙子进程会被操作系统领养

//child 
if (fork() > 0) exit(0);
close(listen_sock);
ServiceIO(new_sock); //提供服务
close(new_sock);
exit(0);

所以我们可以将提供的服务放在一个函数中供子进程调用

signal(SIGCHLD, SIG_IGN); // 在Linux中父进程忽略子进程的SIGCHILD信号,子进程会自动退出释放资源//accept for ( ; ; ){struct sockaddr_in peer;socklen_t len = sizeof(peer);int new_sock = accept(listen_sock, (struct sockaddr*)&peer, &len);if (new_sock < 0){continue;   }std::cout << "get a link ..." << std::endl; pid_t id = fork();if (id  < 0){continue;}else if (id == 0){//child if (fork() > 0) exit(0);close(listen_sock);ServiceIO(new_sock); //提供服务close(new_sock);exit(0);}else {//fatherclose(new_sock);}}

子进程会继承父进程的struct files_struct因为子进程只提供服务所以listen_sock是没有用的,可以将其关掉,对于父进程只用于监听接收请求,所以提供服务的new_sock传递给子进程后就没有用了,可以关闭,防止文件描述符泄露

多线程优化TCP服务器

创建线程

pthread_t tid;
int *pram = new int(new_sock);
pthread_create(&tid, nullptr, HandlerRequest, pram);

线程执行函数

void *HandlerRequest(void* args){pthread_detach(pthread_self());int sock = *(int*)args;delete (int*)args;ServiceIO(sock);   	//提供服务close(sock);
}

注意:该代码存在以下问题

a、创建线程、进程无上限

b、当客户连接来了,我们才给客户创建进程/线程

线程池优化TCP服务器

使用find()指令查找我们之前写过的线程池

[clx@VM-20-6-centos Lesson_Linux]$ ll
total 28
drwxrwxr-x 21 clx clx 4096 Aug  1 00:49 21_7_lesson
drwxrwxr-x 25 clx clx 4096 Aug 27 09:40 21_8_lesson
drwxrwxr-x 21 clx clx 4096 Oct 30 20:28 22_10_lesson
drwxrwxr-x 23 clx clx 4096 Nov 28 19:13 22_11_lesson
drwxrwxr-x  6 clx clx 4096 Dec 30 21:09 22_12_lesson
drwxrwxr-x 18 clx clx 4096 Sep 30 18:01 22_9_lesson
drwxrwxr-x  5 clx clx 4096 Jan 16 09:01 23_1_lesson
[clx@VM-20-6-centos Lesson_Linux]$ find . -name ThreadPool.hpp //查找线程池
./22_11_lesson/lesson_11_24/FirstProject/ThreadPool.hpp
./22_11_lesson/lesson_11_25/FirstProject/ThreadPool.hpp

创建服务套接字后将使用套接字创建一个任务,然后Push到线程池里就可以了

Task t(new_sock);
ThreadPool::GetInstance()->InitThreadPool();
ThreadPool::GetInstance()->PushTask(new_sock);

Task代码

#pragma once 
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>class Task{
public:Task() : sock(-1){};Task(int _sock) : sock(_sock){}void ProcessOn(){// while (true){char buffer[1024];memset(buffer, 0, sizeof(buffer));ssize_t s = read(sock, buffer, sizeof(buffer) - 1);if (s > 0){//将获取的内容当作字符串buffer[s] = 0;std::cout << "client# " << buffer << std::endl;std::string echo_string = ">>>server<<<";echo_string += buffer;echo_string += "...";write(sock, echo_string.c_str(), echo_string.size());}else if (s == 0){std::cout << "client quit ..." << std::endl;//break;}else {std::cerr << "read errno" << errno << std::endl;//break;}//}close(sock);}    void operator()(){ProcessOn();}
private:int sock;
};

线程池代码

#pragma once
#include <iostream>
#include <pthread.h>
#include <queue>
#include "Task.hpp"#define THREAD_NUM 6class ThreadPool
{
private:ThreadPool(int num = THREAD_NUM) : _pthread_num(num), _stop(false){pthread_mutex_init(&_lock, nullptr);pthread_cond_init(&_cond, nullptr);}public:~ThreadPool(){pthread_mutex_destroy(&_lock);pthread_cond_destroy(&_cond);}static void *ThreadRoutine(void *args);static ThreadPool *GetInstance();bool InitThreadPool();void PushTask(const Task &task);void PopTask(Task &task);void ThreadWait() { pthread_cond_wait(&_cond, &_lock); }void ThreadWakeUp() { pthread_cond_signal(&_cond); }void ThreadLock() { pthread_mutex_lock(&_lock); };void ThreadUnlock() { pthread_mutex_unlock(&_lock); };bool IsStop() { return _stop; }bool TaskQueueIsEmpty() { return _task_queue.empty(); }private:std::queue<Task> _task_queue;size_t _pthread_num;bool _stop;pthread_mutex_t _lock;pthread_cond_t _cond;static ThreadPool *_single_instance;
};
ThreadPool *ThreadPool::_single_instance = nullptr;ThreadPool *ThreadPool::GetInstance()
{static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;if (_single_instance == nullptr){pthread_mutex_lock(&mutex);_single_instance = new ThreadPool();_single_instance->InitThreadPool();pthread_mutex_unlock(&mutex);}return _single_instance;
}bool ThreadPool::InitThreadPool()
{pthread_t tid;for (size_t i = 0; i < _pthread_num; i++){int ret = pthread_create(&tid, nullptr, ThreadRoutine, (void *)this);if (ret != 0){std::cout << "pthread_create errno" << std::endl;return false;}}std::cout << "InitThreadPool success" << std::endl;return true;
}void *ThreadPool::ThreadRoutine(void *args)
{ThreadPool *tp = (ThreadPool *)args;while (true){Task task(0);tp->ThreadLock();while (tp->TaskQueueIsEmpty()){tp->ThreadWait();}tp->PopTask(task);tp->ThreadUnlock();task.ProcessOn();}
}void ThreadPool::PushTask(const Task &task)
{ThreadLock();_task_queue.push(task);ThreadWakeUp();ThreadUnlock();
}
void ThreadPool::PopTask(Task &task)
{task = _task_queue.front();_task_queue.pop();
}

socket编程总结

  • 如果不关闭不需要的文件描述符,会造成文件描述符泄露
  • 创建socket的过程,socket()本质是打开文件 – 仅仅有系统相关的内容
  • bind(), struct sockaddr_in -> ip, port 本质使用ip + port 和文件信息进行关联
  • listen(), 本质是设置该socket文件的状态,允许别人来连接我
  • accept(), 获取新链接到应用层,是以fd为代表的。当有很多链接连上我们的服务器的时候,OS中会存在大量链接。OS许哟啊管理这些建立好的链接,如何管理??先描述再阻止
  • 所谓的链接,在OS层面上本质就是一个描述链接的结构体(文件)
  • read/write,本质就是进行网络通信,但是对于用户来讲,相当于文件读写
  • close(fd)关闭文件 a.系统层面,释放曾经申请的文件资源,链接资源等 b.网络层面,通知对方,我的丽娜姐已经关闭了
  • connect(),本质就是发起连接,在系统层面,就是构建一个请求报文发送过去,在网络层面,发起TCP连接的三次握手
  • close(), client 和 server都需要执行,本质在网络层面,其实就是在进行第四次挥手

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hXnDEdo7-1673836199576)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230116101425614.png)]

TCP协议三次握手四次挥手

服务器初始化:

  • 调用socket, 创建文件描述符;

  • 调用bind, 将当前的文件描述符和ip/port绑定在一起; 如果这个端口已经被其他进程占用了, 就会bind失

败;

  • 调用listen, 声明当前这个文件描述符作为一个服务器的文件描述符, 为后面的accept做好准备;

  • 调用accecpt, 并阻塞, 等待客户端连接过来;

建立连接的过程:

  • 调用socket, 创建文件描述符;

  • 调用connect, 向服务器发起连接请求;

  • connect会发出SYN段并阻塞等待服务器应答; (第一次)

  • 服务器收到客户端的SYN, 会应答一个SYN-ACK段表示"同意建立连接"; (第二次)

  • 客户端收到SYN-ACK后会从connect()返回, 同时应答一个ACK段; (第三次)

这个建立连接的过程, 通常称为 三次握手;

数据传输的过程

  • 建立连接后,TCP协议提供全双工的通信服务; 所谓全双工的意思是, 在同一条连接中, 同一时刻, 通信双方可以同时写数据; 相对的概念叫做半双工, 同一条连接在同一时刻, 只能由一方来写数据;

  • 服务器从accept()返回后立刻调 用read(), 读socket就像读管道一样, 如果没有数据到达就阻塞等待;这时客户端调用write()发送请求给服务器, 服务器收到后从read()返回,对客户端的请求进行处理, 在此期间客户端调用read()阻塞等待服务器的应答;

  • 服务器调用write()将处理结果发回给客户端, 再次调用read()阻塞等待下一条请求;

  • 客户端收到后从read()返回, 发送下一条请求,如此循环下去;

断开连接的过程:
这个断开连接的过程, 通常称为四次挥手

  • 如果客户端没有更多的请求了, 就调用close()关闭连接, 客户端会向服务器发送FIN段(第一次);

  • 此时服务器收到FIN后, 会回应一个ACK, 同时read会返回0 (第二次);

  • read返回之后, 服务器就知道客户端关闭了连接, 也调用close关闭连接, 这个时候服务器会向客户端发送一个FIN; (第三次)

  • 客户端收到FIN, 再返回一个ACK给服务器; (第四次)

在学习 socket API 时需要注意应用程序和TCP协议层是如何交互的:

应用程序调用某个socket函数时TCP协议层完成什么动作,比如调用connect()会发出SYN段

应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的socket函数返回就表明TCP协议收到了某些字段,再比如read()返回0就表明收到了FIN段

学习路线规划

现在我们从零开始,通过系统调用接口(socket, bind, listen …)来编写应用层,在完善应用层的基础上之后我们会学习操作系统的传输层和网络层,还有网卡驱动中的数字链路层的原理以及设计
接请求;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4502733.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

用nodejs框架express做前后端接口转发的中间层

做这个的初衷还是公司升级整体架构&#xff0c;使前后端分离更加彻底&#xff0c;同时增加前端在项目中的权重&#xff0c; 目前开发中间件的主要目的有以下几点&#xff1a; 1.不在客户端暴露后端真实接口地址 2.如果接入第三方合作公司的接口&#xff0c;统一在中间层做整…...

mysql事务回滚是什么意思_Mysql事务提交及事务回滚是什么意思

本篇文章主要给大家介绍mysql事务提交及事务回滚的相关知识。事务可以说是一段sql 语句的批处理&#xff0c;但是这个批处理是一个atom(原子) &#xff0c;不可分割&#xff0c;要么都提交执行&#xff0c;要么回滚(rollback)都不执行。关于事务的详细定义介绍&#xff0c;我们…...

axios框架使用

axios框架使用axios基本使用axios推荐用法axios 官网 : http://www.axios-js.com/ axios是什么 &#xff1a; 一个js框架&#xff0c;用于发送ajax请求&#xff08;底层使用XMLHttpRequest&#xff09; axios基本使用 <body><button class"btn1">基本…...

少儿编程Scratch学习教程--Scratch介绍及参赛相关

之前写了几篇关于Scratch的使用文章。忽然想起&#xff0c;忘记介绍下Scratch了。 Scratch是一款由麻省理工学院&#xff08;MIT&#xff09; 设计开发的少儿编程工具。官方网址是麻省理工学院网站的一个分支。这个软件的开发团队称为“终身幼儿园团队”&#xff08;Lifelong …...

零基础自学Java,第一份工作5K,到现在月薪30k

12年开始从事Java工作&#xff0c;现在属于高级程序员那个级别吧&#xff01;现在看到各行各业的人都在转行学习java&#xff0c;想给大家一些学习建议和忠告。首先告诉你的是Java高薪职位&#xff0c;学出来后薪资起码五千起步&#xff0c;干了一年后薪资基本会翻倍到达一万。…...

2022爱分析·营销服务一体化实践报告

报告编委 特别鸣谢&#xff08;按拼音排序&#xff09; 报告摘要 随着互联网流量红利逐渐见顶&#xff0c;加之消费升级速度趋快&#xff0c;优质的客户体验逐渐成为企业的核心竞争力。提升客户体验&#xff0c;需要企业借助先进的技术工具将服务升级并贯穿于客户全旅程&…...

两个List取交集

List<int> a1 new List<int> { 1, 2, 3, 4, 5 };List<int> a2 new List<int> {3, 4, 5,6,7 };var a3 a1.Intersect(a2);foreach (var item in a3) {Console.WriteLine(item.ToString()); }...

java8 两个List集合取交集、并集、差集

public static void main(String[] args) { List<String> list1 new ArrayList<String>(); list1.add("1"); list1.add("2"); list1.add("3"); list1.add("5"); list1.add("6");...

NodeJS框架学习-Egg框架

第一步&#xff1a;下载安装nodejs 下载官方网址&#xff1a;https://nodejs.org/en/download/ 本人是windows系统所以如图选择&#xff1a; 下载安装十分方便&#xff0c;环境变量也自动配置完成。 第二步&#xff1a;eggjs环境搭配&#xff0c;创建运行项目 &#xff08;…...

详解如何使用python计算一只股票的最大回撤率?

详解如何使用python计算一只股票的最大回撤率&#xff1f; 一、什么是最大回撤率&#xff1f; 最大回撤率&#xff1a;在选定周期内任一历史时点往后推&#xff0c;产品净值走到最低点时的收益率回撤幅度的最大值。最大回撤用来描述买入产品后可能出现的最糟糕的情况。最大回…...

说说对测试培训的一些看法

目录 前言 为什么写&#xff1f; 测试培训到底值不值得参加 从培训内容分析 diss 自动化测试培训 diss 性能测试培训 diss 测试开发培训 目前测培训市场 怎么评判自己要不要报班&#xff1f; 怎么评判报哪个培训机构/个人&#xff1f; 我心目中理想的培训内容 再次聊…...

有符号整数的表示范围

结论 n比特有符号整数的表示范围为[−2^(n−1) ~ 2^(n−1)−1] 解释 1、符号位 首位为符号为&#xff0c;1为负&#xff0c;0为正&#xff1b; 2、对于八位整数为例 00000000到01111111&#xff0c;表示0到127。10000001到11111111&#xff0c;表示-1到-127。大家可以注意…...

tom邮箱的“随心邮”在微信并未即时通知的解决方案

1.进入“随心邮”微信公众号 2.点击对话框菜单的个人中心&#xff0c;选择邮箱设置 3.在邮箱设置的界面里选择“新邮件提醒”的选项中的“全部提醒” 4.这样设置之后即可即时在微信收发tom邮件...

第6章 线程通信

6.2.1 管道 管道是一个线性字节数组,类似文件,使用文件读写进行访问&#xff1b;在程序里面,创建管道需要使用popen()或者pipe(); 管道的一个重要特点是使用管道的两个线程之间必须存在某种关系, 例如,使用popen需要提供另一端进程的文件名,使用pipe的两个线程分别隶属于父子进…...

ubuntu判断是hdd sdd

cat /sys/block/sda/queue/rotational1    for hard disks and 0    for a SSD....

SpringSecurity单体应用

SpringSecurity单体应用 注&#xff1a;本文讲述的是Security在单体架构的应用&#xff0c;不支持集群跨域。另外&#xff0c;本文基于前后端不分离&#xff0c;使用的前端模板引擎是Thymeleaf。 一、导入Security依赖 第一个依赖是SpringBoot为Security提供的starter依赖&a…...

Android应用安全隐患现状,资源文件加密/安全防护进化史

前言 有安全数据显示&#xff0c;2014全年&#xff0c;Android用户感染恶意程序3.19亿人次&#xff0c;平均每天恶意程序感染量达到了87.5万人次。同时&#xff0c;Android应用被破解和盗版等事件也层出不穷。很明显&#xff0c;Android平台已经成为恶意程序和破解者攻击的众矢…...

linux下调节GPU的功率限制

您可以通过在应用程序运行时使用 nvidia-smi 监控 GPU 来确认是否正在发生这种情况。 nvidia-smi dmon 如果您希望调整功率上限&#xff0c;请按照以下步骤操作&#xff1a; 按如下方式确定当前、默认和最大功率限制&#xff1a; nvidia-smi -q | grep Power Limit 确保正在使…...

C语言整数运算符号问题

C语言整数运算 c语言整数特点 分为有符号和无符号有符号和无符号运算&#xff0c;会将有符号转换为无符号默认整数数字都是有符号的 例子 说明&#xff1a;在表达式中没有u或强制类型转换&#xff0c;会按照有符号来运算 关系表达式类型结果说明00U无符号100…0B00…0B-1&…...

读书笔记—《销售铁军》随记7

前情提要&#xff1a; 人到30岁&#xff0c;会面临一个比较大的转型&#xff0c;常言道“三十而立”&#xff0c;不仅仅是生活、精神上&#xff0c;还包括人生的目标和方向。30岁之前从实习到现在&#xff0c;从事了技术研发、系统运维、项目管理、部门管理、技术负责人、产品管…...

芯片培训的套路与Bug

近两年&#xff0c;芯片培训的广告蜂拥而至&#xff0c;揭露某些不靠谱培训的内容也越来越多。比如说&#xff0c;《光明日报》就在今年1月7日发表过《“上4个月网课拿25万年薪”&#xff0c;芯片培训这么神&#xff1f;》的报道。各家自媒体、Up主对“芯片培训骗局”的揭露提醒…...

​WinRAR 是一个强大的存档管理器

WinRAR是一个强大的存档管理器。它可以备份您的数据并减少电子邮件附件的大小&#xff0c;打开和解压从 Internet 下载的RAR、 ZIP和其他文件&#xff0c;创建 RAR 和 ZIP 文件格式的新档案。 企业和个人每天需要处理的数据量每年都呈指数级增长。对敏感信息保护、新政府法规、…...

iOS KeyChain 浅析以及应用(数据AES加密)附demo

一.iOS钥匙串KeyChain 解析根据苹果的介绍,iOS备中的Keychain是一个安全的存储容器&#xff0c;可以用来为不同应用保存敏感信息比如用户名&#xff0c;密码&#xff0c;网络密码&#xff0c;认证令牌。苹果自己用keychain来保存Wi-Fi网络密码&#xff0c;VPN凭证等等。它是一个…...

MySQL面试问题汇总(2022)

一、MySQL架构 锁 什么是锁&#xff1f; 当多个连接并发地存取MySQL数据时&#xff0c;在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据&#xff0c;破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的…...

整数反转(C语言)

题目&#xff1a;给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 这一题…...

两个不同对象的list要取交集(list转map的应用)

前提说明 当前有两个实体类&#xff0c;LinePort为航线港口中间表实体&#xff0c;存有到港时间&#xff0c;出港时间&#xff0c;航线id和港口id&#xff0c;Port为港口信息表&#xff0c;现在前端需要将两个查询到的实体信息list&#xff0c;List和List通过portId来进行对比…...

C++ Reference: Standard C++ Library reference: C Library: cstdio: fread

C官网参考链接&#xff1a;https://cplusplus.com/reference/cstdio/fread/ 函数 <cstdio> fread size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); 从流中读取数据块 从stream中读取count个元素的数组&#xff0c;每个元素的大小为size字节&am…...

MATLAB集合操作

MATLAB中包含多样的函数集合运算&#xff0c;如集&#xff0c;交集和测试组成员等。 下表显示了一些常用的设置操作&#xff1a; 函数描述intersect(A,B)设置两个数组的交集&#xff1b;返回A和B所共有的值。返回的值按排序顺序排列。intersect(A,B,rows)将A和B的每一行作为单…...

什么是机器翻译,主要有哪几种类型?

人类对机器翻译&#xff08;Machine Translation,MT&#xff09;系统的研究开发已经持续了 50多年。起初&#xff0c;机器翻译译系统主要是基于双语字典进行直接翻译&#xff0c;几乎没有句法结构分析。直到20世纪80年代&#xff0c;一 些机器翻译系统采用了两种方法&#xff1…...

瑞华吉瑞保重大疾病保险怎么样?好不好

瑞华保险公司推出了瑞华吉瑞保重大疾病保险&#xff0c;这是一款新规产品。 有不少朋友都问学姐&#xff0c;这款产品的优缺点有哪些&#xff1f;投保是不是合适&#xff1f; 接下来&#xff0c;学姐就专门的解析一下瑞华吉瑞保重大疾病保险这款产品&#xff01; 一、瑞华吉…...

c语言 整数符号,c语言有符号整数

c语言有符号整数: 有符号数与无符号数的介绍&#xff0c;缺失&#xff1a;c语言有符号整数3651/9理解有符号数和无符号数负数在计算机中如何表示呢&#xff1f;这一点&#xff0c;你可能听过两种不同的回答。一种是教科书&#xff0c;它会告诉你&#xff1a;计算机用“补码”表…...

计算机网络总复习

计算机网络复习一、计算机网络概述1、计算机网络组成与结构&#xff08;1&#xff09;资源子网&#xff1a;&#xff08;2&#xff09;通信子网&#xff1a;2、计算机网络的拓扑结构&#xff08;1&#xff09;总线型&#xff08;广播网络&#xff09;&#xff08;2&#xff09;…...

JavaScript应用:前端MD5加密

前端MD5加密 在前端页面&#xff0c;我们经常会使用表单来提交我们的数据&#xff0c;而表单的两种提交方式get和post都具有一定的安全隐患。get请求的的参数直接在请求行显示&#xff0c;安全隐患较大&#xff1b;post请求方式虽然相对get来说较为安全&#xff0c;其请求参数在…...

【Unity3D】快速上手 EasyAR

目录 一&#xff0c;AR技术 1.AR简介 2.AR特点 3.AR工作原理 二&#xff0c;EasyAR 插件 1.获取Key 2.EasyAR 插件下载和导入 三&#xff0c;快速上手 EasyAR 废话不多说上运行效果 一&#xff0c;AR技术 1.AR简介 AR&#xff08;Augmented Reality&#xff0c;增强现…...

springboot 项目自定义log日志文件提示系统找不到指定的文件

自己尝试搭建了一个springboot项目&#xff0c;自定义了log日志文件&#xff0c;启动后报错 Logging system failed to initialize using configuration from logback-spring.xml java.io.FileNotFoundException: E:\code_demo\xxxx\logback-spring.xml (系统找不到指定的文件…...

Windows访问控制 -- SID

Windows访问控制是一个比较大的题目&#xff0c;因此计划用一系列的文章简单谈一下这个。本篇是开篇&#xff0c;介绍SID。 Windows访问控制定义 Windows访问控制的含义可以参考MSDN的描述&#xff1a;Access control refers to security features that control who can acce…...

降级降薪去 Amazon ——左耳朵

作者&#xff1a;左耳朵&#xff0c;MegaEase 创始人。永远都会写代码的程序员。前亚马逊高级研发经理&#xff0c;阿里巴巴资深架构师&#xff0c;路透金融数据中心研发经理。19年软件开发相关工作经验&#xff0c;10年团队管理经验&#xff0c;对高性能&#xff0c;高可用性&…...

知名nodeJS框架Express作者宣布弃nodeJS投Go

知名 nodeJS 框架 Express 的作者 TJ Holowaychuk 在 Twitter 发推并链接了自己的一篇文章&#xff0c;宣布弃 nodeJS 投 Go。 他给出的理由是&#xff1a;Go 语言和 Rust、Julia 等都是众多的下一代语言之一&#xff0c;虽然不能说它是最好的语言&#xff0c;但已足够成熟和稳…...

matlab x为整数,关于matlab中用什么字符表示任意整数

matlab做除法,怎么取整数?方法一&#xff1a; floor(a/b);就是舍去小数点。 ceil(a/b)就是舍去小数点1的数。 方法二&#xff1a; fix(x)截尾取整 fix(x)不超过x的最大整数 ceil(x)大于x的最小整数 round(x)四舍五入取整 扩展资料&#xff1a; Matlab常用函数和命令 sqrt 平方…...

Development Studio

Previous DS-5 Downloads | ARM DS-5 Development Studio The latest version of ARM DS-5 Development Studio is 5.24. Downloads are available for Linux and Windows host operating systems. DS-5 for Windows DS-5 for Linux Windows - DS-5: 5.23.1 Download 64-bit...

《裸辞后,降薪找工作》

上回书说到&#xff0c;从加班变态的公司逃出来后&#xff0c;有点傻了&#xff0c; 因为简历很难看&#xff0c;毕竟工作不长算跳槽频繁&#xff0c;哪怕你很优秀&#xff0c;hr都不太敢接收你。 中间进行了几次面试&#xff0c;效果都不佳。自己的自信也被一次次的失败消耗&…...

Vue-Cli2 脚手架中webpack配置基础文件详解

一、引言 引言&#xff1a;为了提升自己&#xff0c;研究了一下如何使用Vue-cliwebpack搭建项目框架&#xff0c;在网上搜了很多资料&#xff0c;对此有了一定的了解&#xff0c;于是在此记录一下&#xff0c;方便自己以后查看。 二、创建 vue-cli是构建vue单页应用的脚手架…...

Gateway之过滤器

过滤器的作用&#xff1a;过滤器就是在请求的过程中&#xff0c;对请求和响应做一些手脚 生命周期&#xff1a;Pre Post 分类&#xff1a;局部过滤器&#xff08;作用在某一个路由上&#xff09; 全局过滤器&#xff08;作用在全部路由上&#xff09; 在Gateway中&#xff…...

Python培训包食宿

市职教中心招聘18人 97家企业招聘2000余个岗位 市职教中心 招聘劳务派遣18人 岗位如下 招聘公告全文 辛集市开拓劳务派遣有限公司 关于辛集市职业技术教育中心招聘劳务派遣人员的 公 告 为加强辛集市职业技术教育中心师资力量&#xff0c;根据《劳动合同法》、《劳务派…...

python简笔画绘制 数据驱动绘图恐龙_超萌超可爱的恐龙简笔画,简单几步就能学会哦!...

原标题&#xff1a;超萌超可爱的恐龙简笔画&#xff0c;简单几步就能学会哦&#xff01; 今天&#xff0c;给大家分享一组男孩子最喜欢的恐龙简笔画。本次我画的是恐龙世界中的恶魔龙。关于恶魔龙的知识&#xff0c;大家自行去科普吧&#xff0c;我就不过多介绍啦&#xff01;超…...

signature=b05c505286f606b32d69ab58ee3e7bf4,reduce-css-calc/yarn.lock at 0f6c532cf9dc52ac3cb23e143eaf

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.# yarn lockfile v1"ava/babel-preset-stage-4^1.0.0":version "1.1.0"resolved "https://registry.yarnpkg.com/ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz#ae6...

Pytorch模型自定义数据集训练流程

文章目录Pytorch模型自定义数据集训练流程1、任务描述2、导入各种需要用到的包3、分割数据集4、将数据转成pytorch标准的DataLoader输入格式5、导入预训练模型&#xff0c;并修改分类层6、开始模型训练7、利用训好的模型做预测Pytorch模型自定义数据集训练流程 我们以kaggle竞…...

【C++】C++基础知识(一)---基本概念

C基础知识&#xff08;一&#xff09;1. 输出“HelloWorld!”2. 添加注释3. 关键字4. 标识符5. 变量6. 常量1. 输出“HelloWorld!” 在visual studio中输出“HelloWorld!”。代码实现如下&#xff1a; #include <iostream> using namespace std;int main() {cout <&…...

有符号整数的移位操作(按其补码移位规则进行操作)

【知识点】 算法运行时&#xff0c;输入的整数默认情况下被计算机系统表示为有符号整数。有符号整数的二进制表示中&#xff0c;最高位为符号位&#xff08;正整数为0&#xff0c;负整数为1&#xff09;&#xff0c;这也是有符号整数名称的由来。有符号整数移位时&#xff0c;按…...

python 取两/多个list的交集

python 取两个/多个list的交集 Two List Input: lst1 [15, 9, 10, 56, 23, 78, 5, 4, 9] lst2 [9, 4, 5, 36, 47, 26, 10, 45, 87] Expected Output: [9,10,4,5]1、自定义def Method def intersection(lst1, lst2): lst3 [value for value in lst1 if value in lst2] ret…...

_Linux 进程信号-信号处理篇

文章目录前言捕捉信号1. 内核如何实现信号的捕捉2. sigaction代码验证可重入函数volatile(关键字)SIGCHLD信号实验一实验二前言 信号发送 信号处理 已经讲过&#xff0c;本章讲解信号处理最后一部分。 捕捉信号 信号捕捉过程图 经过信号捕捉过程图&#xff1a;我们知道信号…...

6 TCP与UDP

TCP&#xff1a;转发数据量较多 对可靠性要求比较高 流&#xff08;数据无间隔&#xff09;协议 &#xff08;顺序控制 重发控制 流量控制 拥塞控制&#xff09;&#xff08;http 通信必须使用 tcp&#xff09; UDP&#xff1a;高速传输和实时性有较高要求的通信或广播/多播通信…...

【数学建模美赛】2023数模美赛备赛指南

二月中旬要开始美赛了&#xff0c;应该是准备考研这一年的唯一一次正规比赛了&#xff0c;希望能好好完成&#xff0c;在博客边分享边准备。打算开一个新坑&#xff0c;好好准备一下。 文章目录报名事项赛题特点六道赛题特点A&BCDE&F竞赛攻略报名事项 官方网站 美赛官…...

PHP反弹shell

步骤详解&#xff1a; 前提&#xff1a; ①、PHPStudy开启相关服务。 ②、假设木马已上传至服务器且可以访问&#xff08;即执行代码才能反弹shell&#xff09;。 ③、攻击机器和受害服务器要处于同一网段。 1、划线为攻击机的IP端口。 2、攻击机监听自身端口4444&#xff0c;即…...

selenium学习----CSS selector

CSS Selector选择web页面的元素 CSS是用来对web页面进行渲染的&#xff0c;因此必然涉及到web页面上某一元素的选择&#xff0c;比如页面某些内容显示效果&#xff0c;可以讲 CSS Selector 语法 天生就是浏览器用来选择元素的&#xff0c;selenium自然就可以使用它用在自动化中…...

Qlikview连接Mysql数据源

Qlikview通过ODBC连接Mysql的步骤。 &#xff11;.安装Qlikview Qlikview安装包 2.安装mysqlconnectodbc ODBC安装包 下载该安装包后解压安装 一直next安装完成 3.打开ODBC 点击添加 选择 MySQL ODBC 8.0 Unicode Driver,点 完成 点 test 看是否连接成功 点 OK&#xff0…...

夜天之书 #30 Make More Time

个人参与开源社区会面临的一个巨大挑战是缺乏时间。不管是作为项目的维护者还是贡献者&#xff0c;要想参与一个开源项目并非易事。本文试图提供一种方式&#xff0c;帮助想要参与开源社区的个人找到需要的时间。项目的维护者也是贡献者&#xff0c;不过他们需要关注的范围很不…...

Android岗面试者注意:虚惊一场,差点痛失字节跳动offer

目录 算法合集 一.Hash 二.最小生成树算法 三. 最短路径算法 四. KMP 算法 面试专题合集 1、开启线程的三种方式&#xff1f; 2、run()和 start()方法区别 3、如何控制某个方法允许并发访问线程的个数&#xff1f; 4、在 Java 中 wait 和 seelp 方法的不同 5、谈谈 wa…...

android中字母导航和PinnedHeaderListView(listview头部固定)

市面上使用listview头部在顶部固定和字母导航的app是非常之多&#xff0c;今天自己也结合之前做的项目&#xff0c;整理了一个在listview中实现头部固定和字母快速定位导航的功能。 效果图如下&#xff1a; 上面效果图如果不对listview进一步封装&#xff0c;就android原生lis…...

直接拿来用!最火的iOS开源项目(二)

转自&#xff1a;http://www.admin10000.com/document/2446.html “每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数&#xff0c;iOS每一次的改变&#xff0c;总会引发iOS开源项目的演变&#xff0c;从iOS 1.x到如今的iO…...

python 实现维基百科六度分隔原理

在本篇文章中&#xff0c;我将创建一个项目来实现维基百科六度分隔理论的查找方法。也就说&#xff0c;我们要实现从埃里克&#xff0c;艾德尔的词条页面&#xff08;http://en.wikipedia.org/wiki/Eric_Idle&#xff09;开始&#xff0c;经过最少的链接点击次数找到凯文.贝肯的…...

超五成大学生期待月薪过万 中青报:大学生和用人单位不妨“双向奔赴”

杨鑫宇 来源&#xff1a;中国青年报 近日&#xff0c;一份社交平台发布的大中学生职业规划调查结果显示&#xff0c;38.5%的大中学生期待自己毕业能够拿到1-2万元月薪&#xff0c;14.8%的大中学生期待毕业月薪在3万元以上&#xff0c;两者合计超过五成。在#如何看待大学生期望…...

前360、百度42岁程序员,面试小厂,期望月薪1.6万就很满足

【文章来源微信公众号&#xff1a;每天学编程】 35岁考虑转行&#xff0c;然后35岁又成了一个新人&#xff0c;而外国可以做到60岁&#xff0c;啥也不说了&#xff0c;可能是觉得中年大叔油腻&#xff0c;不及小鲜肉便宜&#xff0c;唉&#xff0c;可叹市场更新换代太快&#…...

软件测试人员如何月薪过万、月薪过万的秘籍

一、前言 小伙伴们&#xff0c;我们今天来聊聊月薪过万这个话题&#xff0c;在现在这个百花齐放的职场里是个很流行的命题。 月薪过万对于行业大佬来说&#xff0c;可能是个不屑一顾的追求&#xff0c;但对于职场新人而言通常是个很实际的人生目标。那么对于新人而言&#xff…...

长沙计算机应届生工资水平,长沙毕业生期望的平均月薪是多少?答案在这里

原标题&#xff1a;长沙应届毕业生期待的平均月薪是多少?这里有答案为进一步提升公共就业服务质量&#xff0c;掌握全市高校毕业生就业需求&#xff0c;日前&#xff0c;长沙市人社局对全市6所高校的1418名应届高校毕业生以及360家招用应届毕业生较多的企业进行了问卷调查。据…...

毕业生或者新工作不久,如何填写期望月薪?

来自于以为网友的问题&#xff0c;我想有共性&#xff0c;就整理了一下和大家分享一下吧&#xff1a;问&#xff1a; 我明年就要毕业了~~~ 这期间一直在一家公司做JAVA程序员&#xff0c; 最近公司给我一份应聘的登记表&#xff0c;里面要填想在北京工作还是在郑州工作&#…...

佛系程序员的月薪五万指南

摘要&#xff1a; 大师&#xff1a;很简单&#xff0c;我这里有一份佛系月薪 5 万指南&#xff0c;我看你骨骼清奇、脑门光亮&#xff0c;一看就是将要大富大贵之人&#xff0c;这份指南可以助你快速实现小目标&#xff01; 程序员问大师…… 青年&#xff1a;大师&#xff0c…...

程序员:路人甲帮我找到月薪3万的工作

在刚结束的蚂蚁金服ATEC小程序挑战赛上&#xff0c;11岁的万海妍作为现场最年轻的选手&#xff0c;最终以仅落后1秒钟的成绩获得鼓励奖。蚂蚁金服董事长兼CEO井贤栋向她邀请&#xff1a;“支付宝的大门为你打开&#xff0c;欢迎今后加入&#xff01;” 很多人挤破脑袋想拿到的阿…...

python如何月薪4万_月薪 4 万人民币是一种怎样的感受?

坐标魔都&#xff0c;13年硕士毕业&#xff0c;工作6年吧&#xff0c;月收入5万&#xff0c;到手的话一年加上bonus大概50万不到。买房是买不起的&#xff0c;前几年快乐单身汉风格&#xff0c;有多少花多少&#xff0c;没有关注过房价一是当时的收入不允许&#xff0c;二是一直…...

不写期望薪资,还能有面试吗?

想必很多求职者都有这样一个困惑&#xff1a;简历上到底要不要写期望薪资&#xff1f;看完以下两方的观点&#xff0c;想必你就会有答案了。 反对方&#xff1a;简历上不该写明期望薪资 前程无忧网友“bfme”的观点&#xff1a;“简历里明确要求求职者写明期望薪资&#xff0…...

95年美女程序员用Vue高仿网易云音乐客户端,期望月薪12K,HR会给吗?

今天小编我是来给大家信心的&#xff0c;今天的博主是位妹子程序员&#xff0c;哈哈&#xff0c;你们的机会来了&#xff0c;这位博主自己用VUE全家桶做了一个网易云音乐&#xff0c;知道男同胞们自己也做不出来一个&#xff0c;哈哈&#xff0c;要练习的i自己速度拿代码练习下…...

程序员面试写了500行代码,期望月薪15K,面试官的回答绝了

今天小编我逛论坛&#xff0c;看到了一位大佬程序员面试&#xff0c;说是大佬只不过也是一个刚刚毕业的小伙子&#xff0c;北京&#xff0c;说是面试就写了500行代码拿到了15K月薪&#xff0c;小伙子刚开始还是不敢提这个工资的&#xff0c;但是最后还是鼓起勇气说了&#xff0…...

未明学院:各大城市应届生平均期望月薪最高1.3W!最佳雇主No.1叒是它

每年到这个时候&#xff0c;校园里又一批临近毕业的莘莘学子该为前途做出抉择了。 据教育部消息&#xff0c;2019届全国普通高校毕业生预计将达834万人&#xff0c;再创新高。 根据 58同城近日发布的《第十六届中国大学生最佳雇主调研综合报告》显示&#xff0c;今年六成以上…...

中间人介绍你进去这家公司 期望月薪

中间人介绍你进去这家公司 期望月薪 什么叫关系户&#xff0c;就是有中间人介绍你进去这家公司&#xff0c;其他都谈妥的情况下&#xff0c;期望月薪就是焦点。 1、如果你很菜&#xff0c;完全靠的中间人&#xff0c;那么就听天由命吧&#xff0c;对面说多少钱你就认了吧。 2…...

期望月薪中 写上你的保守价格

1、如果你确实迫切进这家公司&#xff0c;在期望月薪中 写上你的保守价格&#xff0c;大约的公式是当地工资的平均水平并上浮10–20%左右。切记一定要在投简历时 做全面功课。不要盲目任何一个细节。简历的任何一个细节都是需要做功课的&#xff0c;你写的越随意&#xff0c;用…...

[置顶] 程序员期望月薪那些事儿

我们在求职的时候&#xff0c;有个困惑就是用人单位一般不会主动开价&#xff0c;要你先说出自己的期望月薪&#xff0c;然后再面议。 现在明码标价的公司越来越少&#xff0c;其实越是明码标价的公司越说明里面的岗位级别、薪酬制度很完善&#xff0c;完善的背后说明制度很死&…...

95后毕业生期望月薪1.2万,竟然只有这个行业能满足!

每年到这个时候&#xff0c;校园里又一批临近毕业的莘莘学子该为前途做出选择了。据教育部消息&#xff0c;2019届全国普通高校毕业生预计将达834万人。同时&#xff0c;有数据显示&#xff0c;今年六成以上企业的校园招聘需求较去年有所上升。一、95后毕业生期望&#xff1a;薪…...

程序员期望月薪的那些事儿

我们在求职的时候&#xff0c;有个困惑就是用人单位一般不会主动开价&#xff0c;要你先说出自己的期望月薪&#xff0c;然后再面议。 现在明码标价的公司越来越少&#xff0c;其实越是明码标价的公司越说明里面的岗位级别、薪酬制度很完善&#xff0c;完善的背后说明制度很死&…...

程序员期望月薪那些事儿

我们在求职的时候&#xff0c;有个困惑就是用人单位一般不会主动开价&#xff0c;要你先说出自己的期望月薪&#xff0c;然后再面议。 现在明码标价的公司越来越少&#xff0c;其实越是明码标价的公司越说明里面的岗位级别、薪酬制度很完善&#xff0c;完善的背后说明制度很死&…...

HR面试问题-你的期望薪资是多少?

面试三大坑 1&#xff09;请问你的缺点是什么&#xff1f; 2&#xff09;请问你的离职原因是什么&#xff1f; 3&#xff09;请问您的期望工资是多少&#xff1f; 教你如何谈工资 一 太极拳法 工资是谈出来的吗&#xff1f; 现实情况如何&#xff1f; 现状是什么&#xff…...

2022大学生就业力调研:期望月薪降至6295元,首因是就业压力

应届生总是怀揣着理想和抱负走入社会&#xff0c;期待能趁着年轻做一番事业。不知道你曾经有没有这样的想法呢&#xff1f; 近日智联招聘发布《2022大学生就业力调研报告》&#xff0c;调研时间为3月中旬至4月中旬。 报告显示&#xff0c;受就业压力等因素影响&#xff0c;仅…...

为什么书呆子不受欢迎-《黑客与画家》

为什么书呆子不受欢迎&#xff1f; 是硅谷创业之父paul graham 的文集&#xff0c;主要介绍黑客即优秀程序员的爱好和动机&#xff0c;讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。书中的内容不但有助于了解计算机编程的…...

网络安全知识在线宣传电子版的传单制作!

要如何做好全面宣传网络安全知识&#xff1f;如何制作一个能在线宣传的安全知识传单&#xff1f;今天小编就教你使用这个在线工具乔拓云&#xff0c;在线就能制作一个网络安全知识传单&#xff0c;不仅能套用里面已经生成好的文案&#xff0c;还能自己修改编辑&#xff0c;一键…...

H5微传单的推广优势

微传单是一种手机端艺术创意的营销方式&#xff0c;做为店家推广的h5网页页面制做专用工具&#xff0c;它已然变成了一种网路营销的时髦手段。 微传单制作成功以后&#xff0c;点一下內容就可以让用户立即抵达店面、主题活动或商品网页页面&#xff0c;根据微信公众号、朋友圈、…...

5分钟就能做出漂亮的传单页面:电子传单制作发布平台Smore获170万美元种子轮投资

5分钟就能做出漂亮的传单页面&#xff1a;电子传单制作发布平台Smore获170万美元种子轮投资 Smore是一个单页电子传单制作发布平台&#xff0c;用户可以通过这个平台&#xff0c;很方便地制作出一张漂亮的多媒体传单&#xff0c;并可通过链接、代码或邮件发布到社交网络及其他社…...

python自动生成宣传单_python – Matplotlib boxplot只显示最大和最小传单

plt.boxplot()返回一个字典,其中键向量包含上部和下部传单作为line2d对象.您可以在绘制之前操纵它们&#xff1a;仅在matplotlib> 1.4.0上bp plt.boxplot(data, whis[5, 95], showfliersTrue)# Get a list of Line2D objects, representing a single line from the# minim…...

制作传单网站

http://cd.fkw.com/凡科网...

完美Vista专用版WinPE(迅雷下载)

由于Vista不支持一键还原、DOS工具箱等软件&#xff0c;所以如果不是双系统或没有可以引导到DOS的光盘、U盘&#xff0c;就无法Ghost备份Vista。而要安装其他的WinPE&#xff0c;又必须计算机上安装有Windows XP或2000才可以。有鉴于此&#xff0c;完美Vista特别制作了“WinPE完…...

操作系统的另类安装---如何抛开光盘安装系统

第一节&#xff1a;如何从硬盘中全新安装操作系统 本节目的&#xff1a;实现在无光驱、软驱、U盘&#xff0c;系统分区无论FAT或者NTFS格式下全新安装操作系统 &#xff0d;&#xff0d;&#xff0d;当光驱损坏、分区为NTFS的情况下安装系统的替代方法 第二节&#xff…...

硬盘安装FreeBSD8.0+GNOME桌面

说明&#xff1a;【#代表超级用户shell&#xff1b;>代表普通用户的tcsh&#xff0c;黑括号表示说明】 前提&#xff1a;XP已安装&#xff0c;能上网。 一、下载&#xff1a; 1、下载8.0-RC3-i386-bootonly.iso和8.0-RC3-i386-dvd1.iso两个文件&#xff1b; 2、下载中文字…...

Windows7 基本常见问题及解决方案之汇总

Windows7 基本常见问题及解决方案之汇总 以下为使用 Windows7 过程中遇到的一些常见问题以及相应的解决方法&#xff0c;供各位参考: 1.如何关闭UAC&#xff1f; 控制面板→用户帐户→更改用户账户控制设置→拖动选择 从不通知。 2.如何取消开机按 CTRLALTDEL 登陆&#xff1…...

Windows8安装使用初体会

昨日win8开发者预览版开放下载&#xff0c;第一时间下载刻盘&#xff0c;在单位的电脑上用虚拟机试了半天&#xff0c;无果&#xff0c;只有晚上回家在本子上试了。1、安装光盘3G左右&#xff0c;32位&#xff0c;安装很快&#xff0c;大约半小时左右就安完了。 2、界面相当于w…...

手把手教你用fdisk给硬盘分区

转自&#xff1a;http://www.51windows.net/hw/windows/tips/tip013.htm 要说我来教各位初级朋友学习用FDISK来给硬盘分区&#xff0c;倒不如说我在和大家共同学习&#xff0c;因为我也是在2月份来到洪恩论坛后通过请教如何安装多操作系统后才逐渐熟悉了FDISK的操作&#xff0c…...

什么样的离职原因是可以被接受的?

关于离职原因&#xff0c;我列出五点原则&#xff0c;相信只需几分钟&#xff0c;看完这篇回答&#xff0c;你以后在这个问题上就所向披靡了。 原则一&#xff1a;外交语言 跳槽的目的&#xff0c;对你来说应该是加薪、晋级、换行&#xff0c;理论上三者都占才好&#xff0c;…...

老员工辞职原因

1、员工的工作量过重&#xff0c;造成他们必须在晚上或周末加班。 2、公司不愿意在办公室杂务上&#xff0c;另外再花费雇用专人负责&#xff0c;以致专业工作者必须自行做影印等工作。 3、当员工可以在其他公司找到薪水高二至三成的工作时&#xff0c;公司却宣布暂时不帮员工…...

谈管理:员工的离职原因

员工的离职原因很多&#xff0c;只有两点最真实&#xff1a; 1、钱&#xff0c;没给到位&#xff1b; 2、心&#xff0c;委屈了。 这些归根到底就一条&#xff1a;干得不爽。 员工临走还费尽心思找靠谱的理由&#xff0c;就是为给你留面子&#xff0c;不想说穿你的管理有多烂、…...

离职原因体面表达方式

讲离职的体面方式 &#xff1a; 不要抱怨不要抱怨不要抱怨重要事情说三遍&#xff0c;减少一切负面的描述&#xff0c;要用客观的角度来描述。 1.实际原因&#xff1a;原单位收入匹配不上能力。 体面表述&#xff1a;我认为我自己已经具备了一定的积累&#xff0c;希望可以迈…...

【自学Python】Python合并字符串

Python合并字符串 Python合并字符串教程 在开发过程中&#xff0c;很多时候我们有合并 字符串 的需求&#xff0c;即把一个 元祖 或 列表 中包含的多个字符串连接成一个字符串。这个操作是 分割字符串 的逆操作。 在 Python 中&#xff0c;合并字符串我们使用 join() 函数。…...

豆瓣影视接口

https://movie.douban.com/j/search_subjects?typemovie&tag%E7%83%AD%E9%97%A8&sortrecommend&page_limit100&page_start0 其中的tags和sort可以参考https://movie.douban.com/explore#!typemovie&tag%E7%83%AD%E9%97%A8&sortrecommend&page_li…...

sougou影视导航菜单

http://bbs.blueidea.com/thread-2851302-1-1.html在看视频的时候&#xff0c;觉得这个导航挺不错&#xff0c;可以学习学习&#xff01;希望对大家有点用处。 首页 品牌展播 排行榜 VIP客户 创意专题 品牌活动 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti…...

hanlp 词频统计_数据挖掘:基于Spark+HanLP实现影视评论关键词抽取(1)

1. 背景近日项目要求基于爬取的影视评论信息&#xff0c;抽取影视的关键字信息。考虑到影视评论数据量较大&#xff0c;因此采用Spark处理框架。关键词提取的处理主要包含分词算法抽取两部分。目前分词工具包较为主流的&#xff0c;包括哈工大的LTP以及HanLP&#xff0c;而关键…...

爬虫实战7:豆瓣影视爬取

文章目录 前言一、页面解析二、代码展示 1.引入库2.主要代码展示总结前言 一、页面解析 第一步&#xff1a;本次爬取的内容是豆瓣下电影标签&#xff0c;涉及到的热门主要如下所示&#xff0c;爬取的字段主要有&#xff1a; [电影名,评分,上映时间,导演,编剧,演员1,演员2,演…...

点云离群点剔除算法(PCL源码有实现)

UTF8gbsn 基于概率的点云离群点剔除算法. 本算法的源码实现在PCL库中, 请搜索statistical_outlier_removal.hpp文件. 问题描述 假如我们有一个点云数据X{x1,x2,⋯,xN}X\{x_1, x_2, \cdots, x_N\}X{x1​,x2​,⋯,xN​}. 其中xix_ixi​ 是n维度空间中的点.那么问题是, 我们想剔…...

你简历不写精通吗,你说怎么把Bean塞到Spring容器?

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、前言 小傅哥&#xff0c;你是怎么学习的&#xff1f; 有很多初学编程或者码了几年CRUD砖的小伙伴问我&#xff0c;该怎么学…...

求最近点对

问题描述在 应 用 中&#xff0c;常 用 诸 如 点、圆 等 简 单 的 几 何 对 象 代 表 现 实 世 界 中 的实 体 。 在涉 及 这 些 几 何 对 象 的 问 题 中 &#xff0c;常 需 要 了 解 其 邻 域 中 其 他 几 何 对 象 的 信 息。例 如 &#xff0c;在 空 中 交 通 控 制 问 题 …...

CSS实现鼠标悬停经过图片由中心点逐渐放大效果

CSS实现鼠标悬停经过图片由中心点逐渐放大效果 前几天写了类似用JS实现的效果&#xff0c;但并不理想&#xff0c;后来发现一个网站也用了类似功能&#xff0c;由于它代码结构比较清晰&#xff0c;所以可以从中看出其实现的原理和作用的代码。不想之前在仿照腾讯科技数码首页类…...

《面筋:拿到美团点评和去哪儿网的offer》

《面筋&#xff1a;拿到美团点评和去哪儿网的offer》 前言 从9月25号下午面完百度之后&#xff0c;就结束了自己的找工作旅程。就这样浪了20来天&#xff0c;想想还是写篇面筋吧&#xff0c;可能会对学弟学妹有一点点帮助。 自我介绍 在写面筋之前&#xff0c;先说说我自己…...

FOC项目知识点总结四 | 从 PWM 到 SVPWM

参考资料与网站 《SVPWM分析、各个扇区详细计算以及Matlab仿真》 by michaelf手撕系列&#xff08;4&#xff09;&#xff1a;空间矢量调制&#xff08;SVPWM&#xff09; by 小猫钓鱼SVPWM算法原理及详解 by WuAiJiDian电控入门之三&#xff08;电机FOC&#xff0c;用svpwm让…...

如何判断点是否在某一多边形内

本篇博客给出一种如何判断三维点&#xff0c;也就是一个空间点是否在多边形&#xff08;三维空间的一个多边形&#xff09;内的方法。 一、在二维情况下&#xff0c;如何判断一个点在多边形内 参考链接&#xff1a;判断点是否在多边形内部 我这里使用python实现了文中的第二…...

计算空间点到平面的投影点坐标

已知空间平面S的中心点坐标O(x0,y0,z0)和法方向n⃗ (xs,ys,zs)&#xff0c;以及平面外一点P(xp,yp,zp)。求点P到平面S的投影点A的坐标。解&#xff1a; 设点A的坐标为(xA,yA,zA)∵已知点O和n⃗ ∴根据平面点法式方程有xs(x−xo)ys(y−yo)zs(z−zo)0∵点A经过面S∴xs(xA−xo)ys(…...

分贝毫瓦 dBm

分贝毫瓦(dBm&#xff0c;全写为“decibel relative to one milliwatt”)为一个指代功率的绝对值&#xff0c;而不同于dB只是一个相对值。 任意功率P(mW)与xdBm换算的公式如下&#xff1a; 以及 例如&#xff0c;1毫瓦(1 mW)换算成分贝毫瓦为0 dBm。1瓦特(1 Watt)换算成分贝毫…...

51单片机的分贝检测仪设计

硬件方案 分贝是由传感器把非电量转换为电量&#xff0c;传感器输出的是0-5伏的电压值且电压值稳定&#xff0c;外部干扰小等。因此&#xff0c;可以直接把传感器输出电压值经过A/D转换器转换得到数据送入单片机进行处理。此外&#xff0c;还需接入液晶显示&#xff0c;键盘设定…...

功率表达,分贝

比如A点功率为 x dBm Pa10 ^( x/10) mw 如A功率为 5 dBm&#xff0c;那么&#xff0c;Pa 10^0.5 ≈ 3.162 mw 毫瓦&#xff1b; 8dBm&#xff0c;Pa6.310mw 1mW0dBm &#xff0c; dBm<0,即功率小于1mW dBm>0,功率大于1mW B点功率为 y dBm Pb10 ^ (x/10) mw A比B大…...

分贝

声音的产生   声音是由物体的振动产生的&#xff0c;振动发声的物体叫声源。随着声源的不断振动&#xff0c;在传声介质中形成了疏密相间的波动&#xff0c;向远处传播&#xff0c;这种波动叫做声波。声波传入人耳时&#xff0c;鼓膜发生振动&#xff0c;人就听到了声音。如果…...

CEO、CFO、CMO...这些职位你都知道吗?

CXO是现代公司制度下的产物&#xff0c;是所有权与经营权相分离的一种制度表现形式。下面介绍下科技公司中常见的高管头衔。 CEO&#xff08;Chief Executive officer&#xff09;- 首席执行官CAO&#xff08;Chief Administrative Officer&#xff09;- 首席行政官  CFO&…...

大型互联网支付公司职位--朝阳

岗位职责&#xff1a; 1&#xff09;风控系统的开发和维护&#xff1b; 2&#xff09;风险运营系统&#xff0c;风控工具的开发和维护&#xff1b; 3&#xff09;独立完成需求的分析&#xff0c;以及系统的设计及实现。 4&#xff09;与各部门的沟通&#xff0c;系统上线等。 5…...

两大技巧教你轻松应对IB数学

同学想要在IB数学科取得好成绩&#xff0c;可以从两个方面来着手。 1.复习技巧第一个是复习技巧。这方面&#xff0c;同学要清楚知道自己读的课程&#xff0c;它的教学大纲&#xff08;Syllabus&#xff09;要求是什么&#xff0c;还有它背后想要同学达到什么样的目标。 IB数学…...

互联网公司相关职位

互联网公司相关职位 项目经理 主要和人打交道&#xff0c;需要协调各个方面的关系&#xff0c;保证项目进展顺利 产品经理 收集用户需求&#xff0c;完成产品雏形 设计原型图工具&#xff1a; Axure RP 8男生 女生 设计人员(UI设计师) 根据产品雏形&#xff0c;美化页面…...

公司职位简称表

首席品牌官【CBO】 chief brand officer 首席文化官【CCO】 Chief Cultural Officer 开发总监【CDO】 chief Development officer 首席执行官【CEO】 Chief Executive officer 首席财务官【CFO】 Chief finance officer 人事总监 【CHO】 Chief Human resource officer 首席知识…...

软件公司的岗位分布

** 软件公司的职能分布: ** 程序员&#xff1a; 要求&#xff1a;掌握基本的软件工程的思想&#xff0c;明白软件开发的基本流程&#xff0c;至少掌握一门以上的编程语言&#xff0c;一种数据库&#xff0c;能够根据系统分析文档进行基本应用程序的编写。具有项目开发经验。…...

Activity学习——安卓第二次作业

作业要求&#xff1a; 在第一个Activity通过两个EditText分别输入学号和姓名&#xff0c;然后通过数据传递&#xff0c;在第二个Activity上显示出刚才输入的学号和姓名。 布局要求用约束布局实现。 Activity的启动和结束 从当前页面跳到新页面&#xff0c;跳转代码如下&…...

python正则化

一、re模块简介聊到Python正则表达式的支持&#xff0c;首先肯定会想到re库&#xff0c;这是一个Python处理文本的标准库。标准库的意思表示这是一个Python内置模块&#xff0c;不需要额外下载&#xff0c;目前Python内置模块大概有300个。可以在这里查看Python所有的内置模块&…...

week13周报

一.动态规划走楼梯2难点&#xff1a;不能连续走三次两级台阶如何表示思路&#xff1a;可以用二维数组f[i][j],i表示当前台阶数&#xff0c;j表示已经连续走了j次二级台阶了转移方程&#xff1a;f[i2][j1]f[i2][j1]f[i][j] 当j&#xff01;2时&#xff0c;我们可以选择走二级台阶…...

Mybatis使用Oracle数据库主键自增

一、关于mysql和oracle主键自增 我们知道在mysql中主键设置为int类型&#xff0c;然后设置AUTO_INCREMENT&#xff0c;则在插入数据的时候mapper中的sql文件是可以不写主键这个字段&#xff0c;数据库就会自动补全一个自增的主键值&#xff0c;但是在oracle中没有AUTO_…...

音视频技术开发周刊 | 285

每周一期&#xff0c;纵览音视频技术领域的干货。新闻投稿&#xff1a;contributelivevideostack.com。GPT-4 Office全家桶发布谷歌前脚刚宣布AI工具整合进Workspace&#xff0c;微软后脚就急匆匆召开了发布会&#xff0c;人狠话不多地祭出了办公软件王炸——Microsoft 365 Cop…...

具备人脸识别功能的多目标在线实时行为检测(yolov5+deepsort+slowfast)

文章目录前言配置项人脸识别配置多目标行为检测配置人脸识别模块采集模块人脸存储模块识别模块目标行为检测模块非在线实时检测在线实时检测结合人脸识别总结前言 这里先声明一下本项目是基于https://github.com/wufan-tb/yolo_slowfast 做的一个二次开发&#xff0c;也就是进…...

你绝对不知道的 SpringBoot 的外部化配置特性!

作为 Java 程序员&#xff0c;相信大家都知道&#xff0c;我们日常的 SpringBoot 项目会有一个配置文件 application.properties 文件。 里面会配置很多参数&#xff0c;例如服务的端口等&#xff0c;这些都只是默认值&#xff0c;在不改变配置文件里面内容的情况下&#xff0c…...

《2023大型企业财务数智化白皮书》:大型企业财务数智化建设应用架构

2023年3月16日&#xff0c;用友在北京国家会计学院举办“智能会计价值财务”2023企业数智化财务创新峰会 北京站。会上&#xff0c;用友《大型企业财务数智化白皮书》重磅发布&#xff0c;其核心观点之一中强调&#xff0c;大型企业财务数智化建设应遵循“1-1-7”体系&#xff…...

JAVA进阶 —— 动态代理

目录 一、什么是动态代理&#xff1f; 二、如何为Java对象创建代理对象&#xff1f; 三、两种常见的动态代理方式 1. 基于接口的动态代理 2. 基于类的动态代理 一、什么是动态代理&#xff1f; 在原有代码上加入新的功能该如何操作呢&#xff1f; 我们可以采用 侵入式修改…...

TCP报文和UDP报文

TCP报文 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;用于在网络中传输数据。TCP报文段是TCP协议的基本单位&#xff0c;它主要由以下字段组成&#xff1a;20个字节 源端口号&#xff08;16 bits&#xff09;和目…...

【ChatGPT】教你搭建多任务模型

ChatGPT教你搭建多任务模型 You: tell me what’s your version of gpt ? ChatGPT: As an AI language model developed by OpenAI, I am based on the GPT (Generative Pretrained Transformer) architecture. However, my version is known as GPT-3.5, which is an updat…...

【微信小程序】-- 案例 - 自定义 tabBar(四十六)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

人工智能多模态方向学习笔记Attention and Tell

简介 Attention and Tell&#xff08;通常缩写为“Attn-Tell”&#xff09;是一种机器学习算法&#xff0c;用于自然语言处理任务&#xff0c;如文本摘要和问答。 该算法由两个主要组件组成&#xff1a;注意力机制和解码器。注意力机制用于识别输入序列的重要部分&#xff0c…...

ESP8266-NodeMCU开发板-------开发板介绍(1)

目录 认识ESP8266-NodeMCU开发板​编辑 GPIO编号与NodeMCU开发板引脚名的区别&#xff1a; ESP8266 GPIO编号与NodeMCU开发板引脚名的对应关系 可用引脚 电压电流限制 特殊引脚情况说明 上拉电阻/下拉电阻 模拟输入 通讯 认识ESP8266-NodeMCU开发板 初识NodeMCU开发板 (第1章-第…...

蓝桥杯算法全集之完全背包问题(动态规划算法)

一、概念定义有 N 种物品和一个容量是 V 的背包&#xff0c;每种物品都有无限件可用。第 i种物品的体积是 vi&#xff0c;价值是 wi。求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。输出最大价值。用下面这个图来分别动态规…...

Servlet:利用Response实现重定向及其与请求转发的区别与实例展示

目录 一、创建RedirectServlet类 二、注册Srevlet&#xff08;在web.xml中&#xff09; 三、重定向和请求转发的区别 四、重定向实例应用——登录界面 1、打开index.jsp设计登录页面 2、创建RequestTest类 3、注册servlet 4、在webapp文件夹下新建一个success.jsp文件 …...

leetcode 2111 使数组K递增的最少操作次数

给你一个下标从 0 开始包含 n 个正整数的数组 arr &#xff0c;和一个正整数 k 。 如果对于每个满足 k < i < n-1 的下标 i &#xff0c;都有 arr[i-k] < arr[i] &#xff0c;那么我们称 arr 是 K 递增 的。 比方说&#xff0c;arr [4, 1, 5, 2, 6, 2] 对于 k 2 是…...

(数字图像处理MATLAB+Python)第一章:绪论

文章目录一&#xff1a;图像的基本概念&#xff08;1&#xff09;视觉与图像A&#xff1a;视觉B&#xff1a;图像&#xff08;2&#xff09;图像的表示A&#xff1a;函数表示B&#xff1a;模拟图像C&#xff1a;数字图像二&#xff1a;数字图像处理&#xff08;1&#xff09;数…...

【3.20】BFS算法、操作系统进程管理(整理)、Java并发面试题

BFS BFS出现的常见场景是&#xff1a;让你在一幅「图」中找到从起点 start 到终点 target 的最近距离&#xff0c;这个例子听起来很枯燥&#xff0c;但是 BFS 算法问题其实都是在干这个事儿。 BFS框架&#xff1a; // 计算从起点 start 到终点 target 的最近距离 int BFS(No…...

【服务器数据恢复】使用碎片拼接方法恢复SQL Server数据库的数据恢复案例

服务器数据恢复环境&#xff1a; 某公司一台DELL服务器&#xff0c;作为WEB服务器使用&#xff0c;安装的Windows Server操作系统&#xff0c;配置了SQL Server数据库&#xff1b; 采用了Xen Server虚拟化系统&#xff1b; 底层是通过raid卡&#xff0c;用4块STAT硬盘搭建的RAI…...

VBA提高篇_ 31 VBA调用正则表达式_RegExp.Pattern/Global/Execute(s)/Replace(s,r)

文章目录1.VBScript处理正则的对象:2.创建对象: CreateObject("")3. 查找步骤RegExp.Pattern/Global/Execute(s)3.1 RegExp.Pattern--> 设置正则3.2 RegExp.Global--> 设置全局查找3.3 RegExp.Execute(s)--> 执行查找4.查找结果4.1 Matchs4.2 ()分组的高级应…...

基于BP神经网络的图像跟踪,基于BP神经网络的细胞追踪识别

目录 摘要 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络激活函数及公式 基于BP神经网络的细胞识别追踪 matab编程代码 效果 结果分析 展望 摘要 智能驾驶,智能出行是现代社会发展的趋势之一,其中,客量预测对智能出行至关重要,…...

day11-Python-函数

Python-函数 一.函数作用 """ 在实现某个功能对应的代码的时候&#xff0c;如果将实现功能对应的函数放到函数中&#xff0c;那么下一次再需要这个功能的时候&#xff0c;就可以不用再写这个功能对应的代码了&#xff0c; 而是直接调用这个功能对应的函数 &qu…...

总线(六)SPI通信协议介绍

文章目录SPI背景知识SPI特征SPI总线的物理层SPI标准协议SPI背景知识 SPI&#xff08;Serial Peripheral interface&#xff09;是串行外设接口&#xff0c;是一种高速、全双工、同步的通信总线。是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI特征 1、全双工串行通信&a…...

国产化替代浪潮下,企业该如何保障电子邮件安全?

电子邮件&#xff0c;是日常工作到会经常用到的联系方式。但也正因为此&#xff0c;邮件攻击也成了网络攻击的主要手段之一&#xff0c;特别是带有恶意病毒、网页木马程序、特制木马程序以及利用软件漏洞的邮件木马在互联网上泛滥成灾&#xff0c;邮件安全已经成为一个安全领域…...

ChatGPT能够改变时代吗?一点点思考

都知道ChatGPT的出现对整个世界产生了剧烈的影响&#xff0c;前不久出的ChatGPT4更是在ChatGPT3.5的基础上展现了更强的功能。比如说同一个问题&#xff0c;ChatGPT3.5还是乱答的&#xff0c;ChatGPT4已经能给出正确解了。当然这只能说明技术是进步的。 虽然如此&#xff0c;很…...

​十四届蓝桥杯青少组选拔赛Python_2023.03.12​

十四届蓝桥杯青少组选拔赛Python_2023.03.12 未完 待更新...... T4. 编程实现: 假设果园中有N(1<=N<=100)种水果,猴子想要采摘一些水果带回家,但猴子采摘水果的总重量不能超过W(1<=W<=1000). 已知每种水果的最大采摘数量Ni(1<=Ni<=100)、每种水…...

桌面出现白色图标的恢复办法

前几天装了一个软件&#xff0c;在桌面生成了快捷方式&#xff0c;用着用着这个图标突然变成了白色的&#xff0c;如下图所示。 这对有强迫症的人来说是难以接受的&#xff0c;所以就在网上找了很多解决办法&#xff0c;本来觉得重启电脑会解决&#xff0c;但是也没能够&#…...

1052 Linked List Sorting PAT甲级真题

A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the structure...

RK3588平台开发系列讲解(NPU篇)NPU调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、日志等级二、NPU 支持查询设置项沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起来看一下NPU的调试方法。 一、日志等级 NPU 的运行库会根据开发板上的系统环境变量输出一些日志信息或者生成…...

SpringMVC框架详解(学习总结)

目录 什么是MVC SpringMVC概述 SpringMVC常见开发方式 SpringMVC执行流程 SpringMVC核心组件介绍 快速构建Spring MVC程序 SpringMVC参数绑定 SpringMVC跳转方式 SpringMVC处理json请求和响应 SpringMVC静态资源处理 SpringMVC操作session和cookie SpringMVC拦截器 …...

Java 基于 JAVE 库 实现 视频转音频的批量转换

文章目录 Java 基于 JAVE 库 实现 视频转音频的批量转换Maven:方案一:代码优化:方案二:示例代码:代码优化:结语Java 基于 JAVE 库 实现 视频转音频的批量转换 实现视频转音频的功能需要使用到一个第三方的 Java 库,叫做 JAVE。JAVE 是一个开源的 Java 库,提供了视频和音频转换…...

为何在 node 项目中使用固定版本号,而不使用 ~、^?

以语雀 文档为准 使用 ~、^ 时吃过亏希望版本号掌握在自己手里&#xff0c;作者自己升级&#xff08;跟随官方进行升级&#xff0c;就算麻烦作者&#xff0c;也不想麻烦使用者&#xff09;虽然 pnpm 很好用&#xff0c;但是不希望在项目中用到&#xff08;临时性解决问题可以选…...

Blazor JWT登录退出、身份控制、定时检测账户管理示例项目

本示例项目为.Net Core 7.04 Blazor Server 版本。功能&#xff1a;适合企业内部的账户分发&#xff08;非开放公众注册&#xff09;的App。1、身份控制&#xff1a;分发账户为初始密码&#xff0c;使用初始密码登录后必须修改密码才能使用相应身份的功能&#xff1b;根据身份提…...

聊一聊java程序中的换换符

常见的换行符Java程序中的换行符一般使用“\n”表示&#xff0c;它是一个转义字符&#xff0c;表示换行符。根据操作系统的不同&#xff0c;换行符的实际表示可能不同&#xff1a;在Windows系统中&#xff0c;换行符由两个字符“\r\n”表示&#xff0c;即回车符和换行符。在Uni…...

【Hive基础】-- 常见面试题目

一、请描述一下数据倾斜,并提供解决方案?  定义:由于数据分布不均匀,导致大量数据集中到一点,造成数据热点。现象是100个 task, 有一个运行了 1个小时,其他99个只有 10分钟。本质是数据量太大。原因:key 分布不均匀、sql倾斜join、建表时类型有问题算子:count、dist…...

VNC 远程登录树莓派 zero 2w

就两步 开启树莓派的 VNC server在电脑上安装 VNC viewer sudo raspi-config哇&#xff0c;竟然能在终端进入GUI交互 到此就成功开启树莓派的 VNC server 了 在电脑上安装 VNC viewer https://www.realvnc.com/en/connect/download/viewer/ 挺好&#xff0c;比单独再给树莓派配…...

如何巧妙应用JMeter的Dummy Sampler

很少人知道Dummy Sampler这个采样器(扩展插件里带的),也不知道它的妙用。Dummy Sampler 可以比较方便地模拟测试场景,自定义Request Data和Response Data,在学习测试脚本编写的过程中非常有用。另外如果巧妙应用它,可以在开发人员出接口文档后(接口还没实现)就可以同步…...

Elasticsearch 设置最低安全性

Elasticsearch 设置最低安全性 您启用 Elasticsearch 安全功能&#xff0c;然后为内置用户创建密码。您可以稍后添加更多用户&#xff0c;但使用内置用户可以简化为集群启用安全性的过程。 最小安全场景对于 生产模式集群是不够的。如果您的集群有多个节点&#xff0c;您必须…...

leetcode:66:加一

给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输入&#xff1a;digits…...

DirectX12(D3D12)基础教程(二十一)—— PBR:IBL 的数学原理(5/5)镜面反射积分项2及光照合成

这里写目录标题3.5.4、根据 Epic 近似假设进一步拆分积分项为两部分之积3.5.5、镜面反射预过滤积分贴图的重要性采样实现3.5.6、菲涅尔近似项 FSchlickF_{Schlick}FSchlick​ 中菲涅尔常数 F0F_0F0​ 的分离3.5.7、预积分 BRDF-LUT贴图3.6、最终光照合成4、总结5、参考资料3.5.…...

本科课程【移动互联网应用开发(Android开发)】实验3 - Activity及数据存储

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。 如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never let it rest, until good is better, and better best. 近期会把自己本科阶段的一些课程设计、实验报…...

一口一口吃掉yolov8(2)

前面介绍了训练的第一个部分&#xff0c;也是大部分人在网上找得到的文章&#xff0c;但是后面2个部分应该是网上没有的资料了&#xff0c;希望大家喜欢。 0.数据 我的数据是一些栈板&#xff0c;主要是检测栈板的空洞&#xff0c;识别出空洞的位置和偏转角度。原图如下 我的…...

springboot静态资源解析失效处理

继承WebMvcConfigurationSupport导致默认配置失效问题描述问题分析解决问题方式1:WebMvcConfigurationSupport补充静态资源【不推荐】方式2:改写mvc自定义配置实现【推荐】总结问题描述 我们开发了一个基于SpringBoot的工具(starter封装)&#xff0c;可以提供通用的功能和管理…...

kafka-manager配置及安装Kerberos(Ambari-HDP)认证

目录 一、概述 二、环境 三、部署kafka-manager 3.1下载 3.2 配置修改 3.3kafka开启JMX 3.4启动CMAK 3.5登录 3.6添加kafka cluster配置 3.7 问题 3.8Topic和Broker信息查看 3.9Topic创建 一、概述 为了简化开发者和服务工程师维护Kafka集群的工作&#xff0c;yaho…...

【手把手教程】MacOS 安装Multipass一款更轻量级的虚拟机 保姆级安装教程

【手把手教程】MacOS 安装Multipass轻量级虚拟机 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助请帮我点一个Star~ 文章目录 【手把手教程】MacOS …...

C - Candy Machine 二分

传送门 题意 JB非常喜欢糖果。 有一天&#xff0c;他发现了一台糖果机&#xff0c;里面有 N里面有糖果。看完机器的说明书后&#xff0c;他知道他可以选择一个子集 N糖果。每颗糖果都有一个甜味价值。JB 选择子集后&#xff0c;假设所选糖果的平均甜度值为 X&#xff0c;所有甜…...

一起来学5G终端射频标准(EVM均衡器频谱平坦度-2)

上一篇一起来学5G终端射频标准&#xff08;EVM均衡器频谱平坦度-1&#xff09;中的测试图例&#xff0c;这里补一下&#xff1a; 01 — EVM均衡器系数的计算 由上图红框可知&#xff0c;结果由四部分组成&#xff0c;那么这四个结果是如何计算的呢&#xff1f;我们曾在一起来学…...

火遍全网的chatGPT怎么使用

类别 描述 学术论文 它可以写各种类型的学术论文&#xff0c;包括科技论文、文学论文、社科论文等。它可以帮助你进行研究、分析、组织思路并编写出符合学术标准的论文。 创意写作 它可以写小说、故事、剧本、诗歌等创意性的文学作品&#xff0c;能够在描述情节和角色方面…...

Selenium:找不到对应的网页元素?常见的一些坑

目录 1. 用Xpath查找数据时无法直接获取节点属性 2. 使用了WebDriverWait以后仍然无法找到元素 2.1. 分辨率原因 2.2. 需要滚动页面 2.3. 由于其他元素的遮挡 1. 用Xpath查找数据时无法直接获取节点属性 通常在我们使用xpath时&#xff0c;可以使用class的方式直接获取节…...

Linux的诞生过程

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…...

arcpy基础篇(6)-制图脚本

arcpy.mapping模块可以实现地图制图的自动化&#xff0c;它的具体功能包括管理地图文档、数据框架、图层文件以及上述元素中的数据。此外&#xff0c;还可用于地图自动化打印和输出。 1.地图文档 地图文档&#xff08;MXD&#xff09;在磁盘中的后缀名是.mxd。ArcPy制图模块可…...

基于RBF神经网络的机械臂运动控制算法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在信号处理、模式识别等系统中,多层前馈网络是应用较为广泛的模型。但是大部分基于反向传播的多层前馈网络的学习算法必须基于某…...

Android原生集成友盟SDK

2021.09记录&#xff0c;2023发布&#xff0c;如有不对&#xff0c;还请包含。发晚了 Android原生集成友盟SDK 版本&#xff1a; Android Studio 4.2.1 &#xff08;以下简称AS&#xff09; UMeng 9.4.0 &#xff08;2021.06.24当天用的版本&#xff09; 参考文档&am…...

Thread的小补丁

Thread小补丁线程状态NewRunnableWaitingTimed_waitingBlocked线程安全线程的抢占式执行同时对同一个变量进行修改指令重排序操作不是原子的解决方案万恶之源优化我们自己的代码Synchronized和Volatile上一篇博客中,我们简单介绍了线程Thread的一些知识,一些基本的使用,但是单单…...

复数的实部虚部与幅值相角之间的转换及python代码实现

一、复数定义 复数 zabizabizabi 的实部为 aaa&#xff0c;虚部为 bbb。复数的模长 ∣z∣|z|∣z∣ 定义为 ∣z∣a2b2|z|\sqrt{a^2b^2}∣z∣a2b2​&#xff0c;即复数在复平面上的长度。复数与正实轴之间的夹角 θ\thetaθ 称为辐角。 二、实部虚部转换为模长幅角 公式 从实…...

从一致性/debias角度考虑推荐优化问题(排序部分 四 《参数的一致性》)

在排序工作中&#xff0c;我们也经常遇到不同的一致性需求&#xff0c;关于排序一致性&#xff0c;我们往往需要考虑几个方面&#xff1a;《样本的差异》&#xff0c;《特征的差异》&#xff0c;《模型参数差异》&#xff0c;《目标差异》&#xff0c;《场景融合的差异》。当然…...

状态机引擎选型

状态机引擎选型 概念 有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在电商场景(订单、物流、售后)、社交(IM消息投递)、分布式集群管理(分布式计算平台任务编排)等场景都有大规…...

怎么压缩图片大小到50kb以下?照片怎么压缩到50kb?

随着现在摄影设备的升级&#xff0c;我们拍摄的许多照片都比较大&#xff0c;有时候在上传使用的时候&#xff0c;都会因为被限制大小无法上传&#xff0c;这时候就需要用到图片压缩指定大小&#xff08;https://www.yasuotu.com/imagesize&#xff09;工具&#xff0c;去将压缩…...

如何实现用pillow库来实现给图片加滤镜?

使用Pillow库可以非常容易地给图片加滤镜。Pillow库是Python图像处理的一个强大库&#xff0c;提供了多种滤镜效果&#xff0c;如模糊、边缘检测、色彩增强等。 下面是使用Pillow库实现给图片加滤镜的简单步骤&#xff1a; 安装Pillow库&#xff1a;首先需要安装Pillow库。可…...