Jiahong 的个人博客

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

Conference——各种会议知识总结

NIPS和Advances in Neural Information Processing Systems的关系

  • NIPS 会议全称为:Annual Conference on Neural Information Processing Systems,年度神经信息处理系统大会
  • NIPS 收录的会议论文会以“Advances in Neural Information Processing Systems”为名出版成书,一般由 mit 和 Morgan Kaufmann 出版社出版
  • 引用时一般会以“Advances in Neural Information Processing Systems”命名

ICLR不在CCF列表中

  • ICLR(International Conference on Learning Representations) 是近年来的会议,也是很好的会议,甚至可以比拟 NIPS,但是因为国内发的不多,所以没有列到 CCF列表 中
  • ICLR 在清华的列表中是 A 类

SIGKDD vs KDD

  • 这两者指的是同一个会议,一般正式叫做 SIGKDD
  • 会议全称:ACM Knowledge Discovery and Data Mining

AI 顶会 & 顶刊排名

  • AI顶会&顶刊
  • 人工智能方面顶级会议(转)

FS——文件系统总结


FAT32

常用于闪存

优点

  • 通用格式,任何USB都会预装FAT32,任何操作系统平台上都能读写
  • 节约空间

缺点

  • 单个文件的大小限制为4GB
  • 无读写日志,不能记录磁盘上文件的修改记录?

ExFAT

微软自家创建的用来取代FAT32的新型文件格式类型

优点

  • 跨平台
  • 能支持4GB以上的单个文件

缺点

  • 无读写日志,不能记录磁盘上文件的修改记录

NTFS

New Technology File System
微软为硬盘和固态硬盘创建的默认新型文件系统
几乎集成了所有文件系统的优点

优点

  • 日志功能
  • 无文件大小限制
  • 支持文件压缩和长文件名
  • 服务器文件管理权限

缺点

  • MacOS不能写,只能读(严格来说并不能算是NTFS的问题,是苹果自己不适配吧)

MacOS日志式

优点

  • 没啥缺点也是一种优点

缺点


总结

  • 如果要在MacOS上访问使用就用ExFAT,否则一律使用NTFS
  • 对于移动硬盘可以考虑部分分区格式化为ExFAT,部分分区格式化为NTFS

IDEA——一些常见的问题解决方案

本文总结一些IDEA使用过程中遇到的问题和解决方案


模块导入问题

  • 同一目录下Python模块导入有红色波浪线,但是可以运行
    • 解决方案:
      • 将当前文件夹标记成Source Root
      • 如果是使用的from,可使用当前文档标记符来解决问题
        1
        from .test_module import test_function

VSCode——一些常见的问题解决方案

本文总结一些 VSCode 使用过程中遇到的问题和解决方案


VSCode 不显示 Git 修改情况

  • VSCode 不显示 Git 修改情况(比如行号旁的颜色标记、文件状态图标、源代码管理面板无内容等),通常是 Git 配置、工作区设置或插件冲突 导致的

第一步:基础检查:确认项目已关联 Git 仓库

  • VSCode 仅对 Git 仓库目录 显示修改跟踪,先确认项目是否初始化 Git
  • 执行命令 git status

第二步:启用 VSCode 内置 Git 功能(核心步骤)

  • VSCode 内置 Git 支持,可能被手动禁用,需重新启用:
    • 1)打开 VSCode 设置
    • 2)搜索配置项 git.enabled ,确保勾选(值为 true)
    • 3)搜索配置项 git.decorations.enabled ,确保勾选(控制行号旁的修改标记、文件图标状态)
    • 4)重启 VSCode(关键!修改配置后需重启生效)

第三步:检查 Git 可执行文件路径(Git 未被 VSCode 识别)

  • 若 VSCode 找不到 Git 程序,会无法跟踪修改,需手动指定 Git 路径
  • 先确认本地已安装 Git(终端执行 git --version,若提示“不是内部命令”,需先安装)
  • 在 VSCode 设置中搜索/创建 git.path
    • 注意,这个字段可能找不到,需要在 settings.json 文件中手动加入
    • 比如添加 "git.path": "/usr/bin/git"
      • Windows:默认 C:\Program Files\Git\bin\git.exe 或 C:\Program Files\Git\cmd\git.exe;
        • Mac/Linux:默认 /usr/bin/git 或 /usr/local/bin/git(可通过 which git 命令查询);
  • 重启 VSCode,再查看是否生效

其他可能的问题

  • Git 版本过低:VSCode 对旧版 Git 兼容性较差,升级 Git 到 2.20+ 版本(官网下载最新版);
  • 权限问题:项目目录或 .git 文件夹无读写权限
    • Windows 右键目录 -> 属性 -> 安全 -> 允许“完全控制”;
    • Mac/Linux 执行 chmod -R 755 项目目录;
  • VSCode 版本过旧:升级 VSCode 到最新版(左下角齿轮 -> 检查更新)
  • 冲突插件或 VSCode Git 配置错误

附录:修复文件/文件夹的 Git 跟踪状态(仅部分文件不生效时)

  • 若部分文件不显示修改,可能是 Git 未跟踪或被忽略
  • 检查 .gitignore 文件:确保目标文件没有被添加到 .gitignore(比如 node_modules/、dist/ 等目录会被默认忽略,修改这些目录的文件不会显示跟踪);
  • 手动跟踪未跟踪文件:终端执行 git add 文件名(或 git add . 跟踪所有文件),之后修改文件会显示红色(删除)、绿色(新增)、黄色(修改)标记;
  • 清除 Git 缓存(若文件曾被 .gitignore 忽略后需重新跟踪)
    1
    2
    3
    4
    5
    git rm --cached 文件名  # 单个文件
    # 或所有文件
    git rm -r --cached .
    git add .
    git commit -m "修复 Git 跟踪状态"

快捷键修改

  • File -> Preferences -> Keyboard Shortcuts
  • 可按照快捷键或名字搜索即可
    • 名称:
      • 如 前进/后退(中文)或 go back / go forward 表示前进或后退
      • 如 缩进/减少缩进 或 indent / outdent 表示缩进或者减少缩进
    • 快捷键:
      • 如 ctrl, cmd, tab, space,shift 等

VSCode——Debug使用笔记


整体说明

  • VSCode Debug 大型项目是有一定难度和门槛的

Debug 的前置准备

安装必要插件

  • 打开 VSCode,左侧栏扩展(快捷键Ctrl+Shift+X),搜索并安装:
    • Python(微软官方,核心插件)
    • Python Debugger(新版调试核心,微软官方)
    • 可选:Pylance(增强代码提示,大型项目必备)

确认 Python 解释器

  • 大型项目通常用虚拟环境,Debug 是从 terminal 中启动的,需要在 terminal 先配置好环境
  • 快捷键 Ctrl+Shift+P,输入 Python: Select Interpreter

初始化调试配置文件(launch.json)

  • VSCode 调试依赖 launch.json 配置,大型项目需自定义配置以适配项目结构,步骤如下:

  • 1)打开项目根目录(关键:必须打开根目录,而非单个文件)

  • 2)打开调试面板:左侧栏 运行和调试 (快捷键Ctrl+Shift+D), 点击 创建 launch.json 文件

  • 3)选择调试环境:弹出的下拉框中选 Python,再选 Python File(基础模板,后续修改)

    • 默认生成的 launch.json 在 .vscode 文件夹下
  • 4)自定义 launch.json(这一步是核心!适配大型项目),修改为适合大型项目的配置,示例如下(注释说明关键参数):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Python: 项目主入口", // 配置名称,可自定义
    "type": "debugpy", // 调试器核心,固定值
    "request": "launch", // 启动调试(而非附加进程)
    "program": "${workspaceFolder}/src/main.py", // 项目主入口文件(替换为你的实际路径)
    "cwd": "${workspaceFolder}", // 调试时的工作目录(固定为项目根)
    "args": ["--env", "dev", "--config", "configs/dev.yaml"], // 主程序运行参数(按需添加)
    "justMyCode": false, // 大型项目建议关闭,可调试第三方库/依赖代码
    "env": { // 自定义环境变量(如数据库地址、密钥等)
    "PYTHONPATH": "${workspaceFolder}", // 关键!解决大型项目模块导入问题
    "ENV": "development"
    },
    "envFile": "${workspaceFolder}/.env", // 加载.env文件(可选,管理环境变量)
    "stopOnEntry": false, // 启动后是否立即暂停(新手可设为true,熟悉后改false)
    "console": "integratedTerminal", // 调试输出到VSCode集成终端(方便看日志)
    "subProcess": true // 关键!调试子进程/子模块(大型项目多进程必备)
    },
    // 可选:添加调试单个模块/测试文件的配置
    {
    "name": "Python: 调试单个模块",
    "type": "debugpy",
    "request": "launch",
    "module": "src.utils.data_process", // 调试指定模块(替代program)
    "cwd": "${workspaceFolder}",
    "env": {"PYTHONPATH": "${workspaceFolder}"}
    }
    ]
    }
    • PYTHONPATH:将项目根目录加入 Python 路径,解决 模块找不到 问题(大型项目多目录结构必配);
    • subProcess:开启后可调试项目中通过 subprocess 启动的子进程;
    • args:传递给主程序的命令行参数(如配置文件路径、环境参数)

设置断点

  • 大型项目调试时应该避免 全局断点 ,需针对性设置:

基础断点

  • 点击代码行号左侧的空白处,出现红色圆点即断点生效(调试时运行到此处会暂停)

高级断点(非常好用)

  • 使用:右键断点红点 -> Edit Breakpoint,会出现多个选项可选,默认是 Expression
    • Expression :
      • 右键断点红点 -> Edit Breakpoint -> Expression -> 输入 Python 表达式(仅当表达式为 True 时暂停)
      • 示例:调试循环处理数据时,设条件 i == 100(仅第 100 次循环暂停,避免逐行调试)
      • 注意这个配置很好用,不需要修改代码,且可以是任意的语句
    • Log Messages :
      右键断点红点 -> Edit Breakpoint -> Log Messages -> 输入日志内容(如 "处理数据:{data_id}" )
      • 调试时不暂停,仅输出日志(适合排查循环/批量处理问题,不中断程序)

启动调试

  • 第一步:
    • 确认 launch.json 中选中目标配置
    • 比如调试面板顶部下拉框选 launch.json 中已经配置好的选项
  • 第二步:
    • 点击调试面板的 绿色三角按钮
    • 启动后程序运行到断点会暂停,顶部出现调试控制栏,核心按钮(从左到右):
  • 第三步:一些调试操作说明
    • 继续(F5):运行到下一个断点;
    • 单步跳过(F10):执行当前行,不进入函数内部(适合快速跳过无关代码);
    • 单步进入(F11):进入当前行调用的函数内部(调试子模块核心);
    • 单步退出(Shift+F11):从当前函数退出到调用处;
    • 重启(Ctrl+Shift+F5):重新启动调试;
    • 停止(Shift+F5):结束调试

附录:调试时查看数据

  • VSCode 提供多个面板 查看 查看变量/数据状态

变量面板

  • 自动显示当前作用域的所有变量(局部变量、全局变量、内置变量)
  • 可展开复杂对象(如字典、类实例)查看内部属性
  • 右键变量 -> 添加到监视 ,固定关注核心变量

监视面板

  • 手动输入 Python 表达式(如 len(data_list)、user.id == 123),实时显示结果;
  • 大型项目建议添加 核心状态变量 (如配置是否加载、数据库连接是否正常)
  • 监控面板的变量会固定长期展示(变化也会体现出来)

附录:调试大型项目的进阶技巧(避坑+效率提升)

技巧1:解决 模块导入失败 问题

  • 大型项目多目录结构(如 src/、tests/、configs/)易出现 ModuleNotFoundError,除了配置 PYTHONPATH,还可以尝试
    • 在项目根目录创建 __init__.py(空文件即可,标记为Python包);
    • 调试单个模块时,用 module 参数替代 program(如 launch.json 中 "module": "src.utils.data_process",而非直接指定文件路径)

技巧2:调试多线程/多进程项目

  • 多线程 :调试面板左侧 调用堆栈 -> 展开 线程 列表,切换不同线程查看状态;
  • 多进程 :
    • 若用 gevent 协程,需在 launch.json 中添加 "gevent": true
    • 普通进程使用 subProcess: true(子进程调试);
  • 进阶:使用 附加到进程 调试(调试面板 -> 添加配置 -> Python: 附加到进程 ,选择运行中的Python进程)

技巧3:调试测试用例(大型项目单元测试必备)

  • 安装 pytest(pip install pytest);

  • launch.json 添加配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "name": "Python: test case",
    "type": "debugpy",
    "request": "launch",
    "module": "pytest",
    "args": ["tests/test_data_process.py::test_handle_data", "-v"],
    "cwd": "${workspaceFolder}",
    "env": {"PYTHONPATH": "${workspaceFolder}"}
    }
    • 启动后直接调试指定测试用例(精准定位单元测试失败问题)

技巧4:跳过无关代码(提升效率)

  • 大型项目调试时避免进入第三方库/无关模块:
    • 在 launch.json 中设置 "justMyCode": true(默认),调试时自动跳过 site-packages 中的第三方库代码
    • 若需调试自己写的子模块,确保模块路径在 PYTHONPATH 中,且代码在 ${workspaceFolder} 下

附录:其他问题总结

  • 若断点未触发:检查 launch.json 的 program 路径是否正确、断点是否在执行路径上、PYTHONPATH 是否配置

  • 若变量查看异常:确认当前作用域是否正确(如函数内部只能看局部变量)

  • 若调试卡顿:减少不必要的断点,优先用 日志断点 替代普通断点

  • 断点灰色(未生效):

    • 原因:文件不在项目根目录、解释器选错、launch.json 的 program 路径错误;
    • 解决:确认打开的是项目根目录,重新选择解释器,检查 program 路径是否为 ${workspaceFolder} 开头
  • ModuleNotFoundError:

    • 解决:配置 PYTHONPATH: "${workspaceFolder}",或在代码开头添加:
      1
      2
      3
      import sys
      from pathlib import Path
      sys.path.append(str(Path(__file__).parent.parent)) # 向上级目录添加到路径
  • 调试时终端无输出:

    • 解决:launch.json 中设置 "console": "integratedTerminal"(而非 internalConsole)

数据结构——堆排序

本文介绍堆排序的思想和代码

  • 参考链接:堆排序【超详细+代码】

基本思想

  • 生成最大堆(heapify):从倒数第一个非叶节点开始,按照下虑操作找到该节点在最大堆中的位置,逐步遍历每一个非叶结点执行上述操作,生成最大堆
  • 交换最大值到末尾:交换根节点与最后一个元素的值,树节点减少1(刚才根节点是当前树的最大值,更换以后就是有序的元素了,不再参与最大堆调整)
  • 重新生成最大堆(调整根节点):调整新换上来的根节点(下虑操作),找到其应该在的地方,重新生成最大堆
  • 循环交换根节点和调整根节点这两个步骤,直到最大堆只剩下一个元素

代码实现

  • 堆排序的代码实现
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    // 堆排序实现,对长度为n的数组a进行排序
    void HeapSort(int* a, int n)
    {
    // 生成堆 heapify
    for (int i = n/2-1; i >= 0; --i) // 从n/2-1开始,找到最大的非叶节点
    {
    AdjustDown(a, n, i); // 将第i个节点按照下虑操作放置到它在最大堆中应该在的地方,注意本函数执行完后,当前节点i的所有子节点都小于等于节点i,也就是说,在最终生成的最大堆中,节点i的位置不会再更靠后了,详情见后面函数的实现
    }
    int end = n - 1; // 用于表示数组尾部结点的下标 数值表示此前数字个数
    while (end > 0)
    {
    Swap(&a[0], &a[end]); // 将根部数据排在最后 达到升序的效果
    AdjustDown(a, end, 0);
    --end; // 将从根部换下的值不当作堆中数据 对堆重复以上操作
    }
    }

    // 最大堆的下虑操作实现:将 数组a的前size个数 所表达的最大堆的 parent节点 通过下虑操作找到其应在的位置
    void AdjustDown(int* a, int size, int parent)//向下调整(O(logn))
    {
    // 假设法,假设最大孩子节点是左节点
    int child = parent * 2 + 1;
    while (child < size)
    {
    // 大堆中 向下调整 找大的孩子节点
    if (child + 1 < size && a[child] < a[child + 1]) // 假设错误,右孩子大于左孩子
    {
    child++; // 更新为右孩子
    }
    if (a[child] > a[parent]) // 如果不符合最大堆规则,将父节点与最大的孩子节点进行交换
    {
    Swap(&a[child], &a[parent]); // 交换完成
    // 更新父节点和子节点
    parent = child; // 此时的父节点变为孩子节点所在位置(还是入参parent对应的那个数字),需要继续进行下一轮最大堆验证
    child = parent * 2 + 1; // 依然假设法,假设最大孩子节点是左节点
    }
    else // 如果满足最大堆规则,终止
    {
    break;
    }
    }
    }

机器码——源码-补码-反码

参考博客:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html


基础

机器数

  • 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
    • 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011
  • 那么,这里的 00000011 和 10000011 就是机器数

真值

  • 因为第一位是符号位,所以机器数的形式值就不等于真正的数
  • 例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)
  • 所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值
    • 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

原码, 反码, 补码

  • 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.

原码

  • 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

    [+1]原 = 0000 0001
    [-1]原 = 1000 0001

  • 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

    [1111 1111 , 0111 1111]
    [-127 , 127]

  • 原码是人脑最容易理解和计算的表示方式

反码

  • 反码的表示方法是:
    • 正数的反码是其本身
    • 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

      [+1] = [00000001]原 = [00000001]反
      [-1] = [10000001]原 = [11111110]反

  • 可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

补码

  • 补码的表示方法是:
    • 正数的补码就是其本身
    • 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

      [+1] = [00000001]原 = [00000001]反 = [00000001]补
      [-1] = [10000001]原 = [11111110]反 = [11111111]补

  • 对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

Python中特殊加法运算负数非负的问题

原始题目

  • 剑指 Offer:不用加减乘除对两个整数做加法
    1
    2
    3
    4
    5
    6
    def Add(num1, num2):
    mask = 0xFFFFFFFF
    max_value = 0x7FFFFFFF
    while num2:
    num1, num2 = (num1^num2)&mask, (num1&num2)<<1
    return num1 if num1 <= max_value else ~(num1^mask)
~(num1^mask)的理解
  • 此处实际上是假设num1是一个32位的整型数(在C++和Java中的定义为int,也就是默认32位整型数),Python中由于无法定义整型位数,也就无法识别正常的负数
    • num1为0x8FFFFFFF在C++和Java中为32位整型数时,实际上是个负数
    • Python无法识别到这个负数,因为Python的数值存储长度很长,强制转换也不行
    • 如果我们可以将num1的后32位不变,前面的所有位置取反(由0变成1) ,那么就可以得到Python中的负数值
    • 此时如果先用num1^mask即可得到一个后面32位取反,前面其他位置全部保留正常(实际上都还是0)
      • 原因是mask后32位是1,所以num1每一位为0时异或结果为1,为1时异或结果为0,整体上就等价于对后32位取反
    • 在后面的位置取反后再对所有位置全部取反,那么就可以实现对num1的后32位不变,前面所有位置取反的操作得到Python中的负数的补码

通用——日常杂记

本文记录一些日常通用的笔记,定期整理入其他的路径下


日常笔记

  • Linux 中,realpath 命令可显示文件绝对路径
  • jsonl 文件中每一行是一个 json 字符串
  • Linux 中,汇总显示当前文件夹下占用大小:du -bsh
    • -s 参数表示总结性展示一个数字即可
  • Python 中,函数内部若不使用 return 而是 ...,则表示返回 None
  • Python 中,x = a or b 等价于 x = a if a else b

U盘——做系统盘后恢复空间

U盘做系统盘后空间会减少,本文给出恢复U盘空间的方法
U盘做系统时会自动隐藏部分空间,用于放置启动文件,这些被隐藏的空间用普通的格式化方法无法恢复


Windows

  • 第一步:清除 U 盘: cmd 输入diskpart

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # show all disks
    list disk
    # select target disk(our usb flash disk)
    select disk=n
    # show all disks again
    # make sure we have chosen the right disk
    # there will be a star in choosed disk
    list disk
    # clean the disk
    clean
  • 第二步:用任意方式格式化 U 盘

系统安装——Win10-U盘启动盘制作

由于 Windows10 过大,install.win 文件超过 4GB,常规的 U 盘启动盘制作都是面向 FAT 分区方式的,该方式无法存储超过 4GB 的文件,本文给出一种解决方案


Windows10 U 盘启动盘制作方法:

  • 打开 UltraISO 制作镜像
    • 注意不勾选 create boot partition 选项,否则 U 盘中会隐藏分区,看不到文件
  • 使用 convert H:/fs:ntfs(H 为 U 盘盘符,ntfs 可支持 4GB 以上的文件)
  • 解压 ISO 文件并替换 U 盘中的 ./sources/install.win 文件(因为该文件大于 4GB,FAT 分区格式无法写入)
1…333435…61
Joe Zhou

Joe Zhou

Stay Hungry. Stay Foolish.

608 posts
49 tags
GitHub E-Mail
© 2026 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4