Vue-2.nodejs的介绍和安装
nodejs简介
► 创建 Node.js 应用:package.json
-
首先,创建一个新文件夹以便于容纳需要的所有文件,并且在此其中创建一个 package.json 文件,描述你应用程序以及需要的依赖:
-
配合着你的 package.json 请运行 npm install。如果你使用的 npm 是版本 5 或者之后的版本,这会自动生成一个 package-lock.json 文件,它将一起被拷贝进入你的 Docker 镜像中。
{"name": "docker_web_app","version": "1.0.0","description": "Node.js on Docker","author": "First Last <first.last@example.com>","main": "server.js","scripts": {"start": "node server.js"},"dependencies": {"express": "^4.18.2"}
}
► Node.js项目入口:server.js(可以自定义命名)
- 使用 node server.js 运行程序,访问 http://localhost:3000,你就会看到一个消息,写着“Hello World”。
const http = require('http');const hostname = '127.0.0.1';
const port = 3000;const server = http.createServer((req, res) => {res.statusCode = 200;res.setHeader('Content-Type', 'text/plain');res.end('Hello World');
});server.listen(port, hostname, () => {console.log(`Server running at http://${hostname}:${port}/`);
});
nodejs的安全问题
► 请使用 Buffer.from()/Buffer.alloc()
- Buffer() 和 new Buffer() 构造函数对于有安全顾虑的人而言是不推荐使用的。请使用新的方法 Buffer.alloc(),Buffer.allocUnsafe() 或者是 Buffer.from() 构造函数。
► ESLint 规则(推荐)
ESLint 规则不使用缓存构造函数或 node/ 未废除的 Api 也会寻找到使用 Buffer() 废弃的函数。 这些规则预先已经包含了。
使用内存堆剖析器
► 时间轴的分配
在 Chrome 中连接开发工具实例,然后:
- 选择 memory 选项卡
- 选择 Allocation instrumentation timeline
- 开始剖析
► 采样内存堆剖析器信息
在 Chrome 中连接开发工具的实例,然后:
- 选择 memory 选项卡
- 选择 Allocation sampling
- 开始剖析
阻塞对比非阻塞一览
► 阻塞
- 阻塞 是指在 Node.js 程序中,其它 JavaScript 语句的执行,必须等待一个非 JavaScript 操作完成。这是因为当
阻塞
发生时,事件循环无法继续运行 JavaScript。在 Node.js 标准库中使用libuv
的同步方法是最常用的阻塞
操作。原生模块中也有阻塞
方法。
► 非阻塞
- 在 Node.js 标准库中的所有 I/O 方法都提供异步版本,
非阻塞
,并且接受回调函数。某些方法也有对应的阻塞
版本,名字以Sync
结尾。
► 代码比较
同步示例
看上去比异步示例
简单些,但是有一个缺陷:第二行
语句会 阻塞 其它 JavaScript 语句的执行直到整个文件全部读取完毕,也就是moreWork()在同步示例中要等待执行
,而在异步示例不需要等待
- 同步
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read
console.log(data);
moreWork(); // 在 console.log 之后执行
- 异步
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {if (err) throw err;console.log(data);
});
moreWork(); // 在 console.log 之前执行
► 并发和吞吐量
-
在 Node.js 中 JavaScript 的执行是单线程的
,因此并发性是指事件循环
在完成其他工作后执行 JavaScript回调函数
的能力。任何预期以并行方式运行的代码必须让事件循环
能够在非 JavaScript 操作
(比如 I/O )执行的同时继续运行 -
让我们思考这样一种情况:每个对 Web 服务器的请求需要 50 毫秒完成,而那 50 毫秒中的 45 毫秒是可以异步执行的数据库 I/O。选择
非阻塞
异步操作可以释放每个请求的 45 毫秒来处理其它请求。仅仅是选择使用非阻塞
方法而不是 阻塞 方法,就能造成并发的显著差异。 -
事件循环不同于许多其他语言的模型,其它语言创建额外线程来处理并发工作。
► 混合阻塞和非阻塞代码的危险
- 处理 I/O 时应该避免一些模式。我们来看一个例子:
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {if (err) throw err;console.log(data);
});
fs.unlinkSync('/file.md');
- 在以上的例子中,
fs.unlinkSync()
极有可能在fs.readFile()
之前执行,它会在实际读取之前删除file.md
。更好的写法是完全 非阻塞 并保证按正确顺序执行:以下代码在fs.readFile()
的回调中对fs.unlink()
进行了非阻塞
调用,这保证了正确的操作顺序。
const fs = require('fs');
fs.readFile('/file.md', (readFileErr, data) => {if (readFileErr) throw readFileErr;console.log(data);fs.unlink('/file.md', (unlinkErr) => {if (unlinkErr) throw unlinkErr;});
});
事件循环(nodejs的核心机制)
- 事件循环是 Node.js 处理
非阻塞 I/O 操作
的机制——尽管JavaScript 是单线程处理
的——当有可能的时候,它们会把操作转移到系统内核中去
。 - 因为目前
大多数内核都是多线程的
,所以它们可以在后台处理多种操作。当其中的一个操作完成的时候,内核通知 Node.js 将适合的回调函数添加到 轮询 队列中等待时机执行。
► 事件循环机制解析
-
当 Node.js 启动后,它会
初始化事件循环
,处理已提供的输入脚本,它可能会调用一些异步的 API
、调度定时器
,或者调用process.nextTick()
,然后开始处理事件循环。
┌───────────────────────────┐
┌─>│timers (定时器阶段
)此阶段执行由 setTimeout() 和 setInterval() 排序)
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │pending callbacks(挂起的回调阶段
)执行 I/O 回调推迟到下一个循环迭代
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │idle, prepare(空闲,准备阶段
)仅在内部使用
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │poll (轮询阶段
)
│检索新的 I/O 事件; 执行与 I/O 相关的几乎任何回调
│(由“计时器”或 “setImmediate()”所设的紧邻回调除外);
│node 将在适当时机在此处暂停
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │check(检查阶段
)setImmediate() 回调在此处被调用
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
└──┤close callbacks(关闭回调阶段
)一些关闭的回调函数,如:socket.on('close', ...)
└───────────────────────────┘注意:每个框被称为事件循环机制的一个阶段。
► 定时器阶段解读
计时器
可以 在回调
后面 指定阈值
,而不是
用户希望回调
执行的确切时间
。因为在经过指定的一段时间间隔后,计时器回调将被尽可能早地运行
。但是,操作系统调度或其它正在运行的回调
可能会延迟
它们。- 从技术上讲,
轮询 阶段
控制执行计时器的时间。 - 为了防止
轮询 阶段
挤占事件循环
的执行,libuv(实现 Node.js 事件循环和平台上所有异步行为的 C 函数库)还设有一个最大硬性限制(取决于系统)
,以避免继续轮询更多事件。
► 轮询阶段解读
► 轮询过程
例如,您调度了一个在 100 毫秒后执行回调的定时器,并且您的脚本开始异步读取文件,这会耗费 95 毫秒:
- 计算应该阻塞和轮询 I/O 的时间(95毫秒)。
- 事件循环等待95毫秒,将需要10毫秒才能完成的回调添加到轮询队列,当回调完成时,队列中不再有回调
- 100毫秒达到时,事件循环机制将发现计时器最快的阈值(100ms)的已经达到,然后将回到 计时器 阶段,以执行定时器的回调
(一旦 轮询 队列为空,事件循环将检查 已达到时间阈值的计时器。如果一个或多个计时器已准备就绪,则事件循环将绕回计时器阶段以执行这些计时器的回调。)
- 在本示例中,您将看到调度计时器到它的回调被执行之间的总延迟将为 105 毫秒。`
► 轮询分析
- 如果
轮询队列
不是空的 ,事件循环将循环访问回调队列并同步执行
它们,直到队列已用尽,或者达到了与系统相关的硬性限制。 - 如果
轮询队列
是空的 ,还有两件事发生: -
- 如果脚本被
setImmediate()
调度,则事件循环
将结束 轮询 阶段
,并继续检查 阶段
以执行那些被调度的脚本。
- 如果脚本被
-
- 如果脚本
未
被setImmediate()
调度,则事件循环将等待回调
被添加到队列
中,然后立即执行。
- 如果脚本
- 注意:为了防止
轮询 阶段事件循环陷入吃不饱的状态
,libuv(实现 Node.js 事件循环和平台的所有异步行为的 C 函数库)在停止轮询以获得更多事件之前,还有一个硬性的最大值
(依赖于系统)。
► setImmediate() 对比 setTimeout()
- setImmediate() 是为了在 当前 所有
检测阶段
完成后执行脚本。
通常,在执行代码时,事件循环最终会进入轮询阶段,在该阶段它将等待传入连接、请求等。但是,如果回调已使用 setImmediate()调度过
,并且轮询阶段变为空闲状态
,则它将结束此阶段
,并继续到检查阶段
而不是继续等待轮询事件。 - setTimeout() 安排一个脚本,在已过期的
最小阈值
后运行。
► process.nextTick()
- 任何时候在给定的阶段中调用 process.nextTick(),所有传递到 process.nextTick() 的回调
将在事件循环继续之前解析
- 这可能会造成一些糟糕的情况,因为它允许您通过
递归 process.nextTick()
调用来饿死
您的 I/O,阻止事件循环到达轮询阶段
。
let bar;function someAsyncApiCall(callback) {process.nextTick(callback);
}someAsyncApiCall(() => {console.log('bar', bar); // 1
});bar = 1;
- 允许传递参数给 process.nextTick(),这将允许它接受任何在回调函数位置之后的参数,并将参数传递给回调函数作为回调函数的参数,这样您就不必嵌套函数了。
function apiCall(arg, callback) {if (typeof arg !== 'string')return process.nextTick(callback,new TypeError('argument should be string'));
}
- 通过使用process.nextTick(),我们保证 apiCall() 始终在用户代码的其余部分之后和在让事件循环继续进行之前,执行其回调函数。为了实现这一点,JS 调用栈被允许展开,然后立即执行提供的回调,允许进行递归调用 process.nextTick(),而不触碰 RangeError: 超过 V8 的最大调用堆栈大小 限制。
► 为什么要使用 process.nextTick()?
- 允许用户处理错误,清理任何不需要的资源,或者在事件循环继续之前重试请求。
- 有时有让回调在栈展开后,但在事件循环继续之前运行的必要。
► process.nextTick() 对比 setImmediate()
- process.nextTick() 在同一个阶段立即执行。
- setImmediate() 在事件循环的接下来的迭代或 ‘tick’ 上触发。
► 不要阻塞你的事件循环(或是工作线程池)
- Node.js 通过事件
循环机制(初始化和回调)的方式运行
JavaScript 代码,并且提供了一个线程池
处理诸如文件 I/O 等高成本的任务。 - Node.js 是用很少量的线程来处理大量客户端请求的。 在 Node.js 中,有两种类型的线程:一个
事件循环线程(也被称为主循环,主线程,事件线程等)
。另外一个是在工作线程池里的k 个工作线程
(也被称为线程池)。 - 如果一个线程执行一个回调函数(事件轮询线程)或者任务(工作线程)需要耗费很长时间,我们称之为“阻塞”。 当一个线程在处理某一个客户端请求时被阻塞了,它就无法处理其它客户端的请求了。 这里给出两个不能阻塞事件轮询线程和工作线程的理由:
-
- 性能:如果你在任意类型的线程上频繁处理繁重的任务,那么你的服务器的 吞吐量(请求/秒)将面临严峻考验。
-
- 安全性:如果对于特定的输入,你的某种类型的线程可能会被阻塞,那么恶意攻击者可以通过构造类似这样的“恶意输入”,故意让你的线程阻塞,然后使其它客户端请求得不到处理。这就是拒绝服务攻击。
► Node.js 模块中有如下这些 API 用到了事件循环线程
- 事件轮询线程执行事件的回调函数,并且负责对处理类似网络 I/O 的非阻塞异步请求。
► Node.js 模块中有如下这些 API 用到了工作线程池
- I/O 密集型任务:
-
- DNS:dns.lookup(),dns.lookupService()。
-
- 文件系统:所有的文件系统 API。除 fs.FSWatcher() 和那些显式同步调用的 API 之外,都使用 libuv 的线程池。
- CPU 密集型任务:
-
- Crypto:crypto.pbkdf2()、crypto.scrypt()、crypto.randomBytes()、crypto.randomFill()、crypto.generateKeyPair()。
-
- Zlib:所有 Zlib 相关函数,除那些显式同步调用的 API 之外,都适用 libuv 的线程池。
► 事件循环线程和工作线程池
-
抽象来说,事件轮询线程和工作池线程分别为等待中的事件回调和等待中的任务维护一个队列。
-
而事实上,事件轮询线程本身并不维护队列,它持有一堆要求操作系统使用诸如 epoll (Linux),kqueue (OSX),event ports (Solaris) 或者 IOCP (Windows) 等机制去监听的文件描述符。 这些文件描述符可能代表一个网络套接字,一个监听的文件等等。 当操作系统确定某个文件的描述符发生变化,事件轮询线程将把它转换成合适的事件,然后触发与该事件对应的回调函数。
-
相对而言,工作线程池则使用一个真实的队列,里边装的都是要被处理的任务。 一个工作线程从这个队列中取出一个任务,开始处理它。当完成之后这个工作线程向事件循环线程中发出一个“至少有一个任务完成了”的消息。
-
Node.js有两种线程:一个事件循环和 k 工作者。 事件循环负责JavaScript 回调和非屏蔽I/O, 和一个工人执行对 C++ 代码的任务,完成异步请求,包括阻塞I/O 和 CPU密集工作。 两种类型的线程每次只能在一个活动上工作。 如果任何回调或任务需要很长时间,运行的线程会被屏蔽 。 如果您的应用程序阻止回调或任务,这最多可能导致通过量化(客户/秒),最坏情况下完全拒绝服务。
-
要写入一个高吞吐量,更多地预防 DoS 服务攻击的服务,您必须确保在良性和恶意输入中, 你的事件循环和你的 Worker 始终不会屏蔽。
► Node.js 中的定时器
- ► setTimeout() 可被用来在一段指定时间之后执行某个代码任务,唯一 保证的是定时器不会比声明的时间间隔 提早 执行。
function myFunc(arg) {console.log(`arg was => ${arg}`);
}setTimeout(myFunc, 1500, 'funky');
- ► setImmediate() 在此之后立即执行, 将在当前事件轮询的末尾处执行,setImmediate() 返回一个 Immediate 对象,它可以被用于取消安排的定时任务(见下面的 clearImmediate() )。
不要把 setImmediate() 和 process.nextTick() 相混淆。它们有一些主要的差别:第一, process.nextTick() 将在任何设置好的 Immediate 以及任何安排好的 I/O 前 执行。第二, process.nextTick() 是不可擦除的,换句话说,一旦有代码使用 process.nextTick() 执行,执行无法中断,这就像一个普通函数一样
console.log('before immediate');setImmediate((arg) => {console.log(`executing immediate: ${arg}`);
}, 'so immediate');console.log('after immediate');before immediate
after immediate
executing immediate: so immediate
- ► setInterval() 永远的轮询,setInterval() 接受一个函数作为其参数,该函数将被运行无限次,第二个参数便是一个给定的延时毫秒数。另外一个和 setTimeout() 类似的地方是延时不保证精确。
function intervalFunc() v.console.log('Cant stop me !');
}setInterval(intervalFunc, 1500);
- ► 清除定时器
const timeoutObj = setTimeout(() => {console.log('timeout beyond time');
}, 1500);const immediateObj = setImmediate(() => {console.log('immediately executing immediate');
});const intervalObj = setInterval(() => {console.log('interviewing the interval');
}, 500);clearTimeout(timeoutObj);
clearImmediate(immediateObj);
clearInterval(intervalObj);
- ► 让定时器在背后运行
你已经记住了 Timeout 对象是通过 setTimeout 和 setInterval 返回的。 Timeout 对象提供了两个针对 Timeout 行为的函数
(1)unref()
取消setTimeout
和setInterv
函數的調用
(2)ref()
恢復setTimeout
和setInterv
函數的調用
const timerObj = setTimeout(() => {console.log('will i run?');
});// if left alone, this statement will keep the above
// timeout from running, since the timeout will be the only
// thing keeping the program from exiting
timerObj.unref();// we can bring it back to life by calling ref() inside
// an immediate
setImmediate(() => {timerObj.ref();
});
下载安装nodejs
► 下载nodejs
- 点击下载nodejs,选择长期维护版
► 安装
- 直接点击next直接完成安装(记住这个路径:
C:\Program Files\nodejs
)
► 配置环境变量
► 新建文件夹如下
- D:\nodejs\node_global
- D:\nodejs\node_cache
► 更改文件夹权限
► 添加环境变量
► 验证是否安装成功
C:\Users\Administrator>node -v
v18.17.1C:\Users\Administrator>npm -v
9.6.7C:\Users\Administrator>
► 修改模块下载位置
C:\Users\Administrator>npm get prefix
C:\Users\Administrator\AppData\Roaming\npm
C:\Users\Administrator>npm get cache
C:\Users\Administrator\AppData\Local\npm-cache
C:\Users\Administrator>
C:\Users\Administrator>npm config set prefix "D:\nodejs\node_global"
C:\Users\Administrator>npm config set cache "D:\nodejs\node_cache"
C:\Users\Administrator>
► 测试默认位置是否更改成功
C:\Users\Administrator>npm install express -gadded 58 packages in 20s8 packages are looking for fundingrun `npm fund` for detailsC:\Users\Administrator>
► 设置淘宝镜像,并安装cnpm
C:\Users\Administrator>npm config get registry
https://registry.npmjs.org/C:\Users\Administrator>npm config set registry https://registry.npmmirror.comC:\Users\Administrator>npm config get registry
https://registry.npmmirror.comC:\Users\Administrator>npm install -g cnpm --registry=https://registry.npmmirror.comadded 399 packages in 18s28 packages are looking for fundingrun `npm fund` for detailsC:\Users\Administrator>
npm config get registry
npm config set registry https://registry.npm.taobao.org
npm config set registry https://registry.npmmirror.com
npm config get registry
npm install -g cnpm --registry=https://registry.npm.taobao.org
npm install -g cnpm --registry=https://registry.npmmirror.com
► 查看cnpm模块
► 执行命令查看cnpm是否安装成功
C:\Users\Administrator>cnpm -v
cnpm@9.2.0 (D:\nodejs\node_global\node_modules\cnpm\lib\parse_argv.js)
npm@9.8.1 (D:\nodejs\node_global\node_modules\cnpm\node_modules\npm\index.js)
node@18.17.1 (C:\Program Files\nodejs\node.exe)
npminstall@7.9.0 (D:\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\index.js)
prefix=D:\nodejs\node_global
win32 x64 10.0.19044
registry=https://registry.npmmirror.comC:\Users\Administrator>
► 附上所有命令
Microsoft Windows [版本 10.0.19044.3086]
(c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>node -v
v18.17.1C:\Users\Administrator>npm -v
9.6.7C:\Users\Administrator>npm get prefix
C:\Users\Administrator\AppData\Roaming\npmC:\Users\Administrator>npm get cache
C:\Users\Administrator\AppData\Local\npm-cacheC:\Users\Administrator>npm config set prefix "D:\nodejs\node_global"C:\Users\Administrator>npm config set cache "D:\nodejs\node_cache"C:\Users\Administrator>npm install express -gadded 58 packages in 20s8 packages are looking for fundingrun `npm fund` for detailsC:\Users\Administrator>npm config get registry
https://registry.npmjs.org/C:\Users\Administrator>npm config set registry https://registry.npmmirror.comC:\Users\Administrator>npm config get registry
https://registry.npmmirror.comC:\Users\Administrator>npm install -g cnpm --registry=https://registry.npmmirror.comadded 399 packages in 18s28 packages are looking for fundingrun `npm fund` for detailsC:\Users\Administrator>cnpm -v
cnpm@9.2.0 (D:\nodejs\node_global\node_modules\cnpm\lib\parse_argv.js)
npm@9.8.1 (D:\nodejs\node_global\node_modules\cnpm\node_modules\npm\index.js)
node@18.17.1 (C:\Program Files\nodejs\node.exe)
npminstall@7.9.0 (D:\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\index.js)
prefix=D:\nodejs\node_global
win32 x64 10.0.19044
registry=https://registry.npmmirror.comC:\Users\Administrator>
相关文章:

Vue-2.nodejs的介绍和安装
nodejs简介 ► 创建 Node.js 应用:package.json 首先,创建一个新文件夹以便于容纳需要的所有文件,并且在此其中创建一个 package.json 文件,描述你应用程序以及需要的依赖: 配合着你的 package.json 请运行 npm install。如果你…...
分别用Vue和Java来实现的风靡一时的2048 游戏
目录 1、Vue实现2、Java实现 2048 游戏是一个基于网格的数字益智游戏,玩家需要通过滑动相同的数字来合并它们,并最终得到一个值为 2048 的方块。以下是分别用Vue和Java来实现的 2048 游戏,包含运行效果。 1、Vue实现 首先,创建一…...

echarts甘特图 一个值多条线
先看图 这里我们用到的是 series :type:custom 自定义,但是这里我遇到一个问题,就是不过你在series里push多少数据,图表上显示的都是在同一水平线,用了好多方法都不好使, renderItem: (params, api) >…...
多态性说明
多态 多态性多态性类型描述编译时多态和运行时多态的差异go 语言多态性 多态性 多态性类型描述 多态性是面向对象编程中的一个重要概念,它允许不同的对象通过相同的接口表现出不同的行为,从而实现更加灵活和可扩展的代码结构。多态性有助于降低代码的耦…...

2023-08-04 LeetCode每日一题(不同路径 III)
2023-08-04每日一题 一、题目编号 980. 不同路径 III二、题目链接 点击跳转到题目位置 三、题目描述 在二维网格 grid 上,有 4 种类型的方格: 1 表示起始方格。且只有一个起始方格。2 表示结束方格,且只有一个结束方格。0 表示我们可以…...

腾讯云服务器地域怎么选?可用区是什么?
腾讯云服务器地域有什么区别?怎么选择比较好?地域选择就近原则,距离地域越近网络延迟越低,速度越快。关于地域的选择还有很多因素,地域节点选择还要考虑到网络延迟速度方面、内网连接、是否需要备案、不同地域价格因素…...

第一百二十三天学习记录:C++提高:STL-vector容器(下)(黑马教学视频)
vector插入和删除 功能描述: 对vector容器进行插入、删除操作 函数原型: push_back(ele); //尾部插入元素ele pop_back(); //删除最后一个元素 insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele insert(const_iterator pos, int cou…...
谈谈Spring与字节码生成技术
Spring框架是一个面向企业级Java应用开发的开源框架,它提供了许多功能和特性来简化Java开发过程。字节码生成技术在Spring框架中起着重要的作用,用于实现依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriente…...

Java数组详解 -- 基础知识与常用操作
文章目录 前言一、初识数组1. 数组的定义2. 数组的特点3. 声明和初始化数组4. 默认初始化值 二、访问和操作数组元素1. 数组的索引和范围2. 通过索引访问数组元素3. 修改数组元素的值 三、数组的长度和属性1. 数组的长度计算2. 数组的长度属性3. 数组越界的错误 四、数组的遍历…...
(统计学习方法|李航)第五章 决策树——一二三节:决策树模型与学习,特征选择,决策树的生成,
目录 一,决策树模型与学习 1.决策数模型 2.决策树与if-then规则 3.决策树与条件概率分布 4.决策树学习 二,特征选择 1.特征选择问题 2.信息增益 3.信息增益比 三,决策树的生成 1.ID3算法 2.C4.5的生成算法 一,决策树模型…...
qt lamda表达式及捕获变量列表符号说明及示例
问题描述: 最近发现很多人都喜欢用Lamda表达式了,至于他们到底知不知道自己用的是什么意思,那就另说了。 虽然我个人并不太喜欢,因为很多地方没法像以前信号和槽那样清晰了,而且很多生成UML的软件估计也不支持解析转成对应的序列图啥的。 但是这个lamda写法确实挺方便的…...

第十六章、【Linux】程序管理与SELinux初探
16.1 什么是程序 (process) 在Linux 系统当中:“触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系ÿ…...
ElasticSearch索引生命周期管理--DELETE
概要 ElasticSearch中的索引生命周期管理,也就是ilm(Manage the index lifecycle),是指定了索引在不同周期下的处理策略。ilm 的对象是索引而不是索引中的数据。ilm 包括四个阶段:hot 、warm、cold和delete。hot、warm和cold表示…...

sentinel简单使用
核心demo: 1 引入依赖: <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.0</version> </dependency>2 核心代码: 3 限流保护代码:…...

C#小轮子:自动连续Ping网络地址
文章目录 前言Ping代码异步问题 前言 工作中,我们经常用到Ping这个指令,有时候我们需要Ping整个网段来查看这个网段上面有什么设备,哪些Ip地址是通的,这个时候就需要Ping指令 Ping 代码 我这个是批量Ping的代码,而…...
react入门笔记
什么是React? React是一个用于创建用户界面的开源前端javaScript库。它是声明式的、高效的和灵活的,并且他坚持基于组件的方法,这使得我们能够创建可重用的UI组件。 React是一个开源的前端javaScript库,用于构建用户界面或者UI组件。它是由…...

记录--前端重新部署如何通知用户
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 场景 前端构建完上线,用户还停留还在老页面,用户不知道网页重新部署了,跳转页面的时候有时候js连接hash变了导致报错跳不过去,并且用户体验不到新功能…...

WPS的excel表格单元格拖动数字日期等 不自增原因
对着表格中的每个单元格右下角,在变成下图,黑十字后,拖动这个十字.就会在右侧出现一个小窗口. 里面菜单中可以选择按序数增加 但是,如果拖动,发现小窗口菜单不出现.说明这一栏开启了筛选功能.清空筛选条件后,即可恢复自增功能....
2308C++简单异步懒
Lazy Lazy由C20无栈协程实现.一个Lazy闭包一个懒求值的计算任务. 使用Lazy 想用Lazy,需要先#inlude<async_simple/coro/Lazy.h>,再实现返回类型为Lazy<T>的协程函数即可.如: # 包含<简单异步/协程/懒.h>懒<整>任务1(整 x){协中 x;//带有协中的函数…...

Linux常规操作命令
日升时奋斗,日落时自省 目录 1、vim 1.1、工作模式 1.2、末行模式操作相关命令 1.2.1、保存退出操作 1.2.2、查找替换 1.3、输入模式操作相关命令 1.3.1、移动相关命令 1.3.2、删除和剪切命令 1.3.3、复制操作 1.3.4、撤销 2、head 3、tail 4、ps 5、…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...