Every piece of all creatures in this freezing world, are racing for freedom.
不知道为什么没有人这么总结过. 食: 饮食, 能量来源. 泄: 排泄, 有吃有喝有排泄, 吸收有用的排出有毒的. 息: 气息, 呼吸. 但这一点绝大多数时候是无意识进行的, 不需要意识控制. 温: 温度, 维持人体温度. 眠: 睡眠. 色: 性需求. 呼吸因为自发自主, 空气又是免费的, 不需要成本. 所以如果讨论是否必须要去有意识付出代价获取的话, 通常可以排除. 余下食泄温眠色. 老祖宗说食色性也, 包括了食和色. 又说衣食住行, 包括了温食眠. 又说吃喝拉撒, 包括了食泄. 不过, 从重视程度来说, 食肯定排在第一位的, 温也就是衣可以排在第二位, 这两个都是参与社交, 并作为社交的一部分的, 而且食本身作为社交手段, 又最常用作拉进相互关系. 眠排在第三位, 它不参与社交, 而且直到现代电光源发明之前, 睡眠时长都不存在问题. 泄和色讲起来都颇为忌讳, 其中泄排在第四位, 因为虽然忌讳, 但也从未被禁止过, 而色排在最后一位, 因为不但忌讳, 而且在历史上不断地被各种花式禁止. 这个问题我问了GPT4, 从其回答顺序和爽快程度上, 也可以看出下面的排位. 我: 请总结对人生存所需要的最基本的生理需求, 包括那几点, 每一点分别用一个汉字来概括. GPT4: 对人生存所需要的最基本的生理需求通常可以概括为以下几点： 水 - 人体大部分由水构成，维持身体功能必须要有足够的水分。 食 - 获取足够的营养包括蛋白质、脂肪、碳水化合物、维生素和矿物质。 氧 - 呼吸新鲜空气来供给身体必需的氧气用于细胞的代谢活动。 温 - 保持适宜的体温, 既不能过热也不能过冷。 睡 - 充足的睡眠对恢复体力和精神都是必要的。 这些是人类生存最基础的生理需求。 我: 是否还遗漏了其他方面 GPT4: 我的回答中确实遗漏了其他一些基本生理需求。除了水、食、氧、温和睡之外，还应该包括： 6. 排 - 排泄体内积累的废物和毒素，维持身体的正常功能。 7. 避 - 避险本能，即寻求安全，躲避危险和威胁来保护自己不受伤害。 这些基本生理需求综合起来，构成了人类生存必需的条件。 我: 是否还有遗漏 GPT4: 在以上所述的基本生理需求（水、食、氧、温、睡、排）之外，可以再补充一项基本生理需求： 7. 性 - 生物学上的性需求，涉及繁殖和种族延续。 这七项基础构成了人类生存的核心生理需求。 所以GPT4显然也是受到人类文化熏陶, 总是不肯把所有的关键点一次性说出来.
如果页面使用了shadow-root, 在shadow-root节点以下, 无法使用querySelector进行选择. 这也会导致绝大多数的页面爬虫无法爬取数据, 如chrome插件instant data scraper以及uibot的数据抓取功能. 比如微信的后台都是使用shadow-root的. 个人感觉shadow-root是iframe的一种更优雅的替代技术. e = $('micro-app') // 选择shadowRoot节点, 可以在开发者工具中看到下面标有#shadow-root(open)的 e.shadowRoot.querySelector('your-css-selector') // 此时就可以选择了
uibot函数竟然支持函数形参, 也就是回调
以下代码可以运行. 意味着可以使用回调函数 Function f1(x,y) return x + y end Function Function f2(x,y) return x - y End Function Function a(f) Log.Info(f(1,2)) End Function a(f1) a(f2) 并且函数名除了作为形参，还可以作为普通变量以及对象的值 Dim f = f2 f('from f') dim o = { 'f': f1 } dim o_f = o['f'] o_f('from o_f') Function f1(s) Log.Info('f1') Log.Info(s) End Function Function f2(s) Log.Info('f2') Log.Info(s) End Function 上面的用法，意味着可以创造类似于接口的功能，使用同一接口函数抽象调用，实际实现可以不同。 另外，也可以实现类似于面向对象的开发，在一个object中除了定义变量还可以定义函数。只是在对象中的函数不能直接写在对象里，也不能匿名，需要在外面写好，在对象里赋值。 同样的，对象里的函数也不能通过o['f']()的方式调用，需要先赋值给变量，再通过变量调用。 另外，发现在函数中使用这种方法会报错，似乎和编译有关： Function a() dim f = f1 f() End Function Function f1() log.info(f1) End Function 报错： 后端错误 unexpected symbol near ')' 这种情况只要将dim f放到全局就会正常，不知道为何，似乎是回调函数名称必须为全局变量(常量), 如下： dim f Function a() f = f1 f() End Function Function f1() log.info(f1) End Function 另外，始终没有找到根据字符串常量表示的函数名调用对应函数的方法。 回调的坑: 跨文件调用回调会丢失全局环境(包括全局变量) 有一个主文件为test.task, 一个作为提供函数的模块文件tools.task, 如果在主文件中调用模块文件中的函数, 并给其提供的回调函数位于主文件中, 那么此回调函数不能访问主文件中的全局变量. 调用关系: 主文件->调用模块文件的函数(主文件的回调函数名)->调用主文件回调函数->丢失主文件全局变量. 示意如下: /* tools.task 模块文件 */ Function funcInTools(cb) Log.Info('funcInTools') gCallback = cb gCallback() End Function /* test.task 主文件 */ Import tools Dim gCallback Dim gLost = 11 funcInMain(cbInMain) // 通过主文件的函数调用主文件的回调函数, 不会丢失全局变量 tools.funcInTools(cbInMain) // 通过模块文件的函数调用主文件的回调函数, 丢失全局变量 Function cbInMain() //主文件中的回调 Log.Info(gLost) End Function Function funcInMain(cb) Log.Info('funcInMain') gCallback = cb gCallback() End Function 运行后输出如下: [2024-4-24 11:42:04] [INFO] 流程 test.task 开始运行 [2024-4-24 11:42:04] [INFO] test.task 第15行：funcInMain [2024-4-24 11:42:04] [INFO] test.task 第11行：11 [2024-4-24 11:42:04] [INFO] tools.task 第7行：funcInTools [2024-4-24 11:42:04] [INFO] test.task 第11行：null 可以看到回调函数第一次调用可以输出全局变量, 而第二次调用则不可以. 这种情况建议将全局变量通过形参传入: /* tools.task 模块文件 */ Function funcInTools(cb, 传入变量) Log.Info('funcInTools') gCallback = cb gCallback(传入变量) End Function /* test.task 主文件 */ Import tools Dim gCallback Dim gLost = 11 tools.funcInTools(cbInMain, gLost) // 通过模块文件的函数调用主文件的回调函数, 丢失全局变量 Function cbInMain(传入变量) //主文件中的回调 Log.Info(传入变量) End Function
解决Uibot解析地址字符串中省市区的问题
python中有cpca库, 可以匹配省市区并返回. 但这个库有些老, 好多年不更新, 像深圳龙华区这些近几年升级为区的都没有. 所以需要结合正则实现. python还有另外一个geopy库也可以实现, 但是这个库需要实时通过API读取, 还总是timeout, 所以放弃这个方案. UiBot本来支持python扩展来解决, 但是不知为何Uibot自带的python对cpca支持有问题, 始终报错, 所以放弃, 改为Uibot调用系统命令读取打印输出的方式曲线救国. python代码都是GPT4 Turbo写的, 自己做了小修改. Uibot测试: PyTools('parse_address', '广东省深圳市龙华区深圳北站') Uibot函数: // 由于通过uibot的python调用存在问题(import cpca始终报错), 所以通过命令行调用 // python路径直接写在tools.bat中, 使用系统where python给出的路径, 避免uibot调用错误的python版本. 此时在系统中使用Pip安装的库可以直接在这儿使用 // tools.bat直接调用执行tools.py. 具体函数在tools.py中实现 // 以Json字符串形式返回 Function PyTools(func, params) // params支持单字符串的单参数或者数组形式的多参数 Dim Ret If type('params') = 'string' Ret = Sys.Command(@res"tools.bat "+func+" "+params) else Dim cmd = @res"tools.bat "+func For Each p In params cmd = cmd + " " + p Next Ret = Sys.Command(@res"tools.bat "+func+cmd) End if return JSON.Parse(Ret) End Function 系统命令 tools.bat和python脚本tools.py, 放在uibot项目的res目录下. 如果不放心调用哪个版本的python,可以积极在python前面加路径. @echo off python.exe D:\folder\to\project\res\tools.py %1 %2 %3 %4 %5 %6 %7 %8 %9 @echo on tool.py部分. 大多数是gpt4写的 # tools.py import sys,re,json import cpca def parse_address(address): a = "" a1 = parse_address1(address) a2 = parse_address2(address) # 策略: 长度相同优选a1方法, 否则选a2 if len(a2) <= len(a1): a = a1 else: a = a2 # return f"{a[0]}|{a[1]}|{a[2]}" return json.dumps(a, ensure_ascii=False) # 采用cpca获取省市区. 好处: 不写省市区这几个字都能识别. 问题: 可能有数据库过期问题(龙华区无法识别) def parse_address1(address): # 使用 cpca 库解析地址并返回 DataFrame df = cpca.transform([address]) location = df.iloc[0] # 提取第一行数据，即我们需要的地址解析结果 # 返回省市区字符串，用 "|" 分隔 # return f"{location['省']}|{location['市']}|{location['区']}" return list(filter(None,[location['省'], location['市'], location['区']])) # 采用正则表达式获取省市区. 好处: 不需要更新数据库. 问题: 必须有省市区这几个字. def parse_address2(address): # 更新省/直辖市的匹配模式以处理没有“市”字的直辖市情况 pattern = re.compile( r'(?P<province>[^省]+省|[^自治区]+自治区|北京|天津|上海|重庆)?' r'(?P<city>[^市]+市|[^自治州]+自治州|[^地区]+地区|[^盟]+盟)?' r'(?P<district>[^县]+县|[^区]+区|[^旗]+旗|[^自治县]+自治县|[^林区]+林区|[^特别行政区]+特别行政区)?' ) match = pattern.search(address) if not match: return "无法提取地址信息" province, city, district = match.group('province', 'city', 'district') # 北京、天津、上海和重庆作为直辖市，如果匹配到省份但没有匹配到市，将省份的名字赋给城市 if province in ['北京', '天津', '上海', '重庆'] and not city: city = province city = city + '市' # 如果没有匹配到，则用空字符串代替 province = province if province else '' city = city if city else '' district = district if district else '' # 以"|"连接非空字符串 # result = '|'.join(filter(None, [province, city, district])) return list(filter(None,[province, city, district])) def test_parse_address(): print(parse_address('广东省深圳市龙华区深圳北站')) if __name__ == "__main__": if len(sys.argv) < 3: print("Usage: python tools.py parse_address 'Your Address String Here'") sys.exit(1) if sys.argv[1] == "parse_address": input_address = sys.argv[2] result = parse_address(input_address) print(result) elif sys.argv[1] == "test_parse_address": test_parse_address() else: print('["没有正确的函数名"]')
我: 请数据一个bat文件,可以接受一组参数. 参数为ot时, 将使用ssh命令登录到192.168.1.105端口8022上, 参数为om时, 将使用ssh命令登录到192.168.0.31端口8022上 GPT: 以下是一个能够接受参数的批处理文件的示例： @echo off REM 检查传入的参数 IF "%1"=="ot" ( REM 执行连接到192.168.1.105:8022的ssh命令 ssh user@192.168.1.105 -p 8022 ) ELSE IF "%1"=="om" ( REM 执行连接到192.168.0.31:8022的ssh命令 ssh user@192.168.0.31 -p 8022 ) ELSE ( REM 未提供有效参数时显示帮助信息 echo 请提供有效参数（ot 或 om） ) REM 结束批处理文件 exit /b > 请注意，上面的示例假设已经安装了ssh客户端，并且可以通过命令ssh来进行远程登录。 实际运行一次性成功
参考: 2024，像极了1929 这篇文章作者至少在一开始提出了2个真实的、不忽悠人的看法：一是绝大多数人成功自以为是实力实际上是运气；二是在运气产生的时候坚决地迈出去。不靠运气而能洞察未来的人不是没有而是很少。 所以这儿虽说是洞察，也只能把握大趋势，具体到适合个人的小方向上，只能提高好运气的概率。 文中2点和我想的也类似。其一是GPT之类的人工智能是新变革的起点，以后会变成日常生活的一部分，从现在开始在日常中应该更多应用AI；其二是中国尤其是深圳有制造业的优势，在全球都是最好的，如果不加利用非常可惜。 文中对AI有个观点，就是需要与各行各业深入结合，变成“蒸汽机”，深刻提高效率以至于创造力。 文中对中国制造业有两个值得注意的观点：制造业不应像美国一样完全外流，在扩展到海外的同时，而应在国内同时保留一份；另一个是世界级的领导者企业应该、也必然更多在中国产生，也就是更多颠覆者，而不仅仅都是跟随者。我倒是认为颠覆者已经渐渐产生，至是不够深入和全面。目前主要是在互联网领域，比如字节的Tiktok是世界首创的短视频平台、腾讯的微信也让马斯克的X模仿。为什么？因为这个领域进入成本低，一个人有一台电脑就搞定了，创新速度也就更快。字节可以说是靠今日头条积累原始资本，靠抖音发财成为全球现象级产品。对于制造业的个人创新，以前门槛是比美国人高很多的。美国人都有个车库，里面钉锤斧钻样样俱全，从小再这样的环境中长大的人，很容易在鼓捣出些创新硬件产品。中国都住在鸽子楼里缺少这样的环境，然而近年B站不少UP主也利用家里环境和1688的便捷采购鼓捣出不少新玩意。再加上很多硬件设计可以通过电脑完成，如果加上AI的助力，是否能形成一波硬件产品创新的浪潮，就像美国发明了电灯泡洗衣机，日本让磁带、Walkman、游戏机走入每个家庭一样。 现在AI的问题有以下几个，在解决以后，会形成很大助力(我相信近几年会很快解决): 缺少大量的人工信息导入和分析能力。比如AI和爬虫结合, 通过爬虫给AI导入大量的信息, 让AI对解决方案中的原料进行快速寻找、匹配，甚至对解决方案进行自动优化 缺少通用的图片分析能力。根据图片分析产品的尺寸、材质、重量、结构、功能等是否适用。 缺乏数学和逻辑推理能力。 缺乏复杂的编程和自我DEBUG验证能力。 缺乏工程设计图、矢量图、3D图的阅读和编辑能力。比如可以自编辑STEP文件、SVG文件、STL文件等。现在的AI能力主要是位图能力。 事实上其他文档的生成能力也还很初级，比如xlsx等。 这些方面应该会在近几年快速补齐。有的是AI能力已经足够，只是缺少对应的应用，有的还需要AI本身去提升能力。
腾讯文档收集表关联的统计表数据的清除
希望做一个功能, 通过收集表收集的数据在处理完成后删除掉. 哪种删除方式最方便有效 1. 直接删除统计表: 失败 直接删除统计excel表后, 点击在表格中查看按钮, 会显示表格已经删除, 而且新建相同名称的表格也不能恢复 2. sheet重命名: 失败 重命名sheet后, 仍然在重命名后的sheet中添加数据, 并不能新建sheet添加新数据 3. 在搜集表-统计-已填写-三个点, 一个一个点击移除 : 成功50% 确实可以从统计表sheet中移除数据, 那一行会变成「已移除」, 但是这一行依然存在, 新数据不会覆盖这一行 4. 直接删除统计表数据行: 成功100% 删除数据行后, 新的数据会从新的一行开始 5. 删除sheet后重新关联统计表: 失败 删除sheet后, 可以点击统计表右上角三条杠菜单, 选择'关联的内容', 然后选择对应的收集表, 此时会新建一个收集表同名sheet, 如果已有同名sheet则在名称后面加(1), 而且, 此时会把过往删除的所有收集表信息统统恢复出来.