Cpp 练习——模仿Qt的信号槽
基本概念首先定义如下的概念: 接收元件:Receiver<Y,Ym> 发送元件:Sender<Ym> 接收者:拥有至少一个接受元(公开成员)的类 发送者:拥有至少一个发送元件(公开成员)的类 中转者:既是发送者也是接收者的类 其中:Ym是信息类型, Y是接收者类型,接收元件和发送元件必须使用同样的信息类型Ym, 才能建立联系进行信息传递。 信息会从建立连接的发送元件传递到接收元件,发送元件和接收元件之间可以是一对多或多对多地建议联系。 具体说明元件之间的连接发送元件和接收元件之间的连接是双向且对等的(与QT的信号和槽函数机制不同),它们都可以与对方绑定与解绑(一对多,多对多) 1234567sender.bind(receiver); // 发送元件可以绑定接收元件sender.unbind(receiver); // 发送元件可以解绑接收元件sender.unbind_all(); // 发送元件可以解绑所有的接收元件, 在析构时会自动调用receiver.bind(sender); // 接收元件可以绑定发送元件receiver.unbind(se...
Cpp 练习——侵入式的调用栈追踪
基于 C++20 的 std::source_location 和宏实现侵入式的函数调用栈追踪。 mtracer.hpp12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#pragma once#include <algorithm>#include <cstddef>#include <source_location>#include <stack>#include <string>class MTracer {public: // NOLINTNEXTLINE(fuchsia-default-arguments-declarations) explicit MTracer(const std::source_location &location = ...
基于 SVD 实现图片压缩
图像本质上就是一个或多个矩阵,并且通常具有低秩结构,可以利用SVD分解舍弃低奇异值的部分来实现图片的压缩存储。 SVD 压缩可以用在图像中展示低秩近似的效果,但是实际工程中并不会这么用,有两个原因:首先,大部分图像不是低秩的,低秩会丢失图像细节;其次,图像的有损压缩的评价指标是人的感受,而不是矩阵范数差异小。实际的压缩算法例如 JPG 是对图片切分小块,然后对每一块进行离散傅里叶变换(离散余弦变换),同时利用了人的视觉特点,使其去除的信息尽量是人眼不敏感的信息。 简单的 Python 示例实现如下 1234567891011121314151617181920212223242526import numpy as npimport matplotlib.pyplot as pltfrom PIL import Imagedef compress_img_first_k(img_array, k): if img_array.ndim == 2: img_array = img_array[:, :, np.newaxis] m, n, c = i...
Cpp 练习——INI 文件解析
INI 文件是一种常见的配置文件,相比 json 等文件格式简单得多,对 INI 文件的解析适合练手。 实现代码如下,其中使用了 std::ranges ini_parser.hpp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163#pragma once#include <...
Python 单元测试 unittest / pytest
整理一下 Python 单元测试的内容,包括: 内置的单元测试模块 unittest 第三方测试工具 pytest 除此之外,其实还有直接解析源码注释,获取测试用例的内置模块 doctest。 准备为了便于描述,下面准备两个函数和一个类作为测试目标,构成 my_module.py my_module.py1234567891011121314151617181920def my_add(a, b): return a + bdef my_divide(a, b): return a / bclass MyDict(dict): def __init__(self, **kw): super().__init__(**kw) def __getattr__(self, key): try: return self[key] except KeyError: raise AttributeError(r"'MyDict' object has...
Python conda 使用笔记
Anaconda 是一个用于科学计算的开源 Python 发行版,集成了包和 conda 环境管理器,包括了很多数据科学中常用的包,特别适合数据科学和机器学习。 与之类似的还有 Miniconda,它和 Anaconda 的主要区别就是:Miniconda 在安装时只包括了必要部分,并没有附带很多科学计算常用的包,因此本身的安装包很小,在使用时需要手动下载很多包,除此之外没什么区别。 事实上,Anaconda 和 Miniconda 之间还可能存在一些差别,并且不同版本之间,在不同的系统上的行为都可能存在差异。 Miniconda 默认不包含很多科学计算常用的基础库,可以在 base 环境中进行下载安装,例如: 1conda install numpy scipy matplotlib sympy jupyter tqdm Anaconda 公司对 defaults 仓库的商用行为存在限制,开源社区提供的替代品为 miniforge,与 miniconda 的主要区别是修改了默认的 channel 为开源社区的 anaconda.org,此外还额外提供了 mamba 可以...
基于 BibTeX 构建可视化合作网络
在科研中,作者之间的合作关系往往蕴含了很多信息,比如谁是核心作者、合作紧密的团队以及跨学科合作的桥梁。 通过对 BibTeX 文件中的作者信息解析可以获取作者之间的合作关系,并生成可视化图表。 脚本内容coauthor_network.py12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116...
DLL 注入攻击
概念介绍DLL 注入攻击(DLL Injection)是一种将动态链接库(DLL)强制加载到目标进程中的技术,使得攻击者编写的代码能在目标进程的地址空间中运行。 在 Windows 中,DLL 注入是系统提供的合法功能,主要用于调试器和辅助工具,但也可以被用于攻击,不过这种攻击手段是非常明显且初等的,一般的防护软件都会识别并阻止这种行为。 简易实现可以使用最经典的 CreateRemoteThread + LoadLibraryA 方法实现 DLL 注入攻击,下面是主要的代码思路。 代码参考:idea4good/AbuCoding Loader目标是让目标进程(这里以记事本Notepad.exe为例)加载提供的 DLL,实现步骤: 查找并获取目标进程句柄:使用 CreateToolhelp32Snapshot 遍历系统进程列表;调用 OpenProcess(PROCESS_ALL_ACCESS, ...) 在目标进程分配内存并写入 DLL 路径:VirtualAllocEx 为 DLL 路径字符串留空间;WriteProcessMemory 将 DLL 路径写到目标进...
Python 日志库 logging
Python 标准库中的 logging 模块提供了功能完备、可高度自定义的日志记录方案,适用于从简单脚本到复杂应用程序的各种场景。 许多 C/C++ 项目都依赖自行实现的简单日志库或成熟的第三方日志库(如 spdlog、log4cpp 等),与之不同的是,Python 内置的 logging 模块已经可以满足绝大多数开发需求,各种语言的日志库使用逻辑具有很多共性。 基本使用先讨论在简单脚本文件中的日志使用,不涉及 logger 以及复杂的日志配置逻辑。 极简示例导入日志库之后,无需任何配置就可以直接使用 1234567import logginglogging.debug("This is a debug message.")logging.info("This is an info message.")logging.warning("This is a warning message.")logging.error("This is an error message.")loggi...
NVIM 使用笔记
nvim 安装在Linux系统中默认都没有安装nvim,需要自行安装,官方的包管理器中的版本都太老了,最新的版本是0.11.x,最新版的 Glibc 要求很高,Ubuntu 20 都已经无法满足了。 由于 nvim 插件对版本都很敏感,不同插件的版本之间可能会有很多问题,尽量都使用最新版。 从 nvim 仓库 获取最新版的预编译的压缩包 nvim-linux-x86_64.tar.gz,直接解压到本地就可以使用,无须执行任何额外命令。 有两种配置方式: 第一种方式是将对应的路径加到 PATH 中,保持 nvim 的目录独立性; 1export PATH="$PATH:$HOME/opt/nvim-linux-x86_64/bin" 第二种方式是将解压后的子文件夹(包括bin/,lib/等)与/usr/local/或~/.local/位置下的对应子文件夹合并。 1cp -R * ~/.local/ 目前的做法是将其安装到 ~/opt,并把对应的路径添加到 PATH。 安装之后检查一下即可 12which nvimnvim --version 当前 ...
