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 文件和子模块对应的空目录,这是考虑到实际用途中某些子模块可能是可选项而非必选项。 可以在主仓库中使用下面的命令进行子模块的初始化和...
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<...
通过 Python 脚本发送邮件
在日常的命令行操作中可能存在通过邮件通知的需求,但是不同平台自带的邮箱工具无法统一,可以基于 Python 脚本实现跨平台的统一操作。 脚本内容 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155#!/usr/bin/env python3import argparseimport smtplibfrom email.mime....
密码学笔记——RSA算法
整理一下RSA算法的内容,主要参考维基百科。 对称加密与非对称加密 首先从对称加密开始,Alice和Bob需要进行加密的通信,Alice传递信息 \(m\) 给Bob。 为了信息安全,Alice首先用字母表替换的方式 \(A\) 将明文m变成密文 \(m'=f_A(m)\),然后通过公开方式传递给Bob,Bob使用同样约定好的字母表替换方式 \(A\) ,将收到的密文 \(m'\) 变成明文 \(f_A^{−1}(m')=f_A^{−1}(fA(m))=m\) 。 这里我们对信息都视作字符串,从而字母表替换规则 \(A\) 实际上定义了字符串到字符串的加密函数 \(f_A\) 和解密函数 \(f_A^{−1}\) ,这里加密函数和解密函数都是通过 \(A\) 决定的,并且极容易从其中一个推出另一个,因此双方都必须保管好密码本 \(A\) 。 例如,使用替换的字母表 \(A\) 为 11->3, 2->4, 3->2, 4->1 用轮换的记号就是\((1324)\),此时的加密函数 \(f_A\) ,明文\(1234\),密文 \(f...
C 语言练习——实现终端进度条
记录一下通过C语言实现在终端中展示进度条的动画效果,代码同时支持 Linux 和 Windows。 头文件 pbar.h 内容如下 12345678910111213141516#ifndef PBAR_H#define PBAR_H#ifdef __cplusplusextern "C" {#endifstruct pbar *pbar_create(int style); // style: 0,1,2,3void pbar_update(struct pbar *pb, double pct);double pbar_time_cost(struct pbar *pb);#ifdef __cplusplus}#endif#endif // PBAR_H 这里导出的接口同时支持 C 和 Cpp。 具体实现的源文件 pbar.c 内容如下 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545...
