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

【实用部署教程】olmOCR智能PDF文本提取系统:从安装到可视化界面实现

文章目录

  • 引言
  • 系统要求
  • 1. 环境准备:安装Miniconda
    • 激活环境
  • 2. 配置pip源加速下载
  • 3. 配置学术加速(访问国外资源)
  • 4. 安装系统依赖
  • 5. 安装OLMOCR
  • 6. 运行OLMOCR处理PDF文档
  • 7. 理解OLMOCR输出结果
  • 9. 可视化UI界面
    • 9.1 安装界面依赖
    • 9.2 创建界面应用
    • 9.3 启动界面
  • 10. 常见问题及解决方案
    • 网络连接问题
    • GPU内存不足
  • 字体渲染问题
  • 11. 高级应用与优化
    • 针对不同GPU的优化
  • 总结

引言

OLMOCR是由Allen AI研究所(AI2)开发的一款强大的PDF文档处理工具,它结合了先进的光学字符识别(OCR)技术与大型语言模型能力,能够高效处理各类PDF文档,包括低质量扫描件、复杂格式的学术论文等。本文将详细介绍如何在高性能GPU环境下部署OLMOCR,帮助研究人员和开发者实现高效的文档内容提取与处理。
原图:
原图
提取出来的文本:
提取出来的内容

系统要求

在开始部署前,请确保您的系统满足以下条件:

  • GPU: 最新的NVIDIA GPU,如RTX 4090、L40S、A100或H100
  • 显存: 至少20GB的GPU RAM
  • 存储空间: 至少30GB可用磁盘空间
  • 操作系统: Linux(推荐Ubuntu)

1. 环境准备:安装Miniconda

首先,我们需要安装Miniconda并创建一个独立的Python环境:

# 下载并安装Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh
bash ~/miniconda.sh -b -p $HOME/miniconda
eval "$($HOME/miniconda/bin/conda shell.bash hook)"
echo 'export PATH="$HOME/miniconda/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc# 创建Python 3.11环境
conda create -n olmocr_ai python=3.11 -y

激活环境

conda activate olmocr_ai

如果遇到CondaError: Run 'conda init' before 'conda activate'错误,请执行:

conda init bash
source ~/.bashrc
conda activate olmocr_ai

2. 配置pip源加速下载

对于国内用户,建议配置国内镜像源加速依赖包的下载:

# 配置清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 升级pip并清理缓存
python -m pip install --upgrade pip
pip cache purge
# 检查配置是否生效
pip config list

其他可选国内源:

  • 阿里云:http://mirrors.aliyun.com/pypi/simple/
  • 中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/
  • 华中科技大学:http://pypi.hustunique.com/simple/
  • 上海交通大学:https://mirror.sjtu.edu.cn/pypi/web/simple/

3. 配置学术加速(访问国外资源)

如需访问GitHub等国外资源,可以临时启用学术加速:

# 启用学术加速
source /etc/network_turbo
# 配置Hugging Face镜像
export HF_ENDPOINT=https://hf-mirror.com
# 使用完毕后关闭学术加速
# unset http_proxy && unset https_proxy

4. 安装系统依赖

OLMOCR依赖一些系统库,需要提前安装:

sudo apt-get update
sudo apt-get install poppler-utils ttf-mscorefonts-installer msttcorefonts fonts-crosextra-caladea fonts-crosextra-carlito gsfonts lcdf-typetools

注意:安装过程中如果出现MORE提示,按Enter键继续阅读,然后输入"yes"接受许可条款。

5. 安装OLMOCR

接下来,克隆OLMOCR代码库并安装:

# 克隆代码库
git clone https://github.com/allenai/olmocr.git
cd olmocr
# 安装OLMOCR
pip install -e .
# 安装特定版本依赖
pip install sgl-kernel==0.0.3.post1 --force-reinstall --no-deps
pip install "sglang[all]==0.4.2" --find-links https://flashinfer.ai/whl/cu124/torch2.4/flashinfer/ -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 1800

6. 运行OLMOCR处理PDF文档

现在,我们可以使用OLMOCR来处理PDF文件:

# 创建工作目录并处理PDF文件
python -m olmocr.pipeline ./localworkspace --pdfs tests/gnarly_pdfs/horribleocr.pdf
# 查看处理结果
cat localworkspace/results/output_*.jsonl

7. 理解OLMOCR输出结果

解析完成后的数据
解析完成后的数据
OLMOCR处理完PDF后,会生成JSONL格式的输出文件。下面是输出字段的详细解释:

{"id": "2d8a28b2aa386be36ff8d83135990cae1904257d","text": "Christians behaving themselves like Mahomedans...", "source": "olmocr","added": "2025-03-19","created": "2025-03-19","metadata": {"Source-File": "tests/gnarly_pdfs/horribleocr.pdf","olmocr-version": "0.1.60","pdf-total-pages": 1,"total-input-tokens": 1809,"total-output-tokens": 433,"total-fallback-pages": 0},"attributes": {"pdf_page_numbers": [[0, 1643, 1]]}
}
  • id: 处理任务的唯一标识符,通常是基于输入文件内容生成的哈希值
  • text: 从PDF中提取的实际文本内容
  • source: 标识数据来源为"olmocr"系统
  • added/created: 记录添加和创建的时间戳
  • metadata:
    • Source-File: 原始PDF文件路径
    • olmocr-version: 使用的OLMOCR版本
    • pdf-total-pages: PDF文件的总页数
    • total-input-tokens: 处理过程中输入的token数量
    • total-output-tokens: 处理过程中输出的token数量
    • total-fallback-pages: 使用备用处理方法的页面数量(当主要方法失败时)
  • attributes:
    • pdf_page_numbers: 包含页码信息的数组,格式为[页码索引,字符偏移量,页数]

9. 可视化UI界面

为了让OLMOCR更加易用,我开发了基于Gradio的直观可视化界面,可以通过Web浏览器轻松上传、处理和分析PDF文档。这个界面不仅简化了操作流程,还提供了多种方式查看和验证处理结果。
可视化界面

9.1 安装界面依赖

首先,确保安装必要的依赖包:

pip install gradio pandas

9.2 创建界面应用

将以下代码保存为app.py文件放到olmocr根目录下:

import os
import json
import gradio as gr
import subprocess
import pandas as pd
from pathlib import Path
import shutil
import time
import re# 创建工作目录
WORKSPACE_DIR = "olmocr_workspace"
os.makedirs(WORKSPACE_DIR, exist_ok=True)# 应用主题色
PRIMARY_COLOR = "#2563eb"  # 蓝色主题
SECONDARY_COLOR = "#60a5fa"
BG_COLOR = "#f8fafc"
CARD_COLOR = "#ffffff"def modify_html_for_better_display(html_content):"""修改HTML以便在Gradio中更好地显示"""if not html_content:return html_content# 增加容器宽度html_content = html_content.replace('<div class="container">', '<div class="container" style="max-width: 100%; width: 100%;">')# 增加文本大小和字体html_content = html_content.replace('<style>', f'''<style>body {{font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;font-size: 16px;line-height: 1.6;color: #333;background-color: {BG_COLOR};}}.text-content {{font-size: 16px; line-height: 1.6;color: #1e293b;}}''')# 调整图像和文本部分的大小比例,添加阴影和圆角html_content = html_content.replace('<div class="row">', '<div class="row" style="display: flex; flex-wrap: wrap; margin: 0 -15px;">')html_content = html_content.replace('<div class="col-md-6">', '<div class="col-md-6" style="flex: 0 0 50%; max-width: 50%; padding: 15px;">')# 增加页面之间的间距,添加卡片效果html_content = html_content.replace('<div class="page">', f'<div class="page" style="margin-bottom: 30px; border-radius: 8px; padding: 20px; background-color: {CARD_COLOR}; box-shadow: 0 4px 6px rgba(0,0,0,0.1);">')# 增加图像样式html_content = re.sub(r'<img([^>]*)style="([^"]*)"', r'<img\1style="max-width: 100%; height: auto; border-radius: 4px; \2"', html_content)# 添加更美观的缩放控制zoom_controls = f"""<div style="position: fixed; bottom: 20px; right: 20px; background: {CARD_COLOR}; padding: 12px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.15); z-index: 1000; display: flex; gap: 8px;"><button onclick="document.body.style.zoom = parseFloat(document.body.style.zoom || 1) + 0.1;" style="background: {PRIMARY_COLOR}; color: white; border: none; padding: 8px 12px; border-radius: 4px; cursor: pointer; font-weight: 600; transition: all 0.2s;"><span style="font-size: 16px;">+</span></button><button onclick="document.body.style.zoom = 1;" style="background: #64748b; color: white; border: none; padding: 8px 12px; border-radius: 4px; cursor: pointer; font-weight: 600; transition: all 0.2s;"><span style="font-size: 14px;">100%</span></button><button onclick="document.body.style.zoom = parseFloat(document.body.style.zoom || 1) - 0.1;"style="background: {PRIMARY_COLOR}; color: white; border: none; padding: 8px 12px; border-radius: 4px; cursor: pointer; font-weight: 600; transition: all 0.2s;"><span style="font-size: 16px;">-</span></button></div>"""html_content = html_content.replace('</body>', f'{zoom_controls}</body>')return html_contentdef process_pdf(pdf_file):"""处理PDF文件并返回结果"""if pdf_file is None:return "请上传PDF文件", "", None, None# 创建一个唯一的工作目录timestamp = int(time.time())work_dir = os.path.join(WORKSPACE_DIR, f"job_{timestamp}")os.makedirs(work_dir, exist_ok=True)# 复制PDF文件pdf_path = os.path.join(work_dir, "input.pdf")shutil.copy(pdf_file, pdf_path)# 构建命令并执行cmd = ["python", "-m", "olmocr.pipeline", work_dir, "--pdfs", pdf_path]try:# 执行命令,等待完成process = subprocess.run(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,check=True)# 命令输出log_text = process.stdout# 检查结果目录results_dir = os.path.join(work_dir, "results")if not os.path.exists(results_dir):return f"处理完成,但未生成结果目录\n\n日志输出:\n{log_text}", "", None, None# 查找输出文件output_files = list(Path(results_dir).glob("output_*.jsonl"))if not output_files:return f"处理完成,但未找到输出文件\n\n日志输出:\n{log_text}", "", None, None# 读取JSONL文件output_file = output_files[0]with open(output_file, "r") as f:content = f.read().strip()if not content:return f"输出文件为空\n\n日志输出:\n{log_text}", "", None, None# 解析JSONresult = json.loads(content)extracted_text = result.get("text", "未找到文本内容")# 生成HTML预览try:preview_cmd = ["python", "-m", "olmocr.viewer.dolmaviewer", str(output_file)]subprocess.run(preview_cmd, check=True)except Exception as e:log_text += f"\n生成HTML预览失败: {str(e)}"# 查找HTML文件html_files = list(Path("dolma_previews").glob("*.html"))html_content = ""if html_files:try:with open(html_files[0], "r", encoding="utf-8") as hf:html_content = hf.read()# 修改HTML以更好地显示html_content = modify_html_for_better_display(html_content)except Exception as e:log_text += f"\n读取HTML预览失败: {str(e)}"# 创建元数据表格metadata = result.get("metadata", {})meta_rows = []for key, value in metadata.items():meta_rows.append([key, value])df = pd.DataFrame(meta_rows, columns=["属性", "值"])return log_text, extracted_text, html_content, dfexcept subprocess.CalledProcessError as e:return f"命令执行失败: {e.stderr}", "", None, Noneexcept Exception as e:return f"处理过程中发生错误: {str(e)}", "", None, None# 自定义CSS
custom_css = f"""
:root {{--body-background-fill: {BG_COLOR};--background-fill-primary: {CARD_COLOR};--border-color-primary: #e2e8f0;--color-text-input: #334155;--block-background-fill: {CARD_COLOR};--block-label-background-fill: #f1f5f9;--block-label-text-color: #475569;--block-title-text-color: #1e293b;
}}.contain {{max-width: 1200px;margin: 0 auto;padding: 2rem;
}}/* 头部区域样式 */
.header-container {{background: linear-gradient(135deg, {PRIMARY_COLOR} 0%, {SECONDARY_COLOR} 100%);color: white;border-radius: 10px;padding: 1.5rem;margin-bottom: 2rem;box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}}/* 上传卡片样式 */
.upload-container {{background-color: {CARD_COLOR};border-radius: 8px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);padding: 1.5rem;border: 1px solid #e2e8f0;
}}/* 标签页样式 */
.tabs {{background-color: {CARD_COLOR};border-radius: 8px !important;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);overflow: hidden;
}}/* 按钮样式 */
.primary-button {{background-color: {PRIMARY_COLOR} !important;border: none !important;box-shadow: 0 4px 6px rgba(37, 99, 235, 0.2) !important;
}}.primary-button:hover {{background-color: #1d4ed8 !important;box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3) !important;
}}/* 表格样式 */
table {{border-collapse: collapse;width: 100%;border-radius: 8px;overflow: hidden;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}}th, td {{padding: 12px 15px;text-align: left;border-bottom: 1px solid #e2e8f0;
}}th {{background-color: #f8fafc;font-weight: 600;color: #475569;
}}tr:nth-child(even) {{background-color: #f8fafc;
}}tr:hover {{background-color: #f1f5f9;
}}/* HTML预览容器 */
#html_preview_container {{height: 800px;width: 100%; overflow: auto;border: 1px solid #e2e8f0;border-radius: 8px;background-color: white;
}}#html_preview_container iframe {{width: 100%;height: 100%;border: none;
}}/* 说明卡片样式 */
.instruction-card {{background-color: {CARD_COLOR};border-radius: 8px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);padding: 1.5rem;margin-top: 2rem;border: 1px solid #e2e8f0;
}}/* 特性卡片 */
.feature-card {{background-color: {CARD_COLOR};border-radius: 8px;padding: 1.5rem;margin: 1rem 0;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);border-left: 4px solid {PRIMARY_COLOR};
}}/* 提示和警告样式 */
.alert-info {{background-color: #eff6ff;border-left: 4px solid {PRIMARY_COLOR};padding: 1rem;border-radius: 4px;margin: 1rem 0;
}}.alert-warning {{background-color: #fff7ed;border-left: 4px solid #f97316;padding: 1rem;border-radius: 4px;margin: 1rem 0;
}}
"""# 创建Gradio界面
with gr.Blocks(title="OLMOCR PDF提取工具", css=custom_css) as app:# 头部区域with gr.Row(elem_classes="header-container"):with gr.Column(scale=3):gr.Markdown("# 📄 OLMOCR PDF文本智能提取工具")gr.Markdown("### 基于AI2最新OCR技术,高精度提取和分析PDF文档内容")with gr.Column(scale=1):gr.Markdown("![AI2 Logo](https://allenai.org/icons/ai2-logo.svg)")with gr.Row():# 左侧上传和控制区域with gr.Column(scale=1, elem_classes="upload-container"):gr.Markdown("## 📤 上传文档")pdf_input = gr.File(label="选择PDF文件", file_types=[".pdf"], elem_id="pdf_upload")with gr.Row():process_btn = gr.Button("🚀 开始处理", variant="primary", elem_classes="primary-button")# 添加功能说明with gr.Accordion("🔍 功能说明", open=False):gr.Markdown("""* 支持扫描PDF和数字PDF文件* 处理多语言文本内容* 保留文档原始布局和结构* 高精度识别表格和图表文字* 支持低质量扫描件处理""")# 添加处理状态指示gr.Markdown("### 📊 处理状态", elem_id="process_status")status_html = gr.HTML("""<div class="alert-info"><p><b>就绪</b> - 请上传PDF文件并点击处理按钮</p></div>""")# 右侧结果显示区域with gr.Column(scale=2):# 使用更好看的标签页tabs = gr.Tabs(elem_classes="tabs")with tabs:with gr.TabItem("📝 提取文本", elem_id="text_tab"):with gr.Column():  # 使用Column替代Boxtext_output = gr.Textbox(label="提取的文本内容", lines=20, interactive=True,# 移除不兼容的show_copy_button)with gr.TabItem("👁️ 视觉对比预览", elem_id="html_preview_tab"):gr.Markdown("#### 原始PDF与提取文本对照预览")# 使用更大的HTML组件html_output = gr.HTML(elem_id="html_preview_container")with gr.TabItem("📋 文档元数据", elem_id="metadata_tab"):with gr.Column():  # 使用Column替代Boxgr.Markdown("#### 文档处理元数据")meta_output = gr.DataFrame()with gr.TabItem("🔧 处理日志", elem_id="log_tab"):with gr.Column():  # 使用Column替代Boxlog_output = gr.Textbox(label="处理日志", lines=15, interactive=False,# 移除不兼容的show_copy_button)# 底部说明区域with gr.Row(elem_classes="instruction-card"):gr.Markdown("""## 📚 使用指南<div class="feature-card"><h3>🔷 基本步骤</h3><ol><li>点击"选择PDF文件"上传您需要处理的PDF文档</li><li>点击"开始处理"按钮启动OCR流程</li><li>等待处理完成(根据文件大小可能需要几分钟)</li><li>在标签页中查看提取的文本、视觉预览和元数据</li></ol></div><div class="feature-card"><h3>🔷 关于视觉预览</h3><ul><li>视觉预览标签页展示原始PDF页面和提取的文本对照</li><li>可以清晰查看OCR过程的识别精度</li><li>使用右下角的缩放按钮调整预览大小</li></ul></div><div class="alert-warning"><h4>⚠️ 注意事项</h4><ul><li>首次运行时会自动下载模型(约7GB),请确保网络畅通</li><li>处理大型PDF文件时可能需要较长时间,请耐心等待</li><li>对于复杂表格和特殊格式,可能需要额外调整提取的文本</li></ul></div>""")# 自定义JavaScript用于更新状态和界面交互gr.HTML("""<script>// 处理按钮点击时的状态更新document.addEventListener('DOMContentLoaded', function() {const processBtn = document.querySelector('.primary-button');const statusHTML = document.getElementById('process_status').nextElementSibling;if (processBtn) {processBtn.addEventListener('click', function() {statusHTML.innerHTML = `<div class="alert-info"><p><b>处理中...</b> - 正在分析PDF文档,请耐心等待</p></div>`;});}});</script>""")# 绑定按钮事件 - 使用阻塞模式def update_status():return """<div class="alert-info"><p><b>处理完成</b> - 请在右侧标签页查看结果</p></div>"""process_btn.click(fn=process_pdf,inputs=pdf_input,outputs=[log_output, text_output, html_output, meta_output],api_name="process").then(fn=update_status,outputs=[status_html])# 启动应用
if __name__ == "__main__":app.launch(server_name="0.0.0.0",  # 绑定到所有网络接口server_port=19851,      # 或其他端口share=False             # 禁用共享功能# 移除不兼容的favicon_path参数)

9.3 启动界面

保存代码后,在终端运行以下命令启动界面:

python app.py

启动成功后,您会看到类似以下输出:

Running on local URL:  http://0.0.0.0:19851

现在您可以通过浏览器访问 http://ip:port 来使用OLMOCR的可视化界面。

10. 常见问题及解决方案

网络连接问题

如果在下载模型或依赖时遇到网络问题,建议:

  • 确认已配置正确的镜像源
  • 尝试使用学术加速
  • 增加下载超时时间:pip install --timeout 1800 [包名]

GPU内存不足

  • 减小批处理大小
  • 处理较小的PDF片段
  • 考虑使用更大内存的GPU

字体渲染问题

如果PDF中的某些字体无法正确渲染,可能需要安装额外的字体包:

sudo apt-get install fonts-noto fonts-noto-cjk

11. 高级应用与优化

针对不同GPU的优化

  • RTX 4090: 适合处理中等规模的批量PDF文件,建议batch_size设置为2-4
  • A100/H100: 可以处理更大规模的PDF批量,可将batch_size提高到8或更高
  • 内存优化: 对于显存较小的GPU,可以使用–low_memory参数降低内存使用

总结

通过本教程,可以完成OLMOCR在高性能GPU环境下的部署和基本使用。OLMOCR作为一款结合OCR和大语言模型的工具,可以显著提高PDF文档处理的效率和准确性,特别适用于处理学术论文、技术文档等复杂格式的资料。

随着AI技术的不断发展,文档智能处理领域将会出现更多创新。OLMOCR提供了灵活的架构,允许研究者和开发者在此基础上进行扩展和定制,以满足特定领域的文档处理需求。

希望本文能帮助您顺利部署OLMOCR,提升文档处理效率!

相关文章:

【实用部署教程】olmOCR智能PDF文本提取系统:从安装到可视化界面实现

文章目录 引言系统要求1. 环境准备&#xff1a;安装Miniconda激活环境 2. 配置pip源加速下载3. 配置学术加速&#xff08;访问国外资源&#xff09;4. 安装系统依赖5. 安装OLMOCR6. 运行OLMOCR处理PDF文档7. 理解OLMOCR输出结果9. 可视化UI界面9.1 安装界面依赖9.2 创建界面应用…...

STM32单片机uCOS-Ⅲ系统11 中断管理

目录 一、异常与中断的基本概念 1、中断的介绍 2、和中断相关的名词解释 二、中断的运作机制 三、中断延迟的概念 四、中断的应用场景 五、中断管理讲解 六、中断延迟发布 1、中断延迟发布的概念 2、中断队列控制块 3、中断延迟发布任务初始化 OS_IntQTaskInit() 4…...

CTF【WEB】学习笔记1号刊

Kali的小工具箱 curl www.xxx.com&#xff1a;查看服务器响应返回的信息 curl -I www.xxx.com:查看响应的文件头 一、cmd执行命令 ipconfig&#xff1a;ip地址配置等&#xff1b; 二、 Kali操作 1.sudo su&#xff1b; 2.msfconsole 3.search ms17_010 永恒之蓝&#xff…...

cpp-友元

理解 C 中的友元&#xff08;Friend&#xff09; 在 C 语言中&#xff0c;封装&#xff08;Encapsulation&#xff09; 是面向对象编程的重要特性之一。它允许类将数据隐藏在私有&#xff08;private&#xff09;或受保护&#xff08;protected&#xff09;成员中&#xff0c;…...

Spring AOP 核心概念与实践指南

第一章&#xff1a;AOP 核心概念与基础应用 1.1 AOP 核心思想 ​面向切面编程&#xff1a;通过横向抽取机制解决代码重复问题&#xff08;如日志、事务、安全等&#xff09;​核心优势&#xff1a;不修改源代码增强功能&#xff0c;提高代码复用性和可维护性 1.2 基础环境搭…...

利用ffmpeg库实现音频Opus编解码

一、编译与环境配置 ‌libopus库集成‌ 需在编译FFmpeg时添加--enable-libopus参数&#xff0c;编译前需先安装libopus源码并配置动态库路径‌。最新FFmpeg 7.1版本默认支持Opus的浮点运算优化和VBR/CVBR模式‌。 ‌多平台兼容性‌ Opus支持Windows/Linux/macOS平台&#xff0…...

深入理解指针(1)(C语言版)

文章目录 前言一、内存和地址1.1 内存1.2 究竟该如何理解编址 二、指针变量和地址2.1 取地址操作符&2.2 指针变量和解引用操作符*2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引用操作符 2.3 指针变量的大小 三、指针变量类型的意义3.1 指针的解引用3.2 指针-整数3.3 voi…...

计算机网络——通信基础和传输介质

物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&#xff09;的传输 到了数据链路层之后&#xff0c;它会以帧为单位&#xff0c;把若干个比特交给物理层&#xff0c;物理层需要把这些比特信息转化成信号&#xff0c;在物理传输媒体上进行传输 通信基础基本概念 信…...

【橘子网络】关于网络分层以及协议的全局讲解

一、网络设备 1、硬件网络设备 1.1、主机(host) 主机的定义比较广泛&#xff0c;所有的接收流量或者发送流量的设备都可以被称之为主机。可以是电脑&#xff0c;手机&#xff0c;服务器。在当今云服务大行其道的局面下&#xff0c;各种云设备也可以被称之为主机。 基于这个…...

macOS 使用 enca 识别 文件编码类型(比 file 命令准确)

文章目录 macOS 上安装 enca基本使用起因 - iconv关于 enca安装 Encaenca & enconv 其它用法 macOS 上安装 enca brew install enca基本使用 enca filepath.txt示例 $ enca 动态规划算法.txt [0] Simplified Chinese National Standard; GB2312CRLF line terminat…...

MySQL 字符集

目录 字符集的基本概念 常见MySQL字符集 ascii(单字节字符集) latin1(单字节字符集) utf8(多字节字符集) utf8mb4(多字节字符集) MySQL默认字符集 MySQL字符集的层次级别 服务器级别 数据库级别 表级别 列级别 连接字符集 字符集是计算机科学中的一个重要概念&…...

Linux shell脚本3-if语句、case语句、for语句、while语句、until语句、break语句、continue语句,格式说明及程序验证

目录 1.if 控制语句 1.1 if 语句格式 1.2 程序验证 2.case语句 2.1case语句格式 2.2程序验证 2.2.1 终端先执行程序&#xff0c;在输入一个数 2.2.2 终端执行程序时同时输入一个预设变量 2.2.3 case带有按位或运算和通配符匹配 3.for语句 3.1for语句格式 3.2程序验…...

基于虚拟知识图谱的语义化决策引擎

在数字化转型浪潮中&#xff0c;企业数据资产的价值释放面临两大挑战&#xff1a;海量异构数据的整合困局与业务-技术语义鸿沟。本文解析飞速创软灵燕智能体平台的创新解决方案——通过构建业务语义驱动的虚拟知识图谱系统&#xff0c;实现企业数据的智能认知与决策赋能。 一、…...

Unity Shader 的编程流程和结构

Unity Shader 的编程流程和结构 Unity Shader 的编程主要由以下三个核心部分组成&#xff1a;Properties&#xff08;属性&#xff09;、SubShader&#xff08;子着色器&#xff09; 和 Fallback&#xff08;回退&#xff09;。下面是它们的具体作用和结构&#xff1a; 1. Pr…...

C++ 继承

目录 一、继承的概念与定义 1.1 继承的概念 1.2 继承的定义 1.2.1 语法 1.2.2 继承关系和访问限定符 1.2.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、C11 final 六、继承与友元 七、继承与静态成…...

XSS Game(DOM型) 靶场 通关

目录 靶场网址 Ma Spaghet! 分析 解题 Jefff 分析 解题 方法一 方法二 Ugandan Knuckles 分析 解题 Ricardo Milos 分析 解题 Ah Thats Hawt 分析 解题 方法一 方法二 Ligma 分析 解题 ​ Mafia 分析 解题 方法一&#xff1a;构造函数 方法二&#xf…...

XSS基础靶场练习

目录 1. 准备靶场 2. PASS 1. Level 1&#xff1a;无过滤 源码&#xff1a; 2. level2&#xff1a;转HTML实体 htmlspecialchars简介&#xff1a; 源码 PASS 3. level3:转HTML深入 源码&#xff1a; PASS 4. level4:过滤<> 源码&#xff1a; PASS: 5. level5:过滤on 源码…...

leetcode-200.岛屿数量

首先&#xff0c;想要找岛&#xff0c;肯定是要逐个遍历的&#xff0c;否则肯定会漏岛。 其次&#xff0c;我怎么知道两个点是否属于一个岛&#xff1f;只有一个方法&#xff0c;我踏上一个岛的某个点时&#xff0c;我就分别往四周走&#xff0c;且把当前地块毁掉&#xff0c;就…...

Linux | ubuntu安装 SSH 软件及测试工具

01 windows 要怎么和 ubuntu 互传文件呢&#xff0c;我们可以使用 ssh 软件。 终端输入 sudo apt-get install openssh-server &#xff0c;输入登录 Ubuntu 用户的密码&#xff0c;这里我们输入 y 确认安装。如下图所示。 接着继续改 ssh 配置文件&#xff0c;因为 ssh 默认…...

组件日志——etcd

目录 一、简介 二、安装【Ubuntu】 安装etcd 安装CAPI 三、写一个示例 3.0写一个示例代码 3.1获取一个etcd服务 3.2获取租约(写端操作) 3.3使用租约(写端操作) 3.4销毁租约(写端操作) 3.5获取etcd服务中的服务列表(读端操作) 3.6监听状态变化(读端操作) 一、简介 Et…...

search_fields与filterset_fields的使用

在Django中&#xff0c;search_fields 和 filterset_fields 可以在视图类中使用&#xff0c;尤其是在 Django REST Framework (DRF) 中。它们分别用于实现搜索和过滤功能。以下是它们在视图类中的具体使用方法。 1. search_fields 在视图类中的使用 search_fields 是 DRF 中 S…...

SQLite Delete 语句详解

SQLite Delete 语句详解 SQLite 是一种轻量级的数据库管理系统&#xff0c;广泛应用于移动设备、嵌入式系统和服务器端应用。在数据库管理中&#xff0c;删除数据是一项基本操作。SQLite 提供了强大的删除功能&#xff0c;本文将详细介绍 SQLite 的 Delete 语句及其用法。 1.…...

通往自主智能之路:探索自我成长的AI

1. 引言&#xff1a;当前AI范式与自我成长智能的愿景 当前的人工智能领域在很大程度上由大型语言模型&#xff08;LLM&#xff09;的卓越能力所定义。这些模型&#xff0c;例如OpenAI的GPT系列和谷歌的BERT&#xff0c;已经展示了前所未有的理解和生成类人文本的能力。LLM通常…...

[自动化] 【八爪鱼】使用八爪鱼实现CSDN文章自动阅读脚本

在CSDN上&#xff0c;文章的阅读量往往是衡量内容影响力的一个重要指标。为了测试自动化手段能否提高阅读数&#xff0c;我尝试使用网页自动化工具来模拟人工阅读某个ID的文章。 1. 网页自动化的常见方案 谈到网页自动化&#xff0c;Selenium 是一个最常见的选择。它可以通过…...

Kafka消息序列化深度革命:构建高性能、高安全的自定义编码体系

一、突破默认序列化的桎梏 1.1 原生序列化器的致命缺陷 Kafka默认提供的StringSerializer/ByteArraySerializer在复杂场景下暴露三大痛点&#xff1a; 类型安全黑洞&#xff1a;字节流缺乏元数据描述&#xff0c;消费端解析如履薄冰版本兼容困境&#xff1a;数据结构变更导致…...

2025年如何避免使用验证码求解器时被IP封禁

引言 2025年&#xff0c;验证码求解器已成为自动化网络抓取和其他在线流程的关键工具。然而&#xff0c;自动化用户面临的一个常见挑战是IP封禁。当网站检测到自动化活动时&#xff0c;通常会阻止发出请求的IP地址&#xff0c;导致验证码挑战无法解决。本文将探讨使用验证码求…...

前端 AI IDE应用优缺点

嗯&#xff0c;用户问了三个前端面试的问题&#xff0c;我需要仔细分析每个问题&#xff0c;并结合提供的搜索结果来给出全面且准确的回答。 第一个问题是关于开发工具Cursor或Vim的Windurf在开发中的占比以及它们的缺点。从搜索结果里看&#xff0c;网页3提到了Trae对标Curso…...

银河麒麟桌面版包管理器(二)

APT包管理器 APT是Debian及其派生系统的包管理器&#xff0c;构建在dpkg之上&#xff0c;以其强大的依赖性处理能力和丰富的软件仓库而闻名。APT具有自动解决依赖关系、提供易于使用的命令行工具&#xff08;如apt-get、apt-cache等&#xff09;&#xff0c;以及稳定的软件更新…...

Leetcode 3494. Find the Minimum Amount of Time to Brew Potions

Leetcode 3494. Find the Minimum Amount of Time to Brew Potions 1. 解题思路2. 代码实现 题目链接&#xff1a;3494. Find the Minimum Amount of Time to Brew Potions 1. 解题思路 这道题虽说算是搞定了&#xff0c;通过了全部的测试样例&#xff0c;不过还是很暴力的求…...

制作Oracle11g Docker 镜像

基于Linux系统&#xff0c;宿主主机要设置如下环境变量&#xff0c;oracle为64位版本 dockerfile中需要的数据库安装包可从csdn下载内找到 #!/bin/bash # 在宿主机上运行以设置Oracle所需的内核参数 # 这些命令需要root权限cat > /etc/sysctl.d/99-oracle.conf << EO…...

rocky linux下载软件

一、配置国内镜像源加速下载 Rocky Linux 默认使用国外软件源&#xff0c;国内用户可通过替换为阿里云镜像提升下载速度&#xff1a; 备份原配置文件&#xff1a; cp -r /etc/yum.repos.d /etc/yum.repos.d.backup 修改镜像源&#xff1a; sed -e s|^mirrorlist|#mirrorli…...

JVM的组成--运行时数据区

JVM的组成 1、类加载器&#xff08;ClassLoader&#xff09; 类加载器负责将字节码文件从文件系统中加载到JVM中&#xff0c;分为&#xff1a;加载、链接&#xff08;验证、准备、解析&#xff09;、和初始化三个阶段 2、运行时数据区 运行时数据区包括&#xff1a;程序计数…...

SpringBoot中安全的设置阿里云日志SLS的accessKey

众所周知,阿里云的服务都是基于accesskeyId和accesskeySecret来进行身份鉴权的,但唯独日志因为需要写入到.xml文件里对于accesskeyId和accesskeySecret需要进行一定程度的改进,尤其是使用了jasypt进行加密的参数传递进去logback.xml更是会遇到需要对参数进行解密的问题,而官网只…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例11,TableView15_11带分页的导出表格示例

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

C++多线程编程:从创建到管理的终极指南

在高性能计算时代,掌握多线程编程是提升程序效率的必修课!本文将手把手教你如何用C++11标准库轻松创建和管理线程,告别单线程的“龟速”,让代码跑出多核CPU的性能! 一、多线程为何重要? 充分利用多核CPU:现代计算机普遍支持多核并行,多线程可让程序性能指数级提升。提升…...

人工智能算法基础

基础算法 排序查找线性结构树散列图堆栈 机器学习算法 定义&#xff1a;数据算法 流程&#xff1a;数据收集与预处理、特征选择、训练和测试模型、模型的评估。 监督学习 定义&#xff1a;是从给定的训练数据集中学习出一个函数&#xff0c;当新的数据到来时&#xff0c;可…...

Normal distribution (正态分布)

Normal distribution {正态分布} 1. Normal distribution (正态分布) Gaussian distribution (高斯分布)1.1. Probability density function (概率密度函数)1.2. Standard normal distribution (标准正态分布)1.3. Cumulative distribution function (累积分布函数) 2. 正态分…...

企业级前端架构设计与实战

一、架构设计核心原则 1.1 模块化分层架构 典型目录结构&#xff1a; src/├── assets/ # 静态资源├── components/ # 通用组件├── pages/ # 页面模块├── services/ # API服务层├── store/ # 全局状态管理├── uti…...

数据模型,数据建模,组件,核心价值,使用,意义

数据模型 一组由符号,文本组成的集合, 用以准确表达信息景观, 达到有效交流,沟通的目的 数据建模 是发现,分析和确定数据需求的过程,是一种称为数据模型的精确形式表示和传递这些需求 数据模型的组件 实体, 关系, 属性和域 数据模型的核心价值 交流性 精确性 数据模型的…...

JavaScript 比较运算符

JavaScript 比较运算符 一、基础比较运算符类型 运算符名称示例核心特性==宽松相等"5" == 5 → true隐式类型转换===严格相等"5" === 5 → false类型+值双重校验!=宽松不等null != 0 → true等效于 !(a == b)!==严格不等5 !== "5" → true类型或…...

AI Agent战国时代:Manus挑战者的破局之道与技术博弈

随着Manus引爆通用型AI Agent的"手脑协同"革命&#xff0c;全球AI Agent赛道进入技术竞速期。Flowith、UI-TARS、LangManus等新势力通过差异化路径重构市场格局&#xff0c;背后折射出开源生态、本土化创新与跨模态交互的深层技术博弈。本文结合行业权威报告与公开技…...

linux--时区查看和修改

查看当前时间和时区: 打开终端&#xff0c;输入以下命令查看当前的日期和时间设置&#xff1a; timedatectl修改时区: 使用 timedatectl 命令来修改时区&#xff1a; sudo timedatectl set-timezone <时区>例如&#xff0c;设置时区为北京时间&#xff08;中国标准时间&a…...

个人博客系统 --- 测试报告

一、项目功能介绍 该项目由&#xff1a;登录模块、博客首页模块、博客详情页模块、博客编辑页模块四个功能模块组成。 该系统实现了个人博客的保存以及记录了发布日期、时间、发布人等信息。 二、测试内容与测试用例 我们需要对该系统进行功能测试&#xff0c;界面测试&…...

ESP32S3基于FreeRTOS实时操作系统控制舵机

这段代码是一个基于ESP32的舵机控制示例&#xff0c;通过MCPWM模块配置定时器、操作符、比较器和发生器&#xff0c;生成特定脉冲宽度的PWM信号&#xff0c;控制舵机在 -60度到60度之间以2度为步长往复转动。 1. 源码部分 #include "freertos/FreeRTOS.h" #include…...

【vue的some和filter】

在 Vue 中&#xff0c;some 和 filter 是两种不同的数组方法&#xff0c;分别用于处理数据筛选和条件判断。以下是它们在 Vue 中的具体用法和区别&#xff1a; 一、filter 方法 作用&#xff1a;对数组进行过滤&#xff0c;返回符合条件的新数组。 使用场景&#xff1a;常用于…...

【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【LC插件开发】基于Java实现FSRS&#xff08;自由间隔重复调度算法&#xff09;&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录…...

jupyter 操作相关内容

1、jupyter界面美化 pip3 install jupyterthemes查看可用主题 jt -l推荐两个 jt -t grade3 -f consolamono -fs 140 -tfs 13 -nfs 115 -ofs 14 -cellw 90% -Tjt -t chesterish -f consolamono -fs 140 -altp -tfs 13 -nfs 115 -ofs 14 -cellw 90% -T...

【数据结构】单链表

目录 一、什么是链表&#xff1f;1、 定义2、链表的分类 二、无头单向非循环链表1、结构2、单链表数据的打印3、创建结点并初始化4、尾插5、头插6、尾删7、头删8、查找9、在指定位置pos之前插入数据10、在指定位置pos之后插入数据11、删除pos结点12、删除pos之后的结点13、销毁…...

UnoCSS极速入门:下一代原子化CSS引擎实战指南

文章目录 一、什么是UnoCSS&#xff1f;二、环境配置&#xff08;Vite示例&#xff09;三、核心使用模式3.1 自定义规则3.2 原子化类应用3.3 使用RegExp匹配器 四、高级功能解析4.1 主题系统4.2 响应式与深色模式 五、实战案例&#xff1a;构建现代按钮组件六、性能优化技巧七、…...

Es6进阶

class里的get和set 在 ES6 中&#xff0c;class 里的 get 和 set 是用于定义访问器属性的关键字。get 方法可在访问对象属性时调用&#xff0c;set 方法则在设置对象属性时调用。下面通过一个简单示例来介绍它们的用法&#xff1a; javascript class Person {constructor(nam…...