Welcome to my blog
Windows 快照?
Windows 也有快照?真的是文件系统的快照?还可以通过系统自带的文件历史还原? 新建快照 Windows 称之为 Volume Shadow Copy (VSS) Windows 的快照是通过 Copy On Write 实现的,众所周知对性能有一定影响。 关闭系统还原点功能 新建快照是不需要开启系统还原点功能的! 开启还原点功能会导致老的快照更快的被删除,因为快照占用的空间是有限的,而还原点会占用大量的快照空间,快照空间不足就会删除旧的快照,所以最好把还原点功能关闭了。 新建一个快照 新建一个文件测试一下快照 在 HOME 目录下新建一个内容为 100 的 test.txt 文件 ❯ 100 > test.txt ❯ cat .\test.txt 100 创建一个 C 盘的快照,注意我这里用了 sudo 表明需要管理员权限。 ❯ sudo wmic shadowcopy call create Volume=C:\ Executing (Win32_ShadowCopy)->create() Method execution successful. Out Parameters: instance of __PARAMETERS { ReturnValue = 0; ShadowID = "{57587129-D224-4E21-BC36-4C3D9B1DFDC7}"; }; 快照就成功建立了! 看看效果是怎么样的,把之前新建得到 ~/test.txt 的内容修改为 101 试试。...
ZFS on Windows (using WSL2)
这个让 ZFS 工作在 Windows 上的项目还不太稳定,经常蓝屏,便寻求其他解决方案,于是乎。 有人可能会说你在不是脱裤子放屁吗,这不就是装个虚拟机运行 Linux??? 是的,我就是脱裤子放屁。 写这个文章的时候使用的是 ArchLinux 的 WSL2,为了使教程更简单,也为了从 0 实现,这篇文章使用 Ubuntu22.04 版本进行测试。 先决条件 安装 WSL2 版本的 Ubuntu22.04,其他的系统版本应当也可。 具体安装方法参考官方文档。 对于系统版本大于 Windows 10 version 2004 或者 Windows11 的用户参考下面的文档: https://docs.microsoft.com/en-us/windows/wsl/install 对于系统版本大于 Version 1903 的参考下面的文档: https://docs.microsoft.com/en-us/windows/wsl/install-manual 替换 WSL 的 Linux Kernel 参考文档1 在此 https://github.com/oldshensheep/zfs-on-wsl/releases 下载编译好的支持 ZFS 的 Kernel,需要下载 bzImage,放到 Windows 的一个地方。 然后在 PowerShell 窗口中执行以下命令: 注意把<bzImage Path>替换成你下载的 bzImage 的路径,例如C:\\Fun\\bzImage " [wsl2] kernel=<bzImage Path> " > ~/.wslconfig 然后wsl --shutdown关闭运行中的实例,然后重新启动 Ubuntu。 挂载硬盘到 WSL2 参考文档2...
让 Windows 更加适合开发
在 Windows 上进行优雅的编程是个头疼的问题,但是在我的精心调教下,她变得听话了许多…… 安装 scoop 为什么选择 scoop? 有类似的选择如 chocolatey ,WinGet 但是我选择了 scoop。第一是因为 scoop 的软件很多是便携软件。便携,顾名思义可以很方便带着跑的东西。scoop 安装的软件也是一样的,重装系统不必重新配置一大堆环境变量,不必重新安装一大堆软件。重装系统后可以很快就可以配置好各种环境变量,软件也不必再安装。 安装 scoop 也非常简单 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser irm get.scoop.sh | iex 有更多问题访问 scoop 官网 https://scoop.sh/ 报告问题等访问仓库 Issue https://github.com/ScoopInstaller/Scoop/issues 变成Lindows 安装了 scoop,是时候展现她的力量了。 先来安装一下 busybox 和 gsudo scoop install busybox gsudo busybox 内置了 linux 的很多命令,常用的基本上都有了。 安装 gsudo 可以临时提权类似与 linux 的 sudo(不过有烦人的 UAC,关掉又不安全)。Windows 最终变成了 Linux 的样子,嘿嘿 Windows❤️Linux。 安装完成后可以使用sudo命令提权 🔽点击展开 Windows中busybox自带的命令 ar arch ash awk base64 basename bash bunzip2 bzcat bzip2 cal cat chmod cksum clear cmp comm cp cpio cut date dc dd df diff dirname dos2unix dpkg dpkg-deb du echo ed egrep env expand expr factor false fgrep find fold fsync ftpget ftpput getopt grep groups gunzip gzip hd head hexdump httpd iconv id ipcalc kill killall less link ln logname ls lzcat lzma lzop lzopcat man md5sum mkdir mktemp mv nc nl od paste patch pgrep pidof pipe_progress pkill printenv printf ps pwd readlink realpath reset rev rm rmdir rpm rpm2cpio sed seq sh sha1sum sha256sum sha3sum sha512sum shred shuf sleep sort split ssl_client stat strings su sum tac tail tar tee test time timeout touch tr true truncate ts ttysize uname uncompress unexpand uniq unix2dos unlink unlzma unlzop unxz unzip usleep uudecode uuencode vi watch wc wget which whoami whois xargs xxd xz xzcat yes zcat 有了这些命令Windows变得更像Linux了。如果有没有的命令可以尝试搜索一下`scoop search something`。 开发环境配置 在 Linux 里配置开发环境是很简单的,例如在 ArchLinux 里配置 java 开发环境,很快捷方便。...
Private Network Access update
在你访问一个 http 网站时你可能遇到了下面的错误。 The request client is not a secure context and the resource is in more-private address space local 这是 Chrome94 之后的版本提供的错误提示,因为你的浏览器从 一个源为 http 的网站访问了一个 私有地址 (不太准确)。这在 Chrome 之后默认是不允许的。1 Why? 为什么不允许?当前的浏览器都不限制 http 网站访问私有地址,这是一个安全隐患。 假设你有一个路由器,用户名密码都是默认的,然后访问了一个 http 的网站,那个网站是可以访问到路由器的,而你的路由器的用户名密码又是默认的,那么网站就可以登录到你的路由器了。 还有就是我们一般认为外界是访问不了本地网络的服务的,这样我们可能都设个弱口令。但是通过浏览器,网站就可以访问到本地网络,我们的本地服务就有被攻击的风险。 What? 什么情况下请求会被认为是Private Network Access? 网络地址分为 3 类(不讨论 IPv6)。详细资料可以从2获取 Local 127.0.0.0/8 Private 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16 Public 上面列出的之外的 ip 从上到下越来越开放, 一个源为 http 的请求的地址比目的地址更开放,那么这个请求就是私有网络访问。不外乎 3 种情况,Public->Private,Public->Local,Private->Local。 另一个比较特殊的是用代理会改变目的地址的 ip,通过代理获取的资源,被看作是从代理的 ip 那里获取的。(这里说的改变不是真的改变) How? 怎么解决当前的问题?下面的内容参考自1。 访问 Local 把你要访问的网站升级到 https。...
Pointers in C/C++
C/C++ 的指针是什么?int* ? *(int*)var? 是什么鬼??? 指针就是地址,与其说指针,地址更容易理解。 指针变量的定义 一般的定义一个指针变量:数据类型* 变量名= new 数据类型(); int* i = new int(1); Sheep* sheep = new Sheep("mmm"); 一个指针变量是有类型的(这不是废话?)为什么要有类型?地址大小不都是一样的吗?一般是32位或64位啊。 但是如果指针变量没有类型的话用*运算符怎么取值?是取32位还是64位还是其他的?所以定义指针变量时声明的变量类型就是这个道理。 如果你学过了汇编,下面的例子可以帮助你理解,看例子1,这里将2020h移入一个内存空间,为什么要加word ptr? 2020h不就是2个字节吗,你再声明写入一个2字节的内存空间不是有点多余?这里看起来有点多余,但是如果有这样的汇编指令(例子2和3),他们的行为一样吗? 实际上是不一样的mov word ptr [addr],20h可以理解为mov word ptr [addr],0020h是实际上写入了2个字节的数据,例子3只写入了一个字节。再看例子4,如果不加word ptr你怎么区分例子2和例子3?(就是说你不知道你要写入多少数据) mov word ptr [addr],2020h ;例子1 mov word ptr [addr],20h ;例子2 mov byte ptr [addr],20h ;例子3 mov [addr],20h ;例子4 mov ax,[addr] ;例子5 可以运行、修改下面的汇编代码测试上面的说法。 DATA SEGMENT num dd 660F0655H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: mov ax,data mov ds,ax lea si,num mov word ptr [si],2020h mov ah,4ch int 21h CODE ENDS END START 指针的具体使用 代码 #include <iostream> using namespace std; int main() { int* i = new int(1); int* j = new int(2); int k = 0; int l = 0x64fe10; // 或者 &j /** * l为j变量的地址,理论上**l就可以取j的值 *l取j的内存地址,再取值。 * 实际上因为int类型不能直接取值,要转换成对应的数据类型的指针,再取值。 * 即*(int*)(*(int*)l) */ cout << "变量的内存地址" << endl; cout << "&i: " << &i << endl; cout << "&j: " << &j << endl; cout << "&k: " << &k << endl; cout << "&l: " << &l << endl << endl; cout << "变量的值" << endl; cout << "i: " << i << endl; cout << "j: " << j << endl; cout << "k: " << k << endl; cout << "l: " << l << endl << endl; cout << *i << endl; cout << "l的值转成\"int*\"类型后取值" << endl; cout << *(int*)l << "\thex: " << (int*)(*(int*)l) << endl; cout << "l的值指向的地址的值,再取前面的值指向的地址的值:" << *(int*)(*(int*)l) << endl << endl; return 0; } 运行结果 变量的内存地址 &i: 0x64fe18 &j: 0x64fe10 &k: 0x64fe0c &l: 0x64fe08 变量的值 i: 0x2632540 j: 0x2632560 k: 0 l: 6618640 1 l的值转成"int*"类型后取值 40052064 hex: 0x2632560 l的值指向的地址的值,再取前面的值指向的地址的值:2 变量的内存分布 地址的值可能有所不同...