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

半导体数据分析(二):徒手玩转STDF格式文件 -- 码农切入半导体系列

一、概述

在上一篇文章中,我们一起学习了STDF格式的文件,知道了这是半导体测试数据的标准格式文件。也解释了为什么码农掌握了STDF文件之后,好比掌握了切入半导体行业的金钥匙。

从今天开始,我们一起来一步步地学习如何解构、熟悉、掌握、玩弄这个STDF。并最终尝试写一个完整的 STDF解析器,最后发布到网上成为一个公共库。

了解这个文件,首先需要了解STDF的标准。我们知道,了解标准是一件很繁琐的事情,所以我们现在要做的是一步步开始,从创建和读取最简单的stdf格式的文件作为起始点,逐步探索STDF的核心。

实际上PYTHON 已经有两种第三方库来读取STDF文件,但经过我的测试,并不是很理想,多数时候会在读取STDF的时候报错,或者漏掉一些关键信息。所以,我们今天徒手来盘弄这个stdf文件。

二、文件结构

一个基本的STDF文件,结构是这样的:

STDF File
├── Record (repeated for each record in the file)
│   ├── Header (6 bytes)
│   │   ├── REC_LEN (2 bytes) : Record Length (total length of the record including header)
│   │   ├── REC_TYP (1 byte)  : Record Type (identifies the kind of record)
│   │   └── REC_SUB (1 byte)  : Record Sub-Type (further specifies the record type)
│   └── Body (variable length, depending on REC_TYP and REC_SUB)
│       ├── Field (repeated for each field in the record)
│       │   ├── Field Name    : Descriptive name for the field
│       │   ├── Data Type     : Specifies the data type of the field
│       │   └── Value         : The actual data stored in the field
│       └── [Additional Fields as specified by the record type]
└── [More Records as needed]

 上面的内容可以看出,标准STDF包含了 头文件 和记录文件 两个主要内容。

其中

  • REC TYPE 是主记录的标识。
  • REC_SUB 是主记录下的子标识。

以下是STDF的全部记录类型

今天我们要创建一个最简单的带有头文件的STDF格式文件,就需要理解STDF(Standard Test Data Format)的基本结构。STDF是一种二进制格式,用于半导体测试设备之间交换测试数据。每个STDF记录由一个固定长度的头和可变长度的数据字段组成。

根据标准,我们知道每个STDF记录都包含一个头部,该头部至少包括三个字段:记录长度、记录类型(REC_TYP)、记录子类型(REC_SUB)。我们将创建一个最小的STDF文件,它将仅包含File Attributes Record (FAR) 和 Master Information Record (MIR),因为它们是每个STDF文件必需的。

 它的格式如下:

STDF File
├── FAR (File Attributes Record)
│   ├── Header (6 bytes)
│   │   ├── REC_LEN (2 bytes) : Length of FAR record including header
│   │   ├── REC_TYP (1 byte)  : 0 (for FAR)
│   │   └── REC_SUB (1 byte)  : 10 (for FAR)
│   └── Body (variable length)
│       ├── Version           : STDF version number (1 byte)
│       └── CPU_Type          : Type of CPU used to generate the file (1 byte)
├── MIR (Master Information Record)
│   ├── Header (6 bytes)
│   │   ├── REC_LEN (2 bytes) : Length of MIR record including header
│   │   ├── REC_TYP (1 byte)  : 1 (for MIR)
│   │   └── REC_SUB (1 byte)  : 10 (for MIR)
│   └── Body (variable length)
│       ├── Head Count        : Number of test heads (2 bytes)
│       ├── Site Count        : Number of test sites per head (2 bytes)
│       ├── Date/Time First Part Tested (4 bytes each)
│       ├── Date/Time Last Part Tested (4 bytes each)
│       ├── Test Operator     : ID of the operator who ran the tests (variable length string)
│       ├── Test Station ID   : ID of the station where tests were performed (variable length string)
│       ├── Lot ID            : Identifier for the lot being tested (variable length string)
│       ├── Wafer ID          : Identifier for the wafer being tested (variable length string)
│       └── Flat/Notch Indicator: Orientation of the wafer flat or notch (1 byte)
└── [Potentially more records, depending on the file content]

三、文件创建

以下是Python代码示例,它将创建一个简单的STDF文件,其中包含FAR和MIR记录:

import structdef create_stdf_file(filename):# FAR - File Attributes Recordfar_rec_typ = 0  # Record Type for FARfar_rec_sub = 10  # Record Subtype for FARfar_data = b'\x04\x00'  # Version and CPU type, example values# MIR - Master Information Recordmir_rec_typ = 1  # Record Type for MIRmir_rec_sub = 10  # Record Subtype for MIRmir_data = (b'\x02\x00' +  # Head count, site countb'\xFF\xFF' +  # Date of first part tested (not used)b'\xFF\xFF\xFF\xFF' +  # Time of first part tested (not used)b'\xFF\xFF' +  # Date of last part tested (not used)b'\xFF\xFF\xFF\xFF' +  # Time of last part tested (not used)b'\x00\x00\x00\x00' +  # Test Operator (not used)b'\x00\x00\x00\x00' +  # Test Station ID (not used)b'\x00\x00\x00\x00' +  # Lot ID (not used)b'\x00\x00\x00\x00' +  # Wafer ID (not used)b'\x00\x00\x00\x00'  # Flat/notched indicator (not used))with open(filename, 'wb') as f:# Write FAR recordfar_length = len(far_data) + 4  # Including header lengthfar_header = struct.pack('>HBB', far_length, far_rec_typ, far_rec_sub)f.write(far_header + far_data)# Write MIR recordmir_length = len(mir_data) + 4  # Including header lengthmir_header = struct.pack('>HBB', mir_length, mir_rec_typ, mir_rec_sub)f.write(mir_header + mir_data)create_stdf_file('simple.stdf')

代码解释:

这段代码用于创建一个简单的 STDF 文件,并写入两个类型的记录:FAR(File Attributes Record)和 MIR(Master Information Record)。它会按照 STDF 格式组织数据,并将其写入文件。

1. 导入模块

import struct
  • struct 模块用于处理二进制数据的打包(packing)和解包(unpacking),即将数据转换为字节流,这在读取或写入二进制文件时非常有用。

2. 定义 create_stdf_file 函数

def create_stdf_file(filename):
  • 这是定义的一个函数,接收文件名 filename 作为参数,用来生成 STDF 文件。

3. FAR(File Attributes Record)记录

# FAR - File Attributes Record
far_rec_typ = 0  # Record Type for FAR
far_rec_sub = 10  # Record Subtype for FAR
far_data = b'\x04\x00'  # Version and CPU type, example values
  • FAR 记录的类型和子类型分别是 0 和 10。它用于存储与文件相关的属性(解析的时候,可以对照标准中的表来解析)。
  • far_data = b'\x04\x00' 是一个示例字节数据,这里表示 类型的信息。数据是字节串(bytes)。

4. MIR(Master Information Record)记录

# MIR - Master Information Record
mir_rec_typ = 1  # Record Type for MIR
mir_rec_sub = 10  # Record Subtype for MIR
mir_data = (b'\x02\x00' +  # Head count, site countb'\xFF\xFF' +  # Date of first part tested (not used)b'\xFF\xFF\xFF\xFF' +  # Time of first part tested (not used)b'\xFF\xFF' +  # Date of last part tested (not used)b'\xFF\xFF\xFF\xFF' +  # Time of last part tested (not used)b'\x00\x00\x00\x00' +  # Test Operator (not used)b'\x00\x00\x00\x00' +  # Test Station ID (not used)b'\x00\x00\x00\x00' +  # Lot ID (not used)b'\x00\x00\x00\x00' +  # Wafer ID (not used)b'\x00\x00\x00\x00'  # Flat/notched indicator (not used)
)
  • MIR 记录的类型和子类型分别是 1 和 10。它用于存储关于测试的主信息,如测试设备、测试站等。
  • mir_data 是一个字节串,包含多个字段的示例数据。每个字段都使用字节串表示。例如,b'\x02\x00' 是头计数和站点计数的占位符,b'\xFF\xFF' 表示未使用的字段。

5. 打开文件并写入数据

with open(filename, 'wb') as f:
  • 使用 with open(filename, 'wb') 打开文件并准备以二进制模式('wb')写入文件。这意味着文件中的数据将按字节流写入。

6. 写入 FAR 记录

# Write FAR record
far_length = len(far_data) + 4  # Including header length
far_header = struct.pack('>HBB', far_length, far_rec_typ, far_rec_sub)
f.write(far_header + far_data)
  • far_length = len(far_data) + 4 计算 FAR 记录的总长度,包含了记录头部的 4 字节(2 字节长度字段,1 字节类型字段,1 字节子类型字段)。
  • far_header = struct.pack('>HBB', far_length, far_rec_typ, far_rec_sub) 使用 struct.pack 将 FAR 记录的头部打包成字节流:
    • >H 表示一个 2 字节的无符号短整型,表示记录的长度。
    • B 表示一个字节的无符号字符型,分别表示记录类型和子类型。
  • 然后通过 f.write(far_header + far_data) 将头部和数据一起写入文件。

7. 写入 MIR 记录

# Write MIR record
mir_length = len(mir_data) + 4  # Including header length
mir_header = struct.pack('>HBB', mir_length, mir_rec_typ, mir_rec_sub)
f.write(mir_header + mir_data)
  • mir_length = len(mir_data) + 4 计算 MIR 记录的总长度,同样包括头部的 4 字节。
  • mir_header = struct.pack('>HBB', mir_length, mir_rec_typ, mir_rec_sub) 使用 struct.pack 打包 MIR 记录的头部。
  • 然后通过 f.write(mir_header + mir_data) 将头部和数据一起写入文件。

8. 调用函数

create_stdf_file('simple.stdf')
  • 这行代码调用 create_stdf_file 函数并将 'simple.stdf' 作为文件名传入,创建并写入 STDF 文件。

四、读取和解析文件

读取和解析文件,相对逻辑就比较容易了,因为我们已经有了创建文件的逻辑,所以反着来就行了!

为了读取并打印STDF文件的内容,我们需要编写一个Python脚本来解析二进制数据。下面是一个简单的例子,它会读取我们之前创建的最简STDF文件,并打印出每个记录的头部信息。

import structdef parse_stdf_file(filename):with open(filename, 'rb') as f:# 读取 FAR (File Attributes Record)far_header = f.read(4)far_length, far_rec_typ, far_rec_sub = struct.unpack('>HBB', far_header)far_data = f.read(far_length - 4)  # 读取 FAR 数据print(f"FAR Record (Length: {far_length}):")print(f"  Record Type: {far_rec_typ}")print(f"  Record Subtype: {far_rec_sub}")print(f"  FAR Data: {far_data.hex()}")# 读取 MIR (Master Information Record)mir_header = f.read(4)mir_length, mir_rec_typ, mir_rec_sub = struct.unpack('>HBB', mir_header)mir_data = f.read(mir_length - 4)  # 读取 MIR 数据print(f"\nMIR Record (Length: {mir_length}):")print(f"  Record Type: {mir_rec_typ}")print(f"  Record Subtype: {mir_rec_sub}")print(f"  MIR Data: {mir_data.hex()}")# 解析 MIR 数据(可根据需要进一步解析每个字段)print("\nParsed MIR Data:")print(f"  Head Count and Site Count: {struct.unpack('>H', mir_data[0:2])[0]}")print(f"  Date of First Part Tested (not used): {mir_data[2:4].hex()}")print(f"  Time of First Part Tested (not used): {mir_data[4:8].hex()}")print(f"  Date of Last Part Tested (not used): {mir_data[8:10].hex()}")print(f"  Time of Last Part Tested (not used): {mir_data[10:14].hex()}")print(f"  Test Operator (not used): {mir_data[14:18].hex()}")print(f"  Test Station ID (not used): {mir_data[18:22].hex()}")print(f"  Lot ID (not used): {mir_data[22:26].hex()}")print(f"  Wafer ID (not used): {mir_data[26:30].hex()}")print(f"  Flat/Notched Indicator (not used): {mir_data[30:34].hex()}")# 调用函数解析并打印内容
parse_stdf_file('simple.stdf')

代码解释:

以下是对我提供的 Python 代码的概要解释:

1. parse_stdf_file(filename) 函数

该函数用于解析 .stdf 文件并打印文件中包含的记录数据。

2. 打开文件

with open(filename, 'rb') as f:

使用 open 函数以二进制模式读取文件 ('rb')。with 语句确保文件在读取后被自动关闭。

3. 读取和解析 FAR(File Attributes Record)

far_header = f.read(4)
far_length, far_rec_typ, far_rec_sub = struct.unpack('>HBB', far_header)
far_data = f.read(far_length - 4)
  • 首先,读取 FAR 记录的头部(4 字节)。
  • 使用 struct.unpack 解包头部数据,>HBB 表示将数据按大端格式解包为:1 个 unsigned short(2 字节)表示 far_length,2 个 unsigned char(1 字节)分别表示 far_rec_typfar_rec_sub
  • 然后,读取 FAR 记录的数据部分,数据长度为 far_length - 4(因为头部已经占用 4 字节)。

4. 打印 FAR 记录内容

print(f"FAR Record (Length: {far_length}):")
print(f"  Record Type: {far_rec_typ}")
print(f"  Record Subtype: {far_rec_sub}")
print(f"  FAR Data: {far_data.hex()}")
  • 打印 FAR 记录的长度、类型和子类型。
  • 将 FAR 数据转为十六进制格式进行打印(far_data.hex())。

5. 读取和解析 MIR(Master Information Record)

mir_header = f.read(4)
mir_length, mir_rec_typ, mir_rec_sub = struct.unpack('>HBB', mir_header)
mir_data = f.read(mir_length - 4)
  • 读取 MIR 记录的头部(4 字节)并解包,获取 mir_lengthmir_rec_typmir_rec_sub
  • 读取 MIR 数据部分,数据长度为 mir_length - 4(同样考虑到头部的 4 字节)。

6. 打印 MIR 记录内容

print(f"\nMIR Record (Length: {mir_length}):")
print(f"  Record Type: {mir_rec_typ}")
print(f"  Record Subtype: {mir_rec_sub}")
print(f"  MIR Data: {mir_data.hex()}")
  • 打印 MIR 记录的长度、类型和子类型。
  • 将 MIR 数据转为十六进制格式打印。

7. 解析 MIR 数据的具体字段

print("\nParsed MIR Data:")
print(f"  Head Count and Site Count: {struct.unpack('>H', mir_data[0:2])[0]}")
print(f"  Date of First Part Tested (not used): {mir_data[2:4].hex()}")
print(f"  Time of First Part Tested (not used): {mir_data[4:8].hex()}")
...
  • 我逐个解析 MIR 数据中的各个字段。每个字段在数据流中的位置是已知的,所以下标指定了每个字段的范围。
  • 使用 struct.unpack 解析特定字段(例如 Head Count and Site Count 字段),并打印出它们的值。
  • 对于不使用的字段,直接显示它们的十六进制表示。

执行后,结果就是我们写入的内容:

五、本节小结:

1. 写入 STDF 文件代码
  • 目标:创建一个简单的 .stdf 文件并写入两个记录类型:FAR (File Attributes Record)MIR (Master Information Record)

  • 代码功能

    • FAR 记录
      • far_rec_typ:设置为 0(FAR 记录类型)。
      • far_rec_sub:设置为 10(FAR 记录子类型)。
      • far_data:包含示例数据(如 b'\x04\x00',表示版本和 CPU 类型)。
      • FAR 头部:包含 FAR 记录的长度(far_length)、类型(far_rec_typ)和子类型(far_rec_sub),然后将其与数据一起写入文件。
    • MIR 记录
      • mir_rec_typ:设置为 1(MIR 记录类型)。
      • mir_rec_sub:设置为 10(MIR 记录子类型)。
      • mir_data:包含多个字段的示例数据,如头计数、日期、时间等,很多字段是未使用的(例如,测试操作员、测试站点 ID 等设置为 0x00)。
      • MIR 头部:类似于 FAR 记录,包含 MIR 记录的长度(mir_length)、类型(mir_rec_typ)和子类型(mir_rec_sub),然后将其与数据一起写入文件。
      • 输出:一个名为 simple.stdf 的文件,其中包含 FAR 和 MIR 两个记录。

 

2. 读取 STDF 文件代码
  • 目标:解析刚刚生成的 .stdf 文件,读取 FAR 和 MIR 记录,并打印它们的内容。

  • 代码功能

    • 读取 FAR 记录
      • 读取 4 字节头部,获取 far_length(记录长度)、far_rec_typ(记录类型)和 far_rec_sub(记录子类型)。
      • 然后读取剩余的 far_data 并打印十六进制数据。
    • 读取 MIR 记录
      • 类似于 FAR 记录,读取 4 字节头部,获取 mir_length(记录长度)、mir_rec_typ(记录类型)和 mir_rec_sub(记录子类型)。
      • 然后读取剩余的 mir_data 并打印十六进制数据。
    • 解析 MIR 数据
      • 对 MIR 数据中的各个字段进行进一步解析,例如:头计数和站点计数、日期时间、操作员信息等,并打印它们的值。虽然很多字段在示例中没有实际使用,但可以展示它们的十六进制表示。
    • 输出

    • 读取并打印 FAR 和 MIR 记录的详细信息,包括它们的长度、类型、子类型以及数据部分的十六进制表示。
    • MIR 数据会根据字段解析逻辑显示各个字段的值,尽管示例中的很多字段未被使用。

相关文章:

半导体数据分析(二):徒手玩转STDF格式文件 -- 码农切入半导体系列

一、概述 在上一篇文章中,我们一起学习了STDF格式的文件,知道了这是半导体测试数据的标准格式文件。也解释了为什么码农掌握了STDF文件之后,好比掌握了切入半导体行业的金钥匙。 从今天开始,我们一起来一步步地学习如何解构、熟…...

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试

在生成我们自己的 SSL 证书之前,让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目,让我们创建一个名为node-ssl -server 的目录,用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…...

C++中类和对象的细节原理

文章目录 一、C中的构造函数二、C中的析构函数三、两者的配合与注意事项四、C中的静态成员变量五、C中的静态成员函数六、C中普通成员函数和静态成员函数的区别七、C中的const成员变量八、C中的const 成员函数九、C中构造函数的初始化列表十、C中的浅拷贝操作十一、C中的深拷贝…...

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时,调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误: Model inference er…...

OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

windows和LINUX下校验文件的哈希值(MD5、SHA256)

可以通过两个文件的哈希值来对比两个文件是不是一模一样,有没有缺失 1、windows CertUtil -hashfile 文件路径 MD5 CertUtil -hashfile 文件路径 SHA256 2、Liunx 校验当前目录下所有文件 sha256sum . 校验指定文件名 sha256sum 文件名...

〔 MySQL 〕视图

以下是上述文章的目录: 一、视图概述 视图的定义 二、基本使用 创建视图查询视图修改视图影响基表查询验证删除视图 三、视图规则和限制 命名规则数量限制索引和触发器安全性ORDER BY规则与表一起使用 四、实战案例 牛客实战OJ修改基表影响视图查询验证删除…...

嵌入式硬件产品:CC254x 蓝牙升级

目录 固件更新 OAD原理 作者简介 固件更新 支持固件更新的CC2541芯片中, 包括三段代码: Boot Image Manager(BIM)、ImageA、Im...

Drag and Drop API 实现 JavaScript 中的原生拖放功能

理解什么是拖放,我们先做个简单的实验。鼠标移动到页面左上角“CSDN” 图片上方,点击左键不放开,拖动鼠标,发现图片随着鼠标移动,松开鼠标时,图片消失。 一、拖放(Drag and Drop)有…...

人脸检测的若干思考!!!

1.目前主要有人脸检测方法分类? 主要包含两类:传统人脸检测算法和基于深度学习的人脸检测算法。 传统人脸检测算法主要可以分为4类: 基于知识、模型、特征和外观的人脸检测方法; 基于深度学习的方法:基于级联CNN的人脸…...

【时间序列分析】斯皮尔曼(Spearman)相关系数理论基础及python代码实现

文章目录 1. 斯皮尔曼相关系数1.1 公式定义1.2 计算过程1.3 计算示例1.4 注意事项(当有重复值时) 2. 优缺点2.1 优点2.2 缺点 3. 适用场景4. Python代码实现4.1 调用scipy库 5 思考5.1 什么是单调关系?与线性关系的区别是什么?5.2…...

python | linux | ModuleNotFoundError: No module named ‘WFlib‘ |找不到模块

问题&#xff1a; (base) beautyby521-7:~/Website-Fingerprinting-Library-master$ bash scripts/NetCLR.sh Traceback (most recent call last):File "/home/beauty/Website-Fingerprinting-Library-master/exp/pretrain.py", line 8, in <module>from WFli…...

B-TREE详解

B - tree 的详细结构特点 节点结构细节 关键字存储方式&#xff1a;B - tree 节点中的关键字是按照一定顺序排列的&#xff0c;这个顺序可以是升序或者降序。例如&#xff0c;在一个以数字为关键字的 B - tree 中&#xff0c;关键字从左到右依次增大。每个关键字都有一个分隔作…...

Kotlin复习

一、Kotlin类型 1.整数 2.浮点 显示转换&#xff1a; 所有数字类型都支持转换为其他类型&#xff0c;但是转换前会检测长度。 toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double 不同进制的数字表示方法&#xff08;为了提高…...

批处理文件的创建与编辑方法

批处理命令保存在以BAT为扩展名地文本文件中&#xff0c;因此可以使用任何字处理软件创建、编辑批处理文件&#xff0c;如Word、WinHex、Editpuls等。 案例一 使用copy con命令创建批处理文件 ”copy con“是一个功能简单、易于使用的创建文本文件命令&#xff0c;命令中”con…...

Spring Boot集成Kafka:最佳实践与详细指南

文章目录 一、生产者1.引入库2.配置文件3.配置类PublicConfig.javaMessageProducer.java 4.业务处理类 三、消费者1.引入库2.配置类PublicConfig.javaMessageConsumer.java 3.业务类 一、生产者 1.引入库 引入需要依赖的jar包&#xff0c;引入POM文件&#xff1a; <depend…...

maven 中 有历史模块缓存 怎么清

Maven 在运行时会将一些数据保存在本地仓库中&#xff0c;以加快构建过程。其中一部分是项目的依赖项&#xff0c;还有就是“历史模块缓存”。这些缓存信息保存在本地仓库的 _remote.repositories 文件中。 解决方案&#xff1a; 手动删除缓存文件&#xff1a; 进入你的Maven本…...

云计算HCIP-OpenStack04

书接上回&#xff1a; 云计算HCIP-OpenStack03-CSDN博客 12.Nova计算管理 Nova作为OpenStack的核心服务&#xff0c;最重要的功能就是提供对于计算资源的管理。 计算资源的管理就包含了已封装的资源和未封装的资源。已封装的资源就包含了虚拟机、容器。未封装的资源就是物理机提…...

【信息系统项目管理师-论文真题】2015下半年论文详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...

C# 面试中常见递归算法

前言 今天我们主要总结一下C#面试中常见递归算法。 C#经典十大排序算法&#xff08;完结&#xff09; C#递归算法计算阶乘的方法 一个正整数的阶乘&#xff08;factorial&#xff09;是所有小于及等于该数的正整数的积&#xff0c;并且0的阶乘为1。自然数n的阶乘写作n!。180…...

qemu源码解析【02】qom基本概念

目录 qemu源码解析【02】qom基本概念参考资料基本数据结构TypeImplObjectClassObjectTypeInfo qemu源码解析【02】qom基本概念 参考资料 https://blog.csdn.net/u011364612/article/details/53485856qemu中为了模拟各种虚拟设备和总线&#xff0c;采用了面向对象的思想&#…...

C++算法第八天

本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 第三题 题目链接 题目展示 代码原理 代码编写 第一题 题目链接 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 题目展示…...

大语言模型的常用微调方法

文章目录 数据构造与清洗数据构造方法1.基于 Self-Instruct 方法的数据构造2.面向结构化知识的数据构造 数据清洗方法1.IFD 指标法2. MoDS 方法 2.2 分词器构造2.2.1 分词器概述BPE 分词器WordPiece 分词器Unigram 分词器 2.3 大型语言模型的微调方法前缀调优提示调优P-Tuning …...

安卓获取所有可用摄像头并指定预览

在Android设备中&#xff0c;做预览拍照的需求的时候&#xff0c;我们会指定 CameraSelector DEFAULT_FRONT_CAMERA前置 或者后置CameraSelector DEFAULT_BACK_CAMERA 如果你使用的是平板或者工业平板&#xff0c;那么就会遇到多摄像头以及外置摄像头问题&#xff0c;简单的指…...

Jwt和Session的区别和优缺点

目录 一、Authentication和Authorization的区别 二、用户认证的两种主流方法 ① 、基于session认证流程如下&#xff1a; ②、基于token&#xff08;令牌&#xff09;用户认证如下&#xff1a; 三、区别和优缺点 JWT的优点&#xff1a; JWT的缺点&#xff1a; 安全性 …...

如何使用 Python 读取和写入 CSV 文件?

在Python中&#xff0c;处理CSV文件是一项常见的任务&#xff0c;通常用于数据交换和数据存储。 Python的标准库csv模块提供了一种方便的方式来读取和写入CSV文件。 下面我将详细介绍如何使用Python的csv模块来读取和写入CSV文件&#xff0c;并提供一些实际开发中的建议和注意…...

FR2012富芮坤PMU:设置PMU GPIO为输入读取状态;在睡眠功能中读取IO;PMU GPIO设置唤醒源中断

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

私有云dbPaaS为何被Gartner技术成熟度曲线标记为“废弃”?

当云计算席卷而来&#xff0c;基于云基础设施的数据库部署也改变了数据库。在传统的私有化部署&#xff08;On-premises&#xff09;和公有云部署&#xff08;Public Cloud&#xff09;之间&#xff0c;不断融合的混合IT&#xff08;Mixed IT&#xff09;形式成为最常见的企业级…...

RabbitMQ 高级特性——延迟队列

文章目录 前言延迟队列延迟队列的概念TTL 死信队列模拟延迟队列设置队列的 TTL设置消息的 TTL 延迟队列插件安装并且启动插件服务使用插件实现延迟功能 前言 前面我们学习了 TTL 和死信队列&#xff0c;当队列中的消息达到了过期时间之后&#xff0c;那么这个消息就会被死信交…...

Perl 引用

Perl 引用 Perl&#xff0c;作为一种灵活而强大的编程语言&#xff0c;广泛用于系统管理、网络编程、GUI开发等领域。在Perl编程中&#xff0c;引用&#xff08;References&#xff09;是一个核心概念&#xff0c;它允许变量引用其他数据&#xff0c;从而创建复杂的数据结构&a…...

llama2——微调lora,第一次参考教程实践完成包括训练和模型

前言&#xff1a;磕磕绊绊&#xff0c;不过收获很多&#xff0c;最大的收获就是解决报错error的分析方法和解决思路 1、首先&#xff0c;我参考的是这篇博客&#xff1a;怎样训练一个自己的大语言模型&#xff1f;全网最简单易懂的教程&#xff01;_开源模型训练出一个语言模型…...

【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用

目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解&#xff08;SVD&#xff09; 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码&#xff1a;使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析&#xff08;PCA&#xff0…...

C++常见面试题-初级2

1. C和C有什么区别&#xff1f; C是面向对象的语言&#xff0c;而C是面向过程的语言&#xff1b;C引入new/delete运算符&#xff0c;取代了C中的malloc/free库函数&#xff1b;C引入引用的概念&#xff0c;而C中没有&#xff1b;C引入类的概念&#xff0c;而C中没有&#xff1…...

R square 的计算方法和一点思考

模型的性能评价指标有几种方案&#xff1a;RMSE&#xff08;平方根误差&#xff09;、MAE&#xff08;平均绝对误差&#xff09;、MSE(平均平方误差)、R2_score 其中&#xff0c;当量纲不同时&#xff0c;RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score&#xff1…...

梳理你的思路(从OOP到架构设计)_简介EIT造形

目录 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码结构 <基类/子类>代码结构的变形 2、 从<基类/子类>结构到EIT造形 3、 EIT造形的基本形与变形 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码…...

梳理你的思路(从OOP到架构设计)_认识EIT造形与内涵

目录 1、 认识类(Class)与内涵 2、 认识EIT造形与内涵 EIT造形&#xff1a; 类造形的组合​编辑 复习EIT的基本形与变形​编辑 不同内涵 EIT造形 1、 认识类(Class)与内涵 回顾 类(Class)是比较小的造形 各种不同内涵&#xff0c;可以透过类(Class)的形式(Form)来呈现出…...

【FTP】FTP基础知识点

文章目录 一、概述二、 工作原理2.1 两个连接2.2 安全性 三、代码实现&#xff1a;1. 选择合适的库2. 连接配置和初始化3. 连接状态检查4. 重连机制5. 文件操作6. 安全性7. 资源管理 参考&#xff1a; 一、概述 将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机…...

排序算法(7):堆排序

问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 堆排序 堆排序是一种基于堆数据结构的排序算法。堆是一个近似完全二叉树的结构&#xff0c;即除了最后一层外&#xff0c;每一层都必须填满&#xff0c;且最后一层从左往右填充。 堆可以分为大根堆和小根堆。在大根堆中&…...

BERT模型入门(6)语言建模

文章目录 自回归语言建模自编码语言建模 BERT模型在以下两个任务上进行预训练&#xff1a; &#xff08;1&#xff09;掩蔽语言建模 &#xff08;2&#xff09;下一句预测 让我们逐一了解这两种预训练策略是如何工作的。在介绍掩蔽语言模型任务之前&#xff0c;首先让我们了…...

RNN LSTM Seq2Seq Attention

非端到端&#xff1a; data -》 cleaning -》 feature Engining &#xff08;70%-80%工作 设计特征&#xff09;-》 分类器 -》预测 端到端 End-to-End&#xff1a; data -》 cleaning -》Deep learning&#xff08;表示学习&#xff0c;从数据中学习特征&#xff09; -》…...

go语言使用websocket发送一条消息A,持续接收返回的消息

在Go语言中实现一个WebSocket客户端&#xff0c;可以使用gorilla/websocket这个非常流行的库来处理WebSocket连接。下面是一个简单的示例&#xff0c;展示了如何创建一个WebSocket客户端&#xff0c;向服务器发送消息"A"&#xff0c;并持续接收来自服务器的响应。 首…...

音频进阶学习八——傅里叶变换的介绍

文章目录 前言一、傅里叶变换1.傅里叶变换的发展2.常见的傅里叶变换3.频域 二、欧拉公式1.实数、虚数、复数2.对虚数和复数的理解3.复平面4.复数和三角函数5.复数的运算6.欧拉公式 三、积分运算1.定积分2.不定积分3.基本的积分公式4.积分规则线性替换法分部积分法 5.定积分计算…...

沟通的艺术,学会转移矛盾

我的一位好友&#xff0c;资深项目经理&#xff0c;同时也是我公益课程的热心志愿者&#xff0c;最近向我倾诉了他在团队沟通上的挑战。 他发现&#xff0c;尽管辅导学员时感到轻松愉快&#xff0c;但与自己团队成员的沟通却充满挫折。 我询问了他的沟通方式&#xff0c;他解释…...

测评|携程集团25年社招在线测评北森题库、真题分析、考试攻略

携程集团社招入职测评北森题库主要考察以下几个方面&#xff1a; 1. **言语理解**&#xff1a;这部分主要测试应聘者运用语言文字进行思考和交流、迅速准确地理解和把握文段要旨的能力。 2. **资料分析**&#xff1a;包括文字题和图表题&#xff0c;考察应聘者快速找出关键信息…...

C++(进阶) 第4章 map和set的使⽤

C&#xff08;进阶) 第4章 map和set的使⽤ 文章目录 前言一、序列式容器和关联式容器二、set1. insert2.迭代器遍历3.范围for4.erase5.count6.lower_bound和upper_bound 三、multiset总结 前言 上一篇博客写了二叉搜索树&#xff0c;这一篇博客会在上一篇博客原来的上在深入介…...

数独游戏app制作拆解(之三)——数字候选区实现

所谓的数据候选区就是这个&#xff1a; 数字候选区功能及实现&#xff1a; 说明&#xff1a;这部分其实也是textview. 本区功能&#xff1a; 一、实现数字显示到显示区。点击显示区选定某个格子后&#xff0c;再点击这里的数字&#xff0c;会在格子内显示相应的数字。在编辑…...

数据结构——排序

*排序属于数据的运算 1、定义:将一组杂乱无章的数据按一定规律顺次排列一起,即将无序序列排成一个有序序列的运算。 (如果参加排序的数据结构包含多个数据域,那么排序往往是针对其中某个域而言) 2、排序的应用十分广泛:程序中间接应用(二分查找、最短路径、最小生成树…...

制造业4.0:AI与机器人如何重塑生产线

引言&#xff1a;从传统到未来的转型 在轰鸣的生产线上&#xff0c;传统制造业曾以规模化生产和成本效益为核心竞争力&#xff0c;推动了全球工业化进程。然而&#xff0c;面对现代市场的多样化需求和激烈竞争&#xff0c;这种模式正暴露出越来越多的局限性&#xff1a;产能过剩…...

Fastdfs V6.12.1集群部署(arm/x86均可用)

文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统&#xff0c;特别适合用于存…...

【学习笔记】深入浅出详解Pytorch中的View, reshape, unfold,flatten等方法。

文章目录 一、写在前面二、Reshape&#xff08;一&#xff09;用法&#xff08;二&#xff09;代码展示 三、Unfold&#xff08;一&#xff09;torch.unfold 的基本概念&#xff08;二&#xff09;torch.unfold 的工作原理&#xff08;三&#xff09; 示例代码&#xff08;四&a…...