IT 玩活儿
本帖最后由 uk702 于 2024-1-21 12:13 编辑* 本帖主要介绍一些实用的 IT 技巧 *
最近在学习射影几何,除了一众教材之外,《射影几何的初等说明》(https://tieba.baidu.com/p/7682645300 )无疑最适合我等基础薄弱者,其中大量且经典的例子,更是妙乐可言。
而其中的主要内容,则以 PPT 图片的形式存在,那么,怎么将这些图片都下载到本地呢?无它,右键,图片另存为,再点下一张,重复操作。具体而言,首先将需要的帖子对应的标识(7682645300)加入到 tieba.baidu.com/photo/p?tid= 之后,就可以打开该帖子对应的大图网址(tieba.baidu.com/photo/p?tid=7682645300),然后鼠标右键,图片另存为,再点下一张,不断重复。
而这样的重复操作,交给 AutoHotKey 就再合适不过了,将经下代码写到文件 tieba.ahk 中,然后运行 autohotkey tieba.ahk,按 F12 就可以逐张图片下载了。
; 用于调整每次操作的延时,以保证浏览器有足够的时间响应下面的模拟操作
n := 10
F12::
CoordMode, Mouse, Screen
; 根据网页中提示的图片张数设置循环次数
Loop, 215 {
; 模拟点鼠标右键,发出点击后,将弹出右键菜单
MouseClick, right, 710, 560
Sleep 30*n
; 将鼠标移到图片“另存为"菜单项,再按左键确认下载
; 发出模拟点击左键消息,之后将弹出“另存为”的对话框
MouseClick, left, 780, 620
Sleep 100*n
; 将鼠标移到“另存为”的对话框,点击“确认”按键,完成下载保存到本地
MouseClick, left, 250, 465
Sleep 30*n
; 继续将鼠标移到某恰当位置,按左键,切换到下一张
MouseClick, left, 1200, 560
Sleep 30*n
}
return
上述操作需要预先确认该帖子共有多少张图片,下面略加修改,让程序不停地模拟操作下一张,直到用户主动中止这个过程:
; 用于调整每次操作的延时,以保证浏览器有足够的时间响应下面的模拟操作
n := 10
; 当用户按下 ESC 键,isbreak 将设置为 1,将退出下面的循环
isbreak := 0
; 设置 ESC 热键
ESC::
isbreak = 1
return
; 设置 F12 热键
F12::
CoordMode, Mouse, Screen
; 循环足够多的次数(这样一来就需要手式按 ESC 中断循环了)
Loop, 10000 {
; 模拟点鼠标右键,发出点击后,将弹出右键菜单
MouseClick, right, 710, 560
Sleep 30*n
; 将鼠标移到图片“另存为"菜单项,再按左键确认下载
; 发出模拟点击左键消息,之后将弹出“另存为”的对话框
MouseClick, left, 780, 620
Sleep 100*n
; 将鼠标移到“另存为”的对话框,点击“确认”按键,完成下载保存到本地
MouseClick, left, 250, 465
Sleep 30*n
; 继续将鼠标移到某恰当位置,按左键,切换到下一张
MouseClick, left, 1200, 560
Sleep 30*n
If (isbreak == 1) {
isbreak = 0
break
}
}
return
本帖最后由 uk702 于 2024-1-21 12:16 编辑
上述操作将帖子的所有图片都下载下来之后,这些图片就构成了一个完整的 PPT ,这时就可以用图像浏览器来学习了,但图像浏览器通常默认根据文件名排序进行翻页,但原来的文件名是随机的,有没有办法将这些文件按时间顺序重新命名为比如 1xxx.jpg 队列的文件名?这时,awk 上场最合适不过了。
在命令行中输入如下命令行:
dir /o:d /b | awk "{cmd=sprintf(\"mv %s %d_%s\", $0, 1001+i, $0); i=i+1;system(cmd);}"
稍微解析一下, dir /o:d 表示按时间顺序列出当前目录的所有文件,/b 表示只需显示文件名而不显示其它如文件大小、日期之类的数据。
awk (对输入的文本逐行地,尽管这个说法不完全正确)执行你指定的代码,其中 $0 表示当前行,sprintf() 用法和 c 语言相同,
cmd 和 i 分别是两个变量,cmd=sprintf(\"mv %s %d_%s\", $0, 1001+i, $0); 将返回 cmd = "mv 文件名 1xxx_文件名",
比如(从 dir /o:d 获得)第一个输入是 aaa.jpg,这时 $0 就是 aaa.jpg,cmd 将是字符串 mv aaa.jpg 1001_aaa.jpg; 第二个输入是 bbb.jpg,cmd 这时将是 1002_bbb.jpg。
最后, system() 表示执行外部命令,于是对于输入 aaa.jpg 而言,将执行命令行 mv aaa.jpg 1001_aaa.jpg,调用 mv 命令将文件 aaa.jpg 改名为 1001_aaa.jpg,其它下同。
awk (及 awk.exe) 是(Linux 上)极其有用的小工具之一,相信大家都很熟悉,网上也有大量的资料。 本帖最后由 uk702 于 2024-1-21 21:38 编辑
在命令行中操作剪贴板,windows 下使用 clip.exe 和 paste.exe 。
将文件 aaa.txt 中包含字符串 abcd 的行拷贝到剪贴板中:
awk /abcd/ aaa.txt | clip
如果是 vim,则可以使用如下命令实现抽取所有包含 abcd 的行到寄存器 A 中(使用大写寄存器才能保存所有,否则只是最后一行):
:g/abcd/y A
当然使用外部命令也是可以的:
:!awk /abcd/ % | clip
若改成 :1,$!awk /abcd/ | clip 可用但有副作用(会清空当前 buffer 的内容 )
从剪贴板中读取,并打印出 $2(第 2 个字段) 大于 100 的行:
paste | awk "{if (0+$2 > 100) {print($0)}}" 或 paste | awk "{if (0+$2 > 100) print}" 或 paste | awk "(0+$2) > 100"
其中,0+$2 将 $2 转换成数值类型,否则 if ($2 > 100) 将比较 (字符串形式的 $2) 和 (字符串形式的 100) 。
如何将帖子中的数学公式还原成 Latex 源代码,Kuing 老大的悠闲数学论坛做了大量的探索,取得累累成果,详见下面两个帖子:
http://kuing.infinityfreeapp.com/forum.php?mod=viewthread&tid=11863
http://kuing.infinityfreeapp.com/forum.php?mod=viewthread&tid=173
其中 “方法 B:在浏览器调试器中屏蔽 tex-svg.js(参考 3#)” 具有普遍性,也适用于别的论坛。 本帖最后由 uk702 于 2024-1-22 11:01 编辑
uk702 发表于 2024-1-22 10:01
如何将帖子中的数学公式还原成 Latex 源代码,Kuing 老大的悠闲数学论坛做了大量的探索,取得累累成果,详 ...
获取一个帖子的原始代码(加载各种 js 之前)最通用的方法是打开浏览器的 “开发者工具"(并重新加载网页),转到 "Network" 的属性页,将光标移到 Request 列表(如图)的第一项,然后在右键菜单中选择 ”Copy" - "Copy response",只要网页不禁用“开发者工具",这个方法都应该好使。
页:
[1]