Python 包下载和虚拟环境管理
分成如下几个部分: pip:包下载安装 venv:虚拟环境管理 conda:包下载安装和 conda 环境管理 这些内容在不同的系统(Windows/Linux)中的实现细节各有不同,在不同的 shell(pwsh/bash/fish)中,对应的脚本实现也有差异,下面以 Linux + bash 为主,也会考虑 Windows + pwsh 的情况。 为了便于区分,本文中的虚拟环境特指使用 venv 创建的虚拟环境,conda 创建的虚拟环境则称为 conda 环境。 现在还有一些新的替代工具,例如 uv,但是它们只是简化使用,并没有本质区别。 pip 基本使用 使用 pip 可以安装 Python 包,常见形式为 1pip install <package_name> 例如安装进度条工具 tqdm 1pip install tqdm pip 会自动处理包的版本要求和依赖关系,依赖关系在不同系统下可能存在差异,例如: 在 Linux 上只会安装 tqdm 自身; 在 Windows 上会自动安装两个包:colorama, tqdm,前者是 tqdm 的依赖。...
星期算法
学习一下如何根据指定的年月日快速计算星期几,由于公历的规律性很强,将所有规律整理并不断简化就可以得到这种简便算法,有很多不同的变形算法,例如蔡勒公式,康威裁决日算法等,本文主要学习蔡勒公式。 公历 简要回顾一下公历:每年12个月,每个月可能有28、29、30、31天。 区分普通的年和闰年,非闰年有365天,闰年有366天,年份满足以下情况时为闰年: 年份除以100的余数不为0,除以4的余数为0 年份除以100的余数为0,并且除以400的余数为0 非闰年的12个月的天数依次为: 28天:2月 30天:4月、6月、9月、11月 31天:1月、3月、5月、7月、8月、10月、12月 闰年的12个月的天数依次为: 29天:2月 30天:4月、6月、9月、11月 31天:1月、3月、5月、7月、8月、10月、12月 由于公历于1582年10月正式建立,在这段时间以及更早的年份可能存在日期修正,细节比较复杂,不作讨论。 蔡勒公式 公式如下 \[ w = \left( y + \left[ \frac{y}4 \right] + \left[ \frac{c}4 \...
Docker 入门笔记
简单学习一下 Docker。 基本概念 Docker 是一种轻量级的容器化技术,与传统虚拟机相比,它更加高效,能够快速部署和运行应用程序。传统虚拟机需要完整的操作系统,每个虚拟机通常占用多个 GB,而 Docker 容器共享宿主机内核,镜像通常只有 MB 级别,占用更少的资源,启动速度更快。 首先需要区分 Docker 的两个核心概念: Docker Image(镜像):Docker 镜像是一个只读的模板(实质是宿主系统中的一个文件),包含了运行应用程序所需的所有文件和环境(包括代码、运行时、依赖项、系统工具等)。镜像可以被用来创建容器,基于一个镜像可以创建多个容器。 Docker Container(容器):容器是基于镜像创建的运行实例(实质是宿主系统中的一个进程),它提供了一个隔离的轻量级 Linux 环境,可以在其中独立运行应用程序。 容器可以被创建、启动、暂停、停止、删除等,多个容器可以在同一个主机上运行,并且它们彼此之间是相互隔离的。容器在运行过程中产生的更改通常不会影响外部系统(除非使用专门的方式,包括数据卷和绑定宿主目录等),更不会影响镜像文件。 镜像的构造过...
Linux Socket 编程入门
关于计算机网络以及Socket编程相关的概念性知识,可以参考相关资料,这里只列举了常见函数的用法,以及两个简单的例子。 Socket 相关函数 socket 函数 创建socket(套接字) 123#include <sys/socket.h>int socket(int family, int type, int protocol); 参数: family:协议族,通常取 AF_INET(IPv4) 或 AF_INET6(IPv6) type:套接字类型,通常取 SOCK_STREAM(TCP) 或 SOCK_DGRAM(UDP) protocol:协议,可以取IPPROTO_TCP、IPPTOTO_UDP,但是更建议直接取0,表示自动使用默认的协议 返回值: 创建成功:返回一个新的套接字文件描述符sockfd 创建失败:返回 -1,通过errno获取错误信息 因此最常见的两种用法以及错误处理如下 12345678910111213// TCPint sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd &l...
VSCode Python 配置
相关插件 VSCode 与 Python 有关的插件如下:(巨硬把这些插件拆分的实在太细了) Python Python Debugger Python Environments Pylance:Python语言服务器,支持自动补全、代码提示等 Black Formatter:代码格式化(需要通过 conda/pip 下载对应模块) Flake8:代码静态分析(需要通过 conda/pip 下载对应模块) Jupyter 插件包: Jupyter Jupyter Keymap Jupyter Cell Tags Jupyter Notebook Renderers Jupyter Slide show 注意需要单独下载 black 和 flake8 包,例如 1conda install black flake8 如果语法高亮等出现问题,最好先清理相关的配置缓存并重启VSCode,可以解决不少问题。 VSCode 插件配置 下面是目前VSCode关于Python的配置(2025年7月) 编辑器配置 12345678"[python]": {...
Pytorch 环境配置记录
记录一下当前 Python 涉及的一些环境配置。 基本信息 当前本地以及服务器的Python和CUDA的基本信息如下: Windows(以及WSL): Windows 11 miniconda Python 版本为 3.12.1 CUDA 驱动最高支持版本 12.8(nvidia-smi) GPU服务器: Ubuntu 20.04 anaconda Python 版本为 3.11.7 CUDA 驱动最高支持版本 12.4 两者存在很多差异,为了尽量保持本地和服务器的版本一致,选择使用 Python 3.12.x,CUDA 12.4。 说明: 指定 Python 版本是 conda 相比于 venv 的一大优势,另一个优势是 conda 包不局限于 Python。 很多库并不支持这么高版本的 Python,到时候再说,反正版本问题是避免不了的。 常用包 记录一些常用的包 12345678# 必备conda install numpy scipy pandas matplotlib seaborn scikit-learn sympy jupyter# 支持impor...
Git submodule 学习笔记
简单记录一下 git submodule 的用法,注意不是 subtree。 添加子模块 可以使用 submodule 功能添加子模块仓库 1git submodule add <子模块仓库的url> 默认会在主仓库下创建一个与子模块仓库同名的文件夹,用于存储子模块的所有内容。 也可以指定子模块使用的文件夹 1git submodule add <子模块仓库的url> subdir 此时在本地仓库中会将新建的子模块和对.gitsubmodules(记录子模块信息,包括最重要的子模块提交版本)的新建或修改添加到暂存区,需要正式提交。 子模块所使用的仓库url最好是公开可访问的,并且最好没有修改推送权限,只能单向接受远程更新的推送,这样最省事。 克隆含子模块的仓库 在克隆一个含有子模块的git仓库时,默认对主仓库的 git clone 命令不会把子模块也拉取下拉,只会得到一个包含子模块信息的.gitsubmodules文件和子模块对应的空目录,这是考虑到实际用途中某些子模块可能是可选项而非必选项。 可以在主仓库中使用下面的命令进行子模块的初始化和更新 12...
开源协议与知识共享协议
开源协议 开源协议是一套用于规范软件源代码使用、修改和分发规则的版权管理工具,广泛应用于编程语言、框架、工具库等软件开发项目。 开源协议的核心理念是“代码公开与共享”,区别于传统软件许可的“闭源限制”,旨在促进协作开发、技术创新和知识传播。 这里记录一下常见的几种开源协议: 较严格的,不允许衍生品闭源: GPL(General Public License) 最严格的开源协议。 要求:衍生代码必须使用 GPL 协议进行开源,确保代码的持续开放性。 LGPL(Lesser General Public License) GPL 的宽松版本。 要求:允许与闭源代码链接使用,但修改后的开源部分仍需沿袭 LGPL 协议。 Mozilla Public License(MPL) 比 LGPL 更灵活。 要求:修改源码的部分需要提供说明文档,且仅修改的部分需开源。 较宽松的,允许衍生品闭源: MIT / BSD 最宽松的开源协议。 要求:仅需保留原作者的版权声明。 允许:自由使用、修改、分发(包括闭源的后续开发)。 补充:最新的 MIT 和 BSD 几乎没有区别。 A...
Gauss-Legendre 和 Gauss-Lobatto 积分表计算
在数值计算的编程实践中经常需要获取 Gauss-Legendre 和 Gauss-Lobatto 积分点和权重, 除了直接打表,还可以利用 Legendre 多项式自身的特点和牛顿迭代法通过高效的数值计算获得相应的积分点和权重,这也是本文关注的内容。 本文的主要动机是对下面两份 MATLAB 代码的学习和解释: Legendre-Gauss Quadrature Weights and Nodes Legende-Gauss-Lobatto nodes and weights 基本概念 Gauss 型数值积分 首先需要介绍一些关于 Gauss 型数值积分的基本内容。 对于标准积分区间 \([-1,1]\) 的如下形式的数值积分公式: \[ I(f) = \int_{-1}^1 f(x)\,dx \approx I_n(f) = \sum_{i=1}^n w_i f(x_i) \] 其中节点 \(x_i \in [-1,1]\)。这些节点和权重的选取有一共 \(2n\) 个自由度,至多可以达到 \(2n-1\) 阶的代数精度。如果加上某些额外的约束条件,则可达到的最优代数精度也...
LeetCode 42. 接雨水
刷到一个笑话:字节跳动员工是不是个个都会接雨水。顺便记录一下这道题吧。 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 1234输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 显然需要算出接满水之后的状态数组,即每一个位置的水面高度,然后减掉原本的柱子高度,对数组求和即可。 如何计算水面高度: 如果当前位置的高度大于左右两侧的高度,那么该位置的水面高度就是当前位置的高度,其实就是没有接水; 如果当前位置的高度小于左右两侧的高度,那么该位置的水面高度就是左右两侧的高度中的最小值。 所以问题归结于计算当前位置左侧的最高高度和右侧的最高高度,两次遍历即可。 12345678910111213141516171819202122232425262728class Solution {public: int trap(vector<...