读书打卡和锻炼打卡,以及AHK脚本

1. 习惯

长期有阅读的习惯,经常同时读几本。有时候读着读着就搁下,过几年想起来再接着读,甚或忘记读过一部分,又重头来读。读着读着觉得似曾相似,抚掌大笑原来是你,老朋友。

好记性不如烂笔头,得记下来。除了读书笔记以外,也尝试过不少记录进度的方法。比如尝试过读完归类,分成工程、素材、文学、非功利性……因为兴趣广泛,并且多数书籍都既是文学,同时非功利,也许我看重的正是里面的工程思想可以当作讲课或科幻的素材。MECE不重不漏,太难做到了。

笔记和日志的范围,很容易就超出五年十年。时间流逝,由于兴趣变化,关注点迁移,后来不仅分类,我连标签都懒得加。就是流水账。

这样,除了读书笔记,页边吐槽,A4纸做的书签写满画满,读书的记录就完成了一行。有的读得酣畅淋漓,想来当初读的时候一定不舍昼夜。比如 黑客与画家 [2011-12-14 Wed]--[2011-12-17 Sat],只有短短三天。有的读得了很久,像 伯罗奔尼撒战争史 [2012-04-03 Tue]--[2012-07-04 Wed] ,足足三个月,当时应该是细细品味,不断掩卷追思来着。有的书读了又放下,捡起来又放下,如是者三,到现在也还在不断慢慢耗着。有的书记录的阅读时间非常短,但是训练内化的过程极其漫长艰难,个中滋味不足道哉,也就没有记到那一行里去。像 囚徒健身 [2013-11-13 Wed]--[2013-11-16 Sat],这很可能是第一轮阅读的记录。后来再无记录,但是每周的训练里仍然有这本书的影子,框架,循序渐近,尽可能避免受伤,阶段指标,这些影响还在。

像锻炼,还有其他需要训练的,数学、编程、英语、写作、美术、音乐,这些的训练时间远超过阅读的时间,也都没有记录,不算阅读。

说起锻炼,我也保持了相当长时间记录的习惯。本来断断续续写日志,后来在YK老师倡导打卡的群里打卡,索性每天记录,也充作打卡的内容。记录包括练了什么 (动作、重量、多少组,每组多少个,有时包括休息时长) ,什么感觉。感觉只记了较为客观的体验,受伤了,疼了,费劲,容易,什么的。事情上,在训练量大的时候,多数时间的感觉就是想骂人而已。我还记得一边卷腹,一边咒骂教练的智慧,是怎么想到这些折磨人的姿势的,刚好不容易发力。教练说,应该如何如何,要加油什么的,我就恶毒地隔空骂回去。这些过于个人化的情绪都没有记。

对仪式感我挺不能适应的,特别是别人施加给我的仪式感,哪怕是为了我好,哪怕我也认可真好的。不过,我也很意外,相信不少熟悉我的人也会非常意外,我对遵从合规居然能够接纳得还不错。

微信图片_20220520220212

长达几年的打卡,几乎每天不断,我就是用手写的,一个一个群里发过去。锻炼,现在一般是两个群,读书三个群。百词斩三个群,扇贝两个群。疫情打卡一个群。每天日志推git,手动执行 add,checkin,push 4年,才开始写个简单的脚本,改吧改吧,改动不多,用到现在。

想起群里有人问过我,发博客的时候,我一般都发在三四个地方,用了什么工具。我看到问题最初一楞,没有想到要问的是什么。因为,我并不以发在三四个地方,分别排版,不以此为苦。排版的时候,有时我还挑挑错别字,回味一下哪里写得不够好。

与博客发往多个站点一样,记录日志和群发打卡也是,我就一下一下,每天分别打的。没有自动化工具,难道就不干活了么。大刘先生在《全频道阻塞干扰》的结尾借美国将军之口说:我们也不是从来一直就有最好的武器,也并非没有最好的武器就不能战斗――对面已经全线压上,退后就是大海,他在简短的演讲后下达命令:士兵,上刺刀。

较早的锻炼记录是这样的,到现在也没有大的变化。

>* 俯卧撑[2011-01-16 Sun 20:21]
>50个。流汗不多,喘得不太厉害。
>事先做了左手腕康复训练,不过还是有些胀痛。
>后背和前胸舒服一些。
>
>查用锻炼治疗后背疼。用矿泉水瓶的那个教练的视频提到,俯身飞鸟有效,尤其
>是对肩胛骨下疼痛。

读书进度的记录和打卡晚近一些,像这样:

>[2020-03-22 Sun]
>* 读书打卡
>北野武的小酒馆 第四章
>莎士比亚戏剧集 喜剧I 仲夏夜之夜 第二幕
>瓦尔登湖 The Ponds
>Bodyweight Strength Training Anatomy 第二章 手臂

2. 关键技术,使用AHK脚本

微信图片_20220520220235

我知道DRY原则。有人说,如果要重复两次的,就应该写函数了。我能忍到三次。

在代码中,写作时重复三次的,运行时可能会重复几十万次。单单在后续代码的维护和变更中,可能就要有几十次修改涉及到重复的地方,所以抽象/重用,就有特别的必要。

在工作和生活中这些打卡动作都具有这样一些特点。1.涉及的动作种类不多。比如只有搜索群、输入群名、发送固定的内容,甚至不必检查群里的响应;2.重复次数不多。虽说"长期"打卡,你打过多少年?一年不过350多次,即使打卡十年不过3500多次而已。分布在许多天里,实在算不上什么负担。3.每次动作持续时间不长。我测量过时间,打卡百词斩和扇贝这类需要五六个动作的,也不足一分钟。打卡阅读和锻炼,可能操作的时间半分钟都用不上。写完日志或报告,剩下的操作时间,没有多长,可以全算作休息。

只有两种情况例外。一种是你对打卡这一富有仪式感的动作序列厌烦了,那么这时候自动化能降低心理的负担,有利于保持愉快。另一种是你闲着技痒,把做个打卡代码当成富有 (微小)创造性的游戏,好玩。

最简单的打卡,是只打卡,不看回应。

从需求到技术

1.系统显示文本框,用户在里面填写打卡内容。我就是把日志复制粘贴进去。比如今天的一部分:

>傍晚,跳一组心肺。从提膝跳膝下拍掌开始测心率, 137,140,13X,160。
>
>附:
>心肺一组
>开合跳 50
>提膝跳膝下拍掌 50
>提膝跳拍膝 50
>深蹲跳摸地 50
>交替箭步蹲跳 50

2.用户单击发送按钮。为了点击方便,我把点击按钮做得特别大,鼠标大致往那个方位一按就行,避免鼠标急走急停耗费的精力、腕力、时间。按钮大到你可能找不到它,就在文本框的下面,大小跟文本框差不多,占整个对话框一半,上面有个小小的“OK”。

OK

3.在微信里,向特定的几个群发送消息。这涉及到,找到微信窗口,找到群,向群里发消息。

找到特定控件,或者向特定控件发消息,AHK我用过几种方法。包括 图像匹配找到控件 (像素匹配,不能缩放) ,快捷键 (按键组合,比如 ctrl-f) ,鼠标按坐标点击 (需要根据显示器分辨率标定)。在这里,我只用快捷键,相当于全用键盘操作。ctrl-f 开始搜索,键入群名,回车就到了聊天窗口,发送文本框中的内容。

在寻找群时,我操作了两次。因为在其他项目 (情绪稳定,监听回复) 的需求中,需要跳到群聊天记录的最新一条,操作两次可以保证达成这一效果。在这里我复制了那段代码,操作两次并不带来负面效果,所以就没改保留了。

一个小技巧,AHK虽然功能强大,可能由于本地化/国别/输入法的关系,偏偏发送内容不太可靠。一个简单的方法是用剪贴板。把要发送的内容赋值给剪贴板,然后发送 ctrl-v 快捷键粘贴上去。

4. 星期几

打卡时有日期,还包括星期。我日志里长期保持使用英文缩写"Mon""Tue",但是AHK按默认操作系统本地化以后,会显示中文的"星期一""星期二"。我写了一小段查表转成英文缩写,保持与我日志风格相同。

>Switch A_DDD
>{
>Case "周一":    ddd=Mon
>Case "周二":    ddd=Tue
>Case "周三":    ddd=Wed
>Case "周四":    ddd=Thu
>Case "周五":    ddd=Fri
>Case "周六":    ddd=Sat
>Case "周日":    ddd=Sun
>}
>current_day = %A_YYYY%-%A_MM%-%A_DD% %ddd%

微信图片_20220520220238

3. 代码

代码没多长,总计50多行。去除测试和注释,估计50行有效的?

以下。

#SingleInstance force

; 测试模式
test_mode = false

; 微信群名 列表

group_name := ["玫瑰花园", "天天向上"]

;---------------------------------

; 用户输入发送的文字
Gui, +Resize  ; Make the window resizable.
Gui, Add, Edit, vMsg WantTab W600 R20
Gui, Add, Button, default  w600 h200, OK
Gui, Show
return  ; End of auto-execute section. The script is idle until the user does something.

;--------------------------

ButtonOK:
    Gui, Submit
    out = %Msg%

; 时间戳
Switch A_DDD
{
Case "周一":    ddd=Mon
Case "周二":    ddd=Tue
Case "周三":    ddd=Wed
Case "周四":    ddd=Thu
Case "周五":    ddd=Fri
Case "周六":    ddd=Sat
Case "周日":    ddd=Sun
}
current_day = %A_YYYY%-%A_MM%-%A_DD% %ddd%


; 找微信窗口
Run, C:\Program Files (x86)\Tencent\WeChat\WeChat.exe
Sleep 500
WinActivate, ahk_class WeChatMainWndForPC

; 找群
for index, element in group_name
{
    Sleep 1000
    Send ^f
    Send %element%
    Sleep 1000
    Send {Enter}
    Sleep 1000

    Clipboard = [ %current_day% ]
    Send ^a
    Send ^v
    Sleep 500
    Send ^{Enter}
    Sleep 500

    Clipboard =  %out%
    Send ^v
    if (test_mode != "true"){
       Send {Enter}
    }

}

time_out = 5
msgbox , , 信息 , 完成,%time_out%秒钟后退出, %time_out%


ExitApp
return

Leave a Reply

Your email address will not be published. Required fields are marked *