Skip to content

杂项小技巧

约 1043 个字 77 行代码 预计阅读时间 6 分钟

  • 使用 mklink /d mhwmod D:\mhwmod 建立软链接(powershell 不支持,要用cmd)
  • 写批处理脚本的时候,可以在最后一行加上命令 pause 使其停留而不是直接关闭
  • 推荐字体 0xProto Nerd Font Mono :https://www.nerdfonts.com/font-downloads
  • 在 Github 仓库页面按下 键,即可打开 Web 编辑器,更方便查看代码
  • 在 Powershell 中,where 是 Where-Object 的别名,因此想查找指令位置的话用 Get-Command 或者 where.exe
1
2
3
4
5
6
7
8
9
> Get-Command where

CommandType     Name
-----------     ----
Alias           where -> Where-Object

> where.exe tex

D:\texlive\2023\bin\windows\tex.exe
  • 注册表相关
    • 事情的起因是 bhh 老师给了一份奇怪的注册表文件...运行完成后我的程序都以命令提示符形式运行了,这实在是太丑了!我难以忍受,因此不断翻找注册表希望改回去。
    • 先去 HKCU 目录下找要修改的文件后缀名,我的话就是找 .exe 。找到后可以看到其默认值为 exefile
    • 然后就去找 exefile ,其子目录 shell 文件夹下面就是右键菜单的内容,可以顺便清理下右键菜单
    • 然后在 openn/command 中可以发现默认打开方式为 "%1" %* ,将它改为 wt "%1" %* 后确实可以得到我想要的效果,但是一些普通的应用程序启动前也会先启动终端了
      • %1 代表第一个参数,%0 代表第一个参数开始的所有参数
    • 最终发现只需要在命令提示符左上角右键,选择属性,关闭旧版控制台选项即可,白费这么大力气
  • CTRL K + CTRL C or CTRL U 实现批量注释
  • Win+V 查看剪贴板记录
  • Powershell 创建文件可以用 New-Item,不过在 windows 直接用 md 命令即可
  • .\run.exe | tee output 显示运行结果
  • takeown \f QQNT 获取权限
    • 或者 icacls QQNT /grant administrators:f
  • C语言环境用 msys 搭建吧,编译器的优化差距真的很大
  • 新建了 .gitignore 但前面已上传的文件没有撤回?
    • 使用 git rm --cached -r build 取消对其的跟踪
  • 在任务管理器中结束 WWAHOST 进程,以跳过用户登录 OOBE 初始化

bhh 课上学到的一个很有意思的函数,可以用来一窥 printf 函数的实现方式:

#include <stdio.h>

double f(char *s, void *v1, void *v2, void *v3)
{
    double sum = 0;
    char *p = (char *)&s;
    p += sizeof(s);  // 指向第一个参数的地址(不过参数也是指针形式)
    while (*s != '\0')
        switch (*s++)
        {
        case 'i': // int
            sum += **(int **)(p); // 由于参数是一个指针,而 p 指向的指针的地址,因此需要将 p 看成二级指针来看待并引用两次
            p += sizeof(int *); // 加上一个指针的大小得到下一个参数的地址
            break;
        case 'l': // long
            sum += **(long **)(p);
            p += sizeof(long *);
            break;
        case 'd': // double
            sum += **(double **)(p);
            p += sizeof(double *);
            break;
        }
    return sum;
}

int main(void)
{
    int a = 10;
    long b = 20L;
    double c = 30.0;

    double s = f("ild", &a, &b, &c);
    printf("%f\n", s);
    // output: 60.000000
}

实际上,你也可以参考标准库 stdarg.h 及其中的 vsprintf 函数。

更加底层的方式输出整数对应的二进制:

1
2
3
4
5
6
7
8
#include<stdio.h>

int main(void)
{
    short int a = 0x1234;
    for(int i = 0; i < 16 ; ++i, a <<= 1)
        putchar((a < 0) + '0');
}

对于数组,根据其在内存中的存储格式,一般以如下眼光看待:

d[0], d[1], d[2], ...

那么按字节循环右移,下标由低位向高位移动,得到的结果为:

d[n], d[0], d[1], ...

而比特级别的右移是高位向低位移动,注意二者之间的区别。

python 打包 EXE 可以用 pyinstaller,但是 pip install pyinstaller 下载过来的文件夹名叫 PyInstaller,需要区分大写使用:

python -m PyInstaller --onefile gui.py 
  • 使用 from bs4 import BeautifulSoup 来抓取静态网页
  • 使用 selenium 来抓取动态网页

WSL1 中,要设置通过宿主机代理,直接在 ~/.bashrc 中加上:

# .::: Proxy :::.
# 宿主机的 IP 地址
host_ip=127.0.0.1
# 设置代理端口(根据你的代理软件配置)
proxy_port=7890
# 设置代理环境变量
export http_proxy="http://$host_ip:$proxy_port"
export https_proxy="http://$host_ip:$proxy_port"
export all_proxy="socks5://$host_ip:$proxy_port"
# .::: Proxy :::.

WSL2 相关

微软的这wsl好用是好用,遇到的bug一堆...

先是 WSL2 分发安装不了,显示 FE 结尾的错误码,最终靠清理了一波注册表解决。

但是 WSL2 还是用不了,显示:

1
2
3
> wsl -d kali-linux
远程过程调用失败。
错误代码: Wsl/Service/RPC_S_CALL_FAILED

先按照 https://github.com/microsoft/WSL/blob/master/CONTRIBUTING.md#enable-automatic-crash-dump-collection 的方法记录崩溃日志:

1
2
3
4
md C:\crashes
reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /f
reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d C:\crashes /f
reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f

然后用 windows 自带的 windbg 打开 .dmp 文件。记得先 CTRL+S 设置符号表路径:

SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

导入后输入 !analyze -v 分析,可以看到:

STACK_COMMAND:  ~1s; .ecxr ; kb

SYMBOL_NAME:  ldntvdm+132c

MODULE_NAME: ldntvdm

IMAGE_NAME:  ldntvdm.dll

FAILURE_BUCKET_ID:  INVALID_POINTER_WRITE_c0000005_ldntvdm.dll!Unknown

OS_VERSION:  10.0.26100.1

BUILDLAB_STR:  ge_release

OSPLATFORM_TYPE:  x64

OSNAME:  Windows 10

FAILURE_ID_HASH:  {c91c6b0b-23af-b325-08b3-37a44fff5217}

Followup:     MachineOwner

总之就是这个 ldntvdm.dll 的问题,这个东西是我之前为了写 16bit 的汇编而安装的,不过 24H2 更新后好像也用不了了。所以直接删除,此时 WSL2 就恢复正常了。

想启动 sshd(或其它) 服务,但是总报错:

System has not been booted with systemd as init system (PID 1). Can't operate.  
Failed to connect to bus: Host is down

那么创建一个 wsl config:

sudo /etc/wsl.conf

并加上:

[boot]
systemd=true

ssh 给服务器的 authorized_keys 中添加上公钥后还是不能用密钥对登录?可能是文件夹或文件的权限问题,尽量不要自己创建文件夹和文件,使用如下命令将公钥复制到对应服务器上:

ssh-copy-id -p 22 sora@xx.xx.xx.xx
Comments: