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

面试问题回忆

(1)查看端口 lsof -i:8080  /  netstat 

lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件
netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。netstat 查看端口占用语法格式:netstat -tunlp | grep 端口号
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名

(2)C++ string 底层实现方式

 C++标准库中string的三种底层实现方式_c++ string底层实现_Yol_2626的博客-CSDN博客

三种方式深拷贝、写时复制、段字符串优先。

(3)线程模型

三种线程模型:

一对一模型:直接使用API或者系统调用,优点是用户线程和内核线程一致,但是由于内核线程数量有限,所以会限制用户线程数量,并且内核线程的切换上下文的切换开销大,导致用户线程执行效率下降。

多对一模型:一个内核线程对应多个用户线程,线程间的切换有用户代码进行,优点是多对一速度快,缺点是如果一个用户线程阻塞,其他的线程无法执行,另外一个好处是用户线程没有限制。

多对多模型:结合了一对一和多对一的优点。

(3)用C++实现String类(没写出来,哎,应该用vector写,会简单一点,而不是用指针写)

 以下代码来源C++ STL String底层实现分析_517 pacifikal的博客-CSDN博客

 进行了一点修改。

#ifndef __MYSTRING_H__
#define __MYSTRING_H__#include <assert.h>
#include <memory.h>
#include <iostream>using namespace std;class MyString {
public:MyString():m_size(0), m_ptr(nullptr),m_capacity(0) {}MyString(const MyString& s) {m_ptr = new char[s.m_size+1];strcpy(m_ptr, s.m_ptr);m_size = s.m_size;m_capacity = s.m_capacity;}MyString(const char* s):m_ptr(new char[strlen(s)+1]),m_size(0),m_capacity(0) {strcpy(m_ptr, s);m_size = strlen(s);m_capacity = m_size;}// 赋值运算符MyString& operator=(const MyString& str) {// 此时对象自己的对象已经存在,直接进行赋值strcpy(m_ptr, str.m_ptr);m_size = strlen(str.m_ptr);m_capacity = strlen(str.m_ptr);return *this;}const char& operator[] (size_t index) const {assert(index < m_size);return m_ptr[index];}MyString& operator+=(const char& c) {this->push_back(c);return *this;}MyString& operator+=(const char* str) {this->append(str);return *this;}MyString& operator+=(const MyString& str) {this->append(str.m_ptr);return *this;}// 方法size_t strlen (const char* str) {size_t length = 0;if (str == nullptr) return 0;while (*str++ != '\0') length++;return length;}char* strcpy(char* strDest, const char* strSrc) {assert((strDest != nullptr) && (strSrc != nullptr));char* addr = strDest;while ((*strDest++ = *strSrc++) != '\0');return addr;}void reserve(size_t newCapacity) {if (newCapacity > m_capacity) {char* str = new char[newCapacity + 1];for (int i = 0; i < m_size; i++) {str[i] = m_ptr[i];}delete[] m_ptr;m_ptr = str;m_capacity = newCapacity;}}void resize(size_t newSize) {if (newSize > m_capacity) {reserve(newSize);}if (newSize > m_size) {memset(m_ptr+m_size, '\0', newSize-m_size);}m_size = newSize;m_ptr[m_size] = '\0';}void push_back(const char& c) {int newCapacity;if (m_size == m_capacity) {if (m_capacity == 0) {newCapacity = 32;} else {newCapacity = m_capacity * 2;}reserve(newCapacity);}m_ptr[m_size] = c;m_size++;m_ptr[m_size] = '\0';}size_t size() {return m_size;}size_t capacity() {return m_capacity;}void append(const char* str) {int newLength = strlen(str);if (newLength+m_size > m_capacity) {reserve(newLength + m_size);}for (int i = 0; i <= newLength; i++) {m_ptr[m_size+i] = str[i];}// 下面这句似乎可以不要m_ptr[newLength+m_size] = '\0';m_size += newLength;}void insert(size_t position, const char& c) {assert(position <= m_size);if (m_size == m_capacity) {size_t newCapacity;if (m_capacity == 0) {newCapacity = 32;} else {newCapacity = m_capacity * 2;}reserve(newCapacity);}size_t endPosition = m_size;while (endPosition-position) {m_ptr[endPosition] = m_ptr[endPosition-1];--endPosition;}m_ptr[endPosition] = c;m_ptr[++m_size] = '\0';}void insert(size_t position, const char* str) {int len = m_size + strlen(str);if (len > m_capacity) {reserve(len);}for (int i = position; i < strlen(str) + position; i++) {m_ptr[i] = str[i-position];}m_ptr[m_size] = '\0';}void erase(size_t position, size_t length) {assert(position < m_size && position >= 0);if (position + length >= m_size) {m_ptr[position] = '\0';m_size = position;return;}size_t start = position + length;while (start <= m_size) {m_ptr[position++] = m_ptr[start++];}m_size = position-1;}size_t find(const char& c, size_t position = 0) {assert(position < m_size);while (position < m_size) {if (m_ptr[position] == c) {return position;}position++;}return -1;}char* strstr(char* src, char* substr) {assert(src != nullptr && substr != nullptr);unsigned int size = strlen(src);for (int i = 0; i < size; i++, ++src) {char* p = src;for (char* q = substr;;++p,++q) {if (q == '\0'){return src;} else {break;}}}return nullptr;}size_t find(char* str, size_t position=0) {assert(position < m_size);char* s = strstr(m_ptr+position, str);if (s) {return s-m_ptr;}return -1;}// 迭代器typedef char* iterator;typedef const char* const_iterator;iterator begin() {return m_ptr;}iterator end() {return m_ptr + m_size;}const_iterator begin() const {return m_ptr;}const_iterator end() const {return m_ptr + m_size;}friend ostream& operator<<(ostream& out, const MyString& str);friend istream& operator>>(istream& in, MyString& str);~MyString() {if (m_ptr) {delete[] m_ptr;m_ptr = nullptr;m_size = 0;m_capacity = 0;}}
private:size_t m_size;size_t m_capacity;char* m_ptr;
};ostream& operator<<(ostream& out, const MyString& str) {// for (auto it = str.begin(); it != str.end(); it++) {//     out << *it;// }// out << endl;// return out;for (int i = 0; i < str.m_size; i++) {out << str[i];}out << endl;return out;
}istream& operator>>(istream& in, MyString& str) {char ch;str.resize(0);str.m_size = str.m_capacity = 0;while ((ch=getchar())!=EOF) {if (ch=='\n') {return in;}str+=ch;}return in;
}#endif 

(4)导入表是什么?

记录了动态库的函数、以及库的路径

(5)PE、ELP文件有什么内容。

(6)stdcall,cdecl,fastcall,thiscall,naked call

C++:__stdcall详解 - 瘋子朱磊 - 博客园 (cnblogs.com)

(7)C++14, C++17, C++20新特性

(8)读写锁,线程创建方式

(9)lambda函数的底层如何实现。

编译器实现lambda表达式分为以下几个步骤:(参考C++进阶(八) :Lambda 表达式及底层实现原理【详解】_c++ lambda表达式原理_贺二公子的博客-CSDN博客)

  1. 创建 lambda匿名类,实现构造函数,使用 lambda 表达式的函数体重载 operator()(所以 lambda 表达式 也叫匿名函数对象)
  2. 创建 lambda 对象
  3. 通过对象调用 operator()

 所以编译器将 lambda 表达式翻译后的代码:

class lambda_xxxx
{
private:int a;int b;
public:lambda_xxxx(int _a, int _b) :a(_a), b(_b){}bool operator()(int x, int y) throw(){return a + b > x + y;}
};
void LambdaDemo()
{int a = 1;int b = 2;lambda_xxxx lambda = lambda_xxxx(a, b);bool ret = lambda.operator()(3, 4);
}
  1. lambda 表达式中的捕获列表,对应 lambda_xxxx 类的 private 成员
  2. lambda 表达式中的形参列表,对应 lambda_xxxx 类成员函数 operator() 的形参列表
  3. lambda 表达式中的 mutable,表明 lambda_xxxx 类成员函数 operator() 的是否具有常属性 const,即是否是 常成员函数
  4. lambda 表达式中的返回类型,对应 lambda_xxxx 类成员函数 operator() 的返回类型
  5. lambda 表达式中的函数体,对应 lambda_xxxx 类成员函数 operator() 的函数体

(10)weak_ptr 如何使用

(11)虚析构函数如何实现释放子类的内存空间的。

(12)输入一个n和一个字符串,求组成的最小的新的字符串,使得原来的字符串至少出现n次,例如:n = 4, s = aaa ,则组成字符串为aaaaaa,输入n=2,s=abccab,则组成的字符串为abccabccab,(这里面主要是涉及到求next数组,利用s最后一个next数组的值,往后进行拓展)

#include <iostream>
#include <string>
#include <vector>
using namespace std;int main() {int n;while (cin >> n) { // 注意 while 处理多个 casestring s;cin >> s;if (n==1) {cout << s << endl;} else {vector<int> next;next.push_back(0);for (int i = 1, j = 0; i < s.size(); i++) {while(j>0 && s[j]!=s[i]) {j = next[j-1];}if (s[j] == s[i]) {j++;}next.push_back(j);}n--;string s1 = s;while (n) {int start = next.back();// 每次添加的是原字符串从start之后的字符串s += s1.substr(start);n--;}cout << s << endl;}}
}

(13)输入数字t,接下来2*t行,每行一个字符串分别为S,T(只含有小写字母) ,一次操作为将S的最后一个字符串放到最开始,问是否可以经过若干次操作,将S变为T。例如:S=kyoto,T=tokyo,输出为Yes

#include <iostream>
#include <string>
using namespace std;int main() {int t;while (cin >> t) { // 注意 while 处理多个 casestring s1, s2;for (int i = 0; i < t; i++) {cin >> s1;cin >> s2;int len = s1.size();bool flag = false;for (int i = 0; i < len; i++) {string str1 = "";str1 += s1[len-1];string str2 =  s1.substr(0, len-1);str2 = str1 + str2;cout << str1 << "-" << str2 << endl;string str = s1 + s2;if (str2.compare(s2) == 0) {cout << "Yes" << endl;flag = true;break;}s1 = str2;}if (!flag) {cout << "No" << endl;}}}
}

(14)给定一个数组,含有n个元素,k表示要调出k个区间,t表示区间和为t的倍数。求k个区间和的最大值。例如:【2,3,5,2】k=3, t = 2, 区间[1,3] 和为10,题目忘了

下面是超时的算法

#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;static bool cmp(vector<int>& a, vector<int>& b) {return a[2] < b[2];
}// priority_queue<int, vector<vector<int>>, cmp> q;
priority_queue<int, vector<int>, greater<int>>q;
map<string, int> mp;
void backtrace(vector<int>& nums, int start, vector<int> path, int t, int k) {if (path.size() == 2) {int part_sum = nums[path[1]] - nums[path[0]-1];string state = to_string(path[0]) + "-" + to_string(path[1]);if (!mp[state]) {if (part_sum%t == 0) {if (q.size() < k) {q.push(part_sum);} else if (q.top() < part_sum) {q.pop();q.push(part_sum);}// cout << path[0] << " " << path[1] << " " << part_sum << endl;mp[state]++;}}return;}for (int i = start; i <= nums.size(); i++) {path.push_back(i);backtrace(nums, i+1, path, t, k);path.pop_back();backtrace(nums, i+1, path, t, k);}
}int main() {int n, k, t;while (cin >> n >> k >> t) { // 注意 while 处理多个 casevector<int> nums(n+1);for (int i = 1; i <= n; i++) {int temp;cin >> temp;nums[i] = temp + nums[i-1];}vector<int> path;backtrace(nums, 1, path, t);int sum = 0;while (k--) {sum += q.top();q.pop();}cout << sum << endl;}return 0;
}

(15)给出n,m,k分别表示男生人数,女生人数,需要选出的总人数,其中至少选择2名女生和3名男生,问有多少种不同的选择方法,结果用1000000007取模。(富途科技)

#include <iostream>
using namespace std;
long getSum(int n, int k) {long t1 = 1;long t2 = 1;for (int i = 1; i <= k; i++) {t1 = t1 * i;t2 = t2 * (n-i+1);}return t2 / t1;
}int main() {int n, m, k;while (cin >> n >> m >> k) { // 注意 while 处理多个 caseint ans = 0;bool first = true;long girl_sum, man_sum;for (int i = 2; i <= m; i++) {int man = k - i;if (man < 3) {break;}if (man > n) continue;girl_sum = getSum(m, i);man_sum = getSum(n, man);ans += (girl_sum * man_sum);ans %= (1000000007);} cout << ans << endl;}
}

(16)VPN原理

(17)https为什么能够被抓包,http1,http2, http3区别

参考连接为什么如此安全的https协议却仍然可以被抓包呢?_guolin的博客-CSDN博客

 写一篇最好懂的HTTPS讲解_郭霖 https_guolin的博客-CSDN博客

(18)Socket是哪一层的协议,如果缺失会怎么样?

(19)蜜罐技术

(20)TCP为什么需要三次握手、四次挥手

(21)https过程

(22)一个数组,找到数组中每个元素下一个比他大的数字、当为最后一个元素的时候,它的下一个为数组的第一个元素,如果不存在比它大的数字,则为-1;

面试过程中用的双重for循环。面试官说性能低下。

#include <vector>
#include <iostream>
#include <stack>
using namespace std;vector<int> nextGetgreaternums(vector<int>& nums) {int len = nums.size();vector<int> ans(2*len);// 先将数组进行拓展for (int i = 0; i < len-1; i++) {nums.push_back(nums[i]);}int left = 0, right = 1;stack<int> stk;stk.push(0);while (right < nums.size()) {if (stk.size() && nums[right] > nums[stk.top()]){// 找到一个比栈顶元素大的ans[stk.top()]  = nums[right];stk.pop();} else {stk.push(right);right++;}}while(stk.size()) {ans[stk.top()] = -1;stk.pop();}ans.resize(len);return ans;
}int main() {vector<int> nums{2,1,2,4,3};vector<int> ans = nextGetgreaternums(nums);for (int i = 0; i < ans.size(); i++) {cout << ans[i] << " ";}system("pause");return 0;
}

(23)lambda函数

#include <iostream>
using namespace std;int main()
{int a=9;auto fun1=[=]{return a+1;};auto fun2=[&]{return a+1;};cout<<"fun1:"<<fun1()<<endl;cout<<"fun2:"<<fun2()<<endl;++a;cout<<"++a执行之后的值"<<endl;cout<<"fun1:"<<fun1()<<endl;cout<<"fun2:"<<fun2()<<endl;return 0;
}标准输出:
fun1:10
fun2:10
++a执行之后的值
fun1:10
fun2:11

这个题答错了,第二次func1执行时,还是会输出10,因为已经通过值捕获对类进行了成员变量的初始化,后期再输出的时候,不会重新捕获变量,而是使用之前初始化时候的值。

相关文章:

面试问题回忆

&#xff08;1&#xff09;查看端口 lsof -i:8080 / netstat lsof -i:8080&#xff1a;查看8080端口占用 lsof abc.txt&#xff1a;显示开启文件abc.txt的进程 lsof -c abc&#xff1a;显示abc进程现在打开的文件 lsof -c -p 1234&#xff1a;列出进程号为1234的进程所打开…...

更多场景、更多选择,Milvus 新消息队列 NATS 了解一下

在 Milvus 的云原生架构中&#xff0c;消息队列&#xff08;Log Broker&#xff09;可谓任重道远&#xff0c;它不仅要具备流式数据持久性、支持 TT 同步、事件通知等能力&#xff0c;还要确保工作节点从系统崩溃中恢复时增量数据的完整性。 在 Milvus 的架构中&#xff0c;一切…...

如何通过python实现一个web自动化测试框架?

要实现一个web自动化测试框架&#xff0c;可以使用Python中的Selenium库&#xff0c;它是最流行的Web应用程序测试框架之一。以下是一个基本的PythonSelenium测试框架的示例&#xff1a; 1、安装Selenium 在终端中输入以下命令&#xff0c;使用 pip 安装 Selenium&#xff1a…...

Linux —— 信号阻塞

目录 一&#xff0c;信号内核表示 sigset_t sigprocmask sigpending 二&#xff0c;捕捉信号 sigaction 三&#xff0c;可重入函数 四&#xff0c;volatile 五&#xff0c;SIGCHLD 信号常见概念 实际执行信号的处理动作&#xff0c;称为信号递达Delivery&#xff1b;信…...

【【萌新编写riscV之计算机体系结构之CPU 总二】】

萌新编写riscV之计算机体系结构之CPU 总二&#xff08;我水平太差总结不到位&#xff09; 在学习完软件是如何使用之后 我们接下来要面对的问题是 整个程序是如何运转的这一基本逻辑 中央处理器(central processing unit&#xff0c;CPU)的任务就是负责提取程序指令&#xff0…...

error:03000086:digital envelope routines::initialization error

项目背景 前端vue项目启动突然报错error:03000086:digital envelope routines::initialization error 我用的开发工具是vscode&#xff0c;node版本是v18.17.0 前端项目版本如下↓ 具体报错如下↓ 报错原因 node版本过高 解决方法 1输入命令 $env:NODE_OPTIONS"--op…...

暴涨130万粉仅用3个月,一招转型成B站热门UP主

- 导语 起号难、找不到内容方向、没流量、没粉丝等等运营困境环绕在创作者之间&#xff0c;近期&#xff0c;有黑马UP主短时间内就在B站涨粉百万&#xff0c;飞升成为热门UP主&#xff0c;以下&#xff0c;飞瓜数据&#xff08;B站版&#xff09;剖析黑马UP主运营技巧&#xf…...

【Linus】vim的使用:命令模式、底行模式、插入模式、视图模式、替换模式的常用操作介绍

目录 注意&#xff1a;以下操作前提是要确保你输入法是英文模式 一、进入和退出各个模式的方法 1.命令模式 2.底行模式 3.插入模式 4.视图模式 5.替换模式 二、在命令模式中一些常用的操作 1.移动光标 2.删除文字 3.复制 4.替换 5.撤销上一次操作 6.更改 7.跳至指…...

leetcode第362场周赛补题

8029. 与车相交的点 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;差分数组 class Solution { public:int numberOfPoints(vector<vector<int>>& nums) {int diff[102] {}; for(auto p : nums)//差分{diff[p[0]] ;diff[p[1] 1] -- ;}int res …...

SpringMvc 之crud增删改查应用

目录 1.创建项目 2.配置文件 2.1pom.xml文件 2.2 web.xml文件 2.3 spring-context.xml 2.4 spring-mvc.xml 2.5 spring-MyBatis.xml 2.6 jdbc.properties 数据库 2.7 generatorConfig.xml 2.8 日志文件log4j2 3.后台代码 3.1 pageBean.java 3.2切面类 3.3 biz层…...

【业务功能109】微服务-springcloud-springboot-Skywalking-链路追踪-监控

Skywalking skywalking是一个apm系统&#xff0c;包含监控&#xff0c;追踪&#xff0c;并拥有故障诊断能力的 分布式系统 一、Skywalking介绍 1.什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品&#xff0c;它同时吸收了Zipkin /Pinpoint …...

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3架构升级

架构升级 GPU 支持 早在 Milvus 1.x 版本,我们就曾经支持过 GPU,但在 2.x 版本中由于切换成了分布式架构,同时出于对于成本方面的考虑,暂时未加入 GPU 支持。在 Milvus 2.0 发布后的一年多时间里,Milvus 社区对 GPU 的呼声越来越高,再加上 NVIDIA 工程师的大力配合——为…...

Flutter中实现交互式Webview的方法

前言&#xff1a; Flutter是一款强大的跨平台移动应用开发框架&#xff0c;而Webview则是在应用中展示Web内容的重要组件。本文将介绍如何在Flutter应用中实现交互式的Webview&#xff0c;以便为用户提供更加丰富的内容和功能。 1. 引入webview_flutter插件 要在Flutter应用中…...

【Java Web】用Redis优化登陆模块

使用Redis存储验证码 验证码需要频繁访问和封信&#xff0c;对性能要求高&#xff1b;验证码不需要永久保存&#xff0c;通常在很短时间内失效&#xff1b;分布式部署&#xff0c;存在Session共享问题&#xff1b; 使用Redis存储登陆凭证 处理每次请求时&#xff0c;都要查询用…...

华为云云耀云服务器L实例评测|docker私有仓库部署手册

【软件安装版本】【集群安装&#xff08;是&#xff09;&#xff08;否&#xff09;】 版本号 文档编写 文档审核 创建日期 修改日期 1.0 jzg jzg 2023.9.13 一. 部署规划与架构 1. 规划&#xff1a;&#xff08;集群&#xff1a;网络规划&…...

JAVA-3DES对称加解密工具(不依赖第三方库)

import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;public class EncryptUtil {// 密钥public static final String ENCR…...

基于Matlab卡尔曼滤波的IMU和GPS组合导航数据融合(附上源码+数据)

本文介绍了如何使用Matlab实现惯性测量单元&#xff08;IMU&#xff09;和全球定位系统&#xff08;GPS&#xff09;组合导航数据融合的卡尔曼滤波算法。通过将IMU和GPS的测量数据进行融合&#xff0c;可以提高导航系统的精度和鲁棒性。我们将详细介绍卡尔曼滤波的原理和实现步…...

net自动排课系统完整源码(适合智慧校园)

目录 1 net自动排课系统完整源码(适合智慧校园) 1.1 后台管理admin 1.1.1 菜单 1.1.2 教学计划 net自动排课系统完整源码(适合智慧校园) 后台管理admin<%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&...

Matlab匿名函数教程

Matlab匿名函数是一种方便、简洁的函数定义方式&#xff0c;可以在不使用函数文件的情况下&#xff0c;直接在命令行或脚本中定义函数。本文将介绍Matlab匿名函数的基本语法和用法。 匿名函数的基本语法如下&#xff1a; function_handle (input_variables) expression其中&…...

【Vue】一文让你进入Vue的大门

Vue简介 官网 ● 英文官网 ● 中文官网 介绍与描述 Vue历史 Vue 是一套用来动态构建用户界面的渐进式JS框架 构建用户界面&#xff1a;把数据通过某种办法变成用户界面 渐进式&#xff1a;Vue可以自底向上逐层的应用&#xff0c;简单应用只需要一个轻量小巧的核心库&#xff0c…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...