Hi there 👋

Welcome to my blog

让 Windows 更加适合开发

在Windows上进行优雅的编程是个头疼的问题,但是在我的精心调教下,她变得听话了许多…… 安装scoop 为什么选择scoop? 有类似的选择如 chocolatey ,WinGet但是我选择了scoop。第一是因为scoop的软件很多是便携软件。便携,顾名思义可以很方便带着跑的东西。scoop安装的软件也是一样的,重装系统不必重新配置一大堆环境变量,不必重新安装一大堆软件。重装系统后按照[^1]里的步骤进行配置,很快就可以配置好各种环境变量,软件也不必再安装。 具体如何安装scoop就不赘述了,在官方网站可以了解安装的方法 https://scoop.sh/ 。 变成Lindows 安装了scoop,是时候展现她的力量了。 先来安装一下 busybox 和 sudo scoop install busybox sudo busybox内置了linux的很多命令,常用的基本上都有了。安装sudo可以临时提权类似与linux的sudo。Windows最终变成了Linux的样子,嘿嘿Windows❤️Linux。 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里配置开发环境是很简单的,现在的Lindows其实也一样简单。 在ArchLinux里配置java开发环境,很快捷方便。...

May 27, 2022 · 2 min · 373 words · oldshensheep

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?...

September 27, 2021 · 1 min · 101 words · oldshensheep

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 变量的内存分布 地址的值可能有所不同...

June 14, 2021 · 2 min · 310 words · oldshensheep

mount cifs in android

虽然 Google 在新版本的 android 中提供了新的访问文件的方式 (一些文件管理器可以访问 smb,其他应用程序访问这个文件管理器就可以间接的访问 smb 了), 但是并不是所有的应用程序都支持,所以直接挂载 smb 是一个比较好的解决办法(必须要 Root)。 前提条件 Android 系统获取 Root 权限 安装了 BusyBox, 注意必须是 BusyBox ,而不是系统自带的 ToyBox,在测试中 toybox 不支持挂载网络文件系统 折腾的结果 需要快速解决问题的只看这个就行了 执行下面的程序就可以挂载 smb 了,根据自己实际情况修改 host,user,pass,还有脚本末尾的挂载位置 host="192.168.1.5" user="sheep" pass="123456789" gid=9997 uid=9997 file_mode=0770 dir_mode=0770 # 挂载前要新建要挂载到的位置的文件夹 # //$host/main 是smb的文件夹 /.../emulated/0/{cifs/main} 是手机存储文件夹 su -mm -c mount -o user=$user,pass=$pass,rw,gid=$gid,uid=$uid,file_mode=$file_mode,dir_mode=$dir_mode -t cifs //$host/main /mnt/runtime/full/emulated/0/cifs/main 折腾的大致过程 首先打开终端,这里用的是 termux,理论上其他终端也可以。 然后输入下面的命令 su # 获取root权限 mkdir /mnt/sdcard/cifs # 挂载点 mount -o user=******,pass="*****" -t cifs //192....

January 28, 2021 · 1 min · 152 words · oldshensheep

学习Markdown

常用的 Markdown 语法,记录一些加强记忆。 删除线 ~~删除线~~ 删除线 斜体 _斜体_ 斜体 粗体 **粗体** 粗体 斜体粗体 **_斜体粗体_** 斜体粗体 水平分割线 --- 链接 <http://http://oldshensheep.com> http://http://oldshensheep.com [我是一个链接](http://oldshensheep.com) 我是一个链接 ![我的桌面图片](http://example.com/p.jpg)

December 6, 2020 · 1 min · 23 words · oldshensheep