<?xml version=”1.0” encoding=”utf-8”?>

Jerkwin2024-11-01T02:53:58+00:00 Jerkwin
清理QQ聊天记录中的图片2024-11-01T00:00:00+00:00 Jerkwin https://jerkwin.github.io/2024/11/01/清理QQ聊天记录中的图片 <![CDATA[
  • 2024-11-01 10:37:41

QQ使用时间长了以后, 聊天记录自然会变大. 当然, 如果只是文字, 再怎么多也不会占据太大空间, 关键是图片. 如果你在一些比较活跃的群里, 而群友又喜欢发图片, 又或者, 你的QQ好友比较多, 交流时候经使用图片, 那么经年累月地积攒下来, 图片所占的空间就不可小觑了.

图片占的磁盘空间大了, 自然的想法就是删除/清理聊天记录. 可恨的是, 删除聊天记录时, QQ不会删除缓存的图片. 如果你想手动删除, 看一看图片存放的位置以及命名, 就直接被劝退了

├─$$
│  ├─B$
│  │      $$B$[AGM]}5E{`NT%0TVUGQ.png
│  └─BF
│          $$BF$_[8WVS%C[DT1]07WMJ.jpg
├─$%
│  └─]6
│          $%]6U9A_8F@1A)M2C[`9UM2.jpg
├─$)
│  ├─7[
│  │      $)7[[P[JE{7$4)1MV4P6DHI.png
│  └─CS
│          $)CSO[JGSC0_$$CS)EA@V]3.jpg
├─$1
│  └─YG
│          $1YG{KX6NFF0R0WSDC0`[YM.png
├─$2
│  └─NP
│          $2NP~H2JMDOH]_C94DPF[OB.jpg
├─$3
│  └─%U
│          $3%U56VJ$2)PEFGX4EC8%WB.png
├─$6
│  ├─DM
│  │      $6DM)J~}]TTCM{TK9CCUP8K.png
│  └─O2
│          $6O27B4FV3A(_S%9O{W77U8.jpg
├─$7
│  ├─UZ
│  │      $7UZ_}PFN]C6_%K)7$2_D9G.png
│  └─`%
├─$9
│  └─%C
│          $9%CX`_YUOE{426{K_V]3N2.jpg
├─$A
│  ├─7Y
│  │      $A7Y5{_KHVAAH[BJ54741OC.jpg
│  └─P)
│          $AP)B[JO[K9]YV)2Q5(38G9.png
├─$B
│  └─VC
│          $BVCU`BQIAU)GF5`3KB(COE.png
├─$C
│  └─LV
│          $CLVTRJH47~0L]9CAO87T@K.jpg
├─$D
│  ├─B$
│  │      $DB$XIW`TR_45_O$5(R5]YR.png
│  ├─_8
│  │      $D_8N3B~FCXJ02QZ$J2{M~1.jpg
│  └─_Q
│          $D_Q3)8N]0~5T5G7SJS%L)7.jpg

到网上查了一下, 发现早就有人注意到了这个问题. PC版QQ清理空间时保留指定群聊图片的方法里面提到了一种方法, 基于火绒的文件监控获得图片的路径, 然后用python脚本删除. 但根据留言反馈, 新版本的火绒已经没有这个功能了, 可以用Process Monitor代替. 我试着下载了最新版, 在我的win-7老机器上无法使用, 无奈只得用了3.1064版本, 猜想这个版本兼容性应该不错.

启动Process Monitor后, 需要先建一个过滤器. 对于QQ, 我们可以使用PID. 从任务管理器中查看QQ进程的PID为6064

然后使用PID新建并添加一个过滤器

这时就可以监测到事件了. 由于我们只监测QQ的文件读取, 所以可以忽略其他事件, 这样监测日志文件会小很多. 将工具栏上的其他事件取消, 只保留监测文件系统活动,

操作后, 如果查看下过滤器, 可以看到其他事件被排除了

这样我们就建立好了QQ文件读存的监测器.

接下来打开QQ的消息管理器, 选择要清理图片的联系人或群, 右键导出消息记录, 使用默认格式即可.

导出完成后, 在Process Monitor中保存, 选择CSV格式, 得到了刚才操作的监测日志.

日志中记录了QQ的所有文件读存操作. 我们可以从中找到刚才导出消息时涉及到的图片. 但是如果手动操作多次还是很麻烦的, 所以我就写了个bash脚本, 读取监测日志, 将其中包含的图片移动到日志目录下的QQimg文件夹, 以方便查看并删除. 使用脚本时要将其中的【QQ图片路径】换为你自己的, 类似/C:\\Users\\【用户名】\\Documents\\Tencent Files\\【QQ号】\\Image/这种.

_QQimg.bsh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
awk '
BEGIN{IGNORECASE=1}
/【QQ图片路径】/{
	split($0, arr, /","/)
	img[arr[5]]++
}
END {
	for(i in img) {
		print i
		system("mv \47"i"\47 ./QQimg")
	}
}
' Logfile.CSV

脚本执行成功后, 就可以查看QQimg文件夹下的图片, 没有问题的话, 直接删除, 聊天记录中这些图片就无法看到了. 再将聊天记录删除, 就彻底清理好了.

第一次做的话, 步骤有点麻烦. 但如果你的QQ一直在线, 其PID是不会变的, 所以以后需要清理时候, 直接打开Process Monitor, 导出QQ聊天记录, 保存监测日志, 运行脚本, 删除图片即可. 虽然没有完全自动, 也不算太麻烦.

就这样吧.

]]>
失败的势能面图形复刻2024-10-30T00:00:00+00:00 Jerkwin https://jerkwin.github.io/2024/10/30/失败的势能面图形复刻 <![CDATA[
  • 2024-10-30 11:24:26

最近有人问起一张势能面模型图, 想用gnuplot或其他绘图工具复刻.

我也尝试着进行了复刻, 最终并没有达到完全相同的效果. 这里记载下相关的信息, 以待来者吧.

图形溯源

根据图形搜索结果, 此图在一些专业论文中有所使用, 查看其引用信息, 则会给出Ümit Kaya via LibreTexts. 据此, 可以追溯到 Figure 30.10.3: A 2-D contour map and corresponding Potential Energy Surface for a hypothetical endothermic reaction. See the text for a detailed explanation. (CC BY-NC; Ümit Kaya via LibreTexts). 不出意外的话, 此图来源于此.

此图的原始格式为svg. 但查看其代码则发现, 图像中的彩色表面为嵌入的图像, 各种线条则是绘制的. 我们可以将这两部分分离开来,

复刻

要复刻彩色表面, 有两个要素: 表面的解析表达式与颜色映射方案. 对于前者, 如果接触过matlab绘图, 容易发现这个表面看起来很像matlab的peaks函数

\[╤ z(x, y)&=3(1-x)^2 \exp(-x^2-(y+1)^2) \\ &-10({x/5}-x^3-y^5) \exp(-x^2-y^2)\\ &-{1/3}\exp(-(x+1)^2-y^2) ╧\]

但是如果绘制出来, 仔细对比, 则发现并不完全一样, 主要区别在于峰的位置和胖瘦. 据此推测原图所用解析表达式并非peaks函数, 而是进行了一定的修改. 我试着改变了表达式中的一些参数设置, 结果都不理想, 觉得瞎试不是办法, 所以要尝试其他方法.

原svg图中给出了表面的网格数据, 据此或许可以反推出表面的表达式. 但所给的网格数据是二维图片上的, 并非三维点. 所以要看能不能根据二维图片上的网格数据反推出对应的三维数据. 理论上讲, 将三维数据绘制到二维平面后, 会丢失一部分信息, 因而是无法完全复原的, 至少被遮挡的部分是没有办法知晓的.

要反推每个二维网格点的三维坐标, 首先需要知道原图使用何种方式将三维点绘制到二维平面上, 也就是计算机图形学中所说的投影. 有多种不同的投影方法, 相关的基础课程, 网络资料也很多.

对大部分比较简单的可视化程序, 采用的投影方式也简单, 一般是正投影, 相机和世界坐标系重合, y轴向上, x轴向左, z轴垂直xy面向外, 投影只是直接地忽略z坐标. 在进行旋转时, 要注意旋转是在哪个坐标系中进行的, 从而确定对应的矩阵应该左乘还是右乘, 详细解释可参考网上的一些讨论

查看原图的展示方式, 当是先x轴转60°, 再z轴转45°, 二者都基于本体坐标系. 据此, 可以推知坐标变换的方法

\[╤ R_{x} &=\begin{pmatrix}1 & 0 & 0\cr 0 & \cosθ & -\sinθ\cr 0 & \sinθ & \cosθ\end{pmatrix}\\ R_{z} &=\begin{pmatrix}\cosφ & -\sinφ & 0\cr \sinφ & \cosφ & 0\cr 0 & 0 & 1\end{pmatrix}\\ R=R_xR_z&=\begin{pmatrix}\cosφ & -\sinφ & 0\cr \sinφ\,\cosθ & \cosφ\,\cosθ & -\sinθ\cr \sinφ\,\sinθ & \cosφ\,\sinθ & \cosθ\end{pmatrix}\\ ╧\]

以坐标形式明确写出为:

\[╤ x' &=x \cosφ - y\sinφ \\ y' &=(x \sinφ - y\cosφ)\cosθ -z\sinθ \\ z' &=(x \sinφ + y\cosφ)\sinθ +z\cosθ \\ ╧\]

重新整理下,

\[╤ x' &=x \cosφ - y\sinφ \\ {y'/\cosθ}+z\tanθ &=x\sinφ +y\cosφ ╧\]

可以得到关系式

\[x'^2+({y'/\cosθ}+z\tanθ )^2=x^2+y^2\]

根据上面的坐标变换公式, 确定图形观察方向$θ, φ$后, 对二维图片上的点$(x’, y’)$, 只要知晓了其原始坐标$(x, y)$, 即可反推出对应的$z$坐标.

但是, 原svg中所给的网格点毫无规律, 并没有按一定顺序排列(猜测为自动生成的), 所以需要手动或一定算法才能将每个点的坐标对应好. 按当下的流行说法, 要先标注.

假定标注好了网格点, 反推出了对应的$z(x, y)$, 是否可以得到表面的解析式呢? 理论上也是可行的, 只要对所有点进行拟合即可.

至于颜色映射方案, 看原图的效果应当是某种彩虹色, 但与标准的彩虹色有所不同. 再加上绘图表面时进行了光照渲染, 所以吸取的颜色无法直接使用. 若根据$z$坐标进行反推则需要知道表面的表达式以计算法线, 以及所用的光照方法(猜测是最简单Phong), 如果还使用了某种材质的话, 反推出本来的颜色就更困难了.

综上, 对原图进行逆向, 复刻或许可以, 但首先需要对每个点进行标注, 工作繁琐, 只能作为保底的解决方案.

尽管我们无法复刻原图, 但做个类似的完全没问题. 以gnuplot为例, 使用peaks函数, 彩虹jet方案, 效果如下

看起来效果还是很接近的.

驻点, 途径

下面推算peaks函数的驻点, 包括极值点(极大点, 极小点), 鞍点(只有一阶鞍点), 以及驻点间的最小能量途径, 以便绘制示意图.

待补.

]]>

访问人次(2015年7月 9日起): | 最后更新: 2024-11-01 02:53:58 UTC | 版权所有 © 2008 - 2024 Jerkwin