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

攻防世界GFSJ1229 Three

题目编号:GFSJ1229

解题过程

1. 附件下载是三个压缩包A.zip B.zip C.zip和一个python程序Three.py


2. A.zip可以直接解压出来,内容如下:

```
'2022-08-27 20:16:04.246131' Func A0*X0+B0
'2022-08-27 20:16:05.116859' Read_Data A0.txt->A0(28829613228241459)
'2022-08-27 20:16:06.097964' Secret_Share A0
'2022-08-27 20:16:07.022455' Get A00(200254991086689) A01(200241552690281)
'2022-08-27 20:16:07.925862' Get X00(200058430391504) X01(200401773940794)
'2022-08-27 20:16:09.077771' Mul_loc_compute A0,X0->C00
'2022-08-27 20:16:10.764928' RGet C02(924422050091355025836012334663090)
'2022-08-27 20:16:11.213530' ReShare C00(random mask is 507412160912)
'2022-08-27 20:16:12.153062' Get B00(199957680670222) B01(200362172648094)
'2022-08-27 20:16:13.100727' Add_loc_compute C00,B00->Y00
'2022-08-27 20:16:13.281906' ReShare Y00(random mask is -1008362525723)
'2022-08-27 20:16:14.017485' RGet Y02(924422050091362838179268571917871)
'2022-08-27 20:16:17.000001' Open Y00
'2022-08-27 20:16:17.000101' RGet Y01(12163251699969281466186532960410)
'2022-08-27 20:16:17.000299' Cyberloafing!!
'2022-08-27 20:16:17.004194' ReBuild Y0
'2022-08-27 20:16:17.013270' Save_Data

```
3. B.zip 和C.zip有密码,查看Three.py,代码加了注释后如下:


```Python
import datetime

import numpy as np

  

# 协议类,用于处理多方参与的加密计算

class Protocol:

def __init__(self, party_num):

# 初始化协议类,指定当前参与方编号 (party_num: 0, 1, 或 2)

self.pn = party_num # 参与方编号 (party_num: 0, 1, 2)

  

def Read_Data(self, path):

# 读取数据文件中的内容,尝试将其转换为数值(整数或浮点数)

data = open(path).readline().strip() # 从文件中读取一行数据并去除首尾空格

try:

if '.' in data:

data = float(data) # 如果数据包含小数点,则转换为浮点数

else:

data = int(data) # 否则,转换为整数

except:

# 如果转换失败,打印错误信息并退出程序

print('No number')

exit(-1)

return data # 返回读取的数据

  

def Get(self, x1, x2):

# 获取两个秘密共享的值 (函数未实现)

pass

  

def RGet(self, x1):

# 获取一个秘密共享的值 (函数未实现)

pass

  

def ReShare(self, x):

# 重新共享值 x,x = x + ri,其中 r0 + r1 + r2 = 0

# ri (i=0,1,2) 是随机整数,然后将 x 发送给 (self.pn + 1) % 3 的参与方

pass

  

def Secret_Share(self, x):

# 秘密共享函数,将 x 拆分为三个秘密共享的值

# x1 和 x2 是随机整数,x3 = x - x1 - x2

# sharelist 存储了三部分的秘密共享值,loc 确定了当前参与方的位置

# reserved 保存了两个与当前参与方相关的共享值,用于后续计算

x1, x2 = np.random.randint(0, 100), np.random.randint(0, 100) # 随机生成 x1 和 x2

x3 = x - x1 - x2 # 计算 x3,使 x1 + x2 + x3 = x

sharelist = [x1, x2, x3] # 将 x 分成三个部分

loc = self.pn # 当前参与方的位置

self.reserved = (sharelist[loc], sharelist[(loc + 1) % 3]) # 保留两个共享值

return (sharelist[0], sharelist[1]), (sharelist[1], sharelist[2]), (sharelist[2], sharelist[0])

  

def Mul_loc_compute(self, x1, y1, x2, y2):

# 局部乘法计算,使用秘密共享的 x1 和 y1 计算乘积

# 计算过程为 x1*y1 + x1*y2 + x2*y1,并将结果存储在 self.mulx

self.mulx = x1 * y1 + x1 * y2 + x2 * y1

  

def Add_loc_compute(self, x1, y1):

# 局部加法计算,计算两个共享值的和并存储在 self.addx

self.addx = x1 + y1

  

def Cyberslacking(self):

# 打印表示 "消极工作" 的消息 (仅作示例用途)

print('Cyberloafing!!')

print('Cyberloafing!!')

print('Cyberloafing!!')

  

def Save_Data(self):

# 保存数据的默认方法 (可选)

# 使用当前时间生成密码 (pwd),压缩所有数据后重建函数的答案 (未实现)

pwd = str(datetime.datetime.now())

pass

  

def Func(self, expression):

# 打印数学表达式,将会计算表达式,但保证隐私不泄露

print('Math expression', expression, 'will be computed! You can get the answer without leak your privacy!')

  

def ReBuild(self, x1, x2, x3):

# 重建函数的答案,利用秘密共享的值 x1, x2, x3 求和得到原始数据

return x1 + x2 + x3

  

# 示例:A0 表示 'flag{xxxxxxxxxxx',X0 表示 xxxxx...xxx,B0 表示 xxxxxxxxx}

# A (参与方 0) 拥有 A0,B (参与方 1) 拥有 X0,C (参与方 2) 拥有 B0

# 函数表示 A0 * X0 + B0

p0 = Protocol(0)

p1 = Protocol(1)

p2 = Protocol(2)
```
是C的算法,其中pwd = str(datetime.datetime.now())暴露了如何计算密码的,密码格式为当前时间精确到微秒,如'YYYY-MM-DD HH:MM:SS.ssssss'。

4. 破解C.zip的密码:


```python
## Three.py是C的算法

  

import zipfile # 导入 zipfile 库,用于处理 ZIP 文件

  

def extract(file, password):

"""

解压指定的 ZIP 文件到当前目录,使用给定的密码解压缩。

参数:

- file: 要解压缩的 zipfile.ZipFile 对象

- password: 解压密码,以字符串列表的形式提供

"""

file.extractall(path='.', pwd=''.join(password).encode('utf-8')) # 将密码拼接为字符串并编码为 UTF-8 格式

  

# 初始化空的密码列表,将用于存储所有可能的密码组合

password_lst = []

# 设置密码前缀,假设所有密码以同一时间戳前缀开头

prestr = '2022-08-27 20:16:17.'#从A.txt中找到getData的起始时间

  

# 构造 6 位数的密码组合并添加到 password_lst 列表中

for i in range(0, 999999): # 生成从 000000 到 999999 的所有可能组合

s = str(i) # 将数字转换为字符串

tmpnum = '0' * (6 - len(s)) + s # 前面补足 0 使其成为 6 位数

password_lst.append(prestr + tmpnum) # 将时间戳前缀和 6 位数字组合并添加到密码列表

  

# 打开指定路径的 ZIP 文件,并设为读模式

zfile = zipfile.ZipFile("C.zip", 'r')

  

# 遍历所有可能的密码,尝试解压 ZIP 文件

for pwd in password_lst:

try:

extract(zfile, pwd) # 尝试使用当前密码解压缩

print(pwd) # 如果解压成功,打印正确的密码

break # 成功后退出循环

except:

continue # 如果解压失败(密码错误),继续尝试下一个密码

  

##print: 2022-08-27 20:16:17.930813
```

5. 使用上面获得的密码解压C.zip, 获得C.txt内容如下:


```
'2022-08-27 20:16:04.911132' Func A0*X0+B0
'2022-08-27 20:16:07.201341' Get A02 A00
'2022-08-27 20:16:07.800077' Get X02 X00
'2022-08-27 20:16:08.303948' Mul_loc_compute A0,X0->C02
'2022-08-27 20:16:10.662982' ReShare C02
'2022-08-27 20:16:10.872634' RGet C01
'2022-08-27 20:16:11.412399' Read_Data B0.txt->B0
'2022-08-27 20:16:11.729341' Secret_Share B0
'2022-08-27 20:16:11.800012' Get B02 B00
'2022-08-27 20:16:12.214092' Add_loc_compute C02,B02->Y02
'2022-08-27 20:16:13.334908' ReShare Y02(random mask is 507036073644)
'2022-08-27 20:16:13.923122' RGet Y01
'2022-08-27 20:16:15.000382' Open Y02
'2022-08-27 20:16:17.000892' RGet Y00
'2022-08-27 20:16:17.009702' Cyberloafing!!
'2022-08-27 20:16:17.019991' ReBuild Y0
'2022-08-27 20:16:17.930813' Save_Data
```

6. A.txt和C.txt提供了A0、A1以及加密分享和掩码,以及过程中的Y0和X0相关值,可以逆向计算,因为总的计算公式是A0*X0+B0=Y0,可以求出B0,计算程序如下:


```python
from Crypto.Util.number import long_to_bytes

  

# 定义局部乘法计算函数

# 通过已知的秘密共享值 A00、A01、X00 和 X01,计算出 C00 的真实值

# 此函数在秘密共享中用于计算多方参与的局部乘法

def Mul_loc_compute(x1, y1, x2, y2):

return x1 * y1 + x1 * y2 + x2 * y1

  

# 已知的 A0 值和各秘密共享的具体值,根据日志记录得出以下共享值:

# A0:是目标值,日志显示为 28829613228241459。

# A00_true 和 A01_true 是 A0 的两个共享值,来自 A 方日志的 'Get A00' 和 'Get A01'。

# X00_true 和 X01_true 是 X0 的两个共享值,来自 A 方日志的 'Get X00' 和 'Get X01'。

A0 = 28829613228241459

A00_true = 200254991086689

A01_true = 200241552690281

X00_true = 200058430391504

X01_true = 200401773940794

B00_true = 199957680670222

  

# 计算 C00 的真实值

# 使用 Mul_loc_compute 函数来计算局部乘法结果 C00_true,以便后续计算。

# 通过 A00_true 和 X00_true, A01_true 和 X01_true 的共享值计算得出。

C00_true = Mul_loc_compute(A00_true, X00_true, A01_true, X01_true)

  

# 根据日志,C00 经过了掩码操作,掩码值为 507412160912,来源于 A 方日志的 'ReShare C00'。

# 计算带掩码的 C00 值(C00_mask),供后续 Y00 的计算使用。

C00_mask = C00_true + 507412160912

  

# 计算 Y00_true

# 根据 A 方日志的 'Add_loc_compute C00,B00->Y00' 可知 Y00 是 C00 和 B00 的局部相加结果

# 因此,Y00_true = C00_mask + B00_true。

Y00_true = C00_mask + B00_true

  

# A 方日志的 'ReShare Y00' 显示 Y00 被应用了掩码 -1008362525723

# 计算出 Y00 的带掩码值 Y00_mask,以供最终计算使用。

Y00_mask = Y00_true + (-1008362525723)

  

# 读取 C 方日志获取 Y02 的带掩码值 924422050091362838179268571917871 和掩码 507036073644

# Y02_mask 和 Y02_true 分别表示 Y02 的带掩码值和真实值

Y02_mask = 924422050091362838179268571917871

Y02_true = Y02_mask - 507036073644

  

# C 方日志显示 Y01_mask 值为 12163251699969281466186532960410,将其直接使用

Y01_mask = 12163251699969281466186532960410

  

# A 方日志显示 C02_mask 的值为 924422050091355025836012334663090

# 使用 Y02_true 和 C02_mask 计算 B02_true,这是 B0 的一部分。

C02_mask = 924422050091355025836012334663090

B02_true = Y02_true - C02_mask

  

# 根据 A 和 C 日志中 B 的各共享值 (B00_true, B01_true) 以及计算出的 B02_true

# 还原 B0 值,这是最终的关键结果之一。

B01_true = 200362172648094

B0 = B00_true + B01_true + B02_true

  

# 计算 Y0 的总和,用于还原 X0 值

# 使用 Y00_mask、Y01_mask 和 Y02_mask,通过累加得到 Y0 的值

Y0 = Y00_mask + Y01_mask + Y02_mask

  

# 计算 X0 值

# 根据公式 X0 = (Y0 - B0) // A0 计算得出 X0,这是最终需要的另一个关键结果

X0 = (Y0 - B0) // A0

  

# 将 A0、X0 和 B0 转换为 ASCII,并组合成 flag,代表最终解密的结果。

flag = long_to_bytes(A0) + long_to_bytes(X0) + long_to_bytes(B0)

print(flag)# b'flag{23snyau_sllpmxcz}'
```


7. 备注解释下多方加密(by AI)


在这个三方安全计算协议中,`A00`、`B00`、`C00`、`X00` 等变量是每个参与方持有的秘密共享值的部分。这些共享值通过分割和掩码等方式隐藏了原始数据,在不泄露完整信息的情况下进行计算。

### 各变量的含义

- **A0、B0、X0**:这些是原始值,代表 Allen、Bob 和其他参与方各自拥有的秘密数据。例如:
  - `A0`:由 Allen 持有的原始值。
  - `X0`:是 Allen 和其他参与方希望参与计算的一个值。
  - `B0`:由 Bob 持有的原始值。

- **A00、B00、C00、X00**:这些是 `A0`、`B0`、`C0`、`X0` 的分片,每个原始值被分割为多份秘密共享的片段,各参与方只持有其中一部分。
  - **A00**:`A0` 的分片,由参与方之一持有。
  - **B00**:`B0` 的分片,由参与方之一持有。
  - **C00**:`C0` 的分片,这是计算过程中生成的中间结果。
  - **X00**:`X0` 的分片。

这些分片和共享值的划分是为了让多个参与方共同进行计算,同时保护隐私,使得单个参与方无法独立得出完整的原始数据。

### 计算流程概述

在一次多方计算中,每个参与方通过持有的共享值分片参与运算,具体的流程如下:

1. **秘密共享(Secret Sharing)**:
   - 将每个参与方的原始值(如 `A0`、`B0`、`X0`)分成多个共享片段,如 `A00`、`A01`、`A02` 等。
   - 这些共享片段被分配给不同的参与方。例如,Allen 可能持有 `A00`,Bob 持有 `A01`,Crosley 持有 `A02`。这样,任何单独一个片段都无法还原 `A0` 的完整值。

2. **局部计算(Local Computation)**:
   - 每个参与方在自己持有的分片上执行局部计算。例如:
     - Allen 计算 `A00 * X00`,Bob 计算 `A01 * X01`,Crosley 计算 `A02 * X02`。
   - 这些局部计算结果形成了 `C00`、`C01`、`C02` 等中间共享值。

3. **重新共享和掩码处理(ReShare and Masking)**:
   - 为了防止泄露中间结果,每个参与方会给自己的计算结果加上随机掩码。例如,Allen 的局部计算结果 `C00` 会加上一个掩码 `C00_mask`。
   - 然后,带掩码的结果 `C00_mask` 会被共享给其他参与方,以供后续的合并计算。

4. **合并局部结果(Combine Local Results)**:
   - 所有局部计算的结果(如 `C00_mask`, `C01_mask`, `C02_mask`)在各参与方间汇总,通过计算得到最终结果的共享值。
   - 合并结果的过程确保了各参与方能共同计算出所需的结果(例如 `A0 * X0 + B0`),而每个参与方都不会泄露自己的原始数据。

5. **最终重建(ReBuild)**:
   - 当所有计算完成后,所有共享值可以重构为最终结果。各方将合并后的共享值返回给 Allen,Allen 可以使用这些值恢复出最终的结果。

### 例子:如何运作

假设 Allen 希望计算 `A0 * X0 + B0`,整个过程可以总结如下:

1. **秘密共享阶段**:`A0`、`X0` 和 `B0` 被分割成 `A00, A01, A02`,`X00, X01, X02`,`B00, B01, B02` 三个部分,每个参与方持有一部分。
2. **局部计算**:每个参与方计算 `A00 * X00`、`A01 * X01`、`A02 * X02`。
3. **掩码和重新共享**:每个局部结果加上随机掩码,形成 `C00_mask`、`C01_mask`、`C02_mask`,防止泄露中间数据。
4. **加法和最终重建**:各方汇总带掩码的局部结果,并执行加法操作得到加法结果 `Y0`。最终 `Y0` 被重构并解码,恢复出最终的计算结果。

通过这种流程,所有参与方可以在保护数据隐私的同时共同完成 `A0 * X0 + B0` 的计算。

相关文章:

攻防世界GFSJ1229 Three

​ 题目编号:GFSJ1229 解题过程 1. 附件下载是三个压缩包A.zip B.zip C.zip和一个python程序Three.py 2. A.zip可以直接解压出来,内容如下: 2022-08-27 20:16:04.246131 Func A0*X0B0 2022-08-27 20:16:05.116859 Read_Data A0.txt->A0(28829613228…...

2023 icpc杭州(M,J,D,G,H)

文章目录 [M. V-Diagram](https://codeforces.com/gym/104976/problem/M)[J. Mysterious Tree](https://codeforces.com/gym/104976/problem/J)[D.Operator Precedence](https://codeforces.com/gym/104976/problem/D)[G. Snake Move](https://codeforces.com/gym/104976/probl…...

在CentOS 7上安装Alist

在CentOS 7上安装Alist 的步骤如下: 1. 卸载旧版本 如果你之前安装过旧版本的Docker,可以先卸载它: sudo yum remove docker docker-common docker-snapshot docker-engine2. 安装依赖包 确保你的系统是最新的,并安装必要的依…...

【C/C++】memcpy函数的模拟实现

零.导言 上一篇博客我们学习了memcpy函数,不妨我们现在尝试模拟实现memcpy函数的功能。 一.实现memcpy函数的要点 memcpy函数是一种C语言内存函数,可以按字节拷贝任意类型的数组,因此我们自定义的模拟函数需要两个无类型的指针参数&#xff…...

嵌入式开发之线程互斥

目录 互斥锁初始化-pthread_mutex_init 申请锁-pthread_mutex_lock 释放锁-pthread_mutex_unlock 同步 VS 互斥 临界资源:一次只允许一个任务(进程、线程)访问的共享资源,不允许多个任务同时访问的。 临界区:访问临界区的代码 互斥机制:mutex互斥锁,任务访问临界资…...

JavaScript 变量作用域与函数调用机制:var 示例详解

JavaScript 变量作用域与函数调用机制:var 示例详解 在 JavaScript 中,作用域和闭包是理解变量生命周期和行为的核心概念。通过以下这段代码,我们将详细分析如何在不同的作用域内使用 var 关键字,并解释相关的变量访问规则 代码解…...

Linux(CentOS)安装 JDK

1、下载 JDK 官网:https://www.oracle.com/ 2、上传 JDK 文件到 CentOS,使用FinalShell远程登录工具,并且使用 root 用户登录 3、解压 JDK 创建目录 /export/server mkdir -p /export/server 解压到目录 /export/server tar -zxvf jdk-17…...

AI产品经理实战手册:策略、开发与商业化指南

通过《AI产品经理手册》,将可以了解不同类型的AI,如何将AI整合到产品或业务中,以及支持创建AI产品或将AI集成到现有产品所需的基础设施。熟悉实践管理AI产品开发流程、评估和优化AI模型,以及应对与AI产品相关的复杂伦理和法律问题…...

【大语言模型】ACL2024论文-06 探索思维链COT在多模态隐喻检测中的应用

【大语言模型】ACL2024论文-06 探索思维链COT在多模态隐喻检测中的应用 目录 文章目录 【大语言模型】ACL2024论文-06 探索思维链COT在多模态隐喻检测中的应用目录摘要研究背景问题与挑战如何解决创新点算法模型1. 知识总结模块(Knowledge Summarization Module&…...

Linux之初体验

目录 第1关:1-Linux初体验 第2关:1-Linux常用命令 第3关:1-Linux 查询命令帮助语句 第4关:2--查询命令-locate 第5关:2--查询命令-which/whereis 第6关:2--查询命令-find 第7关:3-Linux文…...

现代化水电管理:Spring Boot在大学城的实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

黑马官网2024最新前端就业课V8.5笔记---HTML篇

Html 定义 HTML 超文本标记语言——HyperText Markup Language。 标签语法 标签成对出现&#xff0c;中间包裹内容<>里面放英文字母&#xff08;标签名&#xff09;结束标签比开始标签多 /拓展 &#xff1a; 双标签&#xff1a;成对出现的标签 单标签&#xff1a;只有开…...

GS-Blur数据集:首个基于3D场景合成的156,209对多样化真实感模糊图像数据集。

2024-10-31&#xff0c;由韩国首尔国立大学的研究团队创建的GS-Blur数据集&#xff0c;通过3D场景重建和相机视角移动合成了多样化的真实感模糊图像&#xff0c;为图像去模糊领域提供了一个大规模、高覆盖度的新工具&#xff0c;显著提升了去模糊算法在真实世界场景中的泛化能力…...

Linux下Java的多种方式安装

Linux下Java的多种方式安装 博客&#xff1a; www.lstar.icu 开源地址 Gitee 地址&#xff1a; https://gitee.com/lxwise/iris-blog_parent Github 地址&#xff1a; https://github.com/lxwise/iris-blog_parent 序言 Java是一门面向对象的编程语言&#xff0c;不仅吸收了…...

Android Studio:connect time out

参考&#xff1a;Android Studio&#xff1a;connect time out_android studio connection timed out-CSDN博客...

A014-基于Spring Boot的家电销售展示平台设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…...

数学期望和联合概率密度

数学期望的定义 数学期望是描述随机变量平均趋势的一个重要统计量。根据随机变量的类型&#xff08;离散或连续&#xff09;&#xff0c;数学期望的定义有所不同。 离散型随机变量的数学期望&#xff1a; 若离散型随机变量 X X X取值为 x 1 , x 2 , … , x n , … x_1,x_2,\do…...

萤石私有化设备视频平台EasyCVR视频融合平台如何构建农业综合监控监管系统?

现代农业的迅速发展中&#xff0c;集成监控管理系统已成为提高农业生产效率和优化管理的关键工具。萤石私有化设备视频平台EasyCVR&#xff0c;作为一个具有高度可扩展性、灵活的视频处理能力和便捷的部署方式的视频监控解决方案&#xff0c;为农业监控系统的建设提供了坚实的技…...

【MongoDB】Windows/Docker 下载安装,MongoDB Compass的基本使用、NoSQL、MongoDB的基础概念及基础用法(超详细)

文章目录 Windows下载MongoDB Compass使用NoSQL的基本概念MongoDB常用术语MongoDB与RDBMS区别MongoDB的CRUD 更多相关内容可查看 Docker安装MongoDB可查看&#xff1a;Docker-安装MongoDB Windows下载 官网下载地址&#xff1a;https://www.mongodb.com/try/download/communi…...

微信小程序-自定义导航栏

一.自定义导航栏 1.JSON文件中配置"navigationStyle": “custom” "navigationStyle": "custom"2.给导航栏设置轮播图 <swiper class"custom-swiper" indicator-dots autoplay interval"2000"> <swiper-item>…...

vue中强制更新视图

vue3 中强制更新视图 方式 通过 $forceUpdate 与 vue2 相似 import {getCurrentInstance} from vueconst internalInstance getCurrentInstance() //操作数据后更新视图 internalInstance.ctx.$forceUpdate()通过 key 值改变更新 <compName :key"key" />co…...

mqsql 场景函数整理

场景1&#xff1a;行数据取多字段&#xff0c;取到有值为止 解决方案&#xff1a; mysql coaleace函数 场景2&#xff1a;字符串拼接文本并换行 解决方案1&#xff1a; mysql concate() 和char(10) 场景3&#xff1a;获取单汉字首拼 解决方案1&#xff1a;单汉字获取首拼 解…...

【AI日记】24.11.05 向量数据库 weaviate、混合搜索、多语言搜索、明确自己的南京

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 工作1 内容&#xff1a;学习deeplearning.ai的课程课程&#xff1a;Vector Databases: from Embeddings to Applications时间&#xff1a;6小时评估&#xff1a;不错&#xff0c;完成收获&#xff1a;学…...

Scrapy入门

Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。 安装scrapy pip install scrapy2.5.0 1.新建 Scrapy项目 scrapy startproject mySpider # 项目名为mySpider 2.进入到spiders目录 cd mySpider/mySpider/spiders 3.创建爬虫 scrapy gensp…...

Ubantu/Linux 采用Repo或Git命令报错!!

简言: 遇事还是不要慌,出现这些问题,很正常的;如果那些你不需要,只是需要回到某一个版本,那么就是需要,方法可以尝试回退节点,也可以尝试强行merge合入冲突,或找到冲突文件解决,但这些方法都非常的繁杂且不实用。以下是研究出来的解决方案! 记得随时使用git statu…...

C++简单工厂模式

什么是简单工厂模式&#xff1f; 简单工厂模式属于创造型模式&#xff0c;而工厂就是负责生产和创造的&#xff0c;顾名思义。建立对象的类就如一个工厂&#xff0c;而需要被建立的对象就是一个个产品&#xff1b;在工厂中加工产品&#xff0c;使用产品的人&#xff0c;不用在…...

讲讲 kafka 维护消费状态跟踪的方法?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲 kafka 维护消费状态跟踪的方法&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲讲 kafka 维护消费状态跟踪的方法&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#x…...

MySQL 和 PostgreSQL 的对比概述

MySQL 和 PostgreSQL 是两种广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它们各自有其特点和优缺点。以下将从多个方面对它们进行详细比较。 1. 介绍 MySQL&#xff1a; MySQL 由瑞典公司 MySQL AB 开发&#xff0c;2008 年被 Sun Microsyst…...

【Python单元测试】pytest框架单元测试 配置 命令行操作 测试报告 覆盖率

单元测试&#xff08;unit test&#xff09;&#xff0c;简称UT。本文将介绍在Python项目中&#xff0c;pytest测试框架的安装&#xff0c;配置&#xff0c;执行&#xff0c;测试报告与覆盖率 pytest简介 pytest是一款流行的&#xff0c;简单易上手的单元测试框架&#xff0c;…...

【牛客刷题记录】【JAVA】栈

(1) 用两个栈实现队列 链接 很简单&#xff0c;如果有元素进入队列&#xff0c;则将其进入stack1。如果要出队列&#xff0c;那么就需要判断stack2的情况。人与法国stack2为空&#xff0c;则直接把stack1的元素全放进stack2&#xff08;相当于顺序反过来&#xff09;&#xff…...