记一次反向代理路径问题
记一次反向代理路径问题
Desc
由于实验在云端环境进行,启动 Gradio 后需通过端口转发访问。初此启动发现 css 不能加载,按钮事件也有问题。F12 检查 Network 发现两个 404:
Name
Request URL
info
https://<forward-ip-port>/info
theme.css
https://<forward-ip-port>/theme.css
观察其他 url 发现,完整的代理路径为 https://<forward-ip-port>/codeserver-forward/<ID>/proxy/<proxy>/,其后才是 /info、/theme.css 等。正是这多出的一段路径导致请求失败。
其中,css 问题容易解决,修改网页 HTML,将 theme.css 的 <link> 标签替换正确 url 即可。检查控制台报错,未能请求 info 数据则是按钮事件失效的元凶。继续根据输出定位,知 info 由 index.js 请求:
1 ...
VitePress 初体验
VitePress 试用
一直希望部署一个与 MyNote 匹配的静态 CMS,应该至少满足以下需求
能够自动生成目录结构
支持隐藏文章
[Optional] 目录导航应该是易用的,最好能提供类似一般文件管理器的层次和缩进
偶然发现 VitePress,记录试用过程。
运行
首先说明一下,VitePress 按照官方教程启动 Demo 并不困难,但是仅仅是一面打印了文本的白屏。笔者图省事,把目光放向了 VitePress 教程本身,其同样采用了 VitePress 主题并已经过完整配置,遂克隆其仓库。以下记录启动过程。
使用 nvm[1] 进行 Node.js 版本管理。先安装了最新的 Node.js 和 pnpm,启动 VitePress 数个报错。首先在 tsconfig 禁用严格检查 "strict": false,后参考仓库 CI 文件,降低版本[2]如下。
Node.js v16.20.2
pnpm v7.0.0
根据 Node.js 和 pnpm 版本对应关系,指定版本 @7.0.0 安装。部署命令和本地 build 命令稍有不同。
1234 ...
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 ...
常用命令速查(一)
Written with StackEdit.
Common
查询一个文件夹及其子文件夹下的所有文件中是否包含某个字符串
1Get-ChildItem -Path "." -Recurse | Select-String -Pattern ""
查询当前目录中的文件总数
1(Get-Childitem -Path . -File | Measure-Object).Count
端口查询 PID
1netstat -ano | findstr "<port_ID>"
PID 查询进程
1tasklist | findstr "<PID>"
开启 / 关闭 ipv6 临时地址 ( 需重启网卡 )[1]
1netsh interface ipv6 set privacy state=[disable | enable]
打印 CPU 占用最高的 10 进程 ( ? )
1Get-Process | Sort-Object -Property CPU -Descending | Sel ...
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
SetupTools(三)
项目主体
基于 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 ...
SetupTools(四)
将 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/ 目录 ...