朋友圈里的杨打油

我,朋友圈里的打油诗人,目前贴了19首。

最初,发朋友圈。有几位朋友说,你这连韵也不押啊。我说:不押韵的多啦,你看王维,再看苏东坡。几位朋友说,人家那是古声古韵,当时是押韵的啊。

后来,徒夫先生说,平仄不通;四声八病,你这太典型了啊。推荐我看王力。我草草翻完几本,又找规律讲解和格律判定。再写,徒夫先生说,对仗还得看词性。前途漫长,此路绵绵无绝期。

刚好攒了十九首,“结集”一下,再接再厉。

(1)

(2)

我困牢笼短

君游四海长

隔墙频网聚

片语诉衷肠

2024年8月28日

(3)

(4)

(5)

(6)

(7)

(8)

(9)

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

哑铃缺斤少两

可调节哑铃片的一对哑铃,发现份量不对。经过称量和讨论,确定了折算公式,缺1/4。

1. 偶然发现

一对哑铃,2根杆,4个锁紧螺丝;哑铃片共4种不同份量,每种4个。4种哑铃片分别标称2.5kg、2kg、1.25kg、0.75kg。组合出不计杆每只 (2+1.25+0.75)*2 =8kg,兴致勃勃练了一段时间。觉得小有进步,可以调高份量了。

忘了因为什么,可能是想把杆重算进去,也可能为了方便以前一直用的固定重量哑铃对比,总之偶然想到称重一下。不称要不紧,一称发现份量不对,缺斤少两。

如下两图所示,标称750g的,称重结果为431g;标称1.25kg的,称重808kg。标称相同的4个哑铃片重量上下略有浮动,十几或几十克,容易理解。但是标称与称重结果差距这么大,就没法用误差解释了。

我锻炼的时候写日志,要记录重量。以后吹牛时,哑铃片的份量也得如实才行啊。不然,在家里举8kg,在别的地方别人面前一显摆,8kg根本举不起来,岂不尴尬。哑铃仅仅重量不准,毕竟这么沉重,又不能扔了,那么想办法找到真实重量标定一下吧。

2. 猜测

猜测上面写的数字的单位不是kg,而是磅,这个重小的重量单位。

换算了一下,手头现有的数字不符合磅和公斤的换算关系。

标称 称重(g)
0.75 443
1.25 808

在网上查到 https://forum.xitek.com/thread-1772754-1-1.html 在 bing 的 cache 中,PCM120说的情况跟我的差不多。

: 我的哑铃用了将近有二十年了,一直没注意重量是否符合要求,当年是按重量付款的,价格约为5元/千克。

: 看了楼主的帖子,下午把哑铃也称了一下,结果如下(标称/实际 单位 :千克):

: 哑铃片:0.75 / 0.49 1.50 / 0.976 2.0 / 1.495。

: 附件重量(手柄及两个固定螺母):1.329千克。

盎司?也不对。

以前见过向龙的壶铃只有数字,没有单位,也好奇过是磅还是公斤。后来用称重确认了,所以还是用秤吧,别猜了。

3. 称重

最简单的称重方法是,4种、每种4个,共16个哑铃片,每个称重一下,贴个不干胶贴标上数值。但是我的工具不行。

我手头现有两个秤。一个是厨房用秤,如上两图所示。量程/最大1kg,精度0.1g。另一个是体重秤(此刻才想到体重秤有两个,但是不影响接下来的方法和结论)。最大重量不清楚,能称大活人,精度也不精楚。最大重量远超过我要称重的哑铃片、杆、螺丝的总和,但是量程不仅是最大重量,还包括最小重量,与精度又有不同。说起细节来挺麻烦,简而言之,从现象上看,哑铃片放在体重秤上“打不起砣”,显示为0。

解决方案是这样的。

(1) 人先站在体重秤上,作为空白。体重秤没有“去皮”功能,所以记录下这个重量,称为H。接着,人拿着哑铃片D,称得新的重量N。计算,哑铃片的重量D=N-H。

(2) 小的哑铃片按上述方法称重得到0,因为体重秤的精度不够。所以用厨房秤称。

(3) 大的和小的之间的重量,比如空杆,人和体重秤联合测量,得到结果0,又超出厨房秤的范围。在厨房秤旁边搭个差不多等高的小台子,把重物同时放在小台子和厨房秤上,得到一侧的读数L。把重物旋转180度,测另一侧的读数R。L+R得到空杆的重量1kg多一点。

以上方案中包括以下假设和需要讨论的地方。

(1) 根据现象,可以推得体重秤的误差分布是不均匀的。因为,在0附近,测得存在哑铃片和不存在哑铃片间的差额为0;在人体重附近,这个差额不是0。既然误差分布不均匀,那么在哪个范围内误差是可忽略的。

(2) 记录数据时假设了体重秤和厨房秤的误差相同。更有甚者,假设了如果二者量程无限,那么同一重物在这两个秤上的结果相同,不然无法比较或求和。有同学可能提到,都是法定用于计量的秤,应该不会有问题吧。如果以此为依据,那么哑铃上还标着数字呢,也作不得准。

(3) 印象里方案(3)中的称量方法对重物放得有多平是有要求的,但是细节不记得了,人懒没有查。所以,假设两次称量之和就是准确的重量。

称了几个组合,得到一些数字。笔记粗糙而乱,除了记录还有猜测和推算(以及暴露口算和笔算能力有多么弱)。下面有表格,此处仅展示,可跳过,不影响阅读。

4. 拟合

实验得到以下几组数据。之所以有斤,还有kg,是因为体重称有时候单位是公斤(kg),有时候是斤。这样记录保留了原始数据,虽然没有表明哪个才是原始的。

在测量过程中,我就开始猜测,感觉像是 哑铃片实际重量为标称的3/4。所以在笔记的左侧用测得的其他数据验证了一下,感觉差不多。这可以作为一个结论,即3/4不知道从哪里来的,经验公式。

不过经验公式不够“科学”,说服力还可以更强一些。我把这些数据用XY散点图绘图,如下图所示。再拟合一下,Excel中称为 趋势线。

拟合的结果是公式的参数。用于拟合的数据有了,先验公式/曲线的函数是什么呢?我们可以通过观察发现,差不多是线性的。也可以猜测一下缺斤少两的做法,在什么情况下不易被用户发现。缺斤少两的直接收益是厂商可以用更少的铁,毕竟哑铃价格中的重要因素是铁的价格。如果每个哑铃减去相同的重量,对较高重量的哑铃获益不多,在较低重量的哑铃上更容易暴露出来。那么按标称乘以一个因数,即线性的缺斤少两,是更佳方案。线性的结果拟合的就挺好,更复杂的,就略过不讨论了。

从图示和R2上都可以看出,线性拟合对于所有数据的误差都不大。

所以,得出结论 标称重量*3/4 或者 标称重量*0.75,即哑铃片的真实重量。缺1/4。以前的哑铃片组合表格,修订如下。我以为去杆8kg的,加杆和螺丝以后,刚好8kg多一点。

5. 讨论

为什么追究这个问题呢,一个因素当然是考虑在工具有限的情况下如何得到有说服力并且易用的结果,是件好玩的事。

也有更实际点的用途。网上有报道,有人在家里用哑铃或杠铃锻炼,以为自己厉害到这个数值了,结果在健身房举了真实重量的哑铃,导致受伤了。

邢ZP老师提到,有百米跑道只有九十米,比实际短十米。受测小朋友误以为自己是天赋异秉不可多得的短跑人才,长期为没能在奥运会上为国争光而遗憾。直到后来这位同学家乡的新闻爆出体育设施建设中的贪污才让他终于把心放下。

我们讨论到,哑铃不是计量器具,不能当作法码用,所以缺斤少量不受计量法管束吧。邢ZP老师还提到,计量器具里,健身房的体重秤的数值说不定也有偏。不过,体重秤并不用于称肉卖,所以并没有顾客多花钱少得肉,没有这方面的损失,还得到了情绪价值。这个,又怎么看呢?

https://younggift.net/

https://www.zhihu.com/people/yang-gui-fu-52

微信公众号 杨贵福

字幕批量繁转简

繁体中文的字幕读起来不那么顺畅,转成简体中文就容易多了。对于电视剧有很多字幕文件的情况,需要批量转换。这个实验过程可以帮助理解简繁对应关系、编码,实践命令行工具使用和批处理编写,可以涉及环境变量、搜索路径、cmd和shell知识,以及word、记录本、Total Commander使用。

1. 解决方案

本文把字幕批量从繁体转换为简体,涉及到的命令行工具为 OpenCC 和 iconv。工具的下载路径、简要的原理、其他替代工具将在后文给出。使用如下所示的bat代码。

for %%i in (*.ass) do (

 iconv -f UTF-16le -t utf-8 "%%i" > "%%i.utf8"

 opencc -i "%%i.utf8" -o "%%i" -c c:\tools\opencc\share\opencc\t2s.json

 del "%%i.utf8"

)

2. 繁体转简体,其他工具 及 原理

电影的单个字幕文件转换,可以用word完成。常用的字幕格式 srt, ass 都是纯文本文件,可以用word打开。使用word的"繁转简"功能即可达到目的。

简体 繁體

在原理上,如下图所示,两个“体”字,在同一个文件中可以同时出现。这两个“体”字的的不同并非由于 编码、国别、本地化locale、字体 的差异,而是不同的字符。在编码上互不相关,二者的对应关系完全由于自然语言汉语决定——在技术上,任意两个字符(严格地说,还有多对一、一对多等情况,在此略过)都可以对应——人为规定“体”与“體”之间为简-繁对应。

电视剧的字幕每集一个文件,逐个用word打开操作,有点麻烦。这种任务,一般适合使用命令行操作。

有个 OpenCC 项目,支持命令行下的繁简转换。

https://github.com/BYVoid/OpenCC

我运行时报错,但是没有找到详细手册。猜测 OpenCC 只能读入 UTF-8编码。

3. 编码,其他工具 及 原理

(1)判定当前编码

我当前要处理的字幕文件是不是utf-8,查看文件编码可以用 Linux 下的 file 命令。或者用记事本 | 另存为,或者用 Total Commander | F3 查看 等诸多方式。这几种方式间可以相互补充印证。

(2)转换编码

在原理上,编码的不同是更一般性的问题,在各种语言中普遍存在,而不仅在中文中存在。通过 记事本 | 另存为,保存为 UTF-8,可以完成编码的转换,从而符合 OpenCC 的输入条件。也可以使用 SubtitleEdit 另存时转换编码。

批量处理的话,可以使用 iconv。

Iconv 在 https://gnuwin32.sourceforge.net/packages/libiconv.htm。下载 Binaries 和 : Dependencies,解压到同一目录中。

4. 批处理

了解以上原理、试用命令行工具对单个文件转换成功后,选用 iconv 和 opencc 写 bat代码 完成批量转换。

(1)遍历目录

遍历当前目录,并以扩展名 ass 作为筛选文件的条件,形成下面的循环。

for %%i in (*.ass) do (

rem 对每个文件执行的操作

)

(2)对每个文件执行编码转换,然后由繁体转换为简体

在循环体中对遍历的每个文件执行类似操作。

第一步,用iconv转换编码,由utf-16 小端 unicode 到 utf-8。

第二步,用opencc执行由繁体到简体的转换。

第三步,删除临时文件。

for %%i in (*.ass) do (

iconv -f UTF-16le -t utf-8 "%%i" > "%%i.utf8"

opencc -i "%%i.utf8" -o "%%i" -c c:\tools\opencc\share\opencc\t2s.json

del "%%i.utf8"

)

其中 %%i 是对应当前遍历的文件名的变量;

c:\tools\opencc\share\opencc\t2s.json 是繁体到简体的配置文件及其所在路径;

%%i.utf8 是临时文件。

Iconv 和 opencc 需要放在搜索路径%path%下,或者像下面这样使用如下绝对路径。

先备份,然后把所有字幕文件放在当前目录下,执行上述批处理(名字就叫“字幕文件 unicode2utf8 繁2简 - go.bat”)。一瞬间以后,所以字幕文件完成了编码和繁简转换。在此案例中,只有一个文件 a.ass。

使用 Total Commander | F3 功能或者上述提到的其他方法,可以验证编码转换完成。

打开文件查看内容,可以检验,已由繁体转换为简体。

使用AHK禁用🚫Windows10表情输入面板,及映射鼠标右键快捷菜单

在Windows10中,误触 win+; 或 win+. (左windows键和分号 或 左windows键和点)组合键,会弹出如下窗口,挡在你正看着的地方。

如果正在写东西,无论是写代码还是写文字,这时的体验都相当不好,想骂人。功能并非越多越好,不管三七二十一全都展示出来就更加糟糕。

这个窗口叫作表情输入面板,在网上找到两种禁用方法。第一种是改注册表。我尝试过至少两个流派,都无效。并且,改注册表这么高权限的操作,应该慎用,尽可能不用。能完成任务的话,取得的权限越少越好。第二种是按特别操作步骤,能够得到特定的窗口/界面,再操作就能禁用。我尝试过至少两个流派,在我的机器都找不到期待的界面。这种Windows GUI风格修改配置与Unix/Linux或Windows ini相比,虽然对初学者友好,但是对稍微复杂一点的修改相当不适用。版本小修改、位置或文字变动,都可能使以前的操作方法失败。

写了一小段AHK脚本,代码如下。

<#;:: ; 禁用 表情输入面板

return

<#.:: ; 禁用 表情输入面板

Return

已经安装了AHK,我把下述代码保存为 ahk扩展名,放在启动执行中。问题解决,世界终于清净了。

代码的含义如下。

拦截了 左win+. 和 左win+分号。这两种组合键是我经常会按到的,在本想按 win+L 或 ctrl+L 的时候。右win+. 和 右win+; 没有拦截,仍然可以使用。不常用的功能,入口应该避免误触。要隐蔽,因为不常用,隐蔽不会妨碍工作效率。

此外,我的键盘有个小缺欠。这款键盘没有上下文菜单,或称鼠标右键菜单,或称快捷菜单。它们略有区别,在此略过。总之,就是按下以后,弹出下图中菜单的那个键。

也写了一段AHK脚本,如下。

^F1:: ;上下文菜单

; msgbox ,,, here

Send, {AppsKey}

; MouseClick , right

这样,我按 ctrl-f1时,会弹出上下文菜单。最后一行的注释,对应的是在鼠标当前位置按下鼠标右键,这个功能我不常用,并且用 keynavish 完成,所以在此注释,只留作备忘。

https://younggift.net/

https://www.zhihu.com/people/yang-gui-fu-52

微信公众号 杨贵福

哑铃片的组合有几种,以及使用Excel解决

对于实现需求“一副哑铃,有可替换的哑铃片 0.75kg,1.25kg,2kg,2.5kg每种各4片。可以组合出哪些重量”,此前写过一篇博客,https://zhuanlan.zhihu.com/p/702387535。我当时感觉有条件的穷举相当困难,束手无策,二猫用C/C++解决了。上次那个故事告诉我们,精确描述需求经常相当困难,即使你觉得问题简单并且考虑清楚了。

前两天练着的时候,突然想到,好像用Excel能解决。这次的故事告诉我们,如果需求清晰了,一切都不是问题。

总体的思路是——先穷举、再过滤。

问题1. 约束条件:两个哑铃重量相同,每个哑铃的两端重量相同。
2.5kg,2kg,1.25kg,0.75kg 共4种哑铃片。

思路是这样的。

(1)在每个重量组合中,4个哑铃片的每个有2种状态,
分别为0和1,1代表取、哑铃片拧在杆上,0代表舍、哑铃片不拧在杆上。

(2)哑铃片彼此重量不同,因此分配4种不同的权重,对应二进制每位2^3~2^0。

步骤如下。

(1)Excel表格的左半边,函数的自变量及取值。

第1行以4种哑铃片的重量作为标签;
第2行的数据是哑铃片的重量,用于接下来的计算。
第3行开始穷举4种哑铃片的所有状态可能。
其中 0000代表4个哑铃片都舍;
0001中的1代表0.75kg哑铃片取,其余哑铃片舍;
0010中的1代表1.25kg哑铃片取,其余哑铃片舍;
0011代表1.25kg和0.75kg哑铃片取,其余哑铃片舍……

其2^4=16种可能。

(2)Excel表格的右半边,函数值。
“半边”这一列,用于计算单个哑铃一端的重量。公式为
每个哑铃片的重量 * 每个哑铃片的状态0或者1 ,4个哑铃片累加。

也即 sigma( 每个哑铃片的重量 * 每个哑铃片的状态 )

也即 2.5kg*状态a + 2kg*状态b + 1.25kg*状态c + 0.75kg*状态d

下图中,D6是0.75kg哑铃片的状态,d是0.75kg哑铃片的重量。

如下图,得到哑铃组合的16种可能。

(3)接下来,把单个哑铃的一端加倍,再加上杆的重量1.1kg。

16种可能,不重不漏。其中有些组合的重量是相同的,给予保留。在锻炼中,这时的重量分布不同,旋转等动作的时候会有不同感觉。

按重量排序。需要排序的原因分析在第2个问题中详述,此处从略。

问题 2. 放宽的限制条件:只组装出单个哑铃。
限制条件:每个哑铃的两端重量相同;每端不超过4个哑铃片。

2.5kg,2kg,1.25kg,0.75kg 共4种哑铃片,每种2片,共8个。

(1)自变量-取舍状态,穷举所有可能,函数值-哑铃重量。

下图为局部,只包括了所有可能中的8种。

按问题1中的思路,把每片哑铃赋值为一个自变量,取值为拧上或不拧上的状态1或0。共2^8=256种可能。

函数值,半边(单个哑铃的一端)重量,取值为

Sigma( 每个哑铃重量 * 每个哑铃片的取舍状态)

下图为局部,只包括了所有可能中的4种。

接下来,求单个哑铃的两端,再加上杆的重量。

(2)过滤条件1 相同重量哑铃片的去重

有一种情况,在穷举中认为两种不同组合,但在需求中视为相同的组合,需要去重。

例如:两个0.75kg哑铃片间没有任何不同,因此取任何一个,在需求中认为相同。但是在上述穷举中两个0.75kg哑铃片的状态是不同的变量,所以未去重。

解决方案如下。

两个相同重量的哑铃片,设1为取,0为舍,共有如下4种可能组合。

哑铃片a 哑铃片b
0 0
0 1
1 0
1 1

我们可以注意到,以上4种组合中 01 和 10 两种状态是完全相同的,因为在需求中两个相同重量的哑铃片没有任何不同,二者取哪个并无区别。

根据以上分析,我们过滤掉 10 的这种情况。

即 遍历4种哑铃片,只要其中任何一种哑铃片有10这样的组合,去除这一组合。

在Excel中分两步完成。

第一步 取重量相同的2片哑铃,如果组合为10,作标记为1。
算法是 左侧的权重为2^1=2,右侧的权重为2^0=1;如果 左*2 + 右 的值 为2,那么标记赋值为1,否则赋值为0。如下图所示,标记“0.75kg - 10”为1。

第二步 遍历所有4种哑铃片,作 或操作,即4种哑铃中有任何一个符合(组合为10),对“有哑铃片存在10组合”标记为1。如下图所示。其中的“+0”是为了把TRUE或FALSE转为1或0的形式。

(3)过滤条件2 哑铃片超过4个,去除

对左侧的状态 求和,哑铃片每取1片会有加1。如果总数大于等于5,对“哑铃片4个及以下”作标记1。

(4)过滤条件1 + 过滤条件2

上述两个条件中任意一个标记为1,那么标记“两条件过滤”当前组合为1。

设置筛选条件如下,去除所有标记为1的行。

(5)排序

筛选完成后发现,与问题1不同的,哑铃的重量并非由小到大升序排列。原因是二进制权重(以及所有带权的进位制)都假设 右边的所有位取1所得到的结果,小于 左侧任意一位的值。如二进制的100 > 011,如十进制的 1000 > 999。这样,按0000~1111穷举权重,得到的结果才是符合升序排列的。即相当于按下图的条件排序。

在下述反例中,
状态0000 1111得到重量4,
状态0001 0000 得到重量2。

状态 自变量值 0000 1111 < 0001 0000,
重量 函数的值 4 > 2。

这导致的按状态升序排列所有组合,函数值并非全都符合升序排列。

在Excel中,容易处理,按列 半边重量(或*2未含标,或加杆1.1kg,顺序相同)排序。

(6)得到结果

因为有筛选,所以如果想把结果复制粘贴到Excel之外,会把筛选掉的组合也一并复制粘贴出来。

排除筛选掉的行的方法,在Excel中按如下步骤操作。

第一步 Ctrl-g 或 F5 得到 定位对话框。

选择 定位条件。在下图中选中 可见单元格。

Ctrl-c复制,打开或新建 另一个工作表,鼠标右键 | 选择性粘贴。如下图所示,按 数值 粘贴。

共49种可能。经与二猫的工作核对,一致,旁证我的结果是对的。

画图分析,双哑铃 其中每个哑铃重量的增长,如下图所示。

从图中可以看出,(1)增长较为平缓,这样锻炼时可以组合出步进不那么激进的重量;(2)某些重量有不止一种组合。相邻求差发现步长有三种,分别是0、0.5、1、1.5。其中6处步长为1,4处步长为1.5,2处步长为0.5.

单哑铃的重量增长,如下图所示。具有与双哑铃相同的特性。

相邻求差发现步长有四种,分别是0、0.5、1、1.5,其中多数是0.5,更多哑铃片使增长更平滑。7处步长为1,1处步长为1.5——最后一步。

-----

https://zhuanlan.zhihu.com/p/709971919
微信公众号:杨贵福

避免雨课堂在切换窗口时暂停视频

在疫情期间对雨课堂就久闻大名,因为不喜欢被强迫,更喜欢自由发挥的感觉,所以未得一见。最近才知道雨课堂有个“为了你好”的功能,就是把网课切换到后台的时候,视频会停止播放。甚至在桌面上并置两个窗口,把另一个窗口设置为活动时,雨课堂的视频也会暂停。

一方面不喜欢被操控的感觉,另一方面喜欢操控代码的感觉。所以,手痒打算试一试如何禁止这个贴心的特性。我平时用 firefox,这次偏偏没有找到有些贴子提到的界面,所以只好换成 Chrome。

如果我是雨课堂的前端程序员,检测窗口不活动最直接的方法是 检测鼠标离开。就从这里试,姑且一试。

1. 技术原型 设置断点,找到代码,修改

打开目标页面,就是网课那页。在 Chrome 中,按 F12 进入 [这个界面叫作什么]界面。选择 Sources。

在窗口的右侧,Event Listener Breakpoints | Mouse | mouseout 设置断点。

动一下页面,东点西点,进入离开,触发断点。鼠标点击下图中红色方框中的按钮,或者按 shift-f11快捷键,跳出当前函数几次。

直到看到下图中的代码。用双斜线注释下图中红色方框中的那一行。在本文中,以下我们把这个文件称为目标文件。

注释以后如下图所示。

Ctrl-s保存。

清除断点。

此时,在不关闭当前页面和F12的前提下,可以连续播放视频,在切换到窗口以外时视频不会被暂停。

2. 下一节课 手动修改代码

载入下一节课时,或者刷新当前页面,修改刚刚那行代码以后就可以避免视频暂停了。

载入下一节课时,不必再次设置断点。通常,F12页面不关闭,在F12d页面上显示的就是这个文件的这个位置,只是代码又刷新成没有注释的版本了。一眼就能看到那行关键代码,注释掉就完成了修改,能避免视频暂停。或者按 ctrl-shift-f 显示 search,在文本框中键入要找的代码,回车就能找到目标文件及代码所在的行。打开文件,注释那一行就可以避免视频暂停。

3. 自动 超驰

每次修改代码还是不够自动化。在写 chrome插件或者油猴脚本 自动修改js代码或变量或函数之前,还有轻量级一点并且相对自动化的对付手段。

在目标文件上鼠标右键,选择下图中靠近下方的红框所在的菜单项, Override content (超驰)。注意看靠近上方的红色方框,目标文件已经修改完成了。

浏览器会在上方菜单之下显示一段文字,并选择文件夹保存修改过的js文件。

浏览器会要求本地硬盘的权限,如下图,允许。

附:以上两条消息对近视眼丰富不友好,如果不弹出系统菜单,那个大个屏幕,根本就看不到消息的存在。

完成以上操作后,载入下一节课,或者刷新当前课程,视频播放以后不会因为切换出窗口而暂停。原理是,目标文件不从远程载入,而是从本地的 override目录中那个刚刚保存的文件载入。从下图中我们可以看到,文件不在Page中,并且右下角标记了淡紫色圆点,表示使用这个本地文件超驰目标文件。

4. 更自动 及 其他

以上方法,适用于对前端开发感兴趣的同学。如果想给非程序员的其他人使用,还需要开发成 Chrome插件,或者油猴脚本(这和自动开始下一课是两种不同功能)。我猜测在 Burp 中正则表达式匹配 js 文件内容,在线修改,可能也行。我还看到有贴子用 python 代替浏览器的角色,发送心跳信号,极短时间内就学完了。

探索原理,熟悉工具,花费的时间比循规蹈矩地学一遍还要长。不过,乐在其中。


https://younggift.net/

https://www.zhihu.com/people/yang-gui-fu-52

如何理解一个数的无理数次幂

1. 问题

PQ同学在朋友圈提到,“如何理解一个数的无理数次幂?”我回复,“(3^x)^x = 9,求x。”

简单解读一下。写成更易读的形式为,在下面这个方程中求x。

我们容易猜测到, 刚好符合要求。接下来可能想到,解可能不唯一,然后想到 也是一个解。所以,这个方程如果有解,那么要求3这个数的次幂是无理数。因此,如果这个方程有解、有意义、成立,那么,一个数(在这里是自然数3)的无理数次幂就需要有意义。换言之,这个方程就是一个数的无理数次幂的意义,就是“如何理解一个数的无理数次幂”。

以上对解的猜测是否正确,可以找一下旁证。

用Geogebra,没错。

用 wolfram alpha https://www.wolframalpha.com/input?i=Solve+%283%5Ex%29%5Ex%3D9

得到2个解。

化简其中一个,结果没错。

数值约等于1.414,正是我们熟悉的 +sqrt(2) 和 -sqrt(2)。

2. 对这个方程又如何理解

单单这么一个方程,看起来有点莫名其妙。你能会觉得这并没有回答,而只是对问题的重复。

这个方程类似在 数域扩展数据类型 那一课中 所举的其他几个例子。我们略做回顾。

第一步 首先要有数。最初的数(似乎)是自然数。自然数是如何定义的?由0和+1操作可以定义出1。进而,由1和+1操作定义出2……这样,我们定义出自然数。

第二步 2+3=5,3+4=7。为方便起见,我们发现 自然数 可以用 加法 表示。

第三步 我们由加法定义出减法。7-4=3。5-3=2。7-4 的意思是 这样的一种运算——如果这个数x存在(有意义,有定义,有解)的话,方程7-4=x有解,即 x+4=7,也就是说那个数是 加上4等于7的那个数。当然,后来我们知道这个数刚好存在,并且唯一,是3。

根据减法的定义,我们列出式子 2-3。根据定义,其含义为 2-3=x,即x+3=2,加上3等于2的那个数——如果这个数存在的话。这个数不存在,在所有自然数中,当我们遍历时可以发现,没有一个数加上3能等于2。

第四步 为了2-3=x或x+3=2这个方程有解,我们扩展数域,令x=-1。我们把这个新的数域,也包括旧有的自然数,起个名字,称为整数。

负数或者说自然数以外的整数为什么存在?如何整理负数?负数,就是令2-3=x有解的那种数。如果想解这种方程,那么就需要负数。如果某个物理现象的建模所得到的方程,即各种变量间的约束关系,刚好就是这样的方程,那么我们就需要负数。

书说简短,我们按这样的方式,即因为方程需要有解(因为运算或逆运算是有定义的,因此应该可解),继续扩展数域,就得到了分数/有理数、实数中的无理数、复数。

回到最初的方程上来。这个方程(3^x)^x = 9看着如此简单,不应该无数吧。如果它有解,我们就必须接受次幂是无理数的,否则方程无解。

3. 如何构出这个方程

构造这个方程不是“显然”就写出来了。

看问题 “如何理解一个数的无理数次幂”时,我首先想到 有什么情况下会有无理数次幂。

所以,我需要一个方程。类似这样的方程 一个数^(x)=另一个数,即一个数的无理数次幂的值是另一个数。2^sqrt(2)=管它什么呢,这就是无理数次幂。但这是没有意义的,是对问题的重复。

什么是有意义呢,我们在什么情况下需要次幂是无理数?答案是:这类同于数域的扩展。

我需要类似 2个数的平方等于2 的形式,这样其解就是sqrt(2),无理数。那么我需要 x*x 的形式。加法不行,减法不行,一定要乘法才行,sqrt(2)就是那个 自乘等于2的数,x*x=2 的那个x。

3^(x*x)=9,这就有意义了。这个方程不需要 问题中的无理数次幂 就可以定义出来。并且,这个方程易懂,我们能猜出来它的根有sqrt(2)。

但是还差一点。这个方程确实没有引用未定义的概念无理数次幂,但是它的解是2,也没有引出无理数次幂(必然存在)这一结论。

变换一下,3^(x*x)=(3^x)^x,这样就可以了。这个公式叫做什么来着?

这样,我们就得到了 (3^x)^x=9,其解是无理数的次幂。

3. 物理意义及扩展

这个方程(3^x)^x=9在数学有意义了,但是有的同学可能还会追问,这样的方程有必要存在吗?那么,所追问的就是这一类方程,或者说无数数次幂,的物理意义。

物理中有没有这样的方程呢,我首先想到的是欧拉公式,那是复数次幂。实数的,还非得是无理数的,有理数/分数的不行,一时没想起来。搜索了一下。我才知道无理数次幂是高中数学的内容/捂脸。

又搜到

为什么几乎所有的物理公式里面的参数都是有理次方的? - Boo Radley的回答 - 知乎

https://www.zhihu.com/question/418475291/answer/2120030068

有回答指出 半衰期、热力学中的多方过程 都可能是无理数次幂。

突然想到前几天刚刚又看到的,维度。相当于下面这个回答中的,维度有一维、二维、三维,还有分数维度,还有无理数维度。正是按数域扩展的思路,“如果符合定义,我们还可以得到这样的结果;它有点匪夷所思,但是符合定义”。

在物理中,是否存在某个物理量正比于另一个物理量的无理数次幂的情况? - 笠道梓的回答 - 知乎

https://www.zhihu.com/question/396816857/answer/1242606325

接下来,我们可以按同一思路继续讨论。一阶导数是什么意思,二阶导数是什么意思,都是有定义的。那么,1/2导数是什么意思,sqrt(2)阶导数呢?

https://younggift.net/

https://www.zhihu.com/people/yang-gui-fu-52

哑铃片的组合有几种,以及二猫的编程解决

一副哑铃,有可替换的哑铃片 0.75kg,1.25kg,2kg,2.5kg每种各4片。可以组合出哪些重量?

1. 我哥给我一副哑铃

回老家,我哥给我一对可调节哑铃。

之前我有6.5kg*2kg哑铃一对,用来练深蹲、单侧或双侧俯身划船,农夫行走和土耳其起立。份量有点轻,但是没有更重的。还有3kg*2哑铃一对,是邦哥带我去迪卡侬买的,用来练肩。他说,不用太重,你感觉侧平举不太费劲就对了。一直用到现在,刚刚才有一点觉得轻,但是没有刚好稍微重一点儿的,因此没有进步的意愿。还有2对1kg哑铃,俯身或俯卧练肩后侧或肩胛,有时希望稍微重一点点点。

我哥给我的这对哑铃可调,共16片哑铃片,0.75kg,1.25kg,2kg,2.5kg共4种,每种各4片。哑铃杆2根,每根1.1kg。

我装配出8kg*2哑铃,当天晚上就练了一轮肱二头肌。果然比6.5kg的要给力,略微有点过于给力。第二天晚上,第三天晚上,肱二头肌拉伸时有微微疼痛。还试了左右分别5组土耳其起立,也果然比6.5kg*2要难。我想,是不是应该降一下重量,比6.5kg高5~10%,这样成长曲线更平滑一些,痛苦能少点。

如果有个表格,能把这副哑铃所有能组合出的重量都列出,我每次查找下一个5~10%进步的选项就可以了。最大重量是每个哑铃13(+杆重1.1)kg,练肩的话,我今生也不会达到。总重五十多斤,抱着深蹲对我可见的未来也足够。

问题是,都有哪些组合呢?

2. 用EXCEL试试

凡事,先用最简单的工具试试。Excel最简单,各种计算,特别是简单场景的,无出其右者。有人可能觉得C最简单,或者觉得Python最简单。你得在发着低烧,要求速度的时候,看出错率和体力消耗。这才是简单。

图1 Virgin Python,惟真楼的巨蟒

Excel有求组合和排列的函数,就是英文单词 combin 和 permut 或变形。我刚一输入函数就觉得“不对”。一,这两个函数的作用是求组合和排列的数量,而我要的是列表,仅仅数量对我不够。二,相同重量的组合,对我而言可以算同一种。如何判断?Excel 是否能像 C++ STL 那样支持自定义的谓词呢?十有八九不能。这样对多数用户过于复杂,容易用错。况且,我对谓词的要求是判断求和相等,通用的谓词定义需要何种计算能力,是不是得图灵机等价,那么这里需要用VBA才行。

再查,Excel 365版本以后的,支持给出组合和排列的条目。我手头的版本过低,不知道有多低,不过,想想发行时间应该不足以支持。试了下 一个array类函数{=PERMUT(A2:A4,3)},又试了ctrl-shift-enter组合键,果然不能工作。

再往下就是用VBA或者某个特别的插件,进入奇技淫巧模式了。

3. 二猫出手

所以,这种活儿就应该用C语言。穷举,判断条件自定义。找二猫,问“我有这么个问题”。我没说“这事挺简单”,虽然不确定,但是隐约觉得还有坑。

二猫说“简单,能做。”

然后开始问我尚未细化的需求。俩哑铃是不是需要相同重量?每个哑铃杆有两端,这两端是否需要相同重量?相同重量,使用不同的哑铃片,比如 2 == 1.25+0.75,这算一种还是两种?我又一次体会到 需求难提,用人类语言尽述心中所想的难度,以及为什么会有《猴爪》这样的故事。

没多一会儿,程序就出来了。核心代码大致如下。

我说,输出改成这样的格式吧,这里加几个空格,那里加两个\t,这里乘以2,那里对齐。二猫体会到需求变更是工程中的常态,用户经常在看到输出效果以后才知道“那不是我想要的”;可能程序员最花时间的那部分,做完以后,用户说“这个不重要”,请删除。

最重要最复杂的业务逻辑完成以后,我和二猫不约而同地对剩余的工作采用了额外的工具,而不是修改程序。二猫写了段以map为准的代码,把数据吃进去再排出来,去除完全相同的重复。核心代码大致如下。

我用excel去除重量相同的重复,调整格式,分别得到重量列表和组合列表。

这样,我们得到了以下表格。能够看到相同重量有多种哑铃片组合方式。

双手两手相同重量,不去重复,最右列是哑铃片的组合。

单手,不去重复,最右列是哑铃片的组合。

4.赞叹精妙设计

观察上述两个表格,我发现,我并不太需要哑铃片的组合。只要告诉我这个重量是可行的/,对我来讲信息就足够了。有了可以得到这个信心,很容易算出组合的方式。就算我的口算能力一塌糊涂,也可以再根据想要的重量查上面的两张表格。

因此,我删除哑铃片的组合,去除相同重量的重复行,得到下述两个表格。简洁多了。

双手,杆两端平衡,按相同重量去除重复。

单手,杆两端平衡,按相同重量去重。

观察这两张表格可以发现,哑铃片重量的选择应该是精心设计过的。哑铃总重的增量,绝大多数是0.5kg。增加0.5kg对于提高训练难度,经常不是特别大,也不特别小,相当适合。个别增量是0.25或者1。

再回顾哑铃片的种类,0.75kg,1.25kg,2kg,2.5kg,如果使用分数是 5/2,4/2,5/4,3/4,有点意思。转换成以1/4的倍数表示,那么4种哑铃为 10,8,5,3。这几个数字看起来眼熟得多,隐约有人民币面值的种类,以及质数、合数之类的印象。好了,应该是精心设计过的。就到这里吧,赶紧去锻炼——莫等闲,锈了新哑铃。

你手腕疼吗?

与老学生相聚总是很愉快。和老老师相聚,能听到很多掌故,和老学生相聚,能听到很多成长的故事。最近老学生华哥来,戴了一对护腕,一问,手腕疼。没多久,群里,老学生权哥问,“有同学遇到过写代码时间长了造成手腕子疼的情况吗?我以前都不疼,最近换了工位后就开始疼了。”我哈哈大笑,真应景,华哥手腕疼来着。我也疼过。

原理,个人体会,以及解决方案如下。

1. 原理

腕伸动作,就是手背向前臂靠拢,如果用力,或者持续,都会导致手腕疼。打字时手腕不悬,长时间用鼠标,俯卧撑特别支撑手远离头而向腰的方向靠近,都属于腕伸动作。如果留有长指甲,为了手指肚敲击键盘而抬起手背,也会导致腕伸。

2. 个人体会 手腕疼痛和休整的案例

我以前手腕疼,所以戴非常松的护腕保暖,感觉好很多。这个救急非常有效,从1998年到2012年,我持续了15年。需要忽视别人的目光和劝阻才行。我用的是线儿衣(有些地方称为秋衣?),里面穿的衬衣 的袖子,松紧和长短都适合。色调是亮绿,亮蓝,在那个时期的照片中非常突出。有次上公开课,老老师们特意告诉我,需要把这护腕摘掉。我说,疼啊。他们说,忍一下吧。袖子长点,长到手背,也有点作用。

因为腰突,接受向龙同学的建议尝试悬挂在单杠上。引体向上从3个长到7个,没有多久。

对腰突的效果不清楚,手腕好了。我猜测悬挂姿势因为握力增加,以及习惯的发力角度更适合人类进化。

3. 解决方案

(1)锻炼。吊单杠,锻炼腕部肌肉和关节。感觉受力的角度很重要,以这样拉伸的角度锻炼。

(2)避免。避免腕伸受力或长时间腕伸。打字时悬腕。如果觉得累悬不动,那就应该歇会儿。少用鼠标,多用键盘。鼠标动作比键盘精准很多,格外累。俯卧撑用架子或者拳头撑在瑜伽垫上。打人的时候,侧面扇巴掌,不要掌心向前推。当然,不打人更好。

(3-1)手腕的休息、训练、恢复的注意事项,角度。无论腕伸、腕屈、向拇指侧倾、向小指侧倾斜、向尺骨侧旋转、向桡骨侧旋转,都保证只停留在最舒服的范围和角度内。不要在腕伸时立掌,不要在腕屈时达到蛇鹤什么拳那样突起手腕的手背一侧成直角。人类手腕侧向旋转的角度非常小,以舒服为界。如果某个角度疼,不要进入那个角度,或者反向用力。例如把东西甩在肩膀后面提起来这个姿势,可能导致腕伸时疼痛。用力向腕屈方向,由手背侧的关节受力改变为手心侧的肌肉受力,这样就不疼了。甩筷子之类的挥拍运动,末端不要放松手腕,保持一定程度绷紧。

(3-2)手腕训练时的原则,除角度要小以外,负重/力量要小。手腕附近的肌肉非常小,关节也小并且复杂,不会练出多大力量,也不应该有这样的需求。所以,抓握、旋转、屈、伸时,随便找根不太细的棍子。截面要圆的,以免不硌手。一只手的上臂提供的力量,足够训练另一只手的手腕了。负重要足够小,数量稍微多点就会酸。我猜测这就足够了。负重不要大,不会练出大肌肉的。并且,手腕,前端的末端和手连接的地方,那里没有肌肉,天生多细就是多细,想也白扯。

训练的角度包括 腕伸、腕屈、向拇指侧倾、向小指侧倾斜、向尺骨侧旋转、向桡骨侧旋转。再次感叹,这么复杂的关节,不应该承受太大的压力和时长。

(4)器械。

这根棍子,过于夸张了。单手握凳子腿做腕屈,更超过了养生锻炼的范围。至于单手握凳子腿做腕伸,如果你能,那么就不应该读这个贴子。家里有马勺的话,可以试试左手颠勺,如果你是右利手。颠勺所需要的力量,超出健康所需要的。超出,可以,为了超出而锻炼,一方面太难,另一方面可能受伤,不是好事。

猜测 正常人类,有三五根筷子足够。如果你能用腕力折断三五根筷子,那就是练得过于努力了。一根筷子,别折断,那个力量感觉正好。

4.补充

对华哥的护腕的评论:护腕紧的话手不过血,勒出印痒;出汗得洗。

权哥补充说:我发现座椅偏低,手打字时就会出现腕伸动作,时间一长手腕就疼。

当压缩包里的文件名是乱码

有过几次,同学发给我压缩包里的文件是乱码,看起来如下图所示。

进入第一个目录,看起来如下图所示。

如果想看解决方案,请略过中间,跳到文末。

猜测这位同学的机器是 MacOs,苹果的机器。据说,苹果系统对于国别和编码处理得格外优秀,因此在落后的Windwos操作系统上看起来是乱码。有同学建议过我换个苹果系统,不贵,用起来特别顺手,这个乱码的问题会不药而愈合。据说苹果的笔记本用起来特别舒服……但是,我一直不能适应巧克力键盘,更何况由于视力弱,所以我现在已经没有办法用笔记本了,所以这么大的优点对我没有意义,钱会白花。还有同学建议我用 winrar(似乎高版本?)而别继续用zip解压也能解决这个问题。

苹果系统还给过我一个印象,就是有位苹果用户发给我的图片尺寸特别大,上面只有几个字纸件的照片,就达到几十M字节。我深深为自己的带宽、日志和工程存储空间而自卑,也为此发愁。

有的同学发来二三百M字节的ppt或者word文件,往往里面有特别大个儿的一张超高高清晰度(全尺寸展示比你的屏幕还大好多倍)的图片,还有特别的字体完整嵌入。

有的同学打包用7z,告诉我这来自当前最好的压缩工具。

有的同学发送给我wps,告诉我这来自爱国的和正版的工具。

以上这些,我统统都能想办法打开,然后削减尺寸以后保存。同时我经常杞人忧天地为他们犯愁,万一哪天被官方当作垃圾把文件扔了该有多可惜。

我对我钟爱的工具也非常执着,但是范围仅限于我的机器。多数时间用 emacs 写作,但是发给编辑或同事或同学的时候,一向要转换为 word。因为猜测这是收件一方中的多数人最常用的系统。

近些年,情况略有变化。有的同学发给我md,还有短小精悍或长篇大论或口齿清晰的或吐字不清的微信语音。有的同学发来截图的字体极难辨认,不是手写,胜似草书。我有时候说 不能听、打不开、不识字,有时候不吱声想办法查看,然后在心里祝福他以后不会被官方以打不开为由而丢掉文件。

说回压缩包里的乱码。最简单的方法是请对方换个方法重发一次,如果对方是计算机系的学生还好,不然万一他不会,你教他怎么操作是件相当繁琐的事。附,我的经验是,一定要拒绝远程解决任何故障。如果他有能力描述故障,他就十有八九有能力解决。如果他不能解决,十有八九他也说不清楚。如果你不知道故障的现象,能解决才怪——他会还觉得你笨,这都解决不了。

解决压缩包的乱码,再就是换个压缩软件,嗯,或者换操作系统和机器。在机器上装winrar触发了我的洁癖,所以不行。我机器上刚好有 Java运行环境 JDK,你的机器差不多也有,很多人的机器上都有。JDK里有个 jar.exe,常用它运行java的jar包文件。

Jar.exe能解压。Java对国别和编码处理得好,这一点也很著名。

鼠标单击资源管理器的地址栏(红框处)。

输入 CMD,回车,弹出命令行窗口,当前目录是资源管理器的地址栏所在目录。

在命令行下按如下命令操作。

Jar xvf 文件名

或者这样。

jar xf 文件名

解压完毕。

验证,所有文件名都不再显示为乱码了。

感谢 MWW同学 和 先帝创业未半而中道崩组 提供的示例。我收到过不少压缩包中文件名乱码的,妥善保存、容易找到、近期的就是这个。