由太阳角度和时间求地点

假设有张照片,有太阳照射下的影子,知道房屋墙基的角度,知道照片拍摄的时间。求拍照的地点经纬度。

1. 题目

就是这张照片。

C:\Users\young\AppData\Local\Temp\WeChat Files\365306cb65c4ecd6d88843a2db30b84.jpg

橙色线,即墙基的角度,为东偏北25.4度。

(原本拍照想题目的时候,以为房屋是正南正北的,即墙基是正东正西走向。在百度地图上看了一下,并非如此。截图放在geogabra里量了一下角度,即上图。)

拍摄时间为 2023年6月30日15:22。

2. 分析

2.1 概念

本篇标题中的“太阳的角度”并非单一变量,而是包含两个数据。其中之一是 高度角 Elevation,另一个是 方位角 Azimuth。

高度角,指 在纵剖面上,太阳的投影-观测者-地平线 之间的夹角。

方位角,指 在水平面上,正北-观测者-太阳的投影 之间的夹角。

https://gml.noaa.gov/grad/solcalc/azelzen.gif

上图来自 https://gml.noaa.gov/grad/solcalc/glossary.html#azimuthelevation.

图中,h为高度角,A为方位角。

2.2 原理

太阳的高度角 与 时间、纬度 有函数关系。由高度角、时间求得的纬度不唯一,分别在太阳在地点上的直射点两侧,距离太阳在地点上的直射点有相等的纬度差。

太阳的方位角 与 时间、经度 有函数关系。

例如下面的示例,由经度、时间 求得 太阳的方位角,由纬度、时间求得 太阳的方位角。我们需要的是两个反函数,由 太阳的高度角、时间 求得 经度,由 太阳的方位角、时间 求得 纬度。

https://www.osgeo.cn/app/s1904

我们需要找公式或找到可查的表。

2.3 自变量

函数值是 经度和纬度,我们需要的自变量 为 太阳的高度角、太阳的方位角、时间。

时间已知。

太阳的高度角可以由建筑的影子和建筑的比值得到;太阳的方位角可以由墙基的角度得到正北,由建筑的影子在大地上的旋转角度得到。

影子长度的测量和影子角度的测量,细节在下文中。

3. 测量

在照片上做出辅助线,得到下图。

图中的角β是高度角。

图中的角 α与方位角有关。把百度地图与照片叠置,旋转照片得到下图。

其中绿线为正东正西走向,红线为太阳影子的方位角。因此太阳方位角与东西方向的夹角为
25.4度-∠GFH。

3.1 太阳的高度角

根据带辅助线的照片,用geogabra可测得太阳高度角41.82度。

或者 根据房角高CD的像素个数 与 房角的影子长DE的像素个数,二者比值构成太阳的高度角β的正切。根据反正切可求得β角大小。

用 画图 测量像素的坐标,在excel中用勾股定理算得距离。用反正切求得角度为40.5度。

注意到此处有误差,由于视角并非水平,因此求得的角度略小于真实值。考虑到影子的本体是建筑物而不是较短的钉子,因此测量误差较小;并且视角高度不大,所以认为误差可以接受。

3.2 太阳的方位角

视角高度不大,因此对水平面角度(和长度)的测量误差较大,需要做透视矫正。

选了个容易使用的工具。用华为手机拍照功能中的 智慧视觉(左上角)| 扫描 功能,校正照片。

其中左上角是房角在水平面上的投影。左上角-右上角和左上角-左下角 之间等距,由假设栏杆的每根立柱间隔无论左右方向和前后方向都是相等的推得。右下角是做平行线得到的。

测得太阳影子与房基间夹角23.02度。

因此从正北顺时针的方位角为 270-(25.4-23.02)=267.62度。

4. 代入公式

所需公式在网上可以查到,未重新推导。

4.1 高度角

4.1.1 高度角公式

高度角公式

https://www.zhihu.com/question/51315574

sin hs =sinφ·sinδ+cosφcosδ·cosΩ

其中

hs 为高度角

φ 为地理纬度

δ-赤纬

Ω-时角,deg

4.1.2 赤纬公式

赤纬公式

https://zhuanlan.zhihu.com/p/265303609

https://pic4.zhimg.com/v2-54d355b186fcee176de2edb3fd45c3fb_r.jpg

其中t为由3月21日到所求日期6月30日的差,用excel求得值为101,如下图。

把101代入赤纬公式得到23.15度。旁证检验,6月30日刚过夏至不久,太阳由北回归线23.5度向南,求得赤纬的结果与此符合。

4.1.3 时角

在高度角公式的贴子中,孔sysu

求得15:22对应的时角为 (15.37-12)*15=50.55度。

4.1.4 反函数

不必求反函数,可以根据高度角公式在excel中制表,局部如下。

上图中,由纬度、赤纬、时角三个变量求得高度角。其中赤纬和时角在本题中是固定值,已求出。以1度为间隔穷举所有北纬纬度。

观察表格可以发现,在高度角40度左右对应的纬度范围相当大。如果考虑到测量的误差,北纬10度至北纬60度都有可能。

画XY散点图如下。

散点图由上图可以看出,根据高度角求纬度,由于高度角范围较小,所以计算得到的高度角误差较大。(纬度分辨率相当低。)

4.2 方位角

不需要引入方位角公式。

时差,经度差与时间差对应,每360度对应24小时。因此 360/24=15,即每小时对应15度,或每度0.067小时。

拍照时间使用东八区时间-北京时间。同一时刻,东八区中央经线东经120度的太阳方位角为259.56度。根据 https://gml.noaa.gov/grad/solcalc/azel.html 查得。

此前已算得太阳的方位角267.62度。与东八区间的方位角相差267.62-259.56=8.06度。照片所在地比东经120度的太阳更偏西,所以地点更东,120+8.06=东经128.06度。或者按每度111km,拍照地点为由北京向东8.06*111=894.66km。

5. 验算

剧透得知,照片拍摄地点为 吉林省长春市东北师范大学净月校区。

根据 Stellarium 得到 经纬度。

https://gml.noaa.gov/grad/solcalc/azel.html

查得高度角41度左右,方位角264度左右。

或者 用 https://scienceasdf.github.io/site/solarAngle.html 在PC机获得大致的经纬度。

得到高度角为41度左右,方位角264度左右。

https://www6b3.wolframalpha.com/Calculate/MSP/MSP550511ie5c243908hid200003i4hhge80hh56880?MSPStoreType=image/gif&s=4

似乎看起来不错,由经纬度算得的高度角和方位角 与 测量值相差不大。

测量值 根据经纬度的计算值 误差
高度角 40 41 -1
方位角 268 264 4

然而误差相当大。

因为纬度分辨率差,所以高度角即使测量非常精确,求得纬度的范围也非常大。按我的测量,纬度从北纬10度到北纬60度,跨度5550,大致相当于从漠河到曾母暗沙。

方位角差4度合地面4*111=444km,从长春到珲春,再远一点就是日本海。

 

二猫的童年

二猫中考结束了,兴高采烈地喵喵叫,再也不用上初中了。说,看着满床满地满书桌的资料,就想应该抽出一张来复习。就像在考场上发现题目比平时简单,告诉自己“以后中考的时候可以慢点答”,然后遽然发现,正在中考。童年转瞬即逝,即使我经常还错觉她仍然是不一点儿高的孩子,却早就比二猫妈还要高了。

所以,趁时光不远,正是时候写点什么回顾一下二猫的童年。

一直以来不太写孩子的故事。一方面我觉得需要尊重她本人的意愿,而她在更小的时候恐怕没有能力辨别到底是否赞同公开讨论她的故事。另一方面,大家听别人家孩子的故事,通常怀着“可供借鉴”之类的心态吧。私以为成年以前,判断孩子某些特质或家长选择的利弊还为时过早。即使成年以后,我们就能断定怎么做是对的么?总之,把孩子视为孩子评判,有违我的准则。因此,这一篇并非希望有所检讨或借鉴,而是单纯回忆。

包括幼儿园前,幼儿园、小学、初中。以下是我的回忆,不是二猫本人的回忆。因为二猫在过了某个时间点以后,突然就忘掉了童年时的很多事,像开关卡搭一下。她会说,“对对,你提到过的,但是我一点印象也没有了。”

二猫从小语言能力非常突出。说话早,认字早。当时我们都感觉非常厉害,就是那种——家长自己觉得这孩子太棒了,居然这么牛,然而过了一两年,每个孩子都会拥有同样能力——的那种厉害。二猫没有经历过 饭饭,香香,臭臭 这样叠字的阶段,能说单字以后每多久就可以说简单的句子。

和她聊天的时候与面对成年人的感觉差不多,除了人生经验还不够。比如我提到我小时候菜里肉太少,她问,是因为奶奶觉得吃肉多不健康吗?

幼儿园的时候,在我身后的墙上写很多字。应该说是很多笔画,她认为那是字,而且每个字都有读音。再问一遍还能认出来,或者记起来吧。再大一点,问我某个字怎么写。我瞎写一气骗她。她说,你写得不对。我说,正确的应该怎么写。她说,我不会写,但是我认识。

认识字多,所以在学前就读了很多书。多到什么程度呢?小学二三年级的时候,老师要求大家把最近一年读过的书名写在一张纸上。二猫用特别小的字,写了满满一页。她说,还有,写不下了。老师认为二猫在说谎,说,不可能,一个人不可能读这么多书。我和二猫妈考虑再三,要不要跟老师解释一下,决定还是沉默。这种沉默在小学入学面试的时候,二猫也做过。要求大家读画本,二猫拿起来就念,毫不犹豫。老师问,你是不是读过这本。二猫说,没有。但是她没有提议,你再换一本给我读吧。

某次作文,二猫提到,小的时候妈妈指着书上的字给她读画本,后来有一天就说:你已经是个大孩子,可以自己读了。二猫太喜欢那些故事了,只好自己读。老师感叹,真是聪明的家长。这里有个可笑的潜在负面效果。多数汉字二猫都是自学的,所以读音也是自学的,不少汉字在小学阶段仍然只读半边。聊天的时候出现过好多我们听不懂的词。现在都不记得具体是哪些了,我随便编一个吧。比如她可能说“见贝要求如何如何”,问了半天,写下来,是“规则”。大致如此。讲解完她自己也哈哈乐。二猫妈审稿到此,说“羊圈(quan)”。二猫说,对对对,当时我读的是《吹小号的天鹅》,把羊圈(juan)读成了羊圈(quan)。

再后来某次家长会的时候,老师请二猫妈做了一次报告,讲如何引导孩子读书。二猫妈提到,我们自己没事也喜欢读书,每年也买多少多少钱的。

喜欢读书,有自己的书架,后来又溢出其他架子上,散到地上床上。特别喜欢《夏洛的网》,用里面主角的孩子为自己起了英文名,某种小蜘蛛。喜欢过《玛蒂尔达》,后来很淡然的态度。喜欢《柳林风声》,给我解读过我看不懂的人物动机。我很喜欢《哈尔罗杰历险记》,积极推荐,她说全看过了,有点吓人,没意思。《我亲爱的甜橙树》,看了很多遍,中考结束以后又捧起来了。喜欢三国,因此初中时看了三国志、后汉书、晋书。小时候喜欢看三国,突然有一天说“害怕”。我们猜测再三,因为血腥暴力,因为权谋政治?都不是,就是怕,怕,还想看,还怕看。后来说清楚了,“怕看到关羽死”。当时她还不能区分恐惧和担忧。

比三国更早,在更小的时候,书籍就给了她力量。她非常喜欢看《小猫当当》,当时最喜欢的一本,是关于尿床的。小猫当当尿了床,其他小动物,挨个给出画面,都尿了床。各有特色,大概是小猫当当的是小鱼的形状,熊猫是竹子形状,大致如此,都尿成了自己喜欢的东西。然后大家一起晒被子。结尾是什么,太阳很红?我当时非常奇怪,为什么结尾不是“如果不尿床该有多好啊”。我当时没敢问,任由二猫喜欢这书。直到幼儿园或者小学,我终于有机会提问,为什么喜欢这本书呢,它并不能解决任何问题,甚至没有正面的引导。此时,二猫已经能清晰表达,她说,“看了这本书,我就不害怕尿床了。”醍醐灌顶。

喜欢看书到了痴迷的程度。应该是经常猫起来偷偷看书,因为暑假学校要求看书的时候,她挑了几本必读书目就跑到了床后面。问为什么要躲起来,答习惯了。这种直肠子回答是二猫特色,做法也是一样。因为中午在图书馆读书回班迟到,正被班主任撞到。问去哪了,答图书馆。也许还问了看什么书,肯定答三国演义吧。老师说,图书馆就是你的班级,你去图书馆上课吧。二猫讲这段的时候,我说,孩子,老师是在批评你啊,你可不能像我那样就真回家看动画片去了。二猫说,我回图书馆看了一节课书,特别过瘾。家长再教育,孩子说,老师是认真的,不是在跟我商量,是要求。问,跟图书馆老师怎么说的?答,我老师让我回来看书。图书馆老师后来再见到二猫,问过,你是不是就是老师不让上课让回来看书的那个女生。

喜欢看,也喜欢写。两篇发表在《作文与考试》上。还写了科幻小说《狼蛛》发表在科幻世界少年版上,是信息学竞赛和养昆虫的故事。参加了很多次自然博物馆魏老师组织的活动,抓虫子,养虫子,认虫子。我跟去过一次,学的是《蝴蝶的防御》。她在小说里没有提到——曾经把两只独角仙里大的那个送给了好朋友,还细心附带上昆虫吃的果冻。好朋友把果冻吃了,独角仙饿死了。

语言早熟,在幼儿园时期并不是什么好事。从幼儿园回来,问过得好不好。答,还行。玩什么了?看一会儿云,玩一会儿chuachua(塑料插件玩具,类似乐高),玩一会儿chuachua,看一会儿云。没有多少朋友。她想跟小朋友玩的时候,会礼貌地问“咱们能一起玩儿么?”三四岁的小朋友似乎还不知道她为什么要问。别的小朋友从她手里拿东西的时候,从来不问,抢了就走。有一次在家二猫拿着玩具,我假装在后面追抢,二猫跑两步以后把玩具飞快地扔到前面的地上。我起初很愤怒,怎么能摔东西呢。后来突然想到,有可能,她在幼儿园面临争抢时就只能这样处理。语言有优势,但是体力和斗志上明显不及。并且还意识不到体力的差距。我带二猫在楼下小公园里玩,看到一群比她高,大约到我腰高的孩子,成群地风一样跑来跑去。二猫试图指挥,用语言,你们到这玩,你们往那跑。我乐呵呵地看孩子们没一个答理她。最后一个孩子对我说,叔叔,能把你家孩子带得远一点吗,我们怕撞到她。二猫懵懂地看着我,问,他们为什么不带我玩。我才意识到,还不能充分理解语言和体力的相对性,不只二猫如此,看来是遗传的。

为了锻炼二猫花钱——那个时候手机付款还不普及——大家都用纸质或金属的人民币。为了锻炼二猫,我给她三块钱,让她替我去买可乐,我在门外等她。老板告诉她,小孩儿少喝(也许是不喝,细节我忘了)可乐。二猫说,她不喝,是给爸爸买的。老板说,小孩儿不能骗人。二猫不喝可乐,她试过几次,在不同年龄段,目前的结论都是一致的,难喝。

类似的,还有大人看她戴眼镜,告诉过她,不要看电视。她说,她不看电视。她确实不看,因为家里没有。大人就会说,不看电视你怎么近视了呢?显然不信。她会说,遗传的。大人就会说,近视怎么还能遗传呢。

乳牙很差。大人看到会说,小朋友不要吃糖。二猫说,我不吃糖。大人会说,不吃糖牙怎么会坏呢?二猫的科普几乎没有人信,她说,是遗传的。牙釉质先天发育不全,长出来以前就那样了。

二猫有坚定的意志品质。小时候几乎不吃糖,因为牙齿不好。也不吃巧克力,因为我把大量吃巧克力影响发育的简化版本告诉她了,即吃了不长个。吃水果。曾经对着剩下的唯一樱桃大哭,这是留给爸爸的。那粒樱桃我犹豫再三,吃掉呢,还是奖励给她。记得是吃了,奖励了其他的东西。

说起奖励,有过一次重大奖励。具体奖励的是什么不记得了,但是缘由还记得。小学。……

我们说,知是非,讲义气,必须重大奖励。奖励的内容具体是啥,家长忘了,孩子也忘了。孩子甚至忘了有过奖励。不过,我一直记着当时的感觉,觉得这个孩子很好,很自豪。并非因为这是我的孩子,而是因为我希望我周围的人是这样的人,希望我自己也能这样做。

即使很小的时候,二猫的热情也表现得相当冷静。带出门玩的时候,沉默不语,表情淡定。回家以后跟姥姥白话得没完没了,所见所闻滔滔不绝。也许总有人能感觉到冰下的火焰吧,她在每个学段都有相当铁杆的好朋友。

老猫,是最重要的朋友。二猫妈告诉她,咱们全家其实都是猫,但是这个秘密不要让别人知道。她自认是老猫的媳妇,我和二猫妈的童养媳。老猫的学名是李白,所以后来她狂热地阅读李白的诗和相关信息。

她在幼儿园有个朋友,家里有非常大的院子。我们一起感慨过,有那么大的院子可真好啊。小学的一个好朋友,一起玩过改良的定向越野。就是把果冻吃了饿死独角仙的那位。那位好朋友转学走了,后来在网上还有联系。小学持续到初中的好朋友。小学时我见过,后来初中放学时又见,拖着个大大的行李箱当书包,个子也窜高,认不出来了。运动会的时候给二猫梳头,似乎从受照顾的小妹妹长大成了姐姐。

学校以外的活动,也交到了朋友。马上要中考了,还有微信留言,问地生考试当初如何如何。二猫说,这是合唱团的好朋友。她们在省少年儿童合唱团一起受训和表演,直至二猫上初中超龄退役。后来这位低一级的同学也上了同一个初中,离得不远,但是从来碰到过。也许碰到过,但是大家长变了样子,互相不再认识,但是在网上保持着联系。

说起合唱团,二猫也曾经唱歌跑调来着,但是同一时期却一直保持着绝对音高的听力。在小学的小提琴班老师拉了音符,没有参照,让大家听。她说,是re吧。老师说,大家看一下,这就是听绝对音高。二猫在合唱团练,我在外面走廊里听。和声一起,天籁之音。并不跑调。

除了音乐,也练了舞蹈。中国舞10级,非常容易就拿到了,因为柔韧性非常好。别人哭着喊着压腿压腰,她趴那都睡着了。然而,我们说好了,过了10级就再也不练了,她实在是不喜欢。家长也要言而有信。

与舞蹈相关的,中考体育选了坐姿体前屈,非常容易就可以满分了。不过,参加了辅导班,感觉非常值得。即使容易满分,教练也能给出方案使得更轻松一些,怎么热身,怎么压还是发力,训练时如何利用不对称。跳绳也很容易就满分了,特别是换了好绳;还有教练第一次三两分钟就指出,歪,哪面容易挂住,以及身体前倾这样的技术要领。我们一度担心过的800米,进步也很快,虽然不能满分,也可以高分通过,也许能扣0.3分?不过后来因为疫情后同学们纷纷阳性,中考取消了800米。

钢琴考到央音8级,不好考的那种。视唱练耳老的三级也过了。9级没过,想再练,被我拦住了。我说,孩子,你现在信息学投入这么多时间,钢琴没有足够时间练不可能过去。她说,不过也可以练啊。我说,9级学习挺贵的。她没有再学9级,不过我听起来相当难相当壮丽的曲子已经可以在一周左右练成了。在初中班级的联欢会上表演过。在马上就要中考之前,最后一天在校的时候,跑到大厅弹了一通。中考之前的晚上,在家又弹。这样就很好。

从小学四年级开始,学习以外花时间最长的是信息学,成了非常牛的学姐的小迷妹,认识了很多特别厉害的学长学姐,信息学内外他们都有非常广泛地讨论。未来还会继续学,她仍然保持着狂热,希望作为职业。

小时候的记忆,二猫有些忘得干干净净。几年前我瞎编磁性球的数量不对,她被诈出来说还记得更早的几年前曾经掉到床后一个。这个故事不知道她是否还记得了。不知道她是否还记得,冬天在伊通河回来的路边,厢式车的下面藏着的那个最好的冰溜子。

持续学,一直作为职业的,保持狂热的,是永远也不会忘掉的。即使忘掉的那些,虽然不再是记忆,也已经成为我们的一部分,恒久地影响我们的选择和不断塑造我们。再过很多年,也许我们会忘掉这个特别炎热的夏天。也许会忘掉剧烈变化要么酷热要么暴雨的夏天,在这个夏天中考结束了初中的学业,结束了义务教育阶段。我们也许会忘记如何连接在一起,忘记很多细节,然而我们仍然切实感觉到,正如春风拂面。

微信图片_20230629221117

批量压缩歌曲

有时候听歌。好像停留在了某个阶段不再成长了,所以绝大多数歌曲对我都太新。像刘德华《忘情水》,还有孙燕姿(非AI的那位)《绿光》,老狼《同桌的你》《白衣飘飘的年代》《B小调雨后》,在我听来都是非常新的歌,才听到没多久的感觉。相应的,更新的歌由于基本没听过,就都感觉特别陌生。嗯,就是上古戏曲古董突然听到五四音乐的感觉,有点排斥。所以,当老朋友给我一大批听起来非常熟悉亲切的老歌的时候,我的愉悦可想而知。这旋律,这钢琴或提琴的伴奏,这……原来这首歌的首唱是他/她啊,不如后来谁谁唱得好,怪不得没流行。

过了一段时间,硬盘空间又告罄。删了一段时间各种宝物,今天轮到这些歌了。

2.5G空间可供回收。或者移到移动硬盘,不过那样可能得很久之后才能听了,因为不是顺手就能做的,可能就不做了。删除之前,突然注意到文件扩展名是 .WMA,每个文件10M左右。MP3就可以啊,虽然WMA采样率可能更高,奈何我的音箱以及耳朵没有多么优秀,白白浪费。

压缩一下。

第一步 改名,去空格

为了后续转换能成批操作,我查看了文件名。有的文件名中存在空格,这会要求转换命令中作为文件名的参数必须外加引号括住。需要额外的工作,不如统一把空格去除。

例如:

东北师大校歌 – 老年合唱团版 .wma

改名为

东北师大校歌–老年合唱团版.wma

操作的方法是 用 Total Commander 全选文件,然后 File | Multi-Rename Tool。左上红框中是目标文件,[N]表示原名不增加日期、时间、序号之类。右上红框,Search for中有个 空格,这样就把所有空格替换为 无。

有些同学在描述这一步的时候可能会称为“预处理”——凡是正式行动之前的都是预处理,如果有若干步需要区分,就分别叫 预处理1,预处理2,预处理3。

第二步 遍历文件

Total Commander据我所知不提供 选中以后提交给某个工具处理 这样的功能,还得用 shell 之类的工具,才能指定这200多个文件都需要操作。即 遍历,这些被遍历的文件都执行相同的操作(题外话,在STL和SICP中也有类似思路)。

我隐约记得 linux 下几种 shell 如何遍历文件,但是我的座机 bash shell 下默认不搜索 ffmpeg 这个转换工具。用windows的批处理吧,我语法不熟悉,搜索。

用 bing,关键词:bat 遍历文件。

第一条命中。

写日志,避免以后引用或要查找的时候忘了。

这条指令与我记忆中长得非常像,差不多。(切手指长小段焯水晾干)备用。

第三步 压缩 格式转换

优秀工具ffmpeg有这个功能,语法我记不清了,猜测是

Ffmpeg -i 输入文件.wma 输出文件.mp3

压缩比,比特率,采样率之类的都用默认值。

差不多,(勾芡大火爆炒出锅晾凉)备用。

第四步 技术原型试验

我才不会直接在任何宝物上实施写操作。万一写错了,把宝物写坏了写没了怎么办。打游戏时凡重大事件以前,必save以备load。

在当前目录下随便建个目录,起名 1 (随便起的,一会儿就删除)。把十几首歌曲复制(不是搬移)进去。

在目录1下建个批处理文件,名字是 1.bat(随便起的,一会儿就删除)。1.bat的内容如下。

for %%i in (*) do ( ffmpeg -i %%i %%i.mp3)

命令行下(在Total Commander按ctrl-下键),在目录1下运行1.bat。不到一分钟,mp3文件生成了。播放,效果不错。原有wma仍在。

以上说明技术原型验证通过。

第五步 操作

把所有wma文件复制(不是搬移)到目录1(这是操作台)中。

命令行下,在目录1中执行1.bat。等。

第六步 估算

从下图中可以看出,这首歌典时长将近4分钟,转换速度为50倍速左右。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\1686816594230.png

歌典大约250首,需要转换多久呢?

每首转换需要 4分钟*60秒/分钟/50倍速,约4秒左右。

250首*4秒/首,合约16分钟。

已转换得到的mp3每首大小约3~5M,与经验中的每分种1M相符。原WMA文件每首10M左右,这样压缩比约0.3~0.5。

还有十多分钟,正好写博客。

十多分钟后转换结束,时间估算正确。MP3占用文件1M,原WMA约2.5G,压缩比0.4,估算准确。

第七步 清理

不,不叫做 后处理。

把目录1递归删除。

把WMA文件搬移(复制后删除原文件)到移动硬盘,在日志中记录目标硬盘的卷标。

把mp3文件都移到 "music 一人一首成名曲 252首 mp3"目录下。

运动会的回忆

这几天学校运动会,朋友圈和群里热火朝天。看大家集合在雨里走方队,看大家动员和争先恐后报项,持续了一两个星期。决赛之前亮哥在群里借钉鞋。我们叮嘱,岁数不饶人,可别伤到了。他说,预赛的时候别的组都穿钉鞋,被欺负到了,决定一定要欺负回去。

不由得回想起我参加过的运动会。

在所有的运动会里,我大多是作为观众出现的。比你想像得无聊。因为我小学就开始高度近视,而我所在的文化氛围和经济状态都不允许使用望远镜,什么也看不到,就是操场上模糊 一片,所以我从来也没有享受过运动会的快乐。

多数情况下不允许欢呼,除了有指挥的时候。一二三、三二一、一二三四五六七。拉歌,一二三四五六七,我们等得真着急。你可以想像什么也看不清,目标、敌人、友军,什么也看不到,就跟着瞎喊。很久以后我才知道,有些同学可以看到远处有人在跑,甚至能辨认出跑的人是谁。

先是在运动会前排练出上述效果,便装。运动会当天,要穿统一服装。穿过白衬衣黑裤子,穿过黑西服裤子随便。有的是向家长借的,有的是礼服,运动会和祭扫烈士陵园的时候要穿。那应该是最初体会到上级的偶尔灵机一动会带来多大的麻烦。比如小学四五年级,在西册体育场参加全市运动会。参加,我的意思是作为观众。要求戴大檐白帽,就是那种展开特别大个儿,边缘是钢丝,可以非常神奇地拆三折成为直径十多厘米的遮阳帽。特别特别白,比用加了钢笔水洗过的白鞋还亮上几分。模糊有记忆六元或者三十元一顶。之所以对价格如此敏感,是因为在那之前的运动会要求买了小白遮阳帽,就是日本动画片里小朋友常戴的那种。但是之前的小白帽不行,必须买新的。并非垄断,随便去哪里买都行,但是随便哪里都不会更便宜。

我没买,刚好要去修牙还是配眼镜,请假成功了。修牙或者配眼镜结束了,时间还早,我去了西山体育场,还找到了班级。老师让我坐在最后一排,看着我戴着不算数的小白帽子,跟我聊天“真热啊”什么的,突然问“你是不是没有帽子啊?”

除了当观众的礼服,还要准备检阅的制服。前文提到,我几乎总是观众而不是运动员。但是几乎每次运动会我都参加检阅。直到大学我才知道,那个检阅的意思是——作为运动员,在开赛之前向主席台(以及绕场一周向所有观众)展示自己。尽管我不是运动员,也要参加检阅。另外,大学以前我就知道,第一个项目即百米短跑的运动员不参加检阅,因为时间不够检录。所以,应该由全体运动员参加的检阅这一程序,有些运动员没有参加,有些参加的人不是运动员。

小学二三年级的检阅要求必须穿运动服,我们当然没有,所以绝大多数同学穿的是线儿衣。如果你不知道线儿衣是什么,可以想像为某种内衣,长及手腕和脚腕,并且手腕和脚腕有松紧带。后来的检阅要求西装,我们还颇奇怪了一下,运动员不是应该穿运动服么?直到在电视上奥运会我看到装西服的入场式,才知道,原来所有的人都可以有许多套衣服,不止拿破仑的妻子或大林和小林里的贵妇人(坏人)才可以有。

检阅以后就是老实坐在观众席上了,在强调运动的场合一动不动。以便取得精神文明奖,这是我作为观众能为班级做的最大的贡献了吧,如果没有拖后腿的话。

举牌子作为背景拼字的活儿也干过。在某个场景里,我似乎是腾飞的腾字里的某个撇的末端。某他的那些场景我就知道自己是哪个像素了,总之是在哨场响起的时候,举起被规定的颜色的方块。并且听到此起彼伏的“我看看谁又错了”“你哪个班的怎么回事”“这么简单的事也做不对呢”。我从未出错过,但是指挥的呵斥令我战栗。战栗到有同学嘲笑过我。在指挥老师不名批评某位同学没站直的时候,嘲笑我的同学告诉我当时我的手指当时已经开始反卷了。然而被不点名批评的同学仍然持续被呵斥,我的手指就反卷得更厉害。事实上,大部分同学都从未出错过,不然以那么短的训练时间主席就没机会看到我们集体的结晶了。但是我们一起被呵斥,“某个同学!”“我看还有人!”。

除了举牌子,还有打竹板。相当震耳朵,我怀疑分贝数可达100左右,应该会永久影响听力。不过比拍手掌强,至少不夹到手的话不疼。还摇过装满钱的罐子。那是大学生运动会还是长春市什么的运动会,大学的时候要求我们参加的。要求每人准备两个易拉罐,不记得对品牌是否有要求了。喝光(是的,得先花钱买到内有饮料的,然后才能喝光),里面放上十枚钢镚。有同学找不到硬币,装上石子问老师,这行不?当然不行。同寝某同学缺几个硬币(还是易拉罐?总之是某种资源),我赠送给他。后来发现我自己也缺,向他要几枚硬币,他死活不给。坏小子们哈哈笑,我也笑,我说:我就这么举着空罐,不放硬币。既轻了很多,又没有人知道,谁还能去特意听某个具体同学的贡献有几分贝吗。

还是长春市这次运动会,在南岭体育场举行。人山人海,要求不得上厕所。我非常听话,在每个节点都按要求“这是最关键的时候”“最最关键”“最最最关键”“最最最最关键”忍受,直到忍不住了肚子疼得厉害。我挪到后排,被一位校园委的老师截住,“你干什么!”我说我上厕所,快憋不住了。他说“这是最关键的时候,你再忍一会,马上就结束了”。我没说话,也许说了“我忍了这么长时间都没去”,不记得了。只记得我迈进了一步,他及时让开了。我对无穷尽地“再忍一下”“最关键”这种没有边界不知进退地“再加一点要求”真是忍无可忍,所以对谈判中试图在划定的底线以后再前进哪怕一小步的,就结束谈判。

运动会持续一整天,彩排有时还持续几个整天。在日落时分,领导会出现,讲话。初三的彩排,我们走方队晒得头昏眼花,校长来了。他说,“我只讲四句话。”我们哗哗鼓掌。他开始第一句,“第一句,好!”他举着喇叭声音嘹亮,我们又响亮地鼓掌。他接着说,“为什么好呢?”然后接下去开始解释为什么好。很久以后才是第二句以及对第二句的解读。然后是第三句,以及对第三句的解读。然后是第四句,以及对第四句的解读。如果我不这样按部就班地写出来,你怎么能体会我们的无聊和愤怒。“这TM不识数吧”,这是当时窃窃私语地主要评价,我奇怪他没有听到。第四句并不是结束,还有总结。

结束前,我们还会为精神文明奖第几,或者第几个被宣布的,为这些纠结很久。我们二班才是最特殊,最优秀,最应该被承认的。也许是二班吧,从小学到初中到高中,到大学,引用李逵的说话,我真的不记得这许多班级到底都是几班了。不过,我们是最特殊,最优秀,最精神文明的,这点我没有忘记。如果是四班,那么就是四班四班我们最强。如果是十八班,那么换个口号。不得性别歧视,所以不能叫十八罗汉最棒。同样不得性别歧视,所以不能叫十八姑娘一朵花。不得涉及宗教,所以不能叫十八层地狱最怎么样。我们需要在运动会以前很久就开始编这套最适合我们的口诀;准备好各种道具,跟家长要钱买或者借,如果这是一次性的可真是糟糕得很,每次运动会都会再次回顾并得到败家的差评;全程做个乖乖的观众,不准说话不准动。

除了做观众,我还一直是报道组成员,就是那个“三年二班报道组来稿”,经常几个人包揽本班所有稿件。我们在运动会前一天,拿着项目单,像亲眼看到一样,把接下来要用的稿件全写出来。有说的,有写的,有抄稿的。运动会当天,还有送稿的,和临时加写稿件的。

也临时做过运动员。跑过110米栏,就是刘翔那个项目。我前一天学的,能左右脚分别上栏。第一次也是唯一一次听到发令枪。听到身后同跑的那位稀里哗啦的踢着,我一个障碍也没有踢倒。然而,我跑得非常慢,预赛就被淘汰了。差一名?直到将近三十年后,在讨论孩子的体育达标时zhumao和向龙教我,还有tiger他们教我,“你的腿倒腾得太慢了啊。”我才知道,不止应该迈大步。

我还跑过5000千米。因为全班谁也不上,只好我去,为了不扣分。体委和我一起去的,他中途退场了,我更需要跑下去。全程是跑的,没有走的时候,保持了运动员的基本尊严。被倒数第二名扣了一圈,到终点的时候体育老师说“你可算到了”。

后来参加过教工运动会。连长叫我替跑过,充个数。还有个三块砖往前挪的项目,我意外地协调,超过第二名老大一截。后来?后来太快了,大意了,掉了下来,没有成绩。还参加过自行车慢骑。我有辆特别小的自行车,在跑道里原地转圈,能向初发点骑回去。准保慢得第一吧。裁判说,不算,违例。我拿出写着规则的纸件来问,非常想知道违哪条例了。大家都劝我算了吧算了。

算了,我觉得大家说得有道理。我闭了嘴,不再讨论,也不想知道错哪了,以后再没有参加过运动会。

修煤气灶 v2.0

本文v1.0中提到的方法有危险,请不要模仿!

本文v1.0提到用绝缘胶带缠绕点火线,经 柳喵喵 和 笑一个 两位指出,在高温环境下有危险。请不要模仿我的做法。后来我购买了点火线换上,不到10元钱,拆卸旧的和换上新的都不困难。

修煤气灶 v2.0

本文v1.0中提到的方法有危险,请不要模仿!

本文v1.0提到用绝缘胶带缠绕点火线,经 柳喵喵 和 笑一个 两位指出,在高温环境下有危险。请不要模仿我的做法。后来我购买了点火线换上,不到10元钱,拆卸旧的和换上新的都不困难。

V 1.0

一起床,二猫妈说煤气灶的右侧灶孔不会打火了。测试一下,有打火的声音,非常小;煤气正常。左侧灶孔正常是电路的问题,并且说明左右两侧电路是独立的。

在网上查了一下,可能是线路中间有打铁(和地线短路),也可能是高压 (发生?)器坏了。

两个灶孔旁边分别拆下3个螺丝。

图示为 拆掉3个*2组螺丝,拔掉旋钮,就可以打开顶面板了。

C:\Users\young\AppData\Local\Temp\WeChat Files\1d3b228058432537a7e42a5153c9d60.jpg

硬用力,把面板和底层脱开。右侧脱开得晚一些,左半边很容易就打开了。得下定决心,能拆开,暴力一下。拆不开上面板时,还拆下过煤气管的加固螺丝,后来看到与它无关。

图示为 右侧灶口的点火线,原本通过右上方的两个塑料卡扣固定,已经从里面拆出来了。

发现导线与灶口附近的铁柱打火,再仔细检查,导线的绝缘外皮有一处裂了。

图示为 点火线有一段烤黑了,有一处绝缘层裂开。裂开的地方和灶口的铁脚之间打火。

C:\Users\young\AppData\Local\Temp\WeChat Files\ab5ce5b9278c76bf3aadc3ff12f7473.jpg

原理判断,因为提前打铁,所以灶孔处没有电火花点火了。

准备加绝缘层。

测试一下解决方案是否有效。在导线和铁柱之间插圆珠笔。导线和圆珠笔打火。

把导线移到离铁柱远一些的地方,把塑料锁扣也移过去一个。孔有点小,对付把卡扣插进去了。导线缠上绝缘胶带。好了,灶孔可以电火花点燃煤气了,说明解决方案有效。

缠绝缘胶带时的操作空间很小,用了前一段在小视频里学到的方法。把绝缘胶带先缠在一截方便筷子上,用筷子作为胶带的轴,把胶带缠在导线上了。

图示为 在裂口处缠上绝缘胶带。

C:\Users\young\AppData\Local\Temp\WeChat Files\80608545345e442cc87e50be55fd328.jpg

图示为 改动布线,让点火线远离铁脚,减少导线受热。原本导线从右上白色卡扣穿过,再贴近铁脚进入灶孔下方。

C:\Users\young\AppData\Local\Temp\WeChat Files\0bcae62b52a23b83c39e9cee939ab2a.jpg

遗留问题有 1.导线固定比原来松动,如果有晃动或者其他原因导线可能移位,靠近金属的话可能再次提前打铁;2.绝缘胶带的介电常数可能还是不如原装的导线绝缘层,毕竟我们一般认为空气也是绝缘的,但是在绝缘层破裂的地方和灶孔点火处被高压轻松电离击穿了。

此处有个安全隐患,是在V1.0当时没有发现的,即经 柳喵喵 和 笑一个 两位指出,绝缘胶带在用火的环境下不安全。

V 2.0

在淘宝买了新的点火线。笑一个 之前指出过,不贵,10元以下。就选了买家最多的一种,6.5元,包邮。

为了拆下旧的点火线,需要把灶孔从基座上拆下来。下图的这个位置在 V1.0 中令我非常犹豫,看不清楚连接的结构,没想清楚需要拆几个螺丝。

在网上看了个视频,此处也跳过了。不过看 up主 动作轻巧的程度,我怀疑“就那么”就能拿下来。果然。灶孔与灶气管线之间,是没有任何锁死装置的,双方都用螺丝固定在基座上。拆下灶孔以后,如下图所示。

下图,拆下旧的点火线,与新的对比。

上图中,下方的是新点火线,两个螺丝之是夹住煤气灶的钢板,以固定点火的高度。上方的是旧点火线,用弹簧和卡扣固定。

下图,新的点火线安装完毕,灶孔固定回基座上。

C:\Users\young\AppData\Local\Temp\WeChat Files\26211bd86ca2b750a15b3314114fe03.jpg

下图,点火线的另一端与基座上的接口连接,硬插进去,插到我用手拔费劲的程度。下图中红色的是新点火线,左侧的截面方形的白色小盒是左灶孔的旧点火线。

C:\Users\young\AppData\Local\Temp\WeChat Files\57dd21092860959ed866cfd111e5dd5.jpg

下图中三个红箭头所指的是新点火线。顶视图。

后来想想不对,应该令点火线远离煤气管,左侧的现状和右侧的原始状态才是对的。改回大致原始的走线位置,参照左侧的角度远离铁脚。

无标题

再看一眼旧线的结构。

下图展示的是绝缘层裂开和烧黑的部分,与线的其余部分的颜色对比。

C:\Users\young\AppData\Local\Temp\WeChat Files\df8e967bacdffdefe1f6b6a1a53d6e5.jpg

再次感谢 柳喵喵 和 笑一个 两位指正。

V 1.0

一起床,二猫妈说煤气灶的右侧灶孔不会打火了。测试一下,有打火的声音,非常小;煤气正常。左侧灶孔正常是电路的问题,并且说明左右两侧电路是独立的。

在网上查了一下,可能是线路中间有打铁(和地线短路),也可能是高压 (发生?)器坏了。

两个灶孔旁边分别拆下3个螺丝。

图示为 拆掉3个*2组螺丝,拔掉旋钮,就可以打开顶面板了。

C:\Users\young\AppData\Local\Temp\WeChat Files\1d3b228058432537a7e42a5153c9d60.jpg

硬用力,把面板和底层脱开。右侧脱开得晚一些,左半边很容易就打开了。得下定决心,能拆开,暴力一下。拆不开上面板时,还拆下过煤气管的加固螺丝,后来看到与它无关。

图示为 右侧灶口的点火线,原本通过右上方的两个塑料卡扣固定,已经从里面拆出来了。

发现导线与灶口附近的铁柱打火,再仔细检查,导线的绝缘外皮有一处裂了。

图示为 点火线有一段烤黑了,有一处绝缘层裂开。裂开的地方和灶口的铁脚之间打火。

C:\Users\young\AppData\Local\Temp\WeChat Files\ab5ce5b9278c76bf3aadc3ff12f7473.jpg

原理判断,因为提前打铁,所以灶孔处没有电火花点火了。

准备加绝缘层。

测试一下解决方案是否有效。在导线和铁柱之间插圆珠笔。导线和圆珠笔打火。

把导线移到离铁柱远一些的地方,把塑料锁扣也移过去一个。孔有点小,对付把卡扣插进去了。导线缠上绝缘胶带。好了,灶孔可以电火花点燃煤气了,说明解决方案有效。

缠绝缘胶带时的操作空间很小,用了前一段在小视频里学到的方法。把绝缘胶带先缠在一截方便筷子上,用筷子作为胶带的轴,把胶带缠在导线上了。

图示为 在裂口处缠上绝缘胶带。

C:\Users\young\AppData\Local\Temp\WeChat Files\80608545345e442cc87e50be55fd328.jpg

图示为 改动布线,让点火线远离铁脚,减少导线受热。原本导线从右上白色卡扣穿过,再贴近铁脚进入灶孔下方。

C:\Users\young\AppData\Local\Temp\WeChat Files\0bcae62b52a23b83c39e9cee939ab2a.jpg

遗留问题有 1.导线固定比原来松动,如果有晃动或者其他原因导线可能移位,靠近金属的话可能再次提前打铁;2.绝缘胶带的介电常数可能还是不如原装的导线绝缘层,毕竟我们一般认为空气也是绝缘的,但是在绝缘层破裂的地方和灶孔点火处被高压轻松电离击穿了。

此处有个安全隐患,是在V1.0当时没有发现的,即经 柳喵喵 和 笑一个 两位指出,绝缘胶带在用火的环境下不安全。

V 2.0

在淘宝买了新的点火线。笑一个 之前指出过,不贵,10元以下。就选了买家最多的一种,6.5元,包邮。

为了拆下旧的点火线,需要把灶孔从基座上拆下来。下图的这个位置在 V1.0 中令我非常犹豫,看不清楚连接的结构,没想清楚需要拆几个螺丝。

在网上看了个视频,此处也跳过了。不过看 up主 动作轻巧的程度,我怀疑“就那么”就能拿下来。果然。灶孔与灶气管线之间,是没有任何锁死装置的,双方都用螺丝固定在基座上。拆下灶孔以后,如下图所示。

下图,拆下旧的点火线,与新的对比。

上图中,下方的是新点火线,两个螺丝之是夹住煤气灶的钢板,以固定点火的高度。上方的是旧点火线,用弹簧和卡扣固定。

下图,新的点火线安装完毕,灶孔固定回基座上。

C:\Users\young\AppData\Local\Temp\WeChat Files\26211bd86ca2b750a15b3314114fe03.jpg

下图,点火线的另一端与基座上的接口连接,硬插进去,插到我用手拔费劲的程度。下图中红色的是新点火线,左侧的截面方形的白色小盒是左灶孔的旧点火线。

C:\Users\young\AppData\Local\Temp\WeChat Files\57dd21092860959ed866cfd111e5dd5.jpg

下图中三个红箭头所指的是新点火线。顶视图。

后来想想不对,应该令点火线远离煤气管,左侧的现状和右侧的原始状态才是对的。改回大致原始的走线位置,参照左侧的角度远离铁脚。

无标题

再看一眼旧线的结构。

下图展示的是绝缘层裂开和烧黑的部分,与线的其余部分的颜色对比。

C:\Users\young\AppData\Local\Temp\WeChat Files\df8e967bacdffdefe1f6b6a1a53d6e5.jpg

再次感谢 柳喵喵 和 笑一个 两位指正。

修煤气灶 更正中

本文中提到的方法有危险,请不要模仿!
本文提到用绝缘胶带缠绕点火线,经柳喵喵笑一个两位指出,在高温环境下有危险。我正在购买准备更换点火线,完成后回来更正本文。请不要模仿我的做法。

一起床,二猫妈说煤气灶的右侧灶孔不会打火了。测试一下,有打火的声音,非常小;煤气正常。左侧灶孔正常是电路的问题,并且说明左右两侧电路是独立的。

在网上查了一下,可能是线路中间有打铁(和地线短路),也可能是高压 (发生?)器坏了。

两个灶孔旁边分别拆下3个螺丝。

图示为 拆掉3个*2组螺丝,拔掉旋钮,就可以打开顶面板了。

C:\Users\young\AppData\Local\Temp\WeChat Files\1d3b228058432537a7e42a5153c9d60.jpg

硬用力,把面板和底层脱开。右侧脱开得晚一些,左半边很容易就打开了。得下定决心,能拆开,暴力一下。拆不开上面板时,还拆下过煤气管的加固螺丝,后来看到与它无关。

图示为 右侧灶口的点火线,原本通过右上方的两个塑料卡扣固定,已经从里面拆出来了。

发现导线与灶口附近的铁柱打火,再仔细检查,导线的绝缘外皮有一处裂了。

图示为 点火线有一段烤黑了,有一处绝缘层裂开。裂开的地方和灶口的铁脚之间打火。

C:\Users\young\AppData\Local\Temp\WeChat Files\ab5ce5b9278c76bf3aadc3ff12f7473.jpg

原理判断,因为提前打铁,所以灶孔处没有电火花点火了。

准备加绝缘层。

测试一下解决方案是否有效。在导线和铁柱之间插圆珠笔。导线和圆珠笔打火。

把导线移到离铁柱远一些的地方,把塑料锁扣也移过去一个。孔有点小,对付把卡扣插进去了。导线缠上绝缘胶带。好了,灶孔可以电火花点燃煤气了,说明解决方案有效。

缠绝缘胶带时的操作空间很小,用了前一段在小视频里学到的方法。把绝缘胶带先缠在一截方便筷子上,用筷子作为胶带的轴,把胶带缠在导线上了。

图示为 在裂口处缠上绝缘胶带。

C:\Users\young\AppData\Local\Temp\WeChat Files\80608545345e442cc87e50be55fd328.jpg

图示为 改动布线,让点火线远离铁脚,减少导线受热。原本导线从右上白色卡扣穿过,再贴近铁脚进入灶孔下方。

C:\Users\young\AppData\Local\Temp\WeChat Files\0bcae62b52a23b83c39e9cee939ab2a.jpg

遗留问题有 1.导线固定比原来松动,如果有晃动或者其他原因导线可能移位,靠近金属的话可能再次提前打铁;2.绝缘胶带的介电常数可能还是不如原装的导线绝缘层,毕竟我们一般认为空气也是绝缘的,但是在绝缘层破裂的地方和灶孔点火处被高压轻松电离击穿了。

 

GPT AI结对编程初体验

入口

chatGPT火了一段时间,我没试,因为我不想翻墙。因为什么?翻墙违法啊,你不知道?我还在观望之中的时候,GPT-4又来了。火的东西多了,承诺多大令人失望,所以我没有着急。

宝玉xp说:

大家快来测试一下集成GPT-4的编辑器Cursor (cursor.so)

我心想,你们测,我围观。

宝玉xp又说:不需要订阅Copilot,不需要API Key。

我在同学们的群里转发了这条消息

https://m.weibo.cn/status/4880070764400024?wm=3333_2001&from=10D3193010&sourcetype=weixin&jumpfrom=weibocom

老学生位同学试了两下,说:不错哎。

并且给出了“生成unity和手柄交互的代码”的体验说“非常好用!”,还有查资料“about WebRTCaudio/video streming”,看起来不错。

安装 https://www.cursor.so/ 到 sandboxie 中试一试吧。

看示例文件的后缀,支持 python 和 js。看配置和实测,C/C++ 也没问题,还有不少语言。

提要求用 汉语或英语都行。

贪吃蛇,业务逻辑,修改需求

做了个贪吃蛇,JS版本。确实强大,连HTML主体都是GPT写的。Ctrl+K提要求。我的要求主体是:生成一个贪吃蛇游戏,JS版本。

为了增加难度,我在初始的要求增加了细节:用 O 作蛇头,用 X 作为食物,用 + 作蛇身。

我增加要求初始蛇身长度3。

我修改按键,由 上下左右 改为 WASD,又改为 HJKL。

甚至不必指出WASD和HJKL哪个键对应哪个方向,他能猜出来。说明玩过反恐精英,习惯使用VI编辑器。

调试最长的时间花在了我的浏览器有插件拦截HJKL按键,运行的时候按键总是不好使。为了找到问题的原因,我要求按键的时候播放声音,要求蛇每走一步播放声音,代码正确。没声音,Ctrl+L聊天,我问为什么没声,他告诉我非常可能受浏览器权限影响的,还告诉我如何解决。我要求按键时弹出窗口,显示按键的字母。这样,发现了按键没被产生 event,进而想到了插件拦截。远程辅助调试的时候,对现场环境的依赖,确实是个难点。需要人类承担责任的部分,得由人工操作,人工是最大的bug。

后来要求用 NENU 作蛇身,代码看起来对的,但是按键不好使了,这条线索没有继续。

我还试了 flappy bird,要求把 管道pipe 改成 柱子column。正确。

不能写论文

同学和同事都说,让他写论文吧。

C:\Users\young\AppData\Local\Temp\WeChat Files\9c02d5e5f8fce6ef01c9c2ca153e759.png

论文不能写,因为是编程专用的。

专用的,不打算聊别的。

解读代码

Zhumao贴来一段代码,问,这段代码能读懂不。

我问了。

他知道这是手动循环展开,还告诉这种优化方法过时了。

俄罗斯方块,逐步提示

我说 写个俄罗斯方块,控制台版本的。

没写完啊。所以我要求继续。之前也见到过代码明显不完整,我问“后面还有吗”,他就继续。

我要求展开函数。

继续展开下一个函数。

怎么旋转方块呢?可以接受或拒绝。

业务逻辑差不多应该就是这样。不过Dijkstra说了:我困惑,数据结构什么样呢?

他不仅回答问题,还委婉偷摸地纠正我的说法。

我要求写一段 L形方块的初始化,然后指着那段代码问,这段代码放在哪里合适呢。

在之前我改乱过一段代码,也回答过我,某段JS代码要放在某个类的构造函数里。

优化和代码风格

要求写个 sin 函数实现,用拉格朗日展开。

// 用拉格朗日展开求sin函数,JS版本

function lagrangeSin(x, n) {

let sinX = 0;

for (let i = 0; i < n; i++) {

let term = (-1) ** i * x ** (2 * i + 1) / factorial(2 * i + 1);

sinX += term;

}

return sinX;

}

function factorial(n) {

if (n === 0) return 1;

return n * factorial(n - 1);

}

以上是上课常讲的故事的第一个高潮,接下来查表法。

// 用查表法实现sin函数,JS版本,精度为角度制 1度

const sinTable = [];

for (let i = 0; i <= 360; i++) {

sinTable[i] = lagrangeSin((i * Math.PI) / 180, 10);

}

function tableSin(degrees) {

const index = Math.round(degrees) % 360;

return sinTable[index];

}

他用拉格朗日展开填表,不够硬。要求硬编码。

给出的硬编码不够多。

填充sinTable[i]的值,i从0至50。不在运行时使用lagarangeSin求值,hardcode.

他像循循善诱的老师“你就这么整就行,例子是这样的……”,我像不争气的学生“你就告诉我答案吧。”

换个算法,用泰勒级数展开,还是求sin。

大E同学说,这家伙会递归。

好吧,我指着 factorial函数说:用迭代法重写求这个。

再快点,用查表法。

再高深一点,用动态规划,我告诉他要实现的函数原来长什么样。

像不像面试题?

写个 strcat,避免内存泄露,效果尽可能高。

逐步引导,几次修改要求。

// Function to concatenate two strings without memory leaks and with high efficiency

// Returns 0 on success, -1 on failure

// Check if the source string is longer than the allowed limit

// Check if the length of dest is larger than src

体会

有同学说:没希望了,想摆烂。

上图来自网上,是电影《喜剧之王》的截屏。

另一个体会是 语言表达和逻辑越好,优势越强。不用牙齿和爪子以后,石刀石斧需要适应。也许新的时代就要到来了,AI作为生产力的利器,淘汰一部分岗位,同时创造新的生产方式。

 

半自动加工了一本电子书

本文讨论半自动化手段,使用多种工具(git bash shell, total commander, grep, sed,还涉及到正则表达式、CSS、HTML),从多个网页加工出一本电子书的过程。纯技术讨论,书本身只作为技术讨论的案例和素材。所以,书是哪本不重要。

读大学本科的时候,读过一本小说,当时感觉惊为杰作。杀手和侠义的现代故事,反恐相关的,读得热血沸腾。后来很多年偶尔还会想起,但是当年买的纸质品已经不知道在哪个故纸堆里积灰,找不到了。

最近突然想到,为什么不自己做一本,留着以后有时间的时候重温呢。

1. HTML下载

电子版在 zlib 和 jiumodiary 都没有找到。在学校图书馆找到了纸质品,在本部储备库 在架上 , 本部中文文二储备库 ; I247/012,是作者自选集长篇小说中的一本。

用bing搜索引擎,找到一个,在这里。

https://yiduhkk.com/art_7589_7182.html

网站把这本书切成了79小节。提供TXT下载,需要注册,这条线索舍弃。

选中这79个链接,用 SingleFile保存成html。

看起来大概像下图这样。为清晰起见,在下图中,我只选择了部分链接,实际操作中所有79个链接都在其中。

2. 文件改名

保存的结果,文件名大致如下。

《苦界》 第1节 易读 (2_15_2023 5_29_04 PM).html
《苦界》 第2节 易读 (2_15_2023 5_29_18 PM).html

使用 Total Commander 批量改名。Ctrl-M,可以用正则表达式、可以去除文件名改为用序号,等等。

得到了以序号命名的文件名,如下。

01.html
02.html

3. 剪切部分文字

下载到的HTML文件中,有大量的内容不希望保存在电子书中,需要去除。计划用shell脚本调用 sed 和 grep,批量修改HTML的文件内容。在批量操作以前,先在命令行试验参数。

下图中,红框以及红框的顶部还有大量内容,需要去除。

使用正则表达式,在 git bash 中 执行

grep "<div class=ART>.*</div>" 11.html

检查输出的内容,确实是我期待的行,说明正则表达式无误。

grep -Po "<div class=ART>(.*)</div>" 11.html

只输出匹配的部分。

接下来,对所有79个HTML文件用shell批量执行上述命令。类似下面的代码,保存为go.sh,在git bash shell中执行。共79行,每行对应一个文件。

grep -Po "<div class=ART>(.*)</div>" 01.html > 1_01.html
grep -Po "<div class=ART>(.*)</div>" 02.html > 1_02.html
grep -Po "<div class=ART>(.*)</div>" 03.html > 1_03.html
grep -Po "<div class=ART>(.*)</div>" 04.html > 1_04.html

这个shell文件的生成,其中的01.html,02.html这些文件名,以及1_01.html中的01.html,复制自Total Commander。因为常用这个功能在我的 Total Commander中设置了快捷键,ctrl-f2。粘贴时在emacs中按列操作,M-x copy-rectangle-as-kill,M-x yank-rectangle(M-x是按Alt然后x,执行命令)。其余的部分每行是相同的,可以使用emacs按列复制和粘贴,也可以使用emacs宏编辑功能,f3录制宏,按住f4重复到最后共执行78次。也可以使用word或emacs按列编辑这一类的功能完成。

在 git bash shell中执行上述脚本,得到79个HTML文件,每个文件的内容都只有一个div,里面是这一节的文字。

4. 格式微调

用calibre Edit E-book功能把上述HTML文件制作成电子书。用浏览器上传至微信读书,格式糟糕得很。段落开头顶格了没空两字,文字太小,行间距和段落间距乱,目录也一塌糊涂。

以下,每次修改,都制作成电子书-上传至微信读书-手机和浏览器分别检查格式。在没有经验,不知道微信读书APP会如何呈现电子书格式时,只好改改试试。得到一些经验,可惜这些经验对我没有复用的价值,希望对你有用。

可以作为 cat、sed、管道、重定向、CSS、HTML 的应用实例。

4.1 <div class=ART> 和 </div> 换成 <p>

cat 1_01.html | sed 's/<div class=ART>/<p>/g' | sed 's/<\/div>/<\/p>/g'

4.2 首行缩进,段间距

cat 1_01.html | sed 's/<div class=ART>/<p style="text-indent:-2em;padding:2em">/g' | sed 's/<\/div>/<\/p>/g'

4.3 拼接成单一文件

$ cat 1.html >> 0.html
$ cat 2.html >> 0.html
$ cat 3.html >> 0.html
$ cat 4.html >> 0.html

以上,共79行,我使用emacs宏编辑帮助完成。

4.4 shell脚本 原型

$ cat 1_04.html | sed 's/<div class=ART>/<p style="text-indent:-2em;padding:2em">/g' | sed 's/<\/div>/<\/p>/g' | sed 's/<br>/<p style="text-indent:-2em;padding:2em">/g' > 4.html
$ cat 1.html >> 0.html; cat 2.html >> 0.html ; cat 3.html >> 0.html ; cat 4.html >> 0.html

4.5 shell脚本

cat 1_01.html | sed 's/<div class=ART>//g' | sed 's/<\/div>//g' | sed 's/<br>/<p style="text-indent:-2em">/g' | sed 's/<p style="text-indent:-2em"><\/b>/<\/b>/g'| sed '1i <p style="text-indent:-2em">' > 01.html
cat 1_02.html | sed 's/<div class=ART>//g' | sed 's/<\/div>//g' | sed 's/<br>/<p style="text-indent:-2em">/g' | sed 's/<p style="text-indent:-2em"><\/b>/<\/b>/g'| sed '1i <p style="text-indent:-2em">' > 02.html
…
cat 1_79.html | sed 's/<div class=ART>//g' | sed 's/<\/div>//g' | sed 's/<br>/<p style="text-indent:-2em">/g' | sed 's/<p style="text-indent:-2em"><\/b>/<\/b>/g'| sed '1i <p style="text-indent:-2em">' > 79.html
rm 0.html
cat 01.html >> 0.html
cat 02.html >> 0.html
…
cat 79.html >> 0.html

5 加目录

在 calibre edit ebook中的以下两个功能中的任意一个,制作电子书。

按以下流程,用 html tag b 作为标签,加目录。

6. 手动

在微信读书中最前面两个字是乱码,不够完美。可能微信读书APP对HTML的解读依赖于encode国别之类的。

试了几个方案,每种方案的乱码位置不同。最终发现,在最前面加了4个空格,完美。

电子书完美,等有时间的时候就可以看了。

加工过程接近2小时45分钟,写博客接近1小时。什么时候会有时间重读这部分精彩的小说呢?

 

好工具 | pdf电子书剪裁briss

相比epub和azw3等格式,pdf电子书的排版和页码都与纸质相符,适合做笔记和引用。特别是理工科的电子书,公式和图示与正文一样重要,排版不变型非常必要。不过,pdf电子书也有缺点,比如排版与纸质品相同,所以每页上下左右都有相当大的白边/页边距。如果不是用PC机大显示器,而是用ipad读,那么就正文太小、页边距太大了。

有个工具briss https://sourceforge.net/projects/briss/,可以剪掉白边。

操作很简单,而且是可视的,随时预览效果。

运行briss以后,菜单左上角 File | Load File。

读入文件以后效果是这样的。左边是奇数页,右边是偶数页。

读入的PDF文件是亿万星辰先生的著作《D&D演义》,排版仿照了三宝书,在PC机上读起来非常古典,印刷出来也应该很精美。

但是,当不太注重阅读体验的时候,比如在 ipad mini 上,会希望把红框(我加的)以外的部分切掉。

Briss就是为了解决这个问题而设计的。

在上图中,(1)白边表示由briss识别建议切除的部分,(2)微蓝色的部分是PDF页芯/版芯处理成半透明,供操作时参考。左上角和右下角两个柄可以拉动,改变剪切crop 的范围。

如下图所示,我把页芯的范围放大了一些,把左下角的页码包括在内。并且展示了这是偶数页的部分。

如果切掉大部分下半页的图,是这样的。

半透明(alpha通道?)展示,大大方便预览 绝大多数页面 的效果。

对效果满意以后,菜单 Action | Crop PDF,就剪切了,得到新的pdf文件。

我刚刚设置的剪贴范围,效果是这样的,果然丑了很多。原本的细节精致和经典,都没了。

也有些pdf文件,去除页边距以后,页芯大了不少,文字也能因此更容易阅读,效果没有变丑太多,可以忍受吧。

Briss是基于java开发的,可以跨操作系统;发布时已经编译为exe,不必了解JVM。我一直用的版本是0.9,大小9M。虽然并不常用,但是每次装机器都带着。偶尔用到的时候,真方便而且给力啊。不需要的时候它并不会像有些工具那样跳出来大喊“我又干活了”。这类好工具的最大缺点,恐怕是你会忘掉它的存在吧。

 

渔之乐,纯回忆,并非讨论鱼与渔

前几天高烧刚退,体力不足,头脑也还是非常不清楚的状态,稍微有点深度的书都看不进去。微信公众号推荐给我的视频里,有赶海的,一会儿看一个,刷了一整天。

就是那种海边有个几十米的大石坑,用泵排水,见底以后上手摸鱼。有鳗,差点咬到手的,扔到一边,再慢慢捋着装进桶里。有龙虾,螃蟹。有各种石斑鱼,也许叫这种名字吧。名目很多,我不认识这些分类,只知道全是鱼,看视频里的人大呼小叫摸得高兴,我也嘿嘿乐一会儿。阳光,海水,礁岩,久违了的室外风光。看别人乐呵,觉得自己也挺幸福的。

突然,电光闪耀一般,我就想起了小时候。原来,我也摸过鱼,还挺喜欢。

小时候家住的地方叫南山,山上是松林和一层层山,听说过有人走进去没出来的。山下是浑江,浑江堤坝和江水之间,常年有大水泡子。我们最长去的水泡子二三十米见方,沿江的方向比垂直于江的方向长一些,水非常浑,一点也看不到底。附近还有几个更大的,也更危险,我们一般不去。现在想,也许可能是挖沙留下的,也许是讯期江水冲击出来的。

夏天的时候,泡子里有很多像我那么大的小孩。大的不过小学高年级,多数应该还没有上学。有钓鱼的,有捞鱼的。也有游泳的,我们称为洗澡,虽然不在江里而是在泡子里,但是叫做去大江洗澡。晚上的时候回家,身上一层白印,挨揍是免不了的。还被父母在大桥上看到过,喊回家揍。

没有任何急救设施,什么救生圈之类的全没有。塘底全是淤泥,可能还有水草。年龄差不多的一个小伙伴,有一位就在里面淹死了。他兄弟二人,都是聋哑人。听说哥哥那天帮邻居家大娘拎东西上山,就那十几二十分钟时间,弟弟一个猛子扎到水里面了。大家说水面直冒泡,没有人敢下去救。有人说如果他哥哥也在,弟弟可能就得救了。也有人说如果那天哥哥在,哥俩就全交待在里面了。

尽管出了事故,也没有阻拦住任何一个小伙伴再去泡子。也许附近的家长狠揍过孩子们一段时间,也许后来就没有人去了。我记不清了。很多年以后我从大桥上远望泡子,还想过,就是那里啊,形状有点变了。不过水浑黄的,还有土岸崩塌的边缘,也还是那样。一脚踏进去,可能是夏日清凉,也可能就是永诀。

从这个泡子沿江向北,是一大片江滩,有很多大小泡子,串连起来,彼此隐约相通。泡子之间长满各种草和大小卵石。

这些泡子里有很多鱼,我哥带我去钓鱼捞鱼来着。我哥的手很巧,做出的渔具比买的还精致。他折叠牙膏皮做的铅坠,比市场上那种黑乎乎的黑球漂亮多了。扔到水里的时候,像暗器样在水面上一闪,刷地就没进去了。鱼线有时是买的,半透明的,有时是家里的蜡线,能把我手指勒得快出血了也扯不断。还有鱼钩,买的那种是有倒刺的,得从侧面才能捏着,胆战心惊。也用缝衣针放在火上烤,再弯过来。不过,没有这么大的鱼,我爸说这纯粹是糟践东西。鱼饵,从来没见过面食的,后来听说还可以用面炒,非常惊讶。就是从河泥湿的地方,有时柳树下,挖蚯蚓。很粗一条,抻得又细又长,装在小瓶子里。到要用的时候,把蚯蚓串在鱼钩,甩进水里,小心别钩到自己。

正经地,我一条鱼也没有钓到过。大学的暑假,有高中同学带了特别专业的钓竿,我们在校园里的静湖里试过,忘了是谁,似乎是我,钩在鱼肚子上带上来一条。旁边一个哥们用半米长的条帚mi子,抻着胳膊才把鱼线扔到水里,一会儿一条,一会儿一条。这些都是后话了,不过我从小就没有钓到过鱼,一直到这时候才第一条。小时候跟我哥去钓鱼那么多次,鞍前马后的,心智盎然,居然一条也没有钓到么。

我哥还带我去捞过鱼。用纱窗,可能还有纱布,两边用棍子固定。撑起来,大的鱼网一边一个人,边霍搂(搅拌)边探着底往前走。小的鱼网一个人负责,一只手撑一边,也是边抖擞边前进,河底的泥全翻上来,像乌云一样,水里什么也看不到。低头猛冲一阵,抬网,有时里面就有鱼翻着白肚跳。课文里怎么说来着,高兴地直跳,就像高梁笑红了脸,谷子笑弯了腰,都争先恐后地等着被我们抓。

说得这么热闹,用这个方法,我只抓到过一条鱼。我哥和小三儿两人是大孩子,䠀着水这儿一下那儿一下,我只有资格在岸边看。有时候荣幸,可以在他们对面负责赶鱼,按指挥的路径,“这边是沙子底”,更多时候傻站在那儿看他们越跑越远,绕到长草后面,拐进另一个泡子里了。我有一次把一面小网铺开,上面压了一块石头。过了一会儿起网,居然网到一条小鱼。唯一的一次。

应该就是这么个场景:特别热,我浑身都是花纹,光着脑袋晒在阳光里。手里捏着唯一的鱼获,我哥和小三儿已经不知转到哪里去了,没有谁分享我的喜悦。

那一次,我们清零了整个那片浅水区域,后来很久都没有鱼。我们抬了两三桶大大小小的鱼,泥鳅居多,用《英雄救日月》小人书里的大大小小的蛇命名,龙王龙母龙家的几太子这一类的。最大的一条是鲤鱼,一臂长,因为不是泥鳅,所以没有名字。

回家以后当然要挨揍,捞鱼有生命危险,必须揍了以免下次胆子大。揍得有多狠,印象已经不深了,肯定不是最狠的一次。隐约记得家长对渔获分配也有不满,但是这些也不是我所能关心的。我不会刷鱼刺,那个时候就不会。

后来想想,我不仅对收获分配没什么兴趣,连对精益求精提高技艺,也只是偶然喜欢。不仅对钓鱼捞鱼,也包括对计算机、写作、专业学习,各项技能的训练,更多的时候,还是因为训练本身带给我快乐,而不是为了追求训练的结果。想想为了未来而严肃地努力,我整个人都严肃了,也就不那么好玩了。

这么多年来,想起那些夏日的午后,跑前跑后,忙着些看不懂搞不清楚的东西,跟着把渔线鱼网装起来扎起来。远远看着我哥和大孩子踏着浊浪威风凛凛,张网抓到那么大的鱼。我要做的,不过就是在泡子边站住了,别掉到水里。极其偶尔,自己居然也能抓到一条,简直超出预料的快乐。

世界庞大而空旷,阳光刺眼。我一直傻站在那里,是个满身花纹目光迷茫的小孩儿。