[{"content":" ⚠由于技术原因，该篇文章的部分内容被损毁，静待恢复\nMark定义 Mark标识 定义 F 已完成 OD 已过时，需要更新 U 未完成 P 计划中 排版控制 拼好图-patchwork[Mark: U] 简要 安装与导入\npatchwork就是这么一个拼图包 拼好图\n1 2 3 4 5 6 %% 安装 %% install.packages(\u0026#34;patchwork\u0026#34;) %% 导入 %% library(ggplot2) library(patchwork) 多\u0026quot;图\u0026quot;拼接\n1 bind \u0026lt;- p1 + p2 1 bind \u0026lt;- p1 + p2 + p3 + p4 1 bind \u0026lt;- p1 + p2 + p3 + p4 + plot_layout(nrow = 3, byrow = FALSE) 1 bind \u0026lt;- (p1 | p2) / p3 1 2 bind \u0026lt;- (p1 | p2) bind \u0026lt;- bind / p3 1 bind \u0026lt;- (p1 | p2) / p3 需要更新：\n添加注释\n1 bind \u0026lt;- ((p1 | p2) / p3) + plot_annotation(title = \u0026#39;Title\u0026#39;) 1 bind \u0026lt;- ((p1 | p2) / p3) + plot_annotation(tag_levels = \u0026#39;A\u0026#39;) 函数定义 1 2 3 4 5 6 7 8 9 10 11 12 plot_layout( ncol = waiver(), #定义网格尺寸，下同 nrow = waiver(), byrow = waiver(), #矩阵或FALSE widths = waiver(), #匹配尺寸用宽高，NA/-1null有特殊 heights = waiver(), guides = waiver(), tag_level = waiver(), design = waiver(), axes = waiver(), axis_titles = axes ) 1 2 3 4 5 6 7 8 9 10 plot_annotation( title = waiver(), subtitle = waiver(), caption = waiver(), tag_levels = waiver(), tag_prefix = waiver(), tag_suffix = waiver(), tag_sep = waiver(), theme = waiver() ) ","date":"2025-03-31T20:59:57+08:00","permalink":"http://blog.doublecat.top/posts/r%E5%AD%A6%E4%B9%A0%E6%89%8B%E8%AE%B0/","title":"R学习手记"},{"content":"格式控制类 首行2字符空白+两端对齐 1 #set par(first-line-indent: (amount: 2em, all: true), justify: true) 标题黑体+正文仿宋(CJK) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #show heading: it =\u0026gt; { let spacing = if it.level == 1 { 1em } else { 0.8em } let weight = if it.level == 1 { \u0026#34;bold\u0026#34; } else if it.level == 2 { \u0026#34;semibold\u0026#34; } else { \u0026#34;regular\u0026#34; } let size = if it.level == 1 { font-size.at(\u0026#34;3\u0026#34;) } else if it.level == 2 { font-size.at(\u0026#34;4\u0026#34;) } else { font-size.at(\u0026#34;-4\u0026#34;) } set block(above: spacing, below: 7pt) set text(weight: weight, size: size, font: (font.main, font.Sans)) it } 自定义类 有序列表序号客制化 1 #set enum(numbering: \u0026#34;a.\u0026#34;) 常用数组/函数 CJK大小-像素大小 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #let font-size = ( \u0026#34;0\u0026#34;: 42pt, \u0026#34;-0\u0026#34;: 36pt, \u0026#34;1\u0026#34;: 26pt, \u0026#34;-1\u0026#34;: 24pt, \u0026#34;2\u0026#34;: 22pt, \u0026#34;-2\u0026#34;: 18pt, \u0026#34;3\u0026#34;: 16pt, \u0026#34;-3\u0026#34;: 15pt, \u0026#34;4\u0026#34;: 14pt, \u0026#34;-4\u0026#34;: 12pt, \u0026#34;5\u0026#34;: 10.5pt, \u0026#34;-5\u0026#34;: 9pt, \u0026#34;6\u0026#34;: 7.5pt, \u0026#34;-6\u0026#34;: 6.5pt, \u0026#34;7\u0026#34;: 5.5pt, \u0026#34;-7\u0026#34;: 5pt, ) 字体 1 2 3 4 5 6 7 #let font = ( main: \u0026#34;IBM Plex Serif\u0026#34;, mono: \u0026#34;IBM Plex Mono\u0026#34;, Serif: \u0026#34;Noto Serif CJK SC\u0026#34;, Sans: \u0026#34;Noto Sans CJK SC\u0026#34;, size: font-size.at(\u0026#34;-4\u0026#34;), ) 大标题 1 2 3 4 #let title(title) = { set align(center) text(title, weight: \u0026#34;bold\u0026#34;, size: font-size.at(\u0026#34;-2\u0026#34;), font: (font.main, font.Sans)) } ","date":"2025-03-27T00:43:07+08:00","permalink":"http://blog.doublecat.top/posts/typst%E5%AD%A6%E4%B9%A0%E6%89%8B%E8%AE%B0/","title":"Typst学习手记"},{"content":"The past is never dead, it is not ever past. 过去从未消亡，它甚至从未过去 ————威廉·福克纳\n网站列表 CS自学指南 || 进度：Git\n前端学习路线 || 暂无想法\n(Python)CS64A || 延缓\nFreeProgrammingBooks\nRust By Example\nGoogle Fonts | All font is free!\nJavaScript 教程\nHTML 系列教程\n书籍列表 微积分的力量\n哥德尔、艾舍尔、巴赫(GEB/集异璧)\nC++ Primer 中文版(第 5 版)\n现代 C++ 教程：高速上手 C++ 11/14/17/20\n视频地址 3B1B微积分的本质||进度：P7\n3B1B线性代数\n3B1B概率论\n技术 Capturingreality | Create realistic 3D models from photos\nAlphaFold\nCarbon | Google said it will replace C++\nRust | Seems already replace C++\nCosine Similarity\n开源软件 FFmpeg | God of process multimedia\nUptime-kuma | Self-hosted monitoring tool\n","date":"2022-07-19T00:42:23+08:00","permalink":"http://blog.doublecat.top/posts/%E4%BA%8C%E5%96%B5%E7%9A%84cs%E7%BC%96%E7%A8%8B%E6%89%8B%E5%86%8C/","title":"二喵的CS编程手册"},{"content":"Busybox编译 1 2 3 4 5 wget https://www.busybox.net/downloads/busybox-1.37.0.tar.bz2 tar -xvf busybox-1.37.0.tar.bz2 cd busybox-1.37.0 make ARCH=arm CROSS_COMPILE=arm-openwrt-linux- defconfig nano .config 接下来需要对.config进行手动修改\nL44 -\u0026gt; CONFIG_STATIC=y\nL98 -\u0026gt; CONFIG_SHA1-HWACCEL=n\nL99 -\u0026gt; CONFIG_SHA256-HWACCEL=n\nL844 -\u0026gt; CONFIG_SEEDRNG=n\nL939 -\u0026gt; CONFIG_FEATURE_IP_LINK_CAN=n\n保存后进行编译\n1 2 3 make ARCH=arm CROSS_COMPILE=arm-openwrt-linux- -j4 make ARCH=arm CROSS_COMPILE=arm-openwrt-linux- install cd _install/bin 此时该文件夹下会存在可执行文件busybox\n将编译好的busybox文件复制到F1C200S开发板上执行测试\n1 2 3 4 adb push busybox busybox adb shell \u0026gt; ./busybox ls 若能正常显示/文件夹即可将文件全部复制到开发板\n1 2 3 4 5 6 7 8 9 \u0026gt; rm /busybox \u0026gt; mkdir /mnt/UDISK/busybox cd .. tar -czvf bin.tar.gz -C bin . adb push bin.tar.gz /mnt/UDISK/busybox \u0026gt; cd /mnt/UDISK \u0026gt; tar -xzvf bin.tar.gz -C /mnt/UDISK/busybox \u0026gt; cd /mnt/UDISK/busybox \u0026gt; ./busybox tar -xzvf bin.tar.gz -C /bin 关闭BLOZI的环境 参考BLOZI 10.1寸LCD价签折腾记1-软硬件分析中终端启动流程分析的内容，将/etc/profile.d/bloziplayer.sh最下面的部分全部注释掉即可\n1 2 3 4 5 6 7 8 9 10 #echo \u0026#34;-- wpa supplicant init --\u0026#34; #wpa_supplicant_init #echo \u0026#34;-- blozi player close --\u0026#34; #blozi_player_close #sleep 2 #echo \u0026#34;-- blozi player start --\u0026#34; #blozi_player_start #sleep 2 #blozi_player_daemon 1\u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp; #blozi_player_start ","date":"2025-07-26T01:07:39+08:00","permalink":"http://blog.doublecat.top/posts/blozi_10.1%E5%AF%B8lcd%E4%BB%B7%E7%AD%BE%E6%8A%98%E8%85%BE%E8%AE%B03-%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/","title":"BLOZI 10.1寸LCD价签折腾记3-环境配置"},{"content":"开发环境 OS: Arch Linux x86_64\nHost: 2347B46 (ThinkPad T430)\nKernel: Linux 6.15.6-arch1-1\nCPU: Intel(R) Core(TM) i7-3632QM (8) @ 3.20 GHz\nPlatform: aarch64\n目标环境 OS: TinaLinux 3.10.65(Based on OpneWRT 3.5.1)\nCPU: F1C200S\nPlatform: ARM9\n交叉编译链下载与配置 注意\n全志的交叉编译链极其奇葩复杂，Linaro编译链并不适用，本编译链为从系统编译包提取的sunxi Arm9 MUSL编译链\n进入本链接下载我提取打包好的编译链toolchain-sunxi-arm9-musl.tar.gz\n1 2 tar -vxf toolchain-sunxi-arm9-musl.tar.gz sudo cp -r toolchain-sunxi-arm9-musl /usr/local/share/ 接下来配置.bashrc(视终端而定，我这里因为使用的是zsh所以是.zshrc)，以使系统支持编译链\n1 nano ~/.zshrc 在最后一行添加\n1 2 export PATH=$PATH:/usr/local/share/toolchain-sunxi-arm9-musl/toolchain/bin export STAGING_DIR=$STAGING_DIR:/usr/local/share/toolchain-sunxi-arm9-musl/toolchain/bin 保存退出后更新环境变量即可\n1 source .zshrc 此时输入在终端arm-openwrt-linux-，双击tab后可得提示\n即代表交叉编译环境安装配置完毕\n环境测试 创建一个测试程序test.cpp\n1 2 3 4 5 #include \u0026lt;iostream\u0026gt; int main(){ std::cout\u0026lt;\u0026lt;\u0026#34;Hello World!\u0026#34;\u0026lt;\u0026lt;std::endl; return 0; } 使用交叉编译器进行编译链接\n1 arm-openwrt-linux-g++ -o test test.cpp 将编译好的test文件复制到F1C200S开发板上执行\n1 2 3 4 5 adb push test test adb shell \u0026gt; ./test Hello World! 测试完毕\n提示\n若执行编译好的程序提示.so缺失，可以在/usr/local/share/toolchain-sunxi-arm9-musl/toolchain/lib中找到对应的文件并使用adb push复制到/lib中\n","date":"2025-07-13T13:08:26+08:00","permalink":"http://blog.doublecat.top/posts/blozi_10.1%E5%AF%B8lcd%E4%BB%B7%E7%AD%BE%E6%8A%98%E8%85%BE%E8%AE%B02-f1c200s%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/","title":"BLOZI 10.1寸LCD价签折腾记2-F1C200S交叉编译环境搭建"},{"content":"问题 今天将工作流也从Windows迁移到Arch上了，故想要进行记录。然而发现Obsidian无法输入中文\n系统环境 OS: Arch Linux x86_64\nHost: 2347B46 (ThinkPad T430)\nKernel: Linux 6.15.6-arch1-1\nDisplay (LEN40A3): 1920x1080 @ 60 Hz in 14\u0026quot;\nWM: Hyprland 0.49.0 (Wayland)\n问题分析 Obsidian是基于Electron构建的~~(坏文明)~~，这让我联想到之前安装的Chrome也存在无法使用输入法的问题(其实也有分辨率异常的问题)。\n考虑到Electron是基于Chromium的，而Chromium是坨屎山代码，对与Hyprland的支持有限，所以合理怀疑是Chromium不支持或配置有问题\n解决方法 参考hyprland桌面使用obsidian不能输入中文和# Using Fcitx 5 on Wayland/zh-cn\n首先使用sudo pacman -Ql obsidian | grep desktop定位到启动文件\n1 obsidian /usr/share/applications/obsidian.desktop 向Exec的末尾增加--enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime\n1 Exec=/usr/bin/obsidian %U --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime 保存并重启软件即可\n","date":"2025-07-13T01:48:31+08:00","permalink":"http://blog.doublecat.top/posts/%E8%A7%A3%E5%86%B3arch%E4%B8%8A%E7%9A%84obsidian%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8%E8%BE%93%E5%85%A5%E6%B3%95/","title":"解决Arch上的Obsidian无法使用输入法"},{"content":"价格 30元一块，商家有买五送一，加上邮费15，最后165拿下6块，平均每块27.5\n配置 MCU：F1C200S\n存储：MXIC的1G NandFlash\nWIFI：XR819\nMIPI：SSD2828\n屏幕：10.1寸LCD 1280*800，型号未知\n连接 原装使用Type-C进行供电和数据传输\n拆开可以发现Type-C板与主板由四组共八个弹簧座-触点连接，分别为DM、DP、IN+、IN-\n在弹簧座旁有RXD、TXD、DM、DP、3.3V、12V、GND的触点，暂未测试\n提示\n据论坛所述，在开启WIFI后可能存在供电不足导致屏幕闪烁的问题，需要焊接TRR(-)接IN-测试点，IN+测试点接R57(R)\nADB连接 使用Type-C线缆直连设备和电脑，若非直连可能无法正常识别\n若需打驱动可以参考知乎：# LCPI(F1C200S)+如何在Windows 下安装驱动？\n使用adb shell可以直连设备\n警告\n根据后续一次事故表明，若/空间不足或busybox配置有问题则ADB将会失效\n具体原因仍需分析\n系统基础信息 账号密码 默认账号为root，默认密码为tina\n系统版本 手动打开自启程序bloziplayer输出显示系统为全志基于openWRT制作的tina系统，版本为3.5\n1 2 3 4 5 6 \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; tina_multimedia \u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; tag : tina3.5 branch: tina-dev date : Mon Jul 15 19:04:59 2019 +0800 Change-Id: I5f6c8a88d7b387a312b7744797a0d5f8ab07ee7a ------------------------------------------------------------------------------- 使用uname获取Linux信息可得系统版本为3.10.65\n1 2 3 \u0026gt; uname -a Linux TinaLinux 3.10.65 #526 Tue Mar 1 04:28:42 UTC 2022 armv5tejl GNU/Linux 通过输出/etc/openwrt_version和/etc/openwrt_release可得更多详细信息\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026gt; cat /etc/openwrt_version 3.5.1 \u0026gt; cat /etc/openwrt_release DISTRIB_ID=\u0026#39;tina.jason.20220301.042736\u0026#39; DISTRIB_RELEASE=\u0026#39;Neptune\u0026#39; DISTRIB_REVISION=\u0026#39;5C1C9C53\u0026#39; DISTRIB_TARGET=\u0026#39;c200s-F1C200s/generic v2.1\u0026#39; DISTRIB_DESCRIPTION=\u0026#39;tina.jason.20220301.042736 3.5.1\u0026#39; DISTRIB_TAINTS=\u0026#39;no-all no-ipv6\u0026#39; 总结来说就是系统是系统是基于OpenWRT 3.5.1的Tina Linux 3.10.65 同时推测bloziplayer和DISTRIB_DESCRIPTION中的系统版本号是写死的，并不具有多少参考价值\n系统启动流程分析 stp.1 启动入口 /etc/inittab 1 2 3 4 5 6 7 8 9 10 11 12 13 null::sysinit:/bin/mount -o remount,rw / null::sysinit:/bin/mkdir -p /dev/pts null::sysinit:/bin/mount -a ::sysinit:/etc/init.d/rcS boot /dev/console::respawn:-/bin/sh ::ctrlaltdel:/sbin/reboot null::shutdown:/bin/umount -a -r 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sysinit(初始化) -\u0026gt; 将根文件系统`/`以读写模式(rw)重新挂载 -\u0026gt; 创建目录`/dev/pts`(用于伪终端设备) -\u0026gt; 挂载`/etc/fstab`中定义的所有文件系统 -\u0026gt; 执行系统初始化脚本`/etc/init.d/rcS`，并传递参数`boot` respawn(持续监控) -\u0026gt; 在控制台`/dev/console`启动Shell(`/bin/sh`) ctrlaltdel -\u0026gt; 按下`Ctrl+Alt+Del`组合键时执行`/sbin/reboot`命令重启系统 shutdown -\u0026gt; 安全卸载文件系统 stp.2 系统初始化脚本 /etc/init.d/rcS 启动顺序 函数 函数定义 1 rc_preboot() 执行预启动脚本 /etc/init.d/rc.preboot 2 rc_init() 基础初始化\n-\u0026gt; 从内核参数 loglevel 设置日志级别 -\u0026gt; 设置主机名 TinaLinux -\u0026gt; 启用回环接口 lo 3 rc_log() 执行日志配置脚本 /etc/init.d/rc.log 4 rc_mount() 挂载关键分区\n-\u0026gt; 挂载 UDISK (/dev/by-name/UDISK → /mnt/UDISK) -\u0026gt; 启动 mdev 动态管理设备节点 5 rc_load_modules() 加载内核模块（执行 /etc/init.d/rc.modules） 6 rc_load_script() 并行启动服务\n-\u0026gt; 从 /etc/init.d/load_script.conf 读取服务列表 -\u0026gt; 以 boot 参数后台运行符合规范的服务 7 rc_final() 执行最终初始化脚本 /etc/init.d/rc.final 8 rc_ota() 后台启动 OTA 升级日志服务 (/sbin/aw_upgrade_log.sh) module mkfs_jffs2() 格式化 JFFS2 文件系统\n-\u0026gt; 检查 mkfs.jffs2 工具是否存在 -\u0026gt; 从 /proc/mtd 获取擦除块大小 -\u0026gt; 创建临时镜像并写入设备 module rc_mount_filesystem() 挂载文件系统\n-\u0026gt; 支持 jffs2（MTD 设备）和 ext4（块设备） -\u0026gt; 挂载失败时自动格式化分区 stp.2.1 预启动脚本 /etc/init.d/rc.preboot 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 /etc/init.d/preboot -\u0026gt; blozi_init -\u0026gt; cd /sys/class/sunxi_dum echo 0xf1c01100 0x0000\u0026gt;write echo 0xf1c01104 0x0000\u0026gt;write echo 0xf1c01108 0x0000\u0026gt;write echo 0xf1c0110c 0x0000\u0026gt;write echo 0xf1c01110 0x0000\u0026gt;write echo 0xf1c01114 0x0000\u0026gt;write echo 0xf1c01118 0x00006000\u0026gt;write echo 0xf1c0111c 0x00000000\u0026gt;write echo 0xf1c01120 0x00000000\u0026gt;write echo 0xf1c01124 0x0000\u0026gt;write echo 0xf1c01128 0x0000\u0026gt;write echo 0xf1c0112c 0x0000\u0026gt;write echo 0xf1c01140 0x0000\u0026gt;write -\u0026gt; mkdir -p /mnt/private -\u0026gt; mount -t vfat -r /dev/by-name/private /mnt/private -\u0026gt; cp /mnt/private/ULI/factory/SN.txt /usr/product_sn 脚本首先使用全志的sunxi_dum工具写入寄存器 然后挂载私有分区并复制序列号 输出SN.txt可得SN号\n1 2 3 \u0026gt; cat /mnt/private/ULI/factory/SN.txt 5000003927 stp.2.2 日志配置脚本 /etc/init.d/rc.log 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/sh mkdir -p /var/log if [ -d /var/log ] then touch /var/log/messages /sbin/syslogd -n -m 0 \u0026amp; /sbin/klogd -n \u0026amp; fi stp.2.3 内核模块/etc/init.d/rc.modules 1 2 3 4 5 6 7 8 9 10 #!/bin/sh [ -d /etc/modules.d ] \u0026amp;\u0026amp; \\ /sbin/kmodloader \u0026#34;/etc/modules.d/\u0026#34; [ -d /etc/modules-boot.d ] \u0026amp;\u0026amp; \\ /sbin/kmodloader \u0026#34;/etc/modules-boot.d/\u0026#34; \u0026amp; 可得加载了两部分的内核模块，/etc/modules.d/和/etc/modules-boot.d/ 分别获取信息\n1 2 3 4 5 6 7 8 9 \u0026gt;cd /etc/modules.d/ \u0026amp;\u0026amp; ll drwxr-xr-x 2 root root 72 Mar 1 2022 . drwxr-xr-x 1 root root 1024 Jan 1 00:00 .. -rw-r--r-- 1 root root 86 Mar 1 2022 30-sound-core -rw-r--r-- 1 root root 9 Mar 1 2022 cfg80211 -rw-r--r-- 1 root root 35 Mar 1 2022 xradio-xr819 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 \u0026gt; cat 30-sound-core soundcore snd snd-seq-device snd-timer snd-pcm snd-mixer-oss snd-pcm-oss snd-compress \u0026gt; cat cfg80211 cfg80211 \u0026gt; cat xradio-xr819 xradio_mac xradio_core xradio_wlan 文件夹/etc/modules-boot.d/不存在\nstp.2.4 服务列表/etc/init.d/load_script.conf 1 2 3 4 5 adbd tinatest wpa_supplicant stp.2.4.1 adbd 脚本为/bin/sh脚本，基于/etc/rc.common框架管理生命周期(80-99) 通过动态配置USB Gadget并启动adbd，使设备支持ADB协议。核心依赖Linux内核的USB Gadget框架和Procd进程管理器\nstp.2.4.2 tinatest 没有找到该服务\nstp.2.4.3 wpa_supplicant 脚本为/bin/sh脚本，基于/etc/rc.common框架管理生命周期(96-98) 仅有启动阶段存在，停止和重启部分均被注释掉\n1 2 3 4 5 6 7 8 9 10 11 12 13 start_service() { procd_open_instance ifconfig wlan0 up procd_set_param oom_adj $OOM_ADJ procd_set_param command $PROG -iwlan0 -Dnl80211 -c/etc/wifi/wpa_supplicant.conf -I/etc/wifi/wpa_supplicant_overlay procd_close_instance } 基于这段代码的信息，修改/etc/wifi/wpa_supplicant.conf\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ctrl_interface=/etc/wifi/sockets disable_scan_offload=1 update_config=1n wowlan_triggers=any network={ ssid=\u0026#34;SSID\u0026#34; psk=\u0026#34;Password\u0026#34; priority=5 } 重启发现文件被覆盖(network信息丢失)，需要进一步的分析\nstp.2.5 最终初始化脚本 /etc/init.d/rc.final 1 2 3 4 5 6 7 8 9 /etc/init.d/rc.final -\u0026gt; if [ -f \u0026#34;/usr/bin/F1C200s-board\u0026#34; ]; then /usr/bin/F1C200s-board \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 \u0026amp; fi -\u0026gt; blozi_player_init -\u0026gt; check dir ls /usr/bin/可得/usr/bin/F1C200s-board并不存在\nstp.3 文件系统挂载 /etc/fstab 1 2 3 4 # /etc/fstab: static file system information. # # \u0026lt;file system\u0026gt;\t\u0026lt;mount pt\u0026gt;\t\u0026lt;type\u0026gt;\t\u0026lt;options\u0026gt;\t\u0026lt;dump\u0026gt;\t\u0026lt;pass\u0026gt; devpts\t/dev/pts\tdevpts\tdefaults,gid=5,mode=620\t0\t0 挂载伪终端\nstp.4 启动目录/etc/rc.d 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 drwxr-xr-x 2 root root 219 Mar 1 2022 . drwxr-xr-x 1 root root 1024 Jan 1 00:00 .. lrwxrwxrwx 1 root root 13 Mar 1 2022 K89log -\u0026gt; ../init.d/log lrwxrwxrwx 1 root root 17 Mar 1 2022 K90network -\u0026gt; ../init.d/network lrwxrwxrwx 1 root root 24 Mar 1 2022 K98wpa_supplicant -\u0026gt; ../init.d/wpa_supplicant lrwxrwxrwx 1 root root 14 Mar 1 2022 K99adbd -\u0026gt; ../init.d/adbd lrwxrwxrwx 1 root root 13 Mar 1 2022 S12log -\u0026gt; ../init.d/log lrwxrwxrwx 1 root root 17 Mar 1 2022 S20network -\u0026gt; ../init.d/network lrwxrwxrwx 1 root root 14 Mar 1 2022 S50cron -\u0026gt; ../init.d/cron lrwxrwxrwx 1 root root 14 Mar 1 2022 S80adbd -\u0026gt; ../init.d/adbd lrwxrwxrwx 1 root root 24 Mar 1 2022 S96wpa_supplicant -\u0026gt; ../init.d/wpa_supplicant lrwxrwxrwx 1 root root 17 Mar 1 2022 S98sysntpd -\u0026gt; ../init.d/sysntpd lrwxrwxrwx 1 root root 26 Mar 1 2022 S99swupdate_autorun -\u0026gt; ../init.d/swupdate_autorun 可以看到所有的启动文件均为/etc/init.d/对应脚本的软链接\nstp.5 脚本目录/etc/init.d/ 分析脚本在启动和关机时的顺序\n1 2 3 4 5 6 7 \u0026gt; Start log -\u0026gt; network -\u0026gt; cron -\u0026gt; adbd -\u0026gt; sysntpd -\u0026gt; swupdate_autorun \u0026gt; Kill log -\u0026gt; network -\u0026gt; adbd 一一访问脚本文件进行分析(除了已经分析过的) network -\u0026gt; 基础的网络接口初始化 cron -\u0026gt; 定时工具，定时文件在/etc/crontabs/中，ls可得空无一物 ntpd -\u0026gt; NTP时间同步 swupdate_autorun -\u0026gt; 全志的自动更新工具\nstp.6 按钮事件 有文件/etc/rc.button/wps\n1 2 3 4 5 6 7 8 9 10 11 12 13 if [ \u0026#34;$ACTION\u0026#34; = \u0026#34;pressed\u0026#34; -a \u0026#34;$BUTTON\u0026#34; = \u0026#34;wps\u0026#34; ]; then cd /var/run/hostapd for socket in *; do [ -S \u0026#34;$socket\u0026#34; ] || continue hostapd_cli -i \u0026#34;$socket\u0026#34; wps_pbc done fi 终端启动流程分析 在/etc/profile.d/中可找到bloziplayer.sh\n1 2 3 4 5 6 7 8 9 wpa_supplicant_init -\u0026gt; cp -f /etc/wifi/wpa_supplicant_src.conf /etc/wifi/wpa_supplicant.conf blozi_player_start -\u0026gt; bloziplayer blozi_player_daemon -\u0026gt; watch dog 故将所有项全部注释，再次修改/etc/wifi/wpa_supplicant.conf 重启即可连接上WIFI\n日志分析 日志脚本改写 ls /var/log/可得只有一个messages的日志文件，故需要对rc.log进行改写\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!/bin/sh mkdir -p /var/log rm -f /var/log/messages /var/log/kernel.log 2\u0026gt;/dev/null mkdir -p /etc cat \u0026gt; /etc/syslog.conf \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; kern.* -/var/log/kernel.log *.* /var/log/messages EOF if [ -d /var/log ] then touch /var/log/kernel.log touch /var/log/messages chmod 644 /var/log/kernel.log killall syslogd klogd 2\u0026gt;/dev/null /sbin/syslogd -n -m 0 -f /etc/syslog.conf -L \u0026amp; /sbin/klogd -n -c 8 \u0026amp; sleep 2 dmesg \u0026gt; /var/log/kernel.log fi 保存并重启\n日志预处理 在使用adb shell连接后会发现messages在被疯狂灌水(多次ll /var/log可得)\n1 [DISP] disp_al_layer_set_framebuffer,line:2029: not support fmt! 只能说BLOZI官方写的代码还是太抽象了，而且从屏幕上也能看到奇奇怪怪的刷新 推测是使用adb shell后创建了一个新终端，由终端启动流程分析可得执行了bloziplayer 执行ps | grep blozi可得\n1 2 3 176 root 23:57 bloziplayer 403 root 0:32 bloziplayer 所以不断刷屏的消息应该是开机自启的bloziplayer输出的demo帧和后续创建的bloziplayer的empty帧冲突导致的 所以想要抓取正常的包含bloziplayer消息的日志，需要在进入时进行进行抓取\n1 cp /var/log/messages /var/log/messages.bak 提示 此处亦可参考BLOZI 10.1寸LCD价签折腾记3-环境配置中的关闭BLOZI的环境操作后再进行抓包，但无法获取包含bloziplayer输出的日志\n然后就能下载log文件进行分析\n1 2 3 4 5 6 7 mkdir log cd log adb pull /var/log/kernel.log adb pull /var/log/messages.bak 然后使用vim去除掉messages中被灌入的垃圾内容\n1 2 3 4 5 vim messages.bak :g/disp_al_layer_set_framebuffer,line:2029/d :wq DTS DTS F1C200S https://whycan.com/t_11396.html#p100965\nINFOS https://whycan.com/t_11396.html#p100966 https://whycan.com/t_11396.html#p100967\n","date":"2025-07-12T08:36:43+08:00","permalink":"http://blog.doublecat.top/posts/blozi_10.1%E5%AF%B8lcd%E4%BB%B7%E7%AD%BE%E6%8A%98%E8%85%BE%E8%AE%B01-%E8%BD%AF%E7%A1%AC%E4%BB%B6%E5%88%86%E6%9E%90/","title":"BLOZI 10.1寸LCD价签折腾记1-软硬件分析"},{"content":"在之前的工作中，已经完成了BIOS启动图片的自定义和键盘的改造\n接下来就是进行BIOS的破解，启用高级功能\u0026amp; 删除白名单\n后续所有涉及到文件的操作省略cd和cp过程\n请全程插入电源接口并使用电池\n准备工作 软件准备 软件 URL 用途 安装方法 IVprep https://github.com/n4ru/IVprep 降级BIOS Git clone flashrom https://github.com/flashrom/flashrom 读写BIOS pacman thinkpad-firmware-patches https://github.com/digmorepaka/thinkpad-firmware-patches 破解BIOS Git clone thinkpad-uefi-sign https://github.com/thrimbor/thinkpad-uefi-sign 签名并校验BIOS镜像 Git clone chipsec https://chipsec.github.io/ yay 1vyrain https://github.com/n4ru/1vyrain 破解BIOS并写入 Git clone Nginx https://nginx.org/en/ 网络服务器 - Python https://www.python.org/ 运行软件 - 降级部分BIOS至最高可破解版本 在T430改造计划2-修改BIOS启动图片中我们将系统升级到了2.81(g1uj48us)\n但是最高可破解的版本为2.64，所以需要使用IVprep降级部分BIOS至2.64\n在Windows中运行downgrade.bat直接进行降级\n同时因为是部分刷写，所以不会影响T430改造计划-改造键盘中刷入的EC固件\n备份BIOS镜像 使用flashroom读取BIOS，以便进行后续修改\n1 flashrom -p internal -r bios_backup.rom --ifd -i bios 破解BIOS并签名 破解BIOS 因为我们只需要修改部分BIOS区域，仅需保留最后的4M，其中包含我们修改的BIOS启动图片和需要修改的部分\n1 dd if=bios_backup.rom of=4M.rom bs=1M skip=8 然后修改xx30_patches_v4.txt，开启需要修改的部分\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 # AdvancedMenu By leokim | W530 / T530 / T430 / x230 / T430s / X230t / X131e / L430 / L530 32442D09-1D11-4E27-8AAB-90FE6ACB0489 10 O:02A0:778B1D826D24964E8E103467D56AB1BA # PowerManagement2 | 0x194 unlock/OC enable test | F7731B4C-58A2-4DF4-8980-5645D39ECE58 10 P:44243080fb0175080fbae80f89442430:44243080fb01eb080fbae80f89442430 F7731B4C-58A2-4DF4-8980-5645D39ECE58 10 P:30488b4338f6000874080fba6c243014:30488b4338f60008eb080fba6c243014 # LenovoWmaPolicyDxe | WL removal | ripped from dudu2002 | W530 2.76 / T530 2.77 / T430 2.82 / x230 2.77 79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:C8390F0F84:C8390F90E9 79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:C8390F7516:C8390F7500 79E0EDD7-9D1D-4F41-AE1A-F896169E5216 10 P:C8394F0474:C8394F04EB # PlatformHiiAdvancedDxe | 1066 fix | \\x | xx30 thinkpads | change 1066 to another auto to stop bricking CFEF94C4-4167-466A-8893-8779459DFA86 10 P:090E680101010100000000000000:090E9C0001010000000000000000 使用firmware-patches工具修改4M.rom\n1 UEFIPatch 4M.rom xx30_patches_v4.txt -o patched_fig4M.rom 此时我们已经得到了破解修改后的patched_4M.rom\n签名BIOS ThinkPad会在每次开机时校验BIOS，如果不进行签名校验修补，会滴滴作响\n使用uefi-sign的sign.py工具签名patched_4M.rom\n1 python sign.py patched_fig4M.rom signed_fig4M.rom 使用校验工具verify.py工具校验signed_4M.rom\n1 python verify.py signed_fig4M.rom 刷入BIOS 将signed_4M.rom移动至Nginx网站目录，确保可以进行访问\n1 wget http://localhost/signed_4M.rom 打开1vyrain的目录，需要修改start.sh\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # Replace L18 if ! ping -q -c 1 -W 1 8.8.8.8 \u0026gt;/dev/null; then echo -e \u0026#34;\\e[1;32mWaiting 10 seconds for Network...\\e[0m\u0026#34; \u0026amp;\u0026amp; sleep 10; fi # To if ! ping -q -c 1 -W 1 223.223.223.223 \u0026gt;/dev/null; then echo -e \u0026#34;\\e[1;32mWaiting 10 seconds for Network...\\e[0m\u0026#34; \u0026amp;\u0026amp; sleep 10; fi # Replace L31 flashsize=$(/root/flashrom/flashrom -p internal:laptop=force_I_want_a_brick --ifd -i bios -N -r /tmp/backup.rom \u0026gt; /dev/null \u0026amp;\u0026amp; du /tmp/backup.rom | sed \u0026#34;s/[^0-9]//g\u0026#34;) # To flashsize=$(flashrom -p internal:laptop=force_I_want_a_brick --ifd -i bios -N -r /tmp/backup.rom \u0026gt; /dev/null \u0026amp;\u0026amp; du /tmp/backup.rom | sed \u0026#34;s/[^0-9]//g\u0026#34;) # Replace L62 # To # Replace L117 /root/flashrom/flashrom -p internal:laptop=force_I_want_a_brick -w /root/bios/rom.temp --ifd -i bios -N # To flashrom -p internal:laptop=force_I_want_a_brick -w /root/bios/rom.temp --ifd -i bios -N # Before L87 echo -e \u0026#34;\\e[1;32mPlease enter a choice:\\e[0m\u0026#34; # Add mkdir /root/bios 以root权限运行start.sh\n1 2 chmod +x start.sh sudo ./start.sh 按照提示，在选择模式的时候选择2使用自定义镜像，输入\n1 http://localhost/signed_4M.rom 在提示按下回车的时候按下回车\n此时屏幕会息屏，类似于睡眠模式\n按下电源按钮即可\n等待脚本自动刷入BIOS，此时千万不要断开电源/关闭电脑\n等待自动重启即可\n此时可以安装非白名单设备例如AX210等，并可以在BIOS菜单中看到增加的功能\nEnjoy~\n","date":"2025-05-10T15:36:43+08:00","permalink":"http://blog.doublecat.top/posts/t430%E6%94%B9%E9%80%A0%E8%AE%A1%E5%88%923-%E7%A0%B4%E8%A7%A3bios%E5%B9%B6%E4%BF%9D%E7%95%99bios%E5%90%AF%E5%8A%A8%E5%9B%BE%E7%89%87/","title":"T430改造计划3-破解BIOS并保留BIOS启动图片"},{"content":"制作图片 为了修改BIOS启动图片，需要俩图片，LOGO1.*和LOGO2.*\n要求如下：\nLOGO1.* 像素小于640X480\nLOGO2.* 像素小于1366X768\n需要使用BMP、JPG或GIF格式\n每个文件均小于30kb\n经过多次尝试后，总结出以下深层要求：\nBIOS会自动改变宽度，所以图像内容的宽度需要/3*4\n单独LOGO1或LOGO2是不可行的，需要同时使用\n仅使用GIF格式\n最好使用8bit RGB\n刷写图片 以下操作在Arch Linux中进行\n找到在T430改造计划1-改造键盘中下载的2.81固件\n因为该版本固件不涉及EC部分，故我们的操作不会对改造好的键盘产生什么影响\n使用geteltorito工具提取BIOS CD\n1 perl geteltorito.pl -o flash.img g1uj48us.iso 找个废弃的U盘，刷入BIOS CD\n1 2 # /dev/sdx 需要更换为你的U盘 sudo dd if=flash.img of=/dev/sdx1 bs=4M status=progress conv=fsync 将LOGO1.gif和LOGO2.gif放在U盘挂载目录/FLASH文件夹下即可\nF12引导启动至U盘，等待自动刷写图片\nEnjoy~\n","date":"2025-04-20T17:20:43+08:00","permalink":"http://blog.doublecat.top/posts/t430%E6%94%B9%E9%80%A0%E8%AE%A1%E5%88%922-%E4%BF%AE%E6%94%B9bios%E5%90%AF%E5%8A%A8%E5%9B%BE%E7%89%87/","title":"T430改造计划2-修改BIOS启动图片"},{"content":"流程 只需要按照网上的通用流程即可\n换键盘-\u0026gt;刷EC固件-\u0026gt;完工\n换键盘 键盘是从咸鱼购买的T420键盘\n键盘到手后需要进行一定的改装\n首先就是按照ThinkPad Classic Keyboard Mod的流程修改控制区域的两块塑料，以及锉金属卡舌 梦回金工实习\n这一步一定要细致认真\n因为我的T430键盘是原生带背光的版本，需要屏蔽背光位点避免烧坏键盘。所以需要拆开新键盘的压接区域，用镊子取下压接排线，用较薄的绝缘的贴纸/胶带覆盖顶层的2~4位点，将压接排线接回。再用一层薄的绝缘贴纸贴在垫子上，避免压接后接触不良导致键位失效。\n将排线接入主板开机测试，除了键位映射不同外，测试每个键位是否都生效\n刷入EC固件 降级版本 由于EC固件最后只支持2.81版本，我手上这台的版本为2.82，所以需要将BIOS降到2.81\n首先在BIOS中关闭BIOS降级保护，顺便将启动模式设置为Legacy first\n把2.81的官方BIOS升级ISO丢到Ventoy U盘里面，重启\nF12引导启动至U盘，选择该ISO启动，忽略掉降级警告就行\n刷入EC固件 以下操作在Arch Linux中进行\n首先下载EC固件\n1 2 git clone https://github.com/hamishcoleman/thinkpad-ec cd ./thinkpad-ec 然后编译EC固件安装包(该步骤第一次运行时需要联网下载BIOS ISO)\n1 2 3 make patch_enable_battery clean make patch_enable_keyboard clean make patched.t430.iso 找个废弃的U盘，刷入EC固件安装包\n1 2 # /dev/sdx 需要更换为你的U盘 sudo dd if=patched.t430.iso of=/dev/sdx bs=4M status=progress conv=fsync F12引导启动至U盘，等待自动刷写EC即可\n重启后即可享受T420的经典键盘（同时也解锁了电池的白名单限制）\n","date":"2025-04-20T16:05:21+08:00","permalink":"http://blog.doublecat.top/posts/t430%E6%94%B9%E9%80%A0%E8%AE%A1%E5%88%921-%E6%94%B9%E9%80%A0%E9%94%AE%E7%9B%98/","title":"T430改造计划1-改造键盘"},{"content":"Windows环境缺失 报错信息为：\n1 2 qt.qpa.plugin: Could not find the Qt platform plugin \u0026#34;windows\u0026#34; in \u0026#34;\u0026#34; This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 通过Windows软件依赖匹配中的操作即可修复\nWindows软件依赖匹配 通过使用windeployqt.exe工具，可以为编译好的程序配置使用环境\n例如对于test.exe，我可以输入：\n1 windeployqt.exe .\\test.exe 输出类似于：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Adding Qt6Svg for qsvgicon.dll Skipping plugin qtvirtualkeyboardplugin.dll due to disabled dependencies (Qt6Qml Qt6Quick). Direct dependencies: Qt6Core Qt6Gui Qt6Widgets All dependencies : Qt6Core Qt6Gui Qt6Widgets To be deployed : Qt6Core Qt6Gui Qt6Svg Qt6Widgets Qt6Core.dll is up to date. Qt6Gui.dll is up to date. Updating Qt6Svg.dll. Qt6Widgets.dll is up to date. Updating opengl32sw.dll. Updating D3Dcompiler_47.dll. Updating libgcc_s_dw2-1.dll. Updating libgcc_s_seh_64-1.dll. Updating libgcc_s_sjlj-1.dll. Updating libstdc++-6.dll. Updating libstdc++_64-6.dll. Updating libwinpthread-1.dll. Updating libwinpthread_64-1.dll. Creating directory D:/Project/test/build/iconengines. Updating qsvgicon.dll. Creating directory D:/Project/test/build/imageformats. Updating qgif.dll. Updating qicns.dll. ...... ","date":"2025-04-11T02:04:01+08:00","permalink":"http://blog.doublecat.top/posts/qt%E6%89%8B%E8%AE%B0/","title":"Qt手记"},{"content":" 本文内容部分使用AIGC，不作为诊疗参考\n习惯回路：大脑的“自动化程序” 什么是习惯回路？ 习惯回路（Habit Loop）是大脑形成习惯的神经机制，由三部分组成：\n提示（Cue）：触发习惯的信号（如时间、地点、情绪）。\n惯常行为（Routine）：自动执行的动作（如吃零食、吸烟）。\n奖赏（Reward）：行为后获得的满足感（如多巴胺分泌）。\neg. 吸烟者的习惯回路\n提示：饭后坐在沙发上（场景触发）。\n惯常行为：点一支烟。\n奖赏：尼古丁刺激多巴胺分泌，缓解压力感。\n循证医学证据 基底神经节的作用：研究显示，习惯行为由基底神经节控制，而非前额叶皮层（负责决策），因此习惯是“自动化”的（Graybiel, 2008）。\n多巴胺强化机制：奖赏通过多巴胺释放强化行为，形成神经通路（Volkow et al., 2019）。\n干预策略：改变习惯需保留“提示”和“奖赏”，替换“行为”。例如，用嚼口香糖替代吸烟（Lally et al., 2010）。\n适应性：身体和大脑的“自我升级” 适应性是什么？ 适应性指生物体通过调整自身功能或结构，适应环境变化的能力。在医学中，适应性体现在：\n生理适应：长期运动后心肺功能增强。\n神经可塑性：学习新技能时，大脑神经元重组连接。\n行为适应：慢性疼痛患者发展出保护性动作模式。\n循证医学证据 运动适应性：规律运动可增加线粒体数量和肌肉毛细血管密度，提升代谢效率（Booth et al., 2012）。\n神经可塑性：中风患者通过康复训练，未受损脑区可接管受损区域功能（Cramer et al., 2011）。\n疼痛适应：慢性疼痛患者可能出现中枢敏化（中枢神经系统过度反应），需通过认知行为疗法（CBT）重建适应性反应（Turk et al., 2011）。\n习惯回路与适应性的关系 良性循环：好习惯促进身体适应 eg. 糖尿病管理\n习惯回路： 提示：餐后血糖监测提醒。 行为：散步15分钟。 奖赏：血糖稳定带来的安心感。 适应性：长期坚持可改善胰岛素敏感性（Umpierre et al., 2011）。 恶性循环：坏习惯引发病理适应 eg. 久坐与腰痛\n习惯回路： 提示：工作压力大。 行为：久坐不动。 奖赏：暂时放松。 适应性：核心肌群萎缩→腰椎稳定性下降→慢性腰痛（Hoy et al., 2010）。 如何利用习惯回路改善健康？ 识别提示和奖赏：记录不良习惯的触发点（如压力大时暴饮暴食）。\n替换行为：用健康行为替代旧习惯（如压力大时改为深呼吸或快走）。\n强化奖赏：放大健康行为的正向反馈（如运动后记录成就感）。\n循证工具：\n使用习惯追踪APP（证据显示自我监测可提升依从性，Burke et al., 2012）。 结合正念训练（Mindfulness）阻断自动习惯反应（Brewer et al., 2013）。 ","date":"2025-04-08T02:33:27+08:00","permalink":"http://blog.doublecat.top/posts/%E4%B9%A0%E6%83%AF%E5%9B%9E%E8%B7%AF%E4%B8%8E%E9%80%82%E5%BA%94%E6%80%A7/","title":"习惯回路与适应性"},{"content":"什么是Zotero Zotero是一款免费、易于使用的文献管理工具，可以帮助收集、管理、阅读、批注、引用和共享文献。使用 Zotero将使你的学术生产效率大增。\n相较于另外三个比较常用的文献管理工具，即Endnote、Mendeley、Noteexpress、Citavi而言，Zotero同时具有轻量化、可扩展性强、易用、可同步、便宜免费、界面美观等特点，可以算是直接杀死了比赛。\nZotero快速启动 请首先到Zotero官方下载页面下载对应的软体\n需要注意的是，Android版本仍在开发中，但可以在Google Play中下载到测试预览版（但是截止发文，测试名额已满，可以前往第三方的夜间构建项目获取APK包）。\nZotero具有简单易上手的特性，基本上无需教程东点一下西点一下也就差不多都知道了\n或者也可以点击Zotero中文社区进行快速入门\nZotero特殊配置 添加国标引用样式 在使用Zotero进行中文论文写作时，需要使用国标引用样式进行论文的引用和文献列表的插入，这个时候就需要提前添加国标引用样式。\n点击最上方标签栏中的编辑，点击设置。在随后弹出的窗口中点击左侧的引用，再点击右侧的紫色超链接获取更多样式，在左侧的搜索框中填入China National Standard即可看到列出的可以添加的样式。\n按你的需求添加一个就行\n美化 见Zotero插件中的Ethereal Style for Zotero部分\nZotero插件 为了让Zotero使用更加方便，我推荐以下我使用的插件\nTranslate For Zotero 显而易见的，这是一个翻译插件\n它可以在你阅读的时候提供划词/句/段翻译的功能，也可以提供批注翻译的功能\n右侧也有一个翻译窗口，可以直接将需要翻译的内容添加到里面进行翻译\n在翻译的时候，对于一些PDF处理没那么好的期刊，可能会出现划到页眉页脚的情况\n这个时候可以打开翻译插件的拼接翻译功能，该功能可以让你进行连续的划词/句/段，内容将会按照划的顺序自动拼接。\n插件支持设置不同的翻译接口，以及其它多种个性化设置\n可以进入设置-翻译中进行修改\nEthereal Style for Zotero 这个插件适用于想美化自己的Zotero，有一定学习插件时间的人群。\n个人使用不是很多，更推荐参考Zotero中文社区的内容\nJasminum Jasminum（茉莉花）是一个用于识别中文元数据的插件。\n原始的Zotero不支持中文元数据的识别，该插件提供了解析\n适用于知网、万方、维普等众多网站\n在安装插件后同样需要在设置-茉莉花中拉到最下面更新转换器\n这时候你会发现甚至连BiliBili都能解析（应该是给社科那帮人用的）\nZotero Box 这个插件是一个十分好用的学术辅助插件，可以查看文章的元数据，例如期刊IF因子，期刊分区，被引量等等，部分文章还支持AI总结功能\n有免费版和VIP版区别，具体可以看官方对比\n反正我觉得挺好用的，如果有长期的科研需要不妨买个会员（分了两级），一个月一两杯蜜雪冰城柠檬水罢了，偶尔还有打折。\n如果你有会员需求，不妨使用我的链接让我赚几角钱（\n","date":"2025-04-04T05:27:30+08:00","permalink":"http://blog.doublecat.top/posts/zotero%E4%B8%AA%E4%BA%BA%E6%8C%87%E5%8D%97/","title":"Zotero个人指南"},{"content":"什么是可信AI 可信人工智能（Trustworthy AI）是指具备可解释性、公平性、鲁棒性、隐私保护及人本价值等核心特征的人工智能（AI）系统。其中，可解释性人工智能（Explainable AI, XAI）作为可信AI的核心组成部分，特指能够清晰展示决策逻辑、量化证据权重并接受人类验证的算法体系。本文重点探讨XAI的技术实现与应用范式。\n为什么需要可信AI 在学科方法论层面，生物学科强调实验结论的支撑，医疗领域依赖循证医学，法律体系则以证据链条为基础。这些学科的共同特征在于构建\u0026quot;假设-证据-结论\u0026quot;的三段式认知框架，要求每个推理环节都具有可追溯的量化支撑。以司法量刑为例，定罪证据需满足证据能力（可采性）与证明力（权重）的双重验证。\nXAI的学术价值在于其能够：\n建立决策要素与输出结果的映射关系；\n量化各特征参数的贡献度；\n生成符合人类认知的解释路径。例如在医疗影像诊断中，XAI不仅输出病灶判断，还需标注影像特征的位置分布及置信度评分，形成可验证的诊断证据链。\n可解释性架构 当前XAI技术体系可分为两个维度：\n技术类型 方法论 典型算法 解释粒度 局限分析 本质可解释模型 结构透明化设计 决策树、线性回归、注意力机制 全局解释 模型复杂度受限 后验解释方法 黑箱模型逆向解析 LIME、SHAP、反事实解释、梯度归因 局部解释 近似误差、计算成本高 本质可解释模型通过受限的模型复杂度换取可解析性，如决策树的规则路径可视化。后验解释方法则通过构建代理模型或特征扰动，近似模拟复杂模型（如深度神经网络）的决策逻辑，但存在解释保真度与计算效率的权衡问题。\n可解释性AI的使用探讨 传统XAI输出存在可读性不足的问题。\n所以可以构建一个三层AI模型框架：\n层 模型类别 作用 预处理层 分词分句 分词分句、论据提取 XAI分析层 XAI 特征权重量化、证据关联分析 LLM解释层 LLM 结构化输出 例如：\n预处理层\n1 2 3 4 5 6 7 8 9 { \u0026#34;promote\u0026#34;: [ { \u0026#34;key\u0026#34;: \u0026#34;收缩压\u0026#34;, \u0026#34;value\u0026#34;: \u0026#34;\u0026gt;140mmHg\u0026#34; }, ...... ] } XAI分析层\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 { \u0026#34;ill\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;白大衣高血压\u0026#34;, \u0026#34;support\u0026#34;: [ { \u0026#34;key\u0026#34;: \u0026#34;血压指标\u0026#34;, \u0026#34;weight\u0026#34;: 0.32 }, ...... ], \u0026#34;deal\u0026#34;: [ { \u0026#34;key\u0026#34;: \u0026#34;复测\u0026#34;, \u0026#34;weight\u0026#34;: 0.89 }, ...... ] }, ...... ] } LMM解释层\n1 复测排除白大衣高血压 ","date":"2025-04-01T07:11:40+08:00","permalink":"http://blog.doublecat.top/posts/%E5%8F%AF%E8%A7%A3%E9%87%8A%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BDxai%E7%9A%84%E7%90%86%E8%AE%BA%E6%A1%86%E6%9E%B6%E4%B8%8E%E6%8A%80%E6%9C%AF%E5%AE%9E%E8%B7%B5/","title":"可解释人工智能(XAI)的理论框架与技术实践"},{"content":" 本文内容部分使用AIGC，不作为诊疗参考\n概念演进与病理机制 诊断标准的发展沿革 注意缺陷多动障碍（Attention Deficit Hyperactivity Disorder, ADHD）是一种以持续性注意缺陷、多动冲动为特征的神经发育障碍。其诊断概念历经重要演变：\nADD术语的演变：1980年DSM-III首次使用\u0026quot;注意缺陷障碍（ADD）\u0026quot;，1994年DSM-IV将其整合为ADHD亚型，现行DSM-5诊断系统将ADHD分为三种表现型：注意力不集中型（对应原ADD概念）、多动冲动型及混合型 神经发育视角：2013年DSM-5明确将其归类为神经发育障碍，强调大脑前额叶皮质、基底神经节等区域的结构/功能异常，涉及多巴胺、去甲肾上腺素等神经递质系统失调 病因学的多维视角 发病机制呈现生物-心理-社会交互作用模式：\n遗传因素：双生子研究显示遗传度达74%，已发现DRD4、DAT1等风险基因\n神经生物学：fMRI研究揭示前额叶-纹状体环路功能连接减弱，默认网络与任务正向网络调控失衡\n环境风险：早产、孕期尼古丁暴露、铅暴露可使发病风险提升2-3倍\n发育代偿：约30%患者青春期出现症状缓解，可能与神经可塑性补偿机制相关\n临床表现的双面特征 神经多样性优势（ADHD特质谱） 近年神经多样性运动推动ADHD优势特质的系统研究：\n优势维度 具体表现 适用领域案例 发散思维 联想广度达常人1.8倍（White \u0026amp; Shah, 2016） 创意策划、产品设计 危机应对 应激状态决策速度提升40% 急诊医疗、危机管理 超聚焦状态 特定兴趣领域持续专注可达心流状态 科研攻坚、艺术创作 多线程处理 环境刺激转化率提高 突发事件响应、多项目管理 功能损害表现 需区分原发性症状与继发共病：\n核心症状群\n注意维持困难：任务持续性较同龄人低2个标准差 执行功能缺陷：工作记忆容量减少30%，任务转换耗时增加50% 情绪失调：延迟满足能力降低，情绪冲动性评分高于常模1.5SD 发展性损害\n学业表现：完成作业耗时延长60%，粗心错误率增加3倍 职业适应：工作变动频率为同龄人2.2倍（APA, 2022） 人际关系：社交冲突发生率提高40% 精准干预框架 阶梯式诊断流程 初筛评估：采用ASRS-v1.1量表结合临床访谈\n鉴别诊断：排除甲状腺功能异常、睡眠障碍等躯体疾病\n神经心理测试：执行功能成套测验（BADS）、持续性操作测验（CPT）\n共病评估：50%成人患者共患焦虑/抑郁，30%存在物质滥用\n多模态干预方案 药物治疗策略 药物类别 代表药物 作用机制 适用人群 中枢兴奋剂 哌甲酯缓释剂 阻断DA/NE再摄取 无心血管风险儿童/成人 选择性NE再摄取抑制剂 托莫西汀 增强前额叶NE传递 共病抽动/焦虑者 α2肾上腺素能激动剂 胍法辛 调节前额叶网络活性 低龄儿童/睡眠障碍者 非药物干预体系 认知重塑\n元认知疗法：训练自我监控（如\u0026quot;停顿-反思-行动\u0026quot;三步骤） 适应性策略：利用时间盲点可视化工具（Time Timer®） 环境工程学改造\n工作场景：采用声光隔离舱，实施25/5番茄工作法 学习场景：动态任务分解技术（将作文拆解为5段式填空） 生物调节技术\n经颅直流电刺激（tDCS）：针对背外侧前额叶的0.5-2mA刺激 心率变异性训练：提升迷走神经张力至正常范围（HRV\u0026gt;60ms） 生命周期管理 儿童期：家校行为契约系统（每日目标-奖励可视化图表）\n青少年期：自我倡导技能训练（症状自我解释模板）\n成年期：职业代偿策略（利用语音备忘录替代工作记忆）\n老年期：认知储备强化（结合有氧运动与双重任务训练）\n前沿研究方向 数字疗法：FDA批准的EndeavorRx®游戏疗法显示注意力提升30%\n肠道微生物调控：特定菌株移植使核心症状改善率达42%\n基因导向治疗：COMT基因多态性指导的个性化用药方案\n","date":"2025-04-01T04:35:36+08:00","permalink":"http://blog.doublecat.top/posts/addadhd/","title":"ADD/ADHD注意力障碍与多动症"},{"content":"很久没写日记了，写一下吧。\n这个点睡着的话，就赶不上早八了 :)\nME 有的时候吧，就是有些焦虑\n说我优秀吧，挂了一大堆科目，现在绞劲脑汁规划时间重修复习还要备考CET-6和考研；打比赛也没打出什么名堂，全是“安慰奖”省三啥的；人际关系也没几个深入的，虽然一直这样早该习惯了，哪哪基本上都没什么太多共同话题；计算机不如部分科班的，生物也不如别人；生物信息更他妈**，没什么能和别人交流的\n不优秀吧，一堆奖加一堆项目加两篇SCI，从部分方面来说确实比别人强一点\n但是每次别人说佬说强的时候，都经常在心里想：我真的够强吗？\n真羡慕那些一手抓学习，一手抓科研，一手抓比赛的大手子\n也许是仰头盲目追逐太久了吧\n我是否真的在别人眼中很耀眼呢\n我是否是别人追逐的目标呢\n或许有吧，或许没有吧，慢慢向前走就对了\n前进 有点累了，摆会烂\n虽然嘴上说着要摆烂要摆烂，但是又一直挣扎着想努力\n人是一切矛盾的综合体\n谁说得来着？似乎是尼采，挺正确的\n好奇心与创造力 不知道什么时候开始，我对世界的好奇心越来越重\n什么东西都想要去弄懂\n小到机械结构，大到宇宙成因\n好吧其实弄不懂，全是零零碎碎的知识，用一个个超链接链接起来罢了\n不成体系，或者说没那么成体系\n搞科研之后，这种感觉更加强了\n我开始从无穷无尽的论文中，综述中获取知识\n我弄懂了许多通道，了解各种具有微妙结构的生物分子机器，探寻了许多代谢通路\n太美了，生物由那么微观的各种小玩意组成这么庞大的个体，我总想弄懂\n从纸壳子到3D打印，从Bash脚本到AI程序\n我的创造力从未消隐一刻\n很多时候遇到一个我觉得不好用的点\n我都会想，这玩意如果造/加一个……会不会更好\n我也这么做了\n是什么勾引出我的创造力的呢？我想是Neil Buchanan主持的艺术创想\nNeil老叔太强了\n最近也翻到了他的网站，摄影作品应该是使用的湿板摄影，还是那么对我胃口\n也许到入坟的那一刻，我都会记起那句\n\u0026ldquo;Try it yourself!\u0026rdquo;\n关于恋爱 春天到了，万物复苏，又到了……\n唉想谈恋爱了\n但是本来就对自己的颜值没什么信心\n大学三年过去长胖了，外貌焦虑更是拉满了\n还经常内耗，是个超超超超超超级大怂包\n喜欢一个人也想着，哪可能会有人喜欢我这种啊\n可能曾经也是有机会的吧\n谁知道呢，或许根本没有，鼠鼠的幻想罢了 :(\n之前也曾对爱情有过幻想\n但是幻想到头来\n欸，动漫里什么的都是骗人的\nDebug 唉有人把愚人节过成情人节\n有人在obsidian论坛提bug\n是谁呢？应该是我吧\n还因为最近用form这个词表达表格用多了，提问的时候用的form\n被问了一嘴\u0026quot;what is a form?!?\u0026quot;\n好吧table其实更加符合一点\n可能是form一般表示表单更多一些？\n碎碎念 文字这种玩意，写出来就是用来发泄情绪表达欲望的\n日记写出来似乎也就不那么难受了\n虽然就只有两段实在宣泄坏情绪哈哈哈哈哈哈\n","date":"2025-04-01T03:51:46+08:00","permalink":"http://blog.doublecat.top/posts/diary-250401/","title":"Diary 25.04.01"},{"content":"关于这个工具 这是一个用于可视化SNP的工具包。\n仅支持VCF文件！\n有些代码需要重写，但它们可以使用，只是对我来说不够干净和美观。\n示例图 使用方法 见 Github仓库\n","date":"2025-03-28T15:52:03+08:00","permalink":"http://blog.doublecat.top/posts/snp-visualize---%E7%BB%98%E5%88%B6%E6%BC%82%E4%BA%AE%E7%9A%84snp%E5%9B%BE/","title":"SNP Visualize - 绘制漂亮的SNP图"},{"content":"仍需解决的问题 Obsidian的格式与Hugo不同 Obsidian自动同步到文件夹并push 前言 之前的那些方案总感觉有些不得劲\n所以本次的技术方案为：\n项目 技术 服务端 Nginx 证书自动续签 Acmebot 静态站点生成器 Hugo 文档同步 Git 博文管理 Obsidian Hugo的主题我选用的 西班牙 中国开发者Jimmy的stack主题\n站点的搭建 Hugo的安装与初始化 Nginx和Acmebot的安装配置暂且略过，直接快进到Hugo这一步\n首先需要在Hugo的releases中下载插件版(即开头是hugo_extended)\n熟悉我的人应该都知道我Linux使用的是Debian，所以接下来一切都以Debian系系统为基准操作\n执行\n1 sudo dpkg -i ./hugo_extended_0.145.0_linux-arm64.deb 安装完毕后，cd进网站目录，初始化博客文件夹\n1 2 sudo hugo new site blog cd blog 这个时候blog文件夹中就是存有hugo目录结构的文件夹\n如果想要了解更多，可以看hugo官方文档\n主题的安装与配置、网站的生成 根据Stack文档的说法，在theme直接Clone仓库即可，即：\n1 2 cd theme sudo git clone https://github.com/CaiJimmy/hugo-theme-stack.git 为了使用该主题，我们还要进行配置，配置文件可以在./hugo-theme-stack/exampleSite/中找到，或者也可以直接执行：\n1 2 sudo rm ../hugo.* sudo cp ./hugo-theme-stack/exampleSite/hugo.yaml ../ 此时可以直接sudo vim ../hugo.yaml，或者chown之后用其他软件修改\n具体修改的内容可以参考Stack文档\n⚠注意，需要在./content中创建文件夹page并在page中创建标签页信息，在content文件夹中创建_index.md等，详见Stack文档\n修改完成后，只需要执行：\n1 2 cd ../ sudo hugo 然后将blog.yourdomain的地址解析到/www/wwwroot/blog/publish就可以访问了\n文档同步 对于文档而言，存在于/www/wwwroot/blog/content/posts(我这里做了修改，默认应该是post)文件夹中，但是出于偶尔可能要修改page，所以同步整个content\n创建Git用户 不太喜欢弄混，所以在这里新建一个用户blog，隶属于组blog\n1 sudo usradd blog -G blog 初始化Git仓库 1 2 3 sudo -u blog git init /www/wwwroot/blog/content sudo chown -R blog:blog /www/wwwroot/blog/content sudo chmod -R 775 /www/wwwroot/blog/content 设置Git裸仓库 为了允许远程访问，需要创建一个裸仓库，使用钩子函数设置自动同步\n1 2 3 4 sudo mkdir /home/blog sudo chown -R blog:blog /home/blog sudo -u blog git init --bare /home/blog/blog-content.git sudo -u blog vim /home/blog/blog-content.git/hooks/post-receive post-receive的内容为\n1 2 #!/bin/bash GIT_WORK_TREE=/www/wwwroot/blog/content git checkout -f 给post-receive设置可执行\n1 sudo chmod +x /home/blog/blog-content.git/hooks/post-receive 仓库提交 因为刚刚创建了裸仓库blog-content.git，而且 /www/wwwroot/blog/content 有文件\n所以我们需要进行一次提交：\n1 2 3 4 5 6 cd /www/wwwroot/blog/content sudo -u blog git init sudo -u blog git add . sudo -u blog git commit -m \u0026#34;Initial commit\u0026#34; sudo -u blog git remote add origin /home/blog/blog-content.git sudo -u blog git push -u origin master 此时本地就可以直接clone了\n1 git clone blog@your-server-ip:/home/blog/blog-content.git 权限设置\u0026amp;博客自动生成 因为pull操作后所有文件会变为644(-rw-r--r--)，所以需要将文件权限自动设置为775(-rwxrwxr-x)，我们还是使用钩子函数，顺便把博客自动生成做了\n1 2 3 sudo chown -R blog:blog /www/wwwroot/blog sudo chmod -R 775 /www/wwwroot/blog sudo -u blog vim /home/blog/blog-content.git/hooks/post-checkout post-checkout的内容为\n1 2 3 4 #!/bin/bash echo \u0026#34;Fixing file permissions...\u0026#34; find /www/wwwroot/blog/content -type d -exec chmod 775 {} \\; find /www/wwwroot/blog/content -type f -exec chmod 664 {} \\; 给post-checkout设置可执行\n1 sudo chmod +x /home/blog/blog-content.git/hooks/post-checkout Git免密 为了让后续访问不需要输密码，需要配置SSH密钥\n在本地主机执行(我用的是Win11)：\n1 ssh-keygen -t ed25519 -f \u0026#34;$HOME\\.ssh\\blog\u0026#34; -C \u0026#34;blog@your-server-ip\u0026#34; 或者如果你用的是Linux的话：\n1 ssh-keygen -t ed25519 -f \u0026#34;~\\.ssh\\blog\u0026#34; -C \u0026#34;blog@your-server-ip\u0026#34; 进入对应目录，打开终端，输入：\n1 cat blog.pub 获取公钥，进入服务器SSH，执行操作：\n1 2 3 4 sudo -u blog mkdir -p ~/.ssh sudo -u blog chmod 700 ~/.ssh sudo -u blog echo \u0026#34;公钥内容\u0026#34; \u0026gt;\u0026gt; ~/.ssh/authorized_keys sudo -u blog chmod 600 ~/.ssh/authorized_keys 在本地主机(我用的是Win11)：\n打开$HOME\\.ssh文件夹\n使用记事本编辑config文件\n或者如果你用的是Linux的话，执行：\n1 2 cd ~\\.ssh\\ sudo -u blog vim config 输入以下内容\n1 2 3 4 5 Host blog HostName your_server_ip User blog IdentityFile ~/.ssh/blog IdentitiesOnly yes 然后cd进克隆仓库，设置局部Git信息\n1 2 git config user.name \u0026#34;blog\u0026#34; git config user.email \u0026#34;email@your.s\u0026#34; 这样我们的博文只需要在本地的blog-content文件夹中进行修改，再push回服务器就可以实现博客的自动更新了\nObsidian的搭建 模板创建 在设置-第三方插件安装Template\n创建一个笔记Template.md作为模板，添加以下内容:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 --- description: title: date: \u0026lt;% tp.date.now(\u0026#34;YYYY-MM-DDTHH:mm:ss+08:00\u0026#34;)%\u0026gt; tags: [] categories: [] featured: true --- 同时开启插件设置的Enable folder templates\n此时每创建一个笔记，都会自动应用模板并添加时间信息\n","date":"2025-03-26T14:12:25+08:00","permalink":"http://blog.doublecat.top/posts/hugo+git+obsidian%E5%8D%9A%E5%AE%A2%E8%87%AA%E5%8A%A8%E5%8C%96%E6%96%B9%E6%A1%88/","title":"Hugo+Git+Obsidian博客自动化方案"},{"content":"写在前面 趁着考研备考还没有完全开始(拖延症又犯了)又双叒叕把博客搭了起来。\n两年没写了，手生。\n上一代博客随着逐渐忙起来，SSL证书过期，域名到期，服务器到期，繁杂的备案流程……\n不知不觉间网站又被搁置了两个年头。\n两年的快节奏生活让我有些找不着北。\n打了比赛，拿了奖；进了组，做了实验，还发了paper；虽然有挂科，但我明白自己不是特别特别聪明的那类人，不能比赛科研学业两手抓，所以入学时的计划性挂科也在按部就班(虽然有点过头了)。\n但是节奏还是太快了，我更想安安静静坐在我的椅子上舒舒服服地边喝茶边写一整天的代码，或者在实验室里做一整天的实验——但总有这样那样的事情穿插其中。\n网站和博客的事情就这么搁置了很久很久很久……\nJust take a deep breath, and take a little tile on it.\n迈过了这个坎，也许就……\n那当然是不可能的，还有迈不完的坎坎坎坎坎……\n坎巴拉太空计划(笑)\n总之现在算是把博客和网站的坎迈过来了(好耶)\n下一步就是迈考研的坎\n预祝，一切顺利。\n第五代博客技术 第五代博客总体采用Hugo + Git + Obsidian\n主题采用印度老哥的hugo-PaperMod\n博文撰写 首先我使用Obsidian制作了一个Hugo可用的模板，然后使用Templater进行模板自动化，它会在我每次创建一个新笔记(.md)的时候应用模板，并生成现在的时间。\n数据同步\u0026amp;静态页面生成 我将整个Blog Obsidian仓库作为Git仓库处理，每隔一段时间检测到仓库有变动的话，Git都会自动提取仓库中除模板的所有.md文件上传到服务器中，该功能依赖于定时脚本，我也许会改用Obsidian的插件，但似乎还没有类似的实现，又得我自己写了好耶坏耶。服务器收到push之后，会使用git服务端Hook post-receive自动执行sudo hugo，通过Hugo的编译生成静态页面。\n","date":"2025-03-26T00:10:06+08:00","permalink":"http://blog.doublecat.top/posts/%E7%AC%AC%E4%BA%94%E4%BB%A3%E5%8D%9A%E5%AE%A2%E7%BA%AA%E5%85%83/","title":"第五代博客纪元"},{"content":"前言 众所周知，微软拼音作为Windows自带的中文输入法，不能说是难用，只能说是勉强能用。\n在更换输入法为Rime之后，却发现这该死的微软拼音无法被删除\n一旦按照常规方式在“设置→时间和语言→语言和区域→(中文)选项→键盘→删除微软拼音”之后，微软拼音会暂时消失，btw一旦重启电脑，微软拼音便会重新蹦出来。但是这时候(中文)选项里也没有微软拼音了，此时是无法直接删除的。离谱吗？离谱就对了，这个那个阴魂不散的Edge一样恶心🤮\n恢复微软拼音 刚刚说道，在重启电脑后微软拼音会重新出现在输入法候选中且为默认输入法，并且(中文)选项里也没有微软拼音。\n那么这时候只需要略微施一点甜头，在“键盘”中重新添加微软拼音，再把微软拼音删除即可\n彻底删除微软拼音 如何管控系统 相信大家能看出来，微软拼音和Edge的嚣张离不开Windows11在操作系统层面上的作妖。\n那么我们必须得了解管控流氓系统软件的三个方法：\n⚠️注意：修改系统软件可能会导致系统功能失效，请谨慎操作\n文件管理法：通过删除对应软件的文件(目录)，同时创建相同名称的目录(文件)(文件拓展名无需考虑)。这样可以使安装程序/修复程序(或者说是Windows Update)无法操作对应文件(目录)而导致安装/修复失败。 但是缺点也很明显，很多目录都被写了保护，主体“TrustedInstaller”拥有目录的完全控制权限，这一主体我没有对其有研究。而如果你成功更改了所有者，并且修改了用户权限，(过程可以看这篇教程(⚠️️大量AD)) ，恭喜你，你已经是主人了。但是大多数情况下你还是无法对文件夹进行操作，即使你获取了完全控制权限。而许多安装程序在安装时也会删除原有文件夹，也就是说每次轮回你都要想尽办法删除文件夹(Fucking Microsoft)。 组策略法：组策略是Windows在专业版的一个工具，家庭版可以参考这篇文章尝试安装组策略(操作未试验)。组策略实际上是Windows将部分对注册表的一系列操作封装起来，以供用户实现对系统的控制。说真的组策略很好用，对系统的危害性近乎为0，但是量太少了不够塞牙缝( 注册表法：Windows唯一真神，系统的命根子注册表是Windows储存各种配置文件的地方，许多程序也喜好将设置/授权什么的存在其中，类似于config.json config.yaml之类的，通过更改注册表，便可以修改操作系统一些玩意，例如更改更新通道，关闭Windows的安全中心之类的。但是这个方法的危险性极高，尤其是涉及到系统的玩意，所以老人家常说“记得备份注册表” 彻底删除微软拼音 说完了储备知识，接下来就得说说怎么干掉，由于微软拼音的顽固，第一个方法无法授权，第二个方法没有对应设置，于是只能请出注册表 微软的输入法候选菜单存储在注册表的计算机\\HKEY_CURRENT_USER\\Keyboard Layout\\Preload之中 我打开之后里面有三个值，00000804、e0200804和00000409，而系统自带有英语(美国)-美式键盘和中文(简体，中国)-微软拼音，前面的值为在候选中的排名。通过找不同，很容易猜出e0200804为我安装的中文(简体，中国)-小狼毫，通过查询得知英语(美国)-美式键盘的代码为00000409，所以删除00000804即可删除微软拼音 重启，恩，该死的微软拼音果然消失了，有可以体验一下子就可以在中文和英文切换的快感了。\n2023/02/17更新： 在Windows更新22H2(25300.1000)之后，这方法失效了，而距离我写博仅仅过了四天。这一次我不想惯着Windows了。 ⚠️注意：本操作会导致键盘设置无法使用，请谨慎操作 还是进入注册表的计算机\\HKEY_CURRENT_USER\\Keyboard Layout\\Preload，这次在左侧的目录栏中找到Preload，右键，选择权限，在弹出的新窗口中选择高级。点击所有者右侧的更改，输入账户名，将所有者更改为当前用户（前提得是管理员账户）。应用后选中SYSTEM，点击下方禁用继承，应用后点击编辑，显示高级权限。通过取消勾选，只留下查询数值 枚举子项 通知 读取控制，点击确定即刻。然后重复之前的步骤并重启即可。\n⚠️注意：后续恢复重新给予SYSTEM完全权限即可\n后记 根据Mircosoft这个大公司的尿性，很大概率在下一次Windows Update中，这该死的微软拼音又会像Edge一样秽土转生，如同打不死的小强 我是很喜欢拥有操作系统的所有权的那种感觉，所以我平时除了使用Windows之外，其实更加喜欢Linux系统一些。我不存在所谓的“绝对开源”“中立开源”“混沌开源”之类的概念，我只是很喜欢能掌控操作系统的全部，知道OS的源代码里没有掺杂什么奇奇怪怪东西的那些感觉。 随着Windows从我最开始使用的Windows XP，到现在的Windows 11 -22H2。我看到了太多臃肿繁杂的东西被强行塞进了Windows这个系统里面，也见识了微软的各种离谱操作，当我慢慢开始吐槽Windows的一堆强制捆绑的时候，我就意识到，当什么时候我不玩游戏了，也许就是我格Windows的时候(PS：什么你说一些软件Windows独占？Wine了解下)\n参考链接 [1] SuperUser - Delete a keyboard layout in Windows 11\n","date":"2023-02-13T19:48:17+08:00","permalink":"http://blog.doublecat.top/posts/%E8%AE%B0%E5%88%A0%E9%99%A4%E5%BE%AE%E8%BD%AF%E6%8B%BC%E9%9F%B3/","title":"记删除微软拼音"},{"content":"晚上刷着抖音，看到了电影“哪啊哪啊神去村”的解说\n突然间有些怅然\n环顾了下四周，是间再普通不过的乡村房间\n六面厚重的水泥包裹着我，小小的房间里在码放完了我的东西之后甚至显得有些局促\n可是仔细一想，这个小小的房间也带着许多厚重\n这个小房间，我的爷爷曾经在这里居住，他是位老实得不能再老实的民办教师，是一位农民，也是一个父亲，在生命的最后时刻还想着他的那个不成器的二儿子。而在他离世之后，这个房间成为了我的基地。\n他在我所睡的床上睡过，带着厚重的尘土气息，无数次地躺在这床上，在我正在坐着打字的床上。如果时间能裹挟着空气飞得远些，我也许也能闻到十年前的一粒灰。还记得小时候和爷爷睡在一起，我们一个睡着头，一个睡那头。爷爷喜欢听戏曲，小时候我也听不懂，当然现在也没啥感觉。我就躺在那里边听戏剧边入睡。好多时候睡不着，就盯着窗外，听着戏曲的声音，时钟滴滴答答响。有时还会有幼时对于黑暗本能的恐惧。但小孩子终究敌不过困意，眼睛不争气得一闭，睁眼身边又是空气——爷爷是习惯早起的，准确的来说，农人都喜欢早起，也都习惯于早起。\n而现在这个房间里的物品，好似在秦始皇的陵墓里发现卫星，金字塔里发现天基炮一般离谱。\n有着我太爷爷打的桌子（顺带一提，那张桌子我正在做修补并准备重新上漆），随着搬家和时间的推移，也只是有些许开裂。有着我爷爷的各种工具、旧手机、远程门铃什么的，还有十年前很流行的“村村通”卫星机顶盒和一台老式的真空管彩色电视机（顺带一提我小时候很喜欢用它看交换空间），我认为它应该在平时默默在它面前与它相守候的爷爷在离开这么久之后，应该不至于老化，还能够使用。\n挂在墙上的钟还在，被我擦得干净，只是缺少电力无法运作。桌子被我搬到了院子里，补桌子的那玩意味道太大了。\n夜深了，突然有点想听戏曲。\n","date":"2023-02-11T16:08:32+08:00","permalink":"http://blog.doublecat.top/posts/diary-230211/","title":"Diary 23.02.11"},{"content":"前导 众所周知，大部分的巡线算法都需要编码器来构成闭环系统\n那要是没有编码器了？难不成巡线就只能靠暴力巡线了？那岂不一个参数没对直接寄了？\n此时唯一的传感参数就是光电传感器的光电值\n能利用的数据有：\n变速后的速度\n一侧光电识别到黑和另一侧光电识别到黑的时间差\n那么要么是利用时间t，要么利用时间t * 速度v\n但是用t * v这不还是到了暴力巡线那步，甚至不好估算误差也有可能是我太菜没想到对应算法\n那么只能利用时间t来构成一个闭环系统了\n原理 对于一个高斯函数\n$$Tc=ae^{\\frac{-(Ti-b)^2}{2c^2}}$$在这里，我们定义一侧识别到黑线后向另一边转动Ti(ms)后直行，从直行到下一次识别到黑线的时间差为Tc(ms)，若在Ti以内识别到黑线则定义此时Tc为1ms\n算法思路 定义Ti每次的增量DeltaTi\n采集两次初始{Ti,Tc}，判断Tc值\n如果Tc两次都为1\n如果两次都是同侧且和黑线同侧，则下一次Ti取两次Ti的最大值 + DeltaTi 如果两次都是同侧且和黑线异侧，则下一次Ti取两次Ti的最小值 - DeltaTi 如果两次是异侧，则下一次Ti取这两次Ti的中值，同时DeltaTi = 两次Ti差值的n分 如果Tc三次都为1\n参考二分查找，记得减小DeltaTi 反正就是一个循环+递归来进行查找Tc峰值的过程\n只要Tc不为1了，那就用这里的Ti对两个相近的Ti进行二分查找\n如果查不到Tc(即Tc = 1)，那么用新的两个Ti与找到的Tc不为1的Ti同样二分查找，直到找到一个Tc也不为1的Ti\n妈的一个二分查找被我叨叨这么久\n只要找到了三个Tc不为1的Ti，就可以愉快地\u0026hellip;继续二分查找了\u0026hellip;\n理论上来说最后可以逼近峰值\n(可以找个长点的直线，然后用串口通信测量这些数据，这样得到的Ti和DeltaTi就可以直接作为以后的初始数据让今后的巡线更加迅速)\n源代码 还有许许多多的部分还没有写完，hmmmm，希望不会烂尾\n点我进入Gayhub仓库\n","date":"2023-01-23T21:31:02+08:00","permalink":"http://blog.doublecat.top/posts/t-st%E9%97%AD%E7%8E%AF%E5%BE%AA%E8%BF%B9%E7%AE%97%E6%B3%95/","title":"T-ST闭环循迹算法"},{"content":"高斯函数 高斯函数以大数学家约翰·卡尔·弗里德里希·高斯的名字命名。高斯函数应用范围很广，在自然科学、社会科学、数学以及工程学等领域都能看到它的身影\n对于这次要写的算法，高斯函数可以对数据进行拟合和表征，从而预测值\n高斯函数可写为：\n$$y=ae^{\\frac{-(x-b)^2}{2c^2}}$$其中 a 为波峰 ymax ， b 为波峰对应的 x 值 xmax ， c 为 y=xmax 与 x=0.607ymax 的交点到两边的距离\n数据生成 数据生成程序由C++编写\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include \u0026lt;math.h\u0026gt; #include \u0026lt;time.h\u0026gt; #include \u0026lt;iostream\u0026gt; #include \u0026lt;random\u0026gt; using namespace std; // #pragma GCC optimize(2) // #pragma G++ optimize(2) void gaosi(double x, double a, double b, double c) { double y, flag = -(x - b) * (x - b) / (2 * c * c); y = a * exp(flag); cout \u0026lt;\u0026lt; x \u0026lt;\u0026lt; \u0026#34; \u0026#34; \u0026lt;\u0026lt; y \u0026lt;\u0026lt; \u0026#34;\\n\u0026#34;; } int main() { default_random_engine e(time(0)); uniform_real_distribution\u0026lt;double\u0026gt; u(0.1, 20.1); ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); double a, b, c; cin \u0026gt;\u0026gt; a \u0026gt;\u0026gt; b \u0026gt;\u0026gt; c; double mod = c * 5, index = b - 2.5 * c; for (int i = 0; i \u0026lt; 20; i++) { double swap = u(e); while (swap \u0026gt; mod) { swap -= mod; } swap += index; gaosi(swap, a, b, c); } return 0; } 高斯拟合 拟合的算法我参考了CSDN上的这篇文章\n但是似乎总是有哪里不对，但是又分析不上来\n","date":"2023-01-23T14:27:40+08:00","permalink":"http://blog.doublecat.top/posts/%E9%AB%98%E6%96%AF%E5%87%BD%E6%95%B0%E6%8B%9F%E5%90%88/","title":"高斯函数拟合"},{"content":"想当初第一代博客的建立不过是脑袋一热，架在了搬瓦工上，不过这玩意的真正用途懂的都懂。\n博客用的是WP，后面也没有写几篇文章。\n后来手滑删库，第一代的数据就如同过往云烟。\n那时的我还不太重视数据，备份什么的根本想都没有想。\n第二代博客只在我的内网运行，架在树莓派3B+上。彼时的树莓派还是一个热门产品，各种国产Pi都在陆陆续续开始涌现。\n但是树莓派在我的手上更像是一台Micro PC，我用它搭建了一个小型的电脑并且用作服务器，守着一堆GPIO口用都没用，Debian和Rasbian系统也没有怎么了解，对于扩展性这么好的产品在我手里这样使用算是暴遣天物。\n不过话说回来，Pi 4在设计时能够真正作为一台电脑使用算是出乎了我的意料，也许我并没有用错吧。\n不过博客我也只是作为一个日记本使用，后面SD卡在搬家的时候丢了，我也就没再重建。\n第三代博客的悲剧我也不太想多说，大概就是我把项目和网站放一个服务器上，格项目的时候cd错了目录，导致项目和网站一起被格了~~（悲）~~。\n而冷备盘也不知发生了什么寄了，在那之后我就懂得一二三定律了（即：3份备份数据，2种不同媒介，1个备份存于异地）。\n第四代博客我在200天前创建，托管在Github Pages上，使用Gridea构建。\n这一代博客我个人感觉是很好的，但是问题就在于Gridea的GUI我不太喜欢，而且生成的数据又过于冗杂。\n还有一个原因是托管在Github Pages上网站访问速度奇慢，而且这还是个静态网站，我又懒得做CDN。\n于是乎我换到了腾讯的轻量云服务器上，后续使用又拍云做CDN，不过由于种种原因还是没有更换博客系统。\n","date":"2023-01-20T13:50:10+08:00","permalink":"http://blog.doublecat.top/posts/%E7%AC%AC%E5%9B%9B%E4%BB%A3%E5%8D%9A%E5%AE%A2%E7%BA%AA%E5%85%83/","title":"第四代博客纪元"},{"content":"A组题解 A.饮料换购 打卡题，注意下细节即可\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include\u0026lt;bits/stdc++.h\u0026gt; using namespace std; // #pragma GCC optimize(2) // #pragma G++ optimize(2) int main(){ ios::sync_with_stdio(false); cin.tie(0); int n; cin\u0026gt;\u0026gt;n; int ans=n; while(n\u0026gt;=3){ ans+=n/3; n=n/3+n%3; } cout\u0026lt;\u0026lt;ans; return 0; } B.Display The Number 模拟题，用有限的段输出能显示的最大数字\n如输入2时显示1, 3时显示7, 1和7两个数字是性价比最高的\n只需要判断这个数字是奇数还是偶数, 是偶数就全输出1, 奇数输出1个7, 随后的都输出1即可\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include\u0026lt;bits/stdc++.h\u0026gt; using namespace std; // #pragma GCC optimize(2) // #pragma G++ optimize(2) int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int t; cin\u0026gt;\u0026gt;t; while(t--){ int n; cin\u0026gt;\u0026gt;n; if(n%2==1){ cout\u0026lt;\u0026lt;\u0026#34;7\u0026#34;; n-=3; } for(int i=0;i\u0026lt;n/2;i++){ cout\u0026lt;\u0026lt;\u0026#34;1\u0026#34;; } cout\u0026lt;\u0026lt;\u0026#34;\\n\u0026#34;; } return 0; } C.外卖店优先级 原文链接\n首先来介绍几个数组的作用: order 数组用来存储 pair 信息:时刻编号和外卖店编号; st[i] 是判断编号为 i 的外卖店是否在有限缓存中, score[i] 用来存储编号为 i 的外卖店的当前优先级, last[i] 表示编号为 i 的外卖店的上一次订单的时间。\n首先对 order 数组按照时间进行排序,然后依次去枚举每个订单,我们只需要去考虑有订单的时间点，比如编号为 3 的店的订单是在 5 时刻,然后下一次 3 号点的订单是在 8 时刻,那么对于 3 号店铺而言,我们不需要去考虑 5 ~ 7 这些时刻的情况,因为肯定是没有订单的,我们只需要在处理 8 时刻之前,去让店铺的优先级减去这些没有订单的时刻即可\n1 2 int j=i; while(j\u0026lt;m\u0026amp;\u0026amp;order[j]==order[i]) j++; 因为此时的 order 数组已经有序,上述代码的结果即 i~j-1 的范围内的值都是相同的,即对于同一家外卖店在同一时刻有多个订单,即一共订单量为:cnt=j-3,这家点的编号为:id=order[i].y;,时刻为:tm=order[i].x;,即当前的时刻是tm,现在我们要计算tm时刻之前(从last[id]到tm-1)的信息\n1 2 3 score[id] -= tm - last[id] - 1; score[id] = max(0, score[id]); if (score[id] \u0026lt;= 3) st[id] = false; 最后,我们要计算在每个店铺获得了最后一个订单的时刻到最终的 t 时刻,需要让优先级减去多少,并计算是否让这些店铺退出优先缓存\n1 2 3 4 5 6 for (int i=1;i\u0026lt;=n;i++){ if (last[i]\u0026lt;t){ score[i]-=t-last[i]; if (score[i]\u0026lt;=3) st[i]=false; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #include \u0026lt;cstdio\u0026gt; #include \u0026lt;cstring\u0026gt; #include \u0026lt;algorithm\u0026gt; #define x first #define y second using namespace std; const int N = 100010; typedef pair\u0026lt;int, int\u0026gt; PII; PII order[N]; int last[N]; // 上一次的订单时间 int score[N]; // 店铺的优先级 bool st[N]; int main() { int n, m, t; scanf(\u0026#34;%d%d%d\u0026#34;, \u0026amp;n, \u0026amp;m, \u0026amp;t); for (int i = 0; i \u0026lt; m; i ++ ) scanf(\u0026#34;%d%d\u0026#34;, \u0026amp;order[i].x, \u0026amp;order[i].y); sort(order, order + m); for (int i = 0; i \u0026lt; m;) { int j = i; while (j \u0026lt; m \u0026amp;\u0026amp; order[j] == order[i]) j ++; int cnt = j - i, id = order[i].y, tm = order[i].x; // 当前的时刻是tm,现在我们要计算tm时刻之前(从last[id]到tm-1)的信息 score[id] -= tm - last[id] - 1; score[id] = max(0, score[id]); if (score[id] \u0026lt;= 3) st[id] = false; // 现在处理t时刻的信息 score[id] += cnt * 2; if (score[id] \u0026gt; 5) st[id] = true; last[id] = tm; i = j; } for (int i = 1; i \u0026lt;= n; i ++ ) if (last[i] \u0026lt; t) { score[i] -= t - last[i]; if (score[i] \u0026lt;= 3) st[i] = false; } int res = 0; for (int i = 1; i \u0026lt;= n; i ++ ) if (st[i]) res ++; printf(\u0026#34;%d\\n\u0026#34;, res); return 0; } D.BAN BAN 二分BAN序列，将N全部丢左边，B全部丢右边即可\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include\u0026lt;bits/stdc++.h\u0026gt; using namespace std; // #pragma GCC optimize(2) // #pragma G++ optimize(2) int main(){ ios::sync_with_stdio(false); cin.tie(0); int t; cin\u0026gt;\u0026gt;t; while(t--){ int n,count; cin\u0026gt;\u0026gt;n; count=n/2+n%2; cout\u0026lt;\u0026lt;count\u0026lt;\u0026lt;\u0026#34;\\n\u0026#34;; for(int i=0;i\u0026lt;count;i++){ cout\u0026lt;\u0026lt;i*3+1\u0026lt;\u0026lt;\u0026#34; \u0026#34;\u0026lt;\u0026lt;n*3-i*3\u0026lt;\u0026lt;\u0026#34;\\n\u0026#34;; } } return 0; } E.路径之谜 这道题考察搜索\n我的思路是有一个 res[n][n] 存储已走路径, top[n] 存储每列已运行步数, left[n] 存储每行已运行步数,每次搜索向4个方向进行搜索，如果遇上边界、移动方向步数已达阈值、路径已走，中断此次搜索(也就是剪枝)\n因为周日开会+写B组去了，索性帖个别人AC的，思路应该差不多\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 #include \u0026lt;bits/stdc++.h\u0026gt; using namespace std; int n; int path[25][25], vis[25][25]; int north[25], west[25]; int north_tru[25], west_tru[25]; int dx[4] = {0,0,1,-1}; int dy[4] = {1,-1,0,0}; vector\u0026lt;int\u0026gt; vv; bool flag = false; bool judge() { for (int i = 1; i \u0026lt;= n; i++) { if (north[i] != north_tru[i] || west[i] != west_tru[i]) return false; } return true; } void dfs(int x, int y) { if (flag) return ; // 剪枝，找到答案后就提前结束，不要再去遍历所有情况了 // 因为题目保证了路径唯一 if (x == n \u0026amp;\u0026amp; y == n) { if (judge()) { // 输出路径 for (int i = 0; i \u0026lt; vv.size(); i++) { cout \u0026lt;\u0026lt; vv[i] \u0026lt;\u0026lt; \u0026#34; \u0026#34;; } flag = true; } return ; } for (int i = 0; i \u0026lt; 4; i++) { int tx = x + dx[i]; int ty = y + dy[i]; if (tx \u0026lt;= 0 || tx \u0026gt; n || ty \u0026lt;= 0 || ty \u0026gt; n) continue; if (!vis[tx][ty]) { if (west[tx] \u0026gt;= west_tru[tx] || north[ty] \u0026gt;= north_tru[ty]) continue; // 最关键的一个剪枝，不加上的话，会超时 vis[tx][ty] = 1; west[tx]++, north[ty]++; // 向正北方和正西方各射一箭 vv.push_back(path[tx][ty]); // 记录路径 dfs(tx, ty); vis[tx][ty] = 0; west[tx]--, north[ty]--; vv.pop_back(); } } } int main() { cin \u0026gt;\u0026gt; n; for (int i = 1; i \u0026lt;= n; i++) { cin \u0026gt;\u0026gt; north_tru[i]; } for (int i = 1; i \u0026lt;= n; i++) { cin \u0026gt;\u0026gt; west_tru[i]; } int k = 0; for (int i = 1; i \u0026lt;= n; i++) { for (int j = 1; j \u0026lt;= n; j++) { path[i][j] = k; k++; } } vis[1][1] = 1; west[1]++, north[1]++; vv.push_back(path[1][1]); dfs(1,1); return 0; } F.Xenia and Ringroad 水题 (虽然它有1000分) ,有 n 个点围成的圆,每个点编号 1n ,移动一个点花费为1,要求第 i 个点的任务必须在 ai~ 点完成,并且必须按照顺序去完成任务,计算完成所有任务需要花费的最小时间\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include\u0026lt;bits/stdc++.h\u0026gt; using namespace std; // #pragma GCC optimize(2) // #pragma G++ optimize(2) int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin\u0026gt;\u0026gt;n\u0026gt;\u0026gt;m; int flag = 1; long long ans=0; for(int i=0; i\u0026lt;m; i++) { int now; cin\u0026gt;\u0026gt;now; if(now \u0026gt;= flag) ans += now - flag; else ans += n - (flag - now); flag = now; } cout \u0026lt;\u0026lt; ans \u0026lt;\u0026lt; \u0026#34;\\n\u0026#34;; return 0; } G.Portal 此题摘自DMOI Round 1,难死人\n因为本次周赛是IOI 赛制，所以想着有人用dfs暴力一下，万一有神犇学了剪枝能A呢(虽然自己做后看题解才知道要用01bfs才能A(悲))\n由于我用的dfs+剪枝不能A，只有一半多的分，这里就不班门弄斧了，官方题解已经很详细了\n官方题解点我\nH.灵能传输 前缀和+贪心\n我做的时候Full-WA了，所以还是看看别人的题解吧(悲)\n点我嘲笑DoubleCat看题解\nB组 A.Yes-Yes? 打卡题\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include\u0026lt;bits/stdc++.h\u0026gt; using namespace std; // #pragma GCC optimize(2) // #pragma G++ optimize(2) int main(){ ios::sync_with_stdio(false); cin.tie(0); int t; cin\u0026gt;\u0026gt;t; while(t--){ string s1,s2=\u0026#34;\u0026#34;; cin\u0026gt;\u0026gt;s1; for(int i=0;i\u0026lt;20;i++){ s2+=\u0026#34;Yes\u0026#34;; } if(s2.find(s1,0)==string::npos){ cout\u0026lt;\u0026lt;\u0026#34;NO\\n\u0026#34;; }else{ cout\u0026lt;\u0026lt;\u0026#34;YES\\n\u0026#34;; } } return 0; } B.Stripes 水题，看是否有一行全是R\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include\u0026lt;bits/stdc++.h\u0026gt; using namespace std; // #pragma GCC optimize(2) // #pragma G++ optimize(2) int main(){ ios::sync_with_stdio(false); cin.tie(0); int t; cin\u0026gt;\u0026gt;t; while(t--){ char res[9][9]; int red=0,flag=0; for(int i=1;i\u0026lt;=8;i++){ for(int j=1;j\u0026lt;=8;j++){ cin\u0026gt;\u0026gt;res[i][j]; } } for(int i=1;i\u0026lt;=8;i++){ flag=0; for(int j=1;j\u0026lt;=8;j++){ if(res[i][j]==\u0026#39;R\u0026#39;){ flag++; } } if(flag==8){ red=1; } } if(red){ cout\u0026lt;\u0026lt;\u0026#34;R\\n\u0026#34;; }else{ cout\u0026lt;\u0026lt;\u0026#34;B\\n\u0026#34;; } } return 0; } ","date":"2022-12-12T17:51:20+08:00","permalink":"http://blog.doublecat.top/posts/%E8%AE%A1%E5%8D%8F%E7%AC%AC%E4%B9%9D%E5%91%A8%E7%AE%97%E6%B3%95%E8%B5%9Ba%E7%BB%84%E6%89%80%E6%9C%89+b%E7%BB%84%E5%89%8D%E4%BF%A9%E9%A2%98%E9%A2%98%E8%A7%A3/","title":"计协第九周算法赛A组所有+B组前俩题题解"},{"content":"目标 实现Arch Linux与Windows的互存\n正在解决的问题 [⚠️️]伪黑屏问题(无法解决)\n安装 参考文档 在ArchLinux的安装以及后续的配置中，官方Wiki、论坛和个人博客通常是解决问题的好去处\nArchWiki-Installation guide\nArchWiki-General recommendations\nklelee小栈-Archlinux安装手册(2022.10.01)\n安装流程 安装盘准备 首先拿个2G的U盘安上ventoy，在ArchLinux官网下载iso复制到U盘里 开始安装\u0026amp;\u0026amp;网络配置 进入引导，进入ventoy，选择ArchLinux\n选择ArchLinux Install\n输入iwctl进入联网模式，根据以下指令连接网络\n1 2 3 4 5 6 7 8 [iwd]# help //查看帮助 device list //列出无线设备名称，一般为wlan0 station device scan //扫描\u0026#34;device\u0026#34;获取到的WIFI station device get-networks //会显示你扫描到的所有网络 station device connect network name //连接网络 password: //输入密码 exit //退出当前模式，回到安装模式 配置更新 停用reflector 1 systemctl stop reflector //或systemctl stop reflector.service tip: reflector是“一个 Python 3 模块和脚本，用于检索和过滤最新的 Pacman 镜像列表”\n因为待会要配置源，所以先把这玩意关了\n配置源 1 nano /etc/pacman.d/mirrorlist 只留下清华(tuna)、中科大(ustc)源\n配置时间\u0026amp;\u0026amp;SSH连接 更新时间，以免网络连接出错 1 2 timedatectl set-ntp true 准备SSH连接 1 2 3 4 passwd //设置密码 ip a //查看当前IP SSH连接 硬盘分配 使用cfdisk分出来三个区(efi，swap、root)\n1 cfdisk \u0026lt;device\u0026gt; //例如cfdisk /dev/nvme0n1，必须指定对应的硬盘 Device tart End Sectors Size Type Free space 34 4095 4062 2M /dev/nvme0n1p1 4096 618495 614400 300M System /dev/nvme0n1p2 618496 651263 32768 16M Microsoft reserved /dev/nvme0n1p3 651264 210370559 209719296 100G Microsoft basic data /dev/nvme0n1p4 210370560 406194647 195824088 93.4G Microsoft basic data /dev/nvme0n1p5 406196224 414584831 8388608 4G Linux swap /dev/nvme0n1p6 414584832 500117503 85532672 40.8G Linux filesystem 因为我已经安装了Windows，所以只创建了一个Swap区和一个root区 \u0026mdash;- 等待更新 \u0026mdash;-\n","date":"2022-10-29T23:32:00+08:00","permalink":"http://blog.doublecat.top/posts/archlinux%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95/","title":"Arch Linux安装配置记录"},{"content":"A - A+B Problem 这道题，啊，洛谷经典题，你翻开那B题解啥解法都有\n签到题嘛随便写 (珍爱时间，拒绝int c=a+b;)\n1 2 3 4 5 6 7 8 #include \u0026lt;iostream\u0026gt; using namespace std; int main() { int a,b; cin\u0026gt;\u0026gt;a\u0026gt;\u0026gt;b; cout\u0026lt;\u0026lt;a+b; return 0; } B - 成绩 这道题最精髓的点在于下面的Hint\n1 2 3 4 数据说明 对于 30% 的数据，A=B=0。 对于另外 30% 的数据，A=B=100。 对于 100% 的数据，0≤A,B,C≤100 且 A,B,C都是 10 的整数倍。 如果不分类的话，那大可以\n1 2 cin\u0026gt;\u0026gt;a\u0026gt;\u0026gt;b\u0026gt;\u0026gt;c; cout\u0026lt;\u0026lt;a*0.2+b*0.3+c*0.5; 但是如果分类的话，代码是\n1 2 3 4 5 6 7 8 9 10 cin\u0026gt;\u0026gt;a\u0026gt;\u0026gt;b\u0026gt;\u0026gt;c; if (a==b){ if (a==0){ cout\u0026lt;\u0026lt;c*0.5; }else{ cout\u0026lt;\u0026lt;50+c*0.5; } }else{ cout\u0026lt;\u0026lt;a*0.2+b*0.3+c*0.5; } 那么说，\n对于30%的数据，直接计算c的成绩，就可以省下两次乘法和两次加法\n对于30%的数据，计算c的成绩+50，就可以省下两次乘法和一次加法\n这不爽省一波时间？\nC - 闰年判断 先判断是否100倍数，如果否再看能否被4整除，如果是就看能否被400整除\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include\u0026lt;iostream\u0026gt; using namespace std; int main(){ int a; cin\u0026gt;\u0026gt;a; if(a%100!=0){ if(a%4==0){ cout\u0026lt;\u0026lt;\u0026#34;1\u0026#34;; }else{ cout\u0026lt;\u0026lt;\u0026#34;0\u0026#34;; } }else{ if(a%400==0){ cout\u0026lt;\u0026lt;\u0026#34;1\u0026#34;; }else{ cout\u0026lt;\u0026lt;\u0026#34;0\u0026#34;; } } return 0; } D - 陶陶摘苹果 算法优化重点在于，是否先把身高和凳子高度相加\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include\u0026lt;iostream\u0026gt; using namespace std; int main(){ int a[10],num,count=0; for(int k=0;k\u0026lt;10;k++){ cin\u0026gt;\u0026gt;a[k]; } cin\u0026gt;\u0026gt;num; num+=30; for(int k=0;k\u0026lt;10;k++){ if(a[k]\u0026lt;=num){ count+=1; } } cout\u0026lt;\u0026lt;count; return 0; } 如果没有预先加上凳子高度，只在第二个for中比较的时候使用if(a[k]\u0026lt;=num+30)的话，那么num+30会被多计算9次 ⑨次啊⑨次\nE - 月落乌啼算钱（斐波那契数列） ** 遇事不决，打表万岁！ **\n因为数据实在太小，为了时间索性打表\n（实际比赛当中一定要结合题意和限制权衡算法，当然时间复杂度优先）\n打表部分代码(用于生成表 (也是生成斐波那契数列的) )\n1 2 3 4 5 6 7 8 9 10 11 12 13 #include\u0026lt;iostream\u0026gt; using namespace std; int main(){ long num[49]={0,1,1,2}; for(int i=4;i\u0026lt;49;i++){ num[i]=num[i-1]+num[i-2]; } for(int i=0;i\u0026lt;48;i++){ cout\u0026lt;\u0026lt;num[i]\u0026lt;\u0026lt;\u0026#34;,\u0026#34;; } cout\u0026lt;\u0026lt;num[48]; return 0; } 然后把表倒腾进去，写查表\n1 2 3 4 5 6 7 8 9 10 #include\u0026lt;iostream\u0026gt; using namespace std; int main(){ long a[49]={0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073,4807526976}; int k=0; cin\u0026gt;\u0026gt;k; printf(\u0026#34;%.2f\u0026#34;,double(a[k])); //或者cout\u0026lt;\u0026lt;a[k]\u0026lt;\u0026lt;\u0026#34;.00\u0026#34;; return 0; } F - 金币 没啥好说的，看注释吧\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include\u0026lt;iostream\u0026gt; using namespace std; int main(){ long long n=0; //总得到金币数，和下面的a一样要初始化 int k,a=0; //k储存天数，a储存已经给的天数，a必须初始化 cin\u0026gt;\u0026gt;k; for(int i=1;;i++){ if(k\u0026gt;=a+i){ //如果这一轮给完还有剩余或刚好给完 for(int j=0;j\u0026lt;i;j++){ n+=i; a++; } }else{ //这一轮中就给完 for(int j=0;j\u0026lt;k-a;j++){ //上一轮刚好给完而进入这个else代码块的话，由于k-a=0，for跟没有一样 n+=i; } break; //跳出 } } cout\u0026lt;\u0026lt;n; } G - 杨辉三角 ** 遇事不决，打表万岁！ **\n这道题其实可以搞字符串打表，即这样：\n1 2 3 4 string s1=\u0026#34;1\u0026#34;; string s2=\u0026#34;1 1\u0026#34;; string s3=\u0026#34;1 2 1\u0026#34;; ………… 嗯，打表是很好，但是我已经懒得写打表程序了\n所以还是老老实实写程序吧\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include\u0026lt;iostream\u0026gt; using namespace std; int main(){ int n,a[21][21]={}; //老老实实初始化嗷 cin\u0026gt;\u0026gt;n; a[1][1]=1; //预存一个 for(int i=2;i\u0026lt;=n;i++){ for(int j=1;j\u0026lt;=i;j++){ a[i][j]=a[i-1][j-1]+a[i-1][j]; //把上一行的数和上一行左边的数加在一起，两边因为边界的关系计算永远是0+1(所以初始化很重要，不然万一加到114514了呢(划掉) ) } } for(int i=1;i\u0026lt;=n;i++){ //打表输出 for(int j=1;j\u0026lt;=i;j++){ cout\u0026lt;\u0026lt;a[i][j]\u0026lt;\u0026lt;\u0026#34; \u0026#34;; } cout\u0026lt;\u0026lt;endl; } return 0; } H - 选数 ** 递归是个好东西，地瓜也是 **\n求是否是素数就一暴力取%，真想拿分还得线性筛(欧拉筛)\n1 2 3 4 5 6 int get_num(int m){ for(int i=2;i\u0026lt;m;i++){ if(m%i==0) return 0; //如果被整除就返回0 } return 1; //没有被整除过才会到这，返回1 } 然后就是核心递归部分，上注释！\n（反正流程就跟十个人握手求多少组合那个9+8+7+balabala那玩意差不多，不过这变成k个人一起牵手手）\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void chooe_num(int x,int y){ //x表示还要取多少个数字，y表示数组上一次取值的下标 if(x==0){ //如果剩下没有可加的了，那就判断和是否为素数 ans+=get_num(sum_add); //如果是素数，返回值为1，ans++；如果不是素数，返回值为0 } else{ y++; //下标右移一位，此时a[y]为可取数字的第一个 for(int i=y;i\u0026lt;=n;i++){ //循环取数 sum_add+=a[i]; //将数字加入和 x--; //已经选了一个所以剩余可选的数字-1； choose_num(x,i); //选下一个(如果没得选的话x=0，就是上面那种直接去判断了) sum_add-=a[i]; //判断完毕，减去当前数字，恢复没选这个值的时候的sum_add x++; //可选数字+1(上一个已经放回去了) } } } 整体代码就是\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include\u0026lt;bits/stdc++.h\u0026gt; using namespace std; int n,k,sum_add,ans,a[21]; int get_num(int m){ for(int i=2;i\u0026lt;m;i++){ if(m%i==0) return 0; } return 1; } void choose_num(int x,int y){ if(x==0){ ans+=get_num(sum_add); } else{ y++; for(int i=y;i\u0026lt;=n;i++){ sum_add+=a[i]; x--; choose_num(x,i); sum_add-=a[i]; x++; } } } int main(){ cin\u0026gt;\u0026gt;n\u0026gt;\u0026gt;k; for(int i=1;i\u0026lt;=n;i++){ cin\u0026gt;\u0026gt;a[i]; } choose_num(k,0); cout\u0026lt;\u0026lt;ans; return 0; } 后记 我要看🐟总的B组题解！（超大声）\n","date":"2022-10-15T23:22:39+08:00","permalink":"http://blog.doublecat.top/posts/%E8%AE%A1%E5%8D%8F%E7%AC%AC%E4%B8%80%E5%91%A8%E7%AE%97%E6%B3%95%E8%B5%9B%E5%A4%A7%E4%B8%80%E7%BB%84%E9%A2%98%E8%A7%A3/","title":"计协第一周算法赛大一组题解"},{"content":"制作原因 表单不能自动保存，每次查询都需要重新输入相关内容 我懒 注意事项 本工具仅为辅助生成代码，不会收集任何信息 本工具生成的函数仅在PC浏览器上可用，手机端不可用 使用方法(请先阅读完再操作) 点此进入生成器网站 根据你要查询的页面参考生成器的提示填写考生姓名、考生号等。注意：若多填，生成的函数会无效 点击生成按钮，复制生成的函数代码。生成的代码将会是例如javascript:(一堆函数)()的格式 在浏览器的书签栏上面新建一个书签，标题随意，网址填写你刚刚复制到的函数代码，点击保存 进入需要查询的通道（可从生成器进入查询系统主网站），点击书签，你就可以看到表单数据已经自动填好了 （PS：这不是一次性的，只要书签没删，查询通道开启，那么每次点击书签都可以自动填表） 希望大家都可以被理想的大学和专业录取！！！ ","date":"2022-07-21T15:23:33+08:00","permalink":"http://blog.doublecat.top/posts/%E5%9B%9B%E5%B7%9D%E7%9C%81%E6%95%99%E8%80%83%E9%99%A2%E6%8B%9B%E8%80%83%E4%BF%A1%E6%81%AF%E6%9F%A5%E8%AF%A2%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%8A%A8%E5%A1%AB%E8%A1%A8%E7%94%9F%E6%88%90%E5%99%A8/","title":"四川省教考院招考信息查询系统自动填表生成器"},{"content":"更新 2022.7.28 更新v1.1.6 (Code + releases)\n2022.7.25 更新v1.1.5 (Code + releases)\n2022.7.20 更新v1.1.4 (Code + releases)\n2022.7.19 更新v1.1.1 (Code only)\n2022.7.18 更新v1.1.0 (Code + releases)\n2022.7.13 更新v1.0.0 (Code + releases)\n操作方法 第一次打开程序需要根据提示输入目标程序的类名、窗口名，若不匹配则输入nullptr\n若需重新匹配请删除程序同目录下的config.json\n左右停靠\n拖动目标窗口至目标窗口左(右)边在屏幕左(右)侧边缘及更左(右)即可激活停靠 鼠标移动至最左(右)即可唤出窗口 拖动目标窗口离开停靠位置即可解除停靠状态 顶部停靠\n拖动目标窗口使其顶部到/超过屏幕顶端即可激活停靠 若目标窗口左(右)边距离屏幕左侧(右侧)距离5px，则会被识别为左(右)停靠 鼠标移至显示屏顶端目标窗口x坐标范围即可唤出窗口 拖动目标窗口使其顶部离开屏幕顶端即可解除停靠 在停靠时，若鼠标离开目标窗口，则会自动隐藏目标窗口直到唤出\n拖动文件/文本等时可以唤出目标窗口\n点击右下角托盘即可显示/隐藏程序窗口，右键即可唤出菜单\n项目地址 全球最大 同姓交友平台 Github\n下载链接(v1.1.6) Github releases\n蓝奏网盘(密码:exan)\n百度网盘(密码:exan)\n后续计划 增加动画\n增加多显示器支持\n增加GUI\n更新日志 v1.1.6\n修复了部分bug v1.1.5\n修复了部分bug\n优化了代码逻辑\nv1.1.4\n增加了右下角托盘以便快速操作\n增加了开机启动\nv1.1.1\n修复了部分bug v1.1.0\n新增通过配置文件自定义目标窗口\n优化了代码逻辑\n实现了多线程\nv1.0.0\n实现了功能 ","date":"2022-07-14T11:11:11+08:00","permalink":"http://blog.doublecat.top/posts/%E8%AE%A9%E7%AC%AC%E4%B8%89%E6%96%B9%E8%BD%AF%E4%BB%B6%E5%AE%9E%E7%8E%B0%E7%B1%BB%E4%BC%BC%E4%BA%8Eqq%E7%9A%84%E7%AA%97%E5%8F%A3%E5%81%9C%E9%9D%A0%E9%9A%90%E8%97%8F%E6%95%88%E6%9E%9C/","title":"让第三方软件实现类似于QQ的窗口停靠\u0026隐藏效果"},{"content":"代码放在了了Debian pastezone里，点这里就看得到啦\n随机数生成用的是random库，使用mt19937_64生成器根据硬件状态生成\n这是真随机数所以要比伪随机数rand()函数安全一些\n码代码时的一些趣事 众所周知，Ascii码里是有空格的\n于是乎我的程序里有这么while循环来判断随机数是否超出范围或为空格，如果是就运行do里的部分\n1 while (flag \u0026lt; 32 || flag ==39 || flag \u0026gt; 126); 其中flag==39就是判断是否为空格\n然后我就发现输出里面有几率有空格 难搞哦\n然后我一直debug，一直debug，就是找不到问题所在\n直到今天查百科，才知道我下载的Ascii码表把32(space)和39(`)弄反了\n造孽啊\n其实可以打表来着，但是循环写都写了就这样吧\n代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include \u0026lt;iostream\u0026gt; #include \u0026lt;random\u0026gt; int main() { std::random_device md; std::mt19937_64 rnd(md()); size_t i, j; int n, flag, mo; std::cin \u0026gt;\u0026gt; n \u0026gt;\u0026gt; mo; int num[n]; for (i = 0; i \u0026lt; n; i++) std::cin \u0026gt;\u0026gt; num[i]; for (i = 0; i \u0026lt; n; i++) { for (j = 0; j \u0026lt; num[i]; j++) { flag = (int) rnd() % mo; do { do { flag += (int) rnd() % mo; } while (flag \u0026lt; 33); do { flag %= 126; } while (flag \u0026gt; 126); } while (flag \u0026lt; 33 || flag \u0026gt; 126); std::cout \u0026lt;\u0026lt; char(flag); } std::cout \u0026lt;\u0026lt; std::endl; } return 0; } 如何使用 有C++环境的直接编译运行\n没有的进入这个链接，把上面的代码复制进去，然后选择运行\n在急速运行里输入以下内容，再点击运行\n第一行，输入你要生成的密码个数n以及随便一个数字取模，中间使用空格断开\n第二行，输入n个数字，为你要生成的密码的长度，中间使用空格断开\n例如输入\n1 2 4 114514 12 12 12 12 运行结果为\n1 2 3 4 ?Odo$n8Xf03{ jzVG$O-)aSLp ]\u0026#39;6V\u0026gt;]ijdsCl Q?$G6/c\u0026#34;Cg\u0026gt;e ","date":"2022-06-22T17:17:17+08:00","permalink":"http://blog.doublecat.top/posts/%E7%AE%80%E6%98%93%E5%AF%86%E7%A0%81%E7%94%9F%E6%88%90%E5%99%A8/","title":"简易密码生成器"}]