Zotero 个人配置清单
Zotero
个人 Zotero 配置介绍,包括自建 WebDAV 和同步工具。
工具
Zotero 6
chfs
SyncTrayzor
Get Started
关于 Zotero
在 23 年 10 月开始使用 Zotero,彼时版本为 Zotero 6. 动笔写这篇文章时已经有了 Zotero 7,由于不想测试插件兼容性,仍介绍 Zotero 6.
Win10-ARM64. 如果是 ARM 芯片,则安装 Zotero 5 吧,win32 实测在 WoW64 上运行正常,Zotero 6 的大部分插件也能运行。
插件列表
中文插件社区 ☞
Addons
Jasminum
Markdown Here
Storage Scanner for Zotero
Zotero Better Notes
Zotero PDF Translate
Zotero Theme
ZotFile
Zotero updateifs
Zotero Citation Counts Manager ( 有 Bug )
DOI Manager ( 疑似寄了 )
Sci-Hub Plugin fo ...
DAXCTL 工具库 - 简介
daxctl
NUMA Mode
Memory Mode,DCPMM 不体现 non-Volatile 特性。
AppDirect Mode,DCPMM 占用独立物理地址空间,并拥有 DAX 特性。
OS Supports: PMem-Aware File System DAX & Memory-Mapping DAX
System RAM: Organised as non-CPU NUMA Node
System-RAM mode 下,NVDIMM 可以按照更细粒度组织[1],这种灵活性是硬件管理方案所不能赋予的。
e.g., 通过操作页表来实现“页粒度”的混合。具体的操作上,有两种方式:
在用户态,通过 move_pages() 迁移页;
在内核态,触发 page fault 绑定页。
方法一最大的优势在于可以用户态实现,但是缺点也很明显,首先如何及时地得知哪些页可以迁移了 ( 未映射的页不能迁移 ),其次迁移会引入额外性能开销,最后有些页不能迁移。方法二的优势就是方法一的缺点。
混合内存虚拟设备 ↩︎
NDCTL 工具库 - 简介
ndctl
Concepts
NVDIMM Devices
A generic DIMM device object, named /dev/nmemX, is registered for each physical memory device indicated in the ACPI NFIT table, or other platform NVDIMM resource discovery mechanism.
12$ ls /dev | grep nmnmem0 nmem1 nmem2 ... nmem7 # 这是字符设备
( ? Why nmem as char-dev while pmem as blk-dev (under fsdax mode) )
ACPI NFIT
Advanced Configuration and Power Interface (ACPI): 高级配置和电源管理接口
提供很多表用于 OS 对硬件配置进行管理。
ACPI 基础
ACPI NVDIMM Firmware Interface Table (NFIT): NVDIMM ...
SetupTools(二)
setup.py
Setup tools 打包生成二进制文件
1234567891011121314151617181920from setuptools,import,setup,find_packageswith open(README.md, r, encoding=utf-8) as fh: long_description = fh.read()setup( # Name # Version # Description # Long description = long_description # url # author # author_email = ... # Packages = find_packages # install_requires = [openpyxl,pandas] # example entry_points = [ "eyetool = trainingtools.bin.eyetool:cmd" ] python_requires = ">=3.9")
安装命令
生成 .whl
1pyth ...
Makefile 入门(一)
Makefile
常见问题
Shell 与工作目录
Makefile 的每一行都是一个 sub shell. 因此,不能在 Makefile 中配置环境变量 ( 单独编写 .sh 进行配置 )。如果需要切换工作目录,则使用 && 或 ; 进行连接。
一般地,忽略错误并执行连续命令
1234567891011phony: -cmd_1 -cmd_2 ; cmd_3````注意:在 .sh 中 export 环境变量的方式也是无效的,都在自己的独立 shell 中执行。只有通过 source 方式执行脚本才能让命令在当前 shell 中生效。```bash# set-env.shexport YOUR_PATH=$YOUR_PATH:<path># unset-env.shunset YOUR_PATH
PyInstaller 封装可执行程序
项目主体
基于 Streamlit 进行可视化,默认端口 8501.
基本运行
直接运行
采用了声明式的网页描述范式,所见即所得。
1streamlit run Index.py
脚本模式
脚本模式下便于 PyInstaller 封装。需要一个 .py 脚本作为项目入口。
说明如下。
.streamlit/config.toml
端口配置等,可加可不加,但为了避免打包后出现奇怪告警和subpages找不到等问题,建议加上
hooks/
用于打包的钩子文件
run_index.py
封装 index.py,作为 Streamlit 运行脚本和 PyInstaller 打包入口
run_index.spec
打包配置项
目录说明
config.toml
1234567[server]port=8531headless=true[browser]gatherUsageStats=false[global]developmentMode=false
不过也发现,打包为单文件后 .streamlit/ 目录找不到,即便在 __MEIPASS 下搜索也不行。所以在 run_inde ...
Electron Builder 打包桌面程序
将 Web 应用封装为桌面应用
Electron 简介
Electron 是基于 Node.js 的桌面应用框架,采用 Chromium / Node.js / Native API 架构,常用于封装 Vue / React 应用为桌面应用,也可直接对 url 进行封装。
本文采用 url 封装方式将 Streamlit Web 应用封装桌面应用。需要 Electron 中同时打包第三方 Web 应用,对 localhost:8501 进行封装,运行时首先拉起第三方应用,退出时一并结束。
安装
安装 Node.js / npm.
依赖库
axios 为主进程所依赖,不能放在 dev-dependcies 中,否则 Electron-Builder 不打包。
12npm install --save-dev electron electron-buildernpm install --save axios
Electron-Builder 依赖
可能需要添加 winCode 签名文件。
运行
项目结构见 §1. 将 Streamlit 无头应用置于 resources/ 目录 ...
Python 打包与分发
打包与分发
Setuptools
目录结构
与 setup.py 同级的包目录都会被默认的 find_packages()检索,所以最后安装的包名是 setup.py 的同级包名。
123456789$ tree.├── pkg1/ # pkg├── pkg2 # pkg│ ├── __init__.py| ├── pkg3/ # pkg│ └── moduleX.py├── setup.py└── test/ # not a pkg, discussed later
那么 pip install 执行后,使用 pip list 查到的包为 pkg1 和 pkg2. 子包 pkg3 不会被找到。为规范起见,可在 setup.py 同级目录只设顶层包。
开发
以下问题在 pip install 时不存在。顶层包可以找得到,直接导。
快速迭代时,为避免频繁 pip install,可使用 setup.py 的 develop 选项 ( 见快速迭代一章 ),此时只能在根目录下找到测试包 ...
Docker Desktop 更改镜像位置
更改镜像位置
Docker Desktop 会创建如下目录
12345→ DockerDesktopWSL → data → ext4.vhdx → main → ext4.vhdx
可以尝试手动更改,更便捷的方法是一键移动。
1Settings → Resources → Advanecd → Disk_Image_Location
Docker Desktop 热更新
Docker Desktop 热更新问题
面向 Docker Desktop for Windows,MacOS 应该有类似的解决思路。
Backgrounds
希望在 Windows 进行 Docker 环境下的 Vue 开发,同时在 Windows 本地进行文件管理。
在 Linux 的原生支持下,这并不成为问题。而在 Windows 中,Docker Desktop 使用 WSL2 作为后端,此时热更新是失效的,因为 WSL2 无法监听到从 Windows 中 mount 到 Linux 的文件系统的改变。
Solutions
尝试了数种方案,如图所示。方框表示 Windows 到 WSL2 的映射,绿色表示 -v 挂载双方。
从 Windows 直接挂载
如图 (a) 所示,无法热更新。
从 WSL2 挂载
如图 (b) 所示,WSL2 对 Windows 文件系统的映射路径为 /mnt,尝试将映射目录作为源目录挂载到 Docker,同样无法热更新。
值得一提的是,以上两种挂载方式可能导致 D:\App 变成一个 bind mount 目录,即从该目录下打开 W ...
WSL 手动压盘
WSL 手动压盘
清理环境后,WSL 所占虚拟磁盘空间并不会释放。手动压盘,操作过程如下。[1]
找到虚拟磁盘位置
备份
DiskPart 压盘
前置操作。关闭 WSL
12wsl --shutdownwsl -l -v
备份虚拟磁盘文件
1wsl --export Ubuntu-18.04 D:\Ubuntu-18.04.tar
以下为 DiskPart 操作记录。首次压缩报错,需在 Services.msc 中关停 WSL Service 后方可正常压缩。
1234567891011121314151617181920DISKPART> select vdisk file="C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"DiskPart 已成功选择虚拟磁盘文件。DISKPART> compact vdiskDiskPart 遇到错误: 另一个程序正在使用此文件 ...
内存架构基础 - DDR3 时序入门
DDR3 时序基础
前言
其实 DDR4,DDR5 很多思路是差不多的,DDR3 算是一个分水岭。这里分两部分讲解:1)时序与命令;2)初始化与训练。
DDR3 命令
ACTIVATE
执行激活命令时
Signal
Description
BA2..0
指定 Bank 地址
A11, 9..0
指定 Row
对某一行激活后,该行将一直处于激活状态,直到下一次 PRECHARGE. 打开新行前必须对旧行执行 PRECHARGE.
PRECHARGE
预充电命令用于关闭一个已经打开的工作行。当 PRECHARGE 命令执行后需等待 tRP 才能执行下一个工作行的激活操作。PRECHARGE 后的行处于 Idle 状态,必须 ACTIVATE 才能进行读写操作。
预充电与刷新
PRECHARGE
预充电时对数据线上的分布电容 Cb 进行充电。刷新则是对存储体的电容 C 进行重写。
动作
预充电
充电
时序
不定期
定期
预充电是一种 Idle 状态,不能保证存储电容不丢失。只有 REFRESH 才能保证存储电容不丢失。
读操作是对存储 ...
Zerotier 使用记录,顺带讲讲 NAT
关于 NAT
引
之前对于 NAT 有一个错误认识,认为所有 NAT 都为 Full-Cone ( 全锥 ) 类型。后来学习了 NAT 分类,才知道打洞能否成功与打洞双方 NAT 类型有关。此外,使用 zerotier 组网时,通过 peers 命令查得的连接方式始终与传输大文件时带宽的直观感受不相匹配,也是一直疑惑的问题之一。
本文对以上问题进行大致梳理。
NAT 分类
根据形状和防火墙策略,将 NAT 分类如下。
表格
其中,NAT3-NAT4 / NAT4-NAT4 一般不能打洞[1]。遗憾的是,国内光猫多数使用 NAT4,一些路由器 ( 如华为 WS5200 ) 也为 NAT4 且不提供修改选项。光猫 NAT 和防火墙策略的修改需要进超级后台,可行性较低。对于 WS5200 这种路由器,可配置性有限[2] [3],比如光猫桥接后在路由器中设一台 DMZ 主机,则通过这种方式实现 NAT0。
端口映射
防火墙可以配置端口映射规则,将特定外部端口的流量映射到内部网络中的某个特定端口上。映射规则可以优先于防火墙对端口的限制而生效。因此,即便对于两个 NAT4 LAN,通过 ...
论文阅读 - Memtis
Memtis
本文将对比纯硬件实现的页面管理方案,对 Memtis 进行分析。
Intro & Backgrounds
Target
不同属性 ( 时延、容量、成本 ) 的多种内存分层。
Motivation
#1
除了在硬件迁移方案中也关注的慢存 ( 容量层 ) 访存延迟外,这里还提出新的问题:Huge Memory 的地址转换成本。主要是指以传统粒度 ( ~4KB ) 将四级页表缓存在 TLB,在 TLB 容量不可能有大的提升的情况下,TLB Miss 概率将提高。
降低地址转换成本,可通过 Huge Page 实现。
减少地址转换开销
增大 TLB 翻译地址范围
劣势是面对热度倾斜页面,即大页中只有很少的 regions 是热区,造成快存容量浪费。在硬件策略中也有讨论,这引出了跟踪和迁移粒度问题。定义“访问偏度”,强调可变粒度的重要性。
Memtis 能够感知倾斜页面,并根据访问分布决定页面放置和动态调整页面大小 ( 粒度 )。
#2
令热页面位于 fast-tier memory,冷页面位于 capacity-tier memory.
The bigge ...
论文阅读 - Nomad
Nomad
Intro & Backgrounds
Multi-Tier Memory
Management
多级内存:时延、容量、功耗、成本。
Central to tiered memory management is page management within operating systems (OS), including page allocation, placement, and migration.
强调 OS-Managed 是多级内存管理的核心。相比于专用硬件架构,其灵活性更高 ( e.g., K-V-Separated Storage ),同时可保持对用户程序透明。
Assumption
传统内存层次结构由性能相差一个数量级以上的存储介质组成。DRAM-Disk 下,延迟、带宽、容量均相差 2 ~ 3 个数量级,页面管理系统只需专注于将热页面移至 DRAM。而新兴内存介质 ( e.g., Optane PMem, CXL Memory ) 与 DRAM 的性能差距已经缩小到数倍。因此,过去的页面管理假设可能不再成立,如果迁移成本太高,则将热页 ...
飞书笔记 导入与导出
笔记迁移篇
由于原子笔记长期不支持 Markdown,遂寻找其替代品。以下记录迁移到字节飞书的过程及导出工具 feishu2md 用法。
迁移过程
只能手动迁移,因此工作量较大。从原子笔记可以导出 .txt,飞书这边可直接批量导入,导入后开共享。图片则只能手动对照复制粘贴了。
导入的文档是无法编辑的,需要先转为飞书的在线文档格式。因此,导入前可以先转 .txt 为 .md,便于阅读一些不需要修改的文档。
1ren *.txt *.md
使用体验
支持 Markdown 主要语法,支持 Web 端,整体观感与 Notion 类似,基本满足个人需求。然而边写边渲染,用起来不舒服,个人更喜欢 Edit / Preview 面板分离。此外,考虑尝试其日程表 / 表格等功能。
可通过在云盘中创建目录来组织文档结构。注意,直接在「我的文档库」中创建的文件属于 wiki 而非 docs,在导出时所需的权限不同。
导出工具
仅支持导出 PDF 和 Word,不能满足文档管理需要。解决方案为 Wsine/feishu2md 导出工具,当前版本 v2.4.4,直接下载 Release 即可。
根据 ...
oh-my-posh 配置记录
使用 oh-my-posh 美化 Windows Terminal
pywin32 模拟鼠标 最小化窗口处理
pywin32 最小化窗口处理
无论窗口是否最小化,win32gui.FindWindow 都是可以正常获取句柄的,但是在模拟鼠标键盘操作时可能受影响。
以如下代码为例:
123456789101112def find_flash_window(to_who): hwnd = win32gui.FindWindow(None, to_who) if (hwnd): win32gui.SetForegroundWindow(hwnd) rect = win32gui.GetWindowRect(hwnd) return rect[0], rect[1] return Noneto_who = '窗口名'x, y = find_flash_window(to_who)print(x, y)
这段代码的问题在于待抓取窗口必须处在前台才能正确打印窗口坐标。如果窗口是最小化的,执行结果:
即便调用了 win32gui.SetForegroundWindow 仍没有激活窗口至前台。
修改后的代码如下:
123456 ...
龙芯杯 MIPS-GCC 交叉编译环境配置
MIPS32-GCC 交叉编译环境
PowerShell 创建自定义命令
将 .ps1 脚本封装为 PowerShell 命令


