找回密码
 欢迎注册
查看: 1317|回复: 5

[灌水] IT 玩活儿

[复制链接]
发表于 2024-1-21 11:30:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
本帖最后由 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 就可以逐张图片下载了。


  1. ; 用于调整每次操作的延时,以保证浏览器有足够的时间响应下面的模拟操作
  2. n := 10

  3. F12::
  4.         CoordMode, Mouse, Screen

  5.         ; 根据网页中提示的图片张数设置循环次数
  6.         Loop, 215 {
  7.                 ; 模拟点鼠标右键,发出点击后,将弹出右键菜单
  8.                 MouseClick, right, 710, 560
  9.                 Sleep 30*n

  10.                 ; 将鼠标移到图片“另存为"菜单项,再按左键确认下载
  11.                 ; 发出模拟点击左键消息,之后将弹出“另存为”的对话框
  12.                 MouseClick, left, 780, 620
  13.                 Sleep 100*n

  14.                 ; 将鼠标移到“另存为”的对话框,点击“确认”按键,完成下载保存到本地
  15.                 MouseClick, left, 250, 465
  16.                 Sleep 30*n

  17.                 ; 继续将鼠标移到某恰当位置,按左键,切换到下一张
  18.                 MouseClick, left, 1200, 560
  19.                 Sleep 30*n
  20.       }

  21. return
复制代码


上述操作需要预先确认该帖子共有多少张图片,下面略加修改,让程序不停地模拟操作下一张,直到用户主动中止这个过程:


  1. ; 用于调整每次操作的延时,以保证浏览器有足够的时间响应下面的模拟操作
  2. n := 10

  3. ; 当用户按下 ESC 键,isbreak 将设置为 1,将退出下面的循环
  4. isbreak := 0

  5. ; 设置 ESC 热键
  6. ESC::
  7.         isbreak = 1
  8. return

  9. ; 设置 F12 热键
  10. F12::
  11.         CoordMode, Mouse, Screen

  12.         ; 循环足够多的次数(这样一来就需要手式按 ESC 中断循环了)
  13.         Loop, 10000 {
  14.                 ; 模拟点鼠标右键,发出点击后,将弹出右键菜单
  15.                 MouseClick, right, 710, 560
  16.                 Sleep 30*n

  17.                 ; 将鼠标移到图片“另存为"菜单项,再按左键确认下载
  18.                 ; 发出模拟点击左键消息,之后将弹出“另存为”的对话框
  19.                 MouseClick, left, 780, 620
  20.                 Sleep 100*n

  21.                 ; 将鼠标移到“另存为”的对话框,点击“确认”按键,完成下载保存到本地
  22.                 MouseClick, left, 250, 465
  23.                 Sleep 30*n

  24.                 ; 继续将鼠标移到某恰当位置,按左键,切换到下一张
  25.                 MouseClick, left, 1200, 560
  26.                 Sleep 30*n

  27.                 If (isbreak == 1) {
  28.                         isbreak = 0
  29.                         break
  30.                 }       
  31.       }

  32. return
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2024-1-21 11:46:13 | 显示全部楼层
本帖最后由 uk702 于 2024-1-21 12:16 编辑

上述操作将帖子的所有图片都下载下来之后,这些图片就构成了一个完整的 PPT ,这时就可以用图像浏览器来学习了,但图像浏览器通常默认根据文件名排序进行翻页,但原来的文件名是随机的,有没有办法将这些文件按时间顺序重新命名为比如 1xxx.jpg 队列的文件名?这时,awk 上场最合适不过了。

在命令行中输入如下命令行:

  1. dir /o:d /b | awk "{cmd=sprintf("mv %s %d_%s", $0, 1001+i, $0); i=i+1;system(cmd);}"


  2. 稍微解析一下, dir /o:d 表示按时间顺序列出当前目录的所有文件,/b 表示只需显示文件名而不显示其它如文件大小、日期之类的数据。

  3. awk (对输入的文本逐行地,尽管这个说法不完全正确)执行你指定的代码,其中 $0 表示当前行,sprintf() 用法和 c 语言相同,
  4. cmd 和 i 分别是两个变量,cmd=sprintf("mv %s %d_%s", $0, 1001+i, $0); 将返回 cmd = "mv 文件名 1xxx_文件名",
  5. 比如(从 dir /o:d 获得)第一个输入是 aaa.jpg,这时 $0 就是 aaa.jpg,cmd 将是字符串 mv aaa.jpg 1001_aaa.jpg; 第二个输入是 bbb.jpg,cmd 这时将是 1002_bbb.jpg。

  6. 最后, system() 表示执行外部命令,于是对于输入 aaa.jpg 而言,将执行命令行 mv aaa.jpg 1001_aaa.jpg,调用 mv 命令将文件 aaa.jpg 改名为 1001_aaa.jpg,其它下同。

复制代码


awk (及 awk.exe) 是(Linux 上)极其有用的小工具之一,相信大家都很熟悉,网上也有大量的资料。

点评

注意 windows 系统和 Linux 系统的区别,windows 中用双引号表示命令行中的字符串,故 awk "{...}",而 linux 用单引号表示命令行中的字符串,故 awk '{...}'   发表于 2024-1-21 12:00
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2024-1-21 11:57:47 | 显示全部楼层
本帖最后由 uk702 于 2024-1-21 21:38 编辑

在命令行中操作剪贴板,windows 下使用 clip.exe 和 paste.exe 。

将文件 aaa.txt 中包含字符串 abcd 的行拷贝到剪贴板中:
  1. awk /abcd/ aaa.txt | clip
复制代码


如果是 vim,则可以使用如下命令实现抽取所有包含 abcd 的行到寄存器 A 中(使用大写寄存器才能保存所有,否则只是最后一行):
  1. :g/abcd/y A
复制代码


当然使用外部命令也是可以的:
  1. :!awk /abcd/ % | clip
复制代码


若改成
  1. :1,$!awk /abcd/ | clip
复制代码
可用但有副作用(会清空当前 buffer 的内容 )

从剪贴板中读取,并打印出 $2(第 2 个字段) 大于 100 的行:
  1. paste | awk "{if (0+$2 > 100) {print($0)}}" 或 paste | awk "{if (0+$2 > 100) print}" 或 paste | awk "(0+$2) > 100"
  2. 其中,0+$2 将 $2 转换成数值类型,否则 if ($2 > 100) 将比较 (字符串形式的 $2) 和 (字符串形式的 100) 。
复制代码

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2024-1-22 10:01:29 | 显示全部楼层
如何将帖子中的数学公式还原成 Latex 源代码,Kuing 老大的悠闲数学论坛做了大量的探索,取得累累成果,详见下面两个帖子:
http://kuing.infinityfreeapp.com ... hread&tid=11863
http://kuing.infinityfreeapp.com ... wthread&tid=173

其中 “方法 B:在浏览器调试器中屏蔽 tex-svg.js(参考 3#)” 具有普遍性,也适用于别的论坛。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2024-1-22 11:00:25 | 显示全部楼层
本帖最后由 uk702 于 2024-1-22 11:01 编辑
uk702 发表于 2024-1-22 10:01
如何将帖子中的数学公式还原成 Latex 源代码,Kuing 老大的悠闲数学论坛做了大量的探索,取得累累成果,详 ...


获取一个帖子的原始代码(加载各种 js 之前)最通用的方法是打开浏览器的 “开发者工具"(并重新加载网页),转到 "Network" 的属性页,将光标移到 Request 列表(如图)的第一项,然后在右键菜单中选择 ”Copy" - "Copy response",只要网页不禁用  “开发者工具",这个方法都应该好使。
2024-01-22_105659.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-21 17:55 , Processed in 0.033388 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表