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

2024最新版JavaScript逆向爬虫教程-------基础篇之Chrome开发者工具学习

目录
  • 一、打开Chrome DevTools的三种方式
  • 二、Elements元素面板
  • 三、Console控制台面板
  • 四、Sources面板
  • 五、Network面板
  • 六、Application面板
  • 七、逆向调试技巧
    • 7.1 善用搜索
    • 7.2 查看请求调用堆栈
    • 7.3 XHR 请求断点
    • 7.4 Console 插桩
    • 7.5 堆内存函数调用
    • 7.6 复制Console面板输出

工欲善其事,必先利其器。本文先来基于 Chrome 浏览器介绍浏览器开发者工具的使用,但由于开发者工具的功能十分复杂,本文主要介绍对 JavaScript 逆向有一些帮助的功能,学会了这些,我们在做 JavaScript 逆向调试的过程中会更加得心应手。参考文档:https://developer.chrome.com/docs/devtools?hl=zh-cn 有空的话可以通篇瞅瞅

一、打开Chrome DevTools的三种方式

Google Chrome 浏览器中内置了一套强大的开发者工具,无论是做源码分析还是 JS 脚本的调试都是比较方便的。要进行抓包或者调试前端的加密脚本,和控制台的交互必不可少。不少做了安全防护的网站都会禁止用户打开 Chrome 开发者工具 如:https://wap.jjwxc.net/book2/545120/4,下面总结打开 Chrome DevTools 的三种方式:

  1. 可以通过 Chrome 中的下拉菜单访问 Chrome DevTools,如下图所示:

  2. 如需打开上次使用的开发者工具面板,请点击地址栏右侧的 按钮,然后依次选择更多工具 > 开发者工具。

  3. 使用以下快捷方式打开面板:元素、控制台或上一个面板

    操作系统	            元素	            控制台	           上次使用的面板
    Windows 或 Linux	Ctrl + Shift + C	Ctrl + Shift + J	F12/Ctrl + Shift + I
    Mac	                Cmd + Option + C	Cmd + Option + J	Fn + F12/Cmd + Option + I
    

遇到该类型的网站 https://wap.jjwxc.net/book2/545120/4 ,我们可以在浏览器中先打开新的标签页,然后使用上述任意方法打开 Chrome DevTools,接着在地址栏中输入要调试的网址,回车,这样就能正常使用 Chrome DevTools 进行调试啦。打开 Chrome DevTools 之后,我们可以看到很多面板标签,如 Elements、Console、Sources 等,这就是 Chrome DevTools 的一个个面板,功能丰富而又强大。下面先对面板进行简单介绍:

  1. Elements:元素面板,用于查看或修改当前网页 HTML 节点的属性、CSS 属性、监听事件等。HTML 和 CSS 都可以即时修改和即时显示。
  2. Console:控制台面板,用于查看调试日志或异常信息。另外,我们还可以在控制台输入 JavaScript 代码,方便调试。
  3. Sources:源代码面板,用于查看页面的 HTML 文件源代码、JavaScript 源代码、CSS 源代码。此外,还可以在此面板对 JavaScript 代码进行调试,比如添加和修改 JavaScript 断点,观察 JavaScript 变量变化等。
  4. Network:网络面板,用于查看页面加载过程中的各个网络请求,包括请求、响应等。
  5. Performance:性能面板,用于记录和分析页面在运行时的所有活动,比如 CPU 占用情况、呈现页面的性能分析结果。
  6. Memory:内存面板,用于记录和分析页面占用内存的情况,如查看内存占用变化,查看 JavaScript 对象和 HTML 节点的内存分配。
  7. Application:应用面板,用于记录网站加载的所有资源信息,如存储、缓存、字体、图片等,同时也可以对一些资源进行修改和删除。
  8. Lighthouse:审核面板,用于分析网络应用和网页,收集现代性能指标并提供对开发人员最佳实践的意见。 参考链接:https://github.com/GoogleChrome/lighthouse/blob/HEAD/docs/user-flows.md

Ctrl + Shift + C/Cmd + Option + C 可在 ink_selection
检查器模式下打开 Elements 面板。当将鼠标悬停在页面上的元素上时,此模式会显示有用的提示。还可以点击任何元素,在 Elements(元素)> Styles(样式)标签页中查看其 CSS。

Device Mode (设备模式):可以设置设备模式。一般而言对我们作用不大,现在的网站手机页面写的不是响应式,而是用一个新域名做指向 m.********.com,所以利用这个方案不太能看得见手机端的样式了,开发者还是很常用的,但是我们用不到。

简单了解了这些面板之后,我们来深入了解几个面板中对 JavaScript 调试很有帮助的功能。

二、Elements元素面板

Elements(元素) 面板,左侧显示页面源码的 DOM 树,可以在这里对页面源代码进行增、删、改、查等操作,右侧展示被选中页面节点的层叠样式表 (Cascading Style Sheets,CSS),它主要是用来对页面进行修饰美化。值得注意的是,左侧显示的页面源代码并非原始代码,而是HTML、CSS与JS结合的结果。
在这里插入图片描述
获取原始网页源代码,有以下两种方式:
(1) 右击任意网页页面空白处,单击查看网页源代码菜单项,或者按 Ctrl + U 组合键,如下图所示:

(2) 切换到 Sources 面板,选择左栏中包含网页地址的 HTML 文件。如下图所示:

如果想要隐藏网页中展示的节点,如一些容易误触的广告,只需要选中 Elements 面板中对应的代码节点后,按 H 键(也可以右键单击需要隐藏的节点,然后选择 Hide element)。日常开发中使用的组合键,如 Ctrl + C 键和 Ctrl + V 键等,也都可以在 Elements 面板中使用。也就是说,在 Elements 面板中可以对网页进行自由调整和编辑。
在这里插入图片描述
在日常的爬虫开发中,需要与源代码打交道的地方大多数是页面元素的定位。Chrome 开发者工具内置了一套定位工具,只需要在 Elements 面板中按 Ctrl + F 键,就会在源代码下方出现如下图所示的调试框,可以在其中编写 CSS 选择器语法或 Xpath 语法,实时地对页面节点进行定位。
在这里插入图片描述
如果要快速复制页面节点的路径,可以点击要定位的节点,再单击 Copy 菜单项,其中有多种可供选择的网页页面定位语法,如下图所示:
在这里插入图片描述
笔者其实不大喜欢这种方式,虽说从一定时间上能提升开发的效率,但更多时候其实也是需要自己修改的, 所以笔者更偏向自己写 Xpath 规则(更相信自己)。此外,断点操作是进行代码调试和分析时的必要操作。 在 Elements 面板中可以进行 DOM 更改断点分析,如果想要暂停更改 DOM 节点或其子级的代码,可以使用 DOM 更改断点。如需设置 DOM 更改断点,请执行以下操作:

点击元素标签页
前往要设置断点的元素。
右键点击相应元素。
将鼠标悬停在断点 (Break on) 上,然后选择子树修改 (Subtree configuration)、属性修改 (Attribute modified) 或节点移除。用于创建 DOM 更改断点的上下文菜单。

我们可以在以下位置找到 DOM 更改断点列表:元素 > DOM 断点窗格。Sources > DOM Breakpoints 侧窗格。"Elements""Sources" 面板中的 DOM 断点列表:

我们可以在其中执行以下操作:

  1. 使用 复选框,启用或停用它们。
  2. 右键点击 > 在 DOM 中移除或显示这些元素。

DOM 更改断点的类型:

  1. 子树修改:在移除或添加当前所选节点的子级,或更改子级内容时触发。在子节点属性更改或对当前所选节点进行任何更改时不会触发。
  2. 属性修改:在当前所选节点上添加或移除属性,或属性值发生变化时触发。
  3. 节点移除:在移除当前选定的节点时会触发。

三、Console控制台面板

Console 面板是与网页进行交互的控制台窗口,它用于显示 DOM 对象信息和调试 JS 代码,熟练使用它将会大大提升开发速度。在 Console 面板中操作节点时,通常需要先定位到页面节点,才可以进行节点操作。输入 $0 可以对当前选中的页面节点进行引用,输入 $1 可以对上一次选择的节点进行引用,以此类推,输入可以一直回溯到 $4。也可以使用 CSS 选择器语法对节点进行操作。复制需要定位的网页节点的 selector 路径后,使用 document. querySelector 或者 $ 方法可以定位第一个符合语法的节点。如果要选择所有符合 CSS 选择器语法的节点,可以使用 document.querySelectorAll 或者 $ $ 方法返回一个符合语法的节点数组。Console 面板中提供了多种方法来观察和检查事件监听器,常用的方法:monitorEvents():监听目标事件信息。unmonitorEvents():停止监听。getEventListeners():获取 DOM 节点的监听器。monitorEvents() 的第一个参数是要监听事件的对象,第二个参数是要监听的事件字符串或者字符串数组。以监听 CSDN 首页的 搜索按钮为例,代码如下:
在这里插入图片描述
只要没有取消对目标节点的事件监听,在每次和页面交互时,控制台都输出监听信息。要停止监听事件,需要使用 unmonitorEvents() 方法,参数是要停止事件监听的页面节点,例如:

unmonitorEvents(searchBtn);

getEventListeners() 方法的参数是网页页面节点,它返回在节点上注册事件的监听器,其中会包含每个已经注册事件类型的数组。例如,以下代码会监听“搜索” 按钮已注册事件的监听器。

getEventListeners(searchBtn); 

如果要查看 DOM 节点上注册的事件监听器,则需要到 Elements 面板中查看 EventListeners 选项卡,它会显示附加到页面上的所有事件,如下图所示:

其他,从左至右:

  1. 弹出消息统计,清空消息栏,选择控制台线程-也可以粗略的理解为 iframe(不同框架内变量有差异)
  2. 小眼睛:创造一个表达式,用来做观察对比用
  3. 过滤器:消息过滤,一般情况用不到,但是遇到控制台一直吐无用消息的时候很好用
  4. 默认等级:显示消息等级,一般不用
  5. Issues:一般不用管
  6. 控制台右键:清理
    在这里插入图片描述

参考链接:https://developer.chrome.com/docs/devtools/console?hl=zh-cn

四、Sources面板

左侧:

  1. page 页面加载的所有内容,包含各种样式。只要是本页面加载的,都可以在这里面找到
  2. 本地覆盖是一个实用的调试方法,能够使开发者用自己的文件来替换请求的资源。即不必再继续向服务器请求资源,而是直接在本地修改,当浏览器向目标地址请求资源时,会使用本地的文件来进行代替。这样,开发者可以随意对网页脚本文件进行修改,包括添加 Console 插桩、添加循环 debugger 以及实现脚本文件在被调用时,直接在控制台对加密参数或函数进行输出等操作。这里讲解 Chrome local overrides 的方式。Chrome 64 之后的开发者工具可以直接在 Sources 面板中进行操作,如下图所示,切换到 Overrides 选项卡中,单击 Select folder for overrides 选项,在弹出的文件夹选择框中选择要进行替换的资源的所属文件夹。
    在这里插入图片描述
    选择文件夹后,浏览器上方会弹出对话框询问是否允许 Chrome 开启访问目录权限,单击 "允许" 按钮。
    在这里插入图片描述
    接下来,以替换百度首页 title 标签中的文字为例进行说明。(1) 打开 Network 面板进行抓包,找到百度首页请求包。(2) 右击对应请求包,选择下图中的 Override content 菜单项。
    在这里插入图片描述
    (3) 选择 Override content 菜单项之后,会自动跳转到 Sources 面板中的 Overrides,如下图所示:
    在这里插入图片描述
    (4) 再次刷新百度首页页面,会发现页面中的内容已经被替换。
    在这里插入图片描述

Sources 面板是我们必须掌握的面板,对 JS 加密脚本的断点调试与代码分析主要从这里出发。如一个网页对登录参数做了加密,可以在加密 JS 脚本处设置断点,这样就可以跟进查看加密函数了。
1. 设置断点。 设置断点最基本的方法是在代码的行序列号上手动添加,也可以将其设置为在满足某些条件下才会触发断点。一旦在某一代码行上设置了断点,网页在加载到这一行代码时就会全局暂停,直到断点删除。要在特定的代码行上设置断点,需要打开 Source 面板,并在 File Navigator 窗口中选择要分析的脚本文件,在源代码的左侧可以看到行序列号,单击行序列号就会在这一行代码上添加断点,如下图所示:
在这里插入图片描述
如果一个表达式占据了多行,这时把一个断点设置在表达式中间,那么断点会被自动调整到下一个表达式上。如下图所示,在代码第684行设置断点,断点会自动调整到第692行。
在这里插入图片描述
条件断点只有在输人表达式为 true 时,才会被触发暂停。如图所示,右击行序列号,单击 Add conditional breakpoint 菜单项可以创建一个条件断点。
在这里插入图片描述
调试者在代码中添加的所有断点都会被记录在右侧的 Breakpoints 栏中。如果要删除一个断点,除了再次单击行序列号之外,还可以右击下图所示断点,选择 Remove breakpoint 菜单项。如果只是想暂时性地删除该断点,可以仅取消勾选复选框。
在这里插入图片描述
在 XHR 请求中设置断点的情况也很常见。当任何 XHR 与设置的 URL 中的子串相匹配时或者 XHR 到达生命周期的某个阶段时,这类断点会被触发。如果想在 XHR 与 URL 子串匹配时触发暂停,可以在 XHR/fetch Break points 窗格中进行 XHR 断点设置。如果想要在 XHR 生命周期的某个阶段触发暂停,可以在 Event Listener Breakpoints 窗格中查看 XHR 目录,如图所示:
在这里插入图片描述
2.调试代码。 设置好断点后就可以开始遍历代码了,可以通过一次执行一行代码或者一个函数来观察数据和页面的更改,也可以修改 JS 脚本及其中的数值。页面登录时的密码加密方式和判断参数正确的标志都可以通过代码调试逐步找出来。代码调试通过 Sources 面板右上角的图标进行操纵,如下图所示:
在这里插入图片描述
第一个图标的含义是,恢复代码执行直到遇到下一个断点,如果没有遇到断点,就会恢复正常;第二个图标的含义是,执行当前行的代码,并跳转到下一行;第三个图标的含义是,如果下一行代码包含一个函数调用,就跳转到该函数内部并在该函数的第一行暂停;第四个图标的含义是,执行当前函数的剩余部分,然后在函数调用后的下一个语句处暂停;第五个图标的含义是单步调试,可以用来调试异步代码,比如 Promise;第六个图标的含义是,暂时禁用所有断点,用于恢复完整的执行,而不是将断点全部删除;第七个图标的含义是,当异常发生时自动暂停代码。在实际的加密脚本调试中,需要将上述图标结合起来使用。除此之外,当脚本暂停在断点时,Scope 窗格会显示当前时刻所有定义在本地、闭包和全局的属性,如下图所示:
在这里插入图片描述
仅在脚本暂停时,Scope 窗格才会有显示。当页面正常运行时,Scope 窗格是空白的。在进行断点时,Call Stack 窗格会显示代码的执行路径。如下图所示,它按照时间逆序,从上到下单击查看时,会自动跳转到对应代码块,这有助于调试者理解代码如何运行。
在这里插入图片描述
3.在任何页面上运行自定义代码块。 代码块是可以在 Sources 面板中创建和执行的小脚本,在任何页面都可以访问和运行。假设调试者有一个 JS 加密方法库,内置了多种常见的加密方法,在调试脚本时,如果要在多个页面中反复使用,就可以考虑将脚本另存为代码块。要创建一个代码块,需要打开 Sources 面板,单击左侧 Snippets 选项卡,右击空白处,选择 Create new snippet(或 New snippet) 选项,如图:
在这里插入图片描述
如果代码块编写后还未保存,文件名会出现下图所示的符号 "*",需要按 Ctrl + S 键来进行保存。保存后的代码块要想在当前页面中使用,需要右击文件名,单击 Run 菜单项。
在这里插入图片描述
4.美化打印代码块。 一般来说,打开一个网页源代码或者脚本文件,会发现它是经过压缩的,观察起来比较困难,如下图所示:
在这里插入图片描述
单击源代码左下角的 {} 图标,可以进行代码的美化打印。

5.跟踪监视变量。 有时候需要持续监视脚本运行中某一个变量的值,如果一直在控制台进行调试输出会有些烦琐。Sources 面板右侧的 Watch 窗格提供了在程序中跟踪监视变量的功能,利用它可以不用反复地将监控对象输出到控制台中。要将变量添加到监控列表中,只需要单击 Watch 窗格中的 Add expression 图标(只有在 Watch 窗格展开时才会出现),如下图所示:
在这里插入图片描述
此时会打开一个内联输入框,输入要监控的变量名称,按 Enter 键,即可完成变量添加。如果要监控的变量没有被设置或未被找到,就会显示为下图中的 not available:
在这里插入图片描述

五、Network面板

Network 面板会记录与网页有关的每个网络操作的详细信息,包括 HTTP 请求和 HTTP 响应。在该面板中,要掌握的是下图中标注的三个窗格,其中1号窗格用于控制 Network 面板的外观和功能,2号窗格用于过滤请求列表中的资源请求和响应,3号窗格列举了按照时间顺序存储的每个网络资源。
在这里插入图片描述
从左至右:

  1. 红色圆点:开启/关闭流量监控
  2. 圈叉:清空当前的捕获数据
  3. 漏斗:过滤器面板是否开启
  4. 放大镜:搜索
  5. Preserve log:Preserve Log 复选框用于保存日志
  6. Disable cache:Disable cache 复选框用于禁用缓存
  7. throttling:开发用,用于模拟网络环境不好的时候,加载页面情况
  8. network conditions:配置一些请求信息,主要是 UA(这个不好用,有更好用的 chrome 插件)
  9. 上传下载:不用说了,保存这些缓存到本地或者从本地上传到 chrome

抓包面板:

  1. Name:名字
  2. Status:状态码
  3. Type:加载形式
  4. Initiator:可以理解这个数据的来源位置,如果是 js 代码发出的,可以看到发出的调用栈
  5. Size:大小
  6. Time:加载时间
  7. Waterfall:加载时间轴

面板右键:会有一些操作, 主要常用的是 copy curl 用于一键生成爬虫代码,如下图所示:

单击3号窗格中的任意一个网络资源,可以查看该网络资源的更多详细信息,如下图所示,打开后默认显示 HTTP 请求头,包含统一资源定位符、HTTP 请求方法和状态码。
在这里插入图片描述
请求的详细内容后续笔者在另一篇博文中展开,这里主要讲解面板的使用。如果要对网络资源进行 Preview 预览,二进制图片资源会直接显示请求资源在页面中的展示,也可能不显示具体信息,具体情况取决于选择查看的资源类型。如果查看 HTTP 响应的具体内容,可以单击 Response 选项卡,如下图所示,HTML 资源会以源代码的方式呈现,具体返回内容取决于查看的资源类型。
在这里插入图片描述

六、Application面板

Application 面板中可以查看和删除 Cookie,但是不能修改 Cookie 值。如下图所示,Cookie 会按照域列出,不过需要注意,来自不同域的 Cookie 可能会出现在同一栏中,相同的 Cookie 也可能会出现在多栏中。
在这里插入图片描述
Manifest: https://web.dev/add-manifest/?utm_source=devtools
Storage 下面的数据库面板汇总,一般用于一键清除所有数据:

  1. Local Storage: 相当于浏览器里针对这个网页的一个数据库
  2. Session Storage: 同上
  3. indexedDB: 同上,但是没见人用过 https://developer.chrome.com/docs/devtools/storage/indexeddb/?utm_source=devtools
  4. webSQL:用来查询 Chrome 数据库的,支持 sql 语言,https://developer.chrome.com/docs/devtools/storage/websql/?utm_source=devtools

Cookies:

  1. Domain:指定 Cookie 的有效域,决定在向该域发送请求时是否携带此 Cookie
  2. path:指定 Cookie 的有效路径
  3. Expires/Max-age:过期时间
  4. HttpOnly:用于避免 Cookie 被 Javascript 访问
  5. Secure Cookie 的安全属性,用于指定 Cookie 需要通过安全 Socket 层连接传递。若设置为 true,则浏览器只会在 HTTPS 和 SSL 等安全协议中传输此 Cookie
  6. SameSite 用来限制第三方 Cookie,从而减少安全风险。它有3个属性,分别是:① Strict 完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie;② Lax 大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外 ③ None 网站可以选择显式关闭 SameSite 属性,将其设为 None。不过,前提是必须同时设置 Secure 属性(Cookie 只能通过 HTTPS 协议发送),否则无效。
  7. Priority 优先级,Chrome 的提案,定义了三种优先级,Low/Medium/High,当 Cookie 数量超出时,低优先级的 Cookie 会被优先清除

使用 local storage 本地存储来存储键值对,可以在其中进行键值对的检查、修改和删除操作。常用的5种方法如下所示:

setItem(): 存储一个名称为 key 的值 value,如果 key 存在,就更新value。
getItem(): 获取名称为 key 的 value,如果 key 不存在,则返回 null。
removeItem(): 删除名称为 key 的信息,这个 key 所对应的 value 也会全部被删除。
clear(): 清空 localStorage 中所有信息。
key(): 键的索引。

以设置键值对为例,创建一个 key 为 name、value 为 test 的键值对,可以在控制台输入如下代码:

localStorage.setItem("name", "test");

七、逆向调试技巧

在掌握了 Chrome 开发者工具的基本使用后,需要将其运用到实际的调试中。在做日常的网页端数据抓包时,通常会遇到各类加密参数,如何快速定位加密脚本和关键函数极为重要。

7.1 善用搜索

在 Network 面板中找到了需要的资源包,当其中的 HTTP 内容中存在加密键值对时,可以使用搜索来快速定位加密脚本和关键函数。如下图所示,需要先单击右上角的展开图标,再单击 Search 菜单项,之后在下方的搜索框中输入要搜索的加密参数,最后单击搜索框右边的 Refresh 图标。如果 Sources 中存在这个加密参数,就会在下方返回符合条件的所有文本文件。
在这里插入图片描述
以全局搜索 safe 加密参数为例,因为通常情况下返回的匹配内容是较多的,可以在原有参数基础上再加一些标识符,例如:password=、 password:。这样可以大幅度减少匹配项,从而减轻寻找关键函数的负扭。

7.2 查看请求调用堆栈

在 Network 面板中,通过资源的 Initiator 列可以看到它的请求调用栈,排序方式是逆序。如果将鼠标移动到某一个请求资源的 Initiator 上,会弹出该请求资源的请求调用堆栈。单击下图的请求调用堆栈中的任意显示项,即可跳转到对应的脚本文件的具体调用行中。
在这里插入图片描述

7.3 XHR 请求断点

不少加密数据包传输的时候,会使用 XHR 请求断点。当目标加密参数存在于 XHR 数据包的时候,选择 XHR 请求断点会比全局搜索更加快捷,下图是添加 XHR 请求断点的联内输入框。具体细节可以查看文章:https://blog.csdn.net/xw1680/article/details/124605393
在这里插入图片描述

7.4 Console 插桩

条件断点不仅可以写判断表达式,还可以在其中输入、输出表达式,这样就可以在脚本运行到对应行时,在控制台中打印输出对应参数,达到插桩的效果。如下图所示,添加条件断点时,可以输入 console.log() 对密码加密脚本中的密码值进行输出调试。
在这里插入图片描述
Console 插桩通常用于滑块验证码的调试,滑块轨迹的输出如果设置了一般断点,就会移动一次暂停一次,使用插桩形式就可以直接在控制台中流畅地输出滑动轨迹了。

7.5 堆内存函数调用

在脚本中设置断点后,可以在当前断点暂停时,在 Console 面板中调试输出具体函数,单击函数内容可以跳转到具体的代码行,如下图所示:
在这里插入图片描述

7.6 复制Console面板输出

在 Console 面板的调试中,通常需要将调试输出内容进行复制,方便将其写入本地文件进行调用。但一般情况下,直接复制往往得不到需要的内容,这个时候,可以在控制台中尝试以下四种方法,最后一种方法需要在 Sources 面板的 Snippets 代码块中添加 CryptoJS 加密库。(1) copy()、(2) JSON.stringify()、(3) Object.toString()、(4) CryptoJS.enc.Utf8.stringfy()。使用复制方法后,Console 面板的内容就会被复制到粘贴板上。

相关文章:

2024最新版JavaScript逆向爬虫教程-------基础篇之Chrome开发者工具学习

目录 一、打开Chrome DevTools的三种方式二、Elements元素面板三、Console控制台面板四、Sources面板五、Network面板六、Application面板七、逆向调试技巧 7.1 善用搜索7.2 查看请求调用堆栈7.3 XHR 请求断点7.4 Console 插桩7.5 堆内存函数调用7.6 复制Console面板输出 工…...

下定决心不去读研了。。。

大家好,我是苍何。 之前发表过一篇文章,表达了自己读研的困惑和纠结,得到了大家很多的建议,也引起了很多人的共鸣,在留言区分享了自己的故事,看着这些故事,我觉得都够苍何写一部小说了。 可惜苍…...

Java21 正则表达式

在 Java 21 中,正则表达式主要通过 java.util.regex 包提供支持,其核心组件包括 Pattern、Matcher 和 String 类中自带的方法(如 replaceAll 和 matches)。以下是关于正则表达式在 Java 21 中的详细介绍及一些新的特性或用法。 核…...

Docker安装PostGreSQL docker安装PostGreSQL 完整详细教程

Docker安装PostGreSQL docker安装PostGreSQL 完整详细教程 Docker常用命令大全Docker 运行命令生成Docker 上安装 PostGreSQL 14.15 的步骤:1、拉取 PostGreSQL 14.15 镜像2、创建并运行容器3、测试连接4、设置所有IP都可以运行连接进入容器内 修改配置文件关闭容器…...

leetcode:205. 同构字符串(python3解法)

难度:简单 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字…...

【Javascript Day9】对象定义、数组中对象元素排序、对象在内存中存储方法、对象构建联系

目录 . 取值运算符 > 用于对象属性或方法的调用操作 [] 取值运算符 > 可用于数组下标或者对象属性的取值操作 数组对象的排序 对象在内存中存储方式 对象的三种定义方式 1. 字面量对象 2. 基于Object构造对象 3. 自定义对象构造器创建对象 对象的构建练习 . 取值…...

运维作业一

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 首先,获得随机字符,需下载pwgen&am…...

数仓建模(三)建模三步走:需求分析、模型设计与数据加载

本文包含: 数据仓库的背景与重要性数据仓库建模的核心目标本文结构概览:需求分析、模型设计与数据加载 目录 第一部分:需求分析 1.1 需求分析的定义与目标 1.2 需求分析的步骤 1.2.1 业务需求收集 1.2.2 技术需求分析 1.2.3 成果输出…...

C语言的网络编程

C语言的网络编程 引言 随着互联网的快速发展,网络编程已经成为计算机科学与技术领域中不可或缺的一部分。C语言作为一种底层语言,以其高效、快速和灵活的特性,广泛应用于网络编程中。本文将深入探讨C语言在网络编程中的应用,包括…...

EE213 Lab3 virtuoso NAND NOR INV XOR HA designlayout(min size layout method)

目录 0 前言 1 设计目标 2 减小面积的layout画法 3 NAND 4 NOR 5 INV 6 XOR 7 HA 0 前言 记录一下来到skd上的强度比较大的一门课,数字集成电路2的lab设计还是蛮好的,该帖非详细教程只是单纯的写一些思虑并用作笔记,新手小白欢迎交…...

Qt——QTableWidget 限制单元格输入范围的方法(正则表达式输入校验法、自定义代理类MyItemDelegrate)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》...

mono3d汇总

lidar坐标系 lidar坐标系可以简单归纳为标准lidar坐标系和nucense lidar坐标系&#xff0c;参考链接。这个坐标系和车辆的ego坐标系是一致的。 标准lidar坐标系 opendet3d&#xff0c;mmdetection3d和kitt都i使用了该坐标系 up z^ x front| /| /left y <------ 0kitti采…...

机器学习第一道菜(一):线性回归的理论模型

机器学习第一道菜&#xff08;一&#xff09;&#xff1a;线性回归的理论模型 一、问题&#xff1a;千金买笑1.1 散点图1.2 机器学习能搞啥 二、模型的建立2.1 线性回归2.2 回归模型 前面讲了机器学习的“四大绝技”&#xff0c;今天&#xff0c;开始研究第一绝技“回归”&…...

Unity的Transform类

1.position 游戏对象的世界坐标以(0, 0, 0)为原点 2.localPosition 本地坐标&#xff0c;相对父物体坐标 3.eulerAngles 相对世界的欧拉角 4.localEulerAngles 本地欧拉角 5.rotation 相对世界四元数 6.localRotation 本地四元…...

指针的进阶

指针的主题&#xff0c;我们在初级阶段的《指针》章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1. 指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节&#xff08;32位平台/64位平台&#xff0…...

每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能

Cursor插件系统与扩展功能 一、课程概述 今天我们将学习Cursor AI的插件系统&#xff0c;了解如何通过插件扩展和增强IDE功能。由于Cursor AI基于VS Code开发&#xff0c;我们可以利用丰富的VS Code插件生态系统。 1.1 学习目标 了解插件系统原理掌握插件安装管理使用常用开…...

【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS

文章目录 1. 概述2. 网络传输安全2.1.什么是中间人攻击2.2. 加密和签名2.2.1.加密算法2.2.2.摘要2.2.3.签名 2.3.数字证书2.3.1.证书的使用2.3.2.根证书2.3.3.证书链 2.4.HTTPS 1. 概述 本篇主要是讲解讲一些安全相关的基本知识&#xff08;如加密、签名、证书等&#xff09;&…...

Dexie.js内存管理技巧:在大型数据集操作中避免浏览器崩溃

Dexie.js 内存管理技巧&#xff1a;避免浏览器崩溃 在使用 Dexie.js 操作 大型数据集 时&#xff0c;如果不注意内存管理&#xff0c;可能会导致浏览器内存溢出&#xff08;OOM&#xff0c;Out of Memory&#xff09;或崩溃。因此&#xff0c;以下 内存管理技巧 可用于优化性能…...

vscode项目依赖问题

必读 一定要将前端下拉的项目备份一下&#xff0c;很容易运行导致依赖报错&#xff0c;重新下载 命令 使用幽灵分解器安装 pnpm install 替代 npm install 设置淘宝NPM镜像源 yarn config set registry https://registry.npmmirror.com 查看目前依赖包的版本 npm list ant-d…...

LLMs之RAG:《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读

LLMs之RAG&#xff1a;《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读 导读&#xff1a;这篇论文针对在资源受限的边缘设备上部署检索增强生成 (RAG) 系统的挑战&#xff0c;提出了一种名为 EdgeRAG 的高效方法。EdgeRAG 通过巧妙地结合预计算、在线生成和缓存策…...

宇泰串口卡驱动在Ubuntu22.04编译、安装汇总

从官网下载驱动官网地址 上传到Ubuntu, 目录结构如下&#xff1a; 驱动源代码: 驱动代码是基于开源项目编译来的 编译路径不能有中文路径&#xff0c;否则可能有类似错误 源码是基于Linux2.3内核编译&#xff0c;我当前是6.8.0-51&#xff0c;数据结构有升级&#xff0c;需要调…...

python管理工具:conda部署+使用

python管理工具&#xff1a;conda部署使用 一、安装部署 1、 下载 - 官网下载&#xff1a; https://repo.anaconda.com/archive/index.html - wget方式&#xff1a; wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh2、 安装 在conda文件的…...

(三)html2canvas将HTML 转为图片并实现下载

将 HTML 转为图片并实现下载&#xff0c;通常可以使用一个叫做 html2canvas 的 JavaScript 库。html2canvas 能够将 HTML 元素及其样式渲染成一个画布 (Canvas)&#xff0c;然后将该画布转换为图片格式&#xff08;如 PNG 或 JPEG&#xff09;&#xff0c;最终提供下载功能。 …...

安装Docker流程

1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 2.配置Docker的yum库 首先要安装一个…...

flutter 使用google_mlkit_image_labeling做图片识别

在AI横行的如今&#xff0c;相信大家或多或少都做过跟AI接轨的需求了吧&#xff1f;今天我说的是关于图片识别的需求&#xff0c;flutter的专属图片识别插件google_mlkit_image_labeling。 google_mlkit_image_labeling它是Google旗下的Google Cloud Vision API中分支出来的一部…...

宝塔php7.4安装报错,无法安装,php8以上可以安装,以下的不行,gd库什么的都正常

宝塔的依赖问题导致的问题&#xff0c;最后手动挂载后才解决。。。废了三天三夜终于搞好了。。。。无语&#xff5e; 建议&#xff1a;不要一直升级宝塔版本&#xff0c;升级前备份或者开服务商的实例镜像&#xff0c;方便恢复&#xff0c;不然&#xff0c;可就GG了&#xff5…...

python中的RPA->playwright自动化录制脚本实战案例笔记

playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器&#xff1a;cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令&#xff1a; playwright codegen…...

Python在DevOps中的应用:自动化CI/CD管道的实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 在现代软件开发中&#xff0c;DevOps理念的引入极大地提升了开发与运维的协作效率&#xff0c;而持续集成&#xff08…...

Centos 离线安装杀毒软件

离线部署实现&#xff1a; 1、去官网下载对应的软件包&#xff0c;centos就下载 .rpm软件包。https://www.clamav.net/downloads2、将下载的软件包上传到服务器后使用rpm命令进行安装&#xff0c;软件包里面已经将相关依赖这些打包好了&#xff0c;直接安装就行。 rpm -ivh --…...

TiDB使用过程中需要注意的坑点:避免踩雷

TiDB使用过程中需要注意的坑点&#xff1a;避免踩雷 TiDB作为一个分布式数据库&#xff0c;虽然在许多场景下表现出色&#xff0c;但在使用过程中也有一些“坑”需要开发者特别注意。尤其是在生产环境中&#xff0c;踩雷可能会导致性能问题&#xff0c;甚至系统宕机。今天&…...

Mysql--实战篇--大数据量表的分页优化(自增长主键,子查询主键主查询全部,查询条件加索引,覆盖索引等)

当Mysql数据表存储大量数据时&#xff08;百万级别数据&#xff09;&#xff0c;分页查询的性能问题是一个常见的挑战。特别是当使用LIMIT和OFFSET时&#xff0c;随着OFFSET的增加&#xff0c;查询性能会显著下降。原因在于MySQL需要扫描并跳过前面的行&#xff0c;这会导致I/O…...

Datawhale组队学习笔记task1——leetcode面试题

文章目录 写在前面刷题流程刷题技巧 Day1题目1、0003.无重复字符的最长子串解答&#xff1a;2.00004 寻找两个正序数组的中位数解答&#xff1a;3.0005.最长回文子串解答4.0008.字符串转换整数解答&#xff1a; Day2题目1.0151.反转字符串中的单词解答2.0043.字符串相乘解答3.0…...

【快速入门 LVGL】-- 1、STM32 工程移植 LVGL

目录 一、LVGL 简述 二、复制一个STM32工程 三、下载 LVGL 四、裁剪 源文件 五、工程添加 LVGL 文件 六、注册 显示 七、注册 触摸屏 八、LVGL 心跳、任务刷新 九、开跑 LVGL 十、控件的事件添加、响应处理 十 一、几个好玩小事情 十 二、显示中文 ~~ 约定 ~~ 在…...

Mac使用-快速开始总结(持续更新)

目录 Mac使用-快速开始总结常用快捷键 Mac使用-快速开始总结 第一次使用mac&#xff0c;发现很多细节上和windows不一样&#xff0c;以下是自己遇到的常用总结&#xff0c;帮助自己快速熟悉mac的使用&#xff5e; 常用快捷键 复制、粘贴 快捷键&#xff1f; 复制&#xff1a;…...

Kubernetes (K8s) 入门指南

Kubernetes (K8s) 入门指南 什么是Kubernetes&#xff1f; Kubernetes&#xff0c;通常简称为 K8s&#xff08;因为从 “K” 到 “s” 之间有八个字符&#xff09;&#xff0c;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌设…...

归纳webpack

常用配置项 const HtmlWebpackPlugin require(html-webpack-plugin); // 通常用于生成HTML const MiniCssExtractPlugin require(mini-css-extract-plugin);// 用于分离CSS const cssMinimizerWebpackPlugin require("css-minimizer-webpack-plugin"); // 用于压…...

Web APP 阶段性综述

Web APP 阶段性综述 当前&#xff0c;Web APP 主要应用于电脑端&#xff0c;常被用于部署数据分析、机器学习及深度学习等高算力需求的任务。在医学与生物信息学领域&#xff0c;Web APP 扮演着重要角色。在生物信息学领域&#xff0c;诸多工具以 Web APP 的形式呈现&#xff…...

SpringBoot之OriginTrackedPropertiesLoader类源码学习

源码解析 /*** 作用是从给定的资源&#xff08;如文件或输入流&#xff09;中加载 .properties 文件&#xff0c;* 并将属性键值对转换为带有来源信息&#xff08;origin&#xff09;的 OriginTrackedValue 对象。*/ public class OriginTrackedPropertiesLoader {private fin…...

Flask学习入门笔记

Flask学习入门笔记 前言1. 安装Flask2. 创建一个简单的Flask应用3. 路由与视图函数3.1 基本路由3.2 动态路由3.3 HTTP方法 4. 请求与响应4.1 获取请求数据4.2 返回响应 5. 模板渲染5.1 基本模板渲染5.2 模板继承 6. 静态文件6.1 静态文件的目录结构6.2 在模板中引用静态文件6.2…...

List 接口的实现类

在 Java 中&#xff0c;List 是一个非常常用的接口&#xff0c;提供了有序、可重复的元素集合。List 接口有多个实现类&#xff0c;每个实现类都有其特定的特性和适用场景。以下是 Java 中主要实现了 List 接口的类及其详细介绍。 1. 常见的 List 实现类 1.1 ArrayList 简介&…...

SpringCloud-基于Docker和Docker-Compose的项目部署

一、初始化环境 1. 卸载旧版本 首先&#xff0c;卸载可能已存在的旧版本 Docker。如果您不确定是否安装过&#xff0c;可以直接执行以下命令&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logro…...

【人工智能】Python中的自动化机器学习(AutoML):如何使用TPOT优化模型选择

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 随着机器学习在各行业的广泛应用&#xff0c;模型选择和优化成为了数据科学家面临的主要挑战之一。自动化机器学习&am…...

Kafka 超级简述

Kafka 就是一个 分布式的消息系统&#xff0c;它帮助不同的系统和应用之间传递信息。可以把它想象成一个超级高效的 “邮局”&#xff1a; 生产者&#xff08;Producer&#xff09; 就是把信息&#xff08;消息&#xff09;送到这个 “邮局” 的人。消费者&#xff08;Consume…...

tomcat项目运行后报500

HTTP状态 500 - 内部服务器错误 类型 异常报告消息 实例化Servlet类[com.mdy.servlet_02.LifeDemoServlet]异常描述 服务器遇到一个意外的情况&#xff0c;阻止它完成请求。例外情况jakarta.servlet.ServletException: 实例化Servlet类[com.mdy.servlet_02.LifeDemoServlet]异常…...

Chapter1:初见C#

参考书籍&#xff1a;《C#边做边学》&#xff1b; 1.初见C# 1.1 C#简介 C # {\rm C\#} C#编写了许多完成常用功能的程序放在系统中&#xff0c;把系统中包含的内容按功能分成多个部分&#xff0c;每部分放在一个命名空间中&#xff0c;导入命名空间语法格式如下&#xff1a; /…...

SQL-leetcode—620. 有趣的电影

620. 有趣的电影 表&#xff1a;cinema ------------------------ | Column Name | Type | ------------------------ | id | int | | movie | varchar | | description | varchar | | rating | float | ------------------------ id 是该表的主键(具有唯一值的列)。 每行包含…...

《鸿蒙Next平台:决策树面对噪声数据的鲁棒性逆袭》

在机器学习领域&#xff0c;决策树是一种强大的模型&#xff0c;但训练数据中的噪声往往会影响其性能和鲁棒性。在鸿蒙Next平台上&#xff0c;我们可以采用多种策略来增强决策树模型在面对噪声数据时的鲁棒性。 数据预处理层面 数据清洗&#xff1a;利用鸿蒙Next平台的数据处理…...

minio https配置

如果使用了官网的教程 使用minio-user作为启动用户 准备好&#xff1a;文件名要定死&#xff0c;因为minio只认识key和crt文件 将xxxxx.key重命名为private.key 将xxxxx.pem重命名为public.crt 将这两个文件放到/home/minio-user/.minio/certs/ 目录下 chown -r minio…...

Windows重装后NI板卡LabVIEW恢复正常

在重新安装Windows系统后&#xff0c;NI&#xff08;National Instruments&#xff09;板卡能够恢复正常工作&#xff0c;通常是由于操作系统的重新配置解决了之前存在的硬件驱动、兼容性或配置问题。操作系统重装后&#xff0c;系统重新加载驱动程序、清理了潜在的冲突或损坏的…...

Spring Initializr创建springboot项目 “java: 错误: 无效的源发行版:19”

我用的1.8的jdk&#xff0c;排查发现这是jdk和springboot版本冲突导致的。 1、File->Project Structure->Module->source和dependancies改成相应的版本 2、File->Setting->Build,Execution,Deployment->Compiler->Java Compiler->target bytecode ver…...