解读一份极其晦涩的c++代码
事先声明,下面的各种语法技巧都是炫技式的,刻意降低代码的可读性,只是写着玩,在实际应用中是不会允许这么乱写的。 先来几个开胃菜。 开胃菜 (1) 嵌入网址? 下面这段代码看起来是在c++中直接嵌入了一个网址 1234567#include <iostream>int main(){ https://www.zhihu.com std::cout << "Hello World!" << std::endl; return 0;} 它确实是合法的c++代码,但是含义却并不是网址: 左半部分https: 是一个标签,可以通过goto跳转; 右半部分由于//的存在,就是一个注释,直接被忽略了。 下面的代码就更利于理解了 123456789#include <iostream>int main() {label: // 这是注释 std::cout << "Hello World!" << std::endl; ...
Jupyter notebook 本地和远程部署
整理一下 jupyter notebook 的各种使用方式。 本地部署 直接在本地主机上启动 jupyter notebook 服务是最简单的用法 1jupyter notebook 需要说明的是: jupyter服务默认监听本机的 8888 端口,如果本机的 8888 端口已经被占用,在启动时会自动递增,例如改为 8889 端口等,也可以使用--port选项指定; jupyter 在启动时会尝试打开本地浏览器,或者手动通过http://localhost:8888/访问即可,可以加上选项阻止自动开启浏览器 --no-browser; 默认只允许接收来自localhost的请求,可以使用 --ip 选项指定,例如--ip=0.0.0.0代表允许所有的ip访问; 默认的工作目录是执行命令时所处的目录,可以在后面加上工作目录作为位置参数,例如jupyter notebook...
Python 虚拟环境管理——venv
之前主要使用的都是conda的虚拟环境,图的是方便省事,但是始终无法理解虚拟环境的底层逻辑, 这里选择学习最简单的、也是python基础的venv虚拟环境。 venv 虚拟环境是Python提供的一个工具,用于创建隔离的环境来管理不同项目的依赖关系,每一个虚拟环境实际存储于一个目录下, 但是可以在任何其它位置激活和使用这个虚拟环境。 在Linux中即使有 Python,也可能不包括 venv,需要额外下载 python3-venv 。 创建虚拟环境 在当前目录下创建一个名为 myenv 的虚拟环境(但是按照惯例,虚拟环境的名称通常为venv或.venv) 1python -m venv...
星期算法
学习一下如何根据指定的年月日快速计算星期几,由于公历的规律性很强,将所有规律整理并不断简化就可以得到这种简便算法,有很多不同的变形算法,例如蔡勒公式,康威裁决日算法等,本文主要学习蔡勒公式。 公历 简要回顾一下公历:每年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...
Python 环境配置
记录一下当前 Python 涉及的一些环境配置。 基本信息 当前本地以及服务器的Python和CUDA的基本信息如下: Windows(以及WSL): 系统 Windows 11 miniconda Python 版本为 3.12.1 CUDA 驱动最高支持版本 12.8 CUDA Toolkit 版本 12.4(nvcc --version) GPU服务器: 系统 Ubuntu 20.04 anaconda Python 版本为 3.12.7 CUDA 驱动最高支持版本 12.4 CUDA Toolkit 版本 12.1 为了尽量保持本地和服务器的版本一致,选择使用 Python 3.12.x,CUDA 12.4。 这里并没有刻意保证Python的小版本号一致,直接使用默认的Python版本,反正不同系统的包实际上也有很多区别。 常用包 记录一些常用的包 12345678# 必备conda install numpy scipy pandas matplotlib seaborn scikit-learn sympy jupyter# 支持import...
Git submodule 速成
简单记录一下 git submodule 的用法,注意不是 subtree。 添加子模块 可以使用 submodule 功能添加子模块仓库 1git submodule add <子模块仓库的url> 默认会在主仓库下创建一个与子模块仓库同名的文件夹,用于存储子模块的所有内容。 也可以指定子模块使用的文件夹 1git submodule add <子模块仓库的url> subdir 子模块所使用的仓库url最好是公开可访问的,并且最好没有修改推送权限,只能单向接受远程更新的推送,这样最省事。 克隆含子模块的仓库 在克隆一个含有子模块的git仓库时,默认对主仓库的 git clone 命令不会把子模块也拉取下拉,只会得到一个包含子模块信息的.gitsubmodules文件和子模块对应的空目录,这是考虑到实际用途中某些子模块可能是可选项而非必选项。 可以在主仓库中使用下面的命令进行子模块的初始化和更新 12git submodule initgit submodule update 这两个命令可以合起来 1git submodule update...
开源协议与知识共享协议
开源协议 开源协议是一套用于规范软件源代码使用、修改和分发规则的版权管理工具,广泛应用于编程语言、框架、工具库等软件开发项目。 开源协议的核心理念是“代码公开与共享”,区别于传统软件许可的“闭源限制”,旨在促进协作开发、技术创新和知识传播。 这里记录一下常见的几种开源协议: 较严格的,不允许衍生品闭源: GPL(General Public License) 最严格的开源协议。 要求:衍生代码必须使用 GPL 协议进行开源,确保代码的持续开放性。 LGPL(Lesser General Public License) GPL 的宽松版本。 要求:允许与闭源代码链接使用,但修改后的开源部分仍需沿袭 LGPL 协议。 Mozilla Public License(MPL) 比 LGPL 更灵活。 要求:修改源码的部分需要提供说明文档,且仅修改的部分需开源。 较宽松的,允许衍生品闭源: MIT / BSD 最宽松的开源协议。 要求:仅需保留原作者的版权声明。 允许:自由使用、修改、分发(包括闭源的后续开发)。 补充:最新的 MIT 和 BSD...
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\) 个自由度,至多可以达到...