From 9838e25bad2096f53f0a3ab7cb9adf40c01ac48b Mon Sep 17 00:00:00 2001 From: UKM Date: Tue, 18 Jul 2023 11:54:49 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=88=E4=BC=98=E5=8C=96RSS=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E7=9A=84=E5=86=85=E5=AE=B9=20(#259)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🧪 test(tests): 添加了RSS的单元测试 * 🎈 perf(rss and test): 优化了RSS部分源标题正文重复的问题 部分RSS源(RSSHub的Twitter)存在正文当标题用的情况,导致推送的时候呈现为两段重复的文字,现通过Jaccard相似系数来判断是否需要去重 * Update nonebot_bison/platform/rss.py Co-authored-by: AzideCupric <57004769+AzideCupric@users.noreply.github.com> * Update nonebot_bison/platform/rss.py Co-authored-by: AzideCupric <57004769+AzideCupric@users.noreply.github.com> * 🐞 fix(platform/rss): 修复了漏掉相似文本在后端位置的问题 * 🐞 fix(rss): 修正一些feed无法正确识别时间的bug 一些feed时间只有updated标签或者没有,原先的代码只能解析用published标签的时间 felinae98#275 * 🎈 perf(rss): 更改字符串相似度比较方法 从Jaccard相似系数比较相似度改为通过最长公共子序列来比较 * 🦄 refactor(rss): 重构实现字符串相似度比较的方法 使用标准库difflib代替原先手搓的LCS * Update nonebot_bison/utils/__init__.py Co-authored-by: felinae98 <731499577@qq.com> * Update nonebot_bison/platform/rss.py * Update nonebot_bison/platform/rss.py --------- Co-authored-by: AzideCupric <57004769+AzideCupric@users.noreply.github.com> Co-authored-by: felinae98 <731499577@qq.com> --- nonebot_bison/platform/rss.py | 31 +++- nonebot_bison/utils/__init__.py | 7 + tests/platforms/static/rss-github-atom-0.xml | 52 ++++++ tests/platforms/static/rss-github-atom.xml | 63 +++++++ tests/platforms/static/rss-ruanyifeng-0.xml | 47 +++++ tests/platforms/static/rss-ruanyifeng.xml | 66 +++++++ tests/platforms/static/rss-top5-new.xml | 57 ++++++ tests/platforms/static/rss-top5-old.xml | 57 ++++++ .../static/rss-twitter-ArknightsStaff-0.xml | 142 +++++++++++++++ .../static/rss-twitter-ArknightsStaff.xml | 157 ++++++++++++++++ tests/platforms/test_rss.py | 169 ++++++++++++++++++ 11 files changed, 843 insertions(+), 5 deletions(-) create mode 100644 tests/platforms/static/rss-github-atom-0.xml create mode 100644 tests/platforms/static/rss-github-atom.xml create mode 100644 tests/platforms/static/rss-ruanyifeng-0.xml create mode 100644 tests/platforms/static/rss-ruanyifeng.xml create mode 100644 tests/platforms/static/rss-top5-new.xml create mode 100644 tests/platforms/static/rss-top5-old.xml create mode 100644 tests/platforms/static/rss-twitter-ArknightsStaff-0.xml create mode 100644 tests/platforms/static/rss-twitter-ArknightsStaff.xml create mode 100644 tests/platforms/test_rss.py diff --git a/nonebot_bison/platform/rss.py b/nonebot_bison/platform/rss.py index eeccd7c..cbcddd4 100644 --- a/nonebot_bison/platform/rss.py +++ b/nonebot_bison/platform/rss.py @@ -1,4 +1,5 @@ import calendar +import time from typing import Any, Optional import feedparser @@ -7,10 +8,17 @@ from httpx import AsyncClient from ..post import Post from ..types import RawPost, Target -from ..utils import scheduler +from ..utils import SchedulerConfig, text_similarity from .platform import NewMessage +class RssSchedConf(SchedulerConfig): + + name = "rss" + schedule_type = "interval" + schedule_setting = {"seconds": 30} + + class Rss(NewMessage): categories = {} @@ -19,7 +27,7 @@ class Rss(NewMessage): name = "Rss" enabled = True is_common = True - scheduler = scheduler("interval", {"seconds": 30}) + scheduler = RssSchedConf has_target = True @classmethod @@ -31,7 +39,12 @@ class Rss(NewMessage): return feed["feed"]["title"] def get_date(self, post: RawPost) -> int: - return calendar.timegm(post.published_parsed) + if hasattr(post, "published_parsed"): + return calendar.timegm(post.published_parsed) + elif hasattr(post, "updated_parsed"): + return calendar.timegm(post.updated_parsed) + else: + return calendar.timegm(time.gmtime()) def get_id(self, post: RawPost) -> Any: return post.id @@ -45,9 +58,17 @@ class Rss(NewMessage): return feed.entries async def parse(self, raw_post: RawPost) -> Post: - text = raw_post.get("title", "") + "\n" if raw_post.get("title") else "" + title = raw_post.get("title", "") soup = bs(raw_post.description, "html.parser") - text += soup.text.strip() + desc = soup.text.strip() + if not title or not desc: + text = title or desc + else: + if text_similarity(desc, title) > 0.8: + text = desc if len(desc) > len(title) else title + else: + text = f"{title}\n\n{desc}" + pics = list(map(lambda x: x.attrs["src"], soup("img"))) if raw_post.get("media_content"): for media in raw_post["media_content"]: diff --git a/nonebot_bison/utils/__init__.py b/nonebot_bison/utils/__init__.py index 007b989..31082ad 100644 --- a/nonebot_bison/utils/__init__.py +++ b/nonebot_bison/utils/__init__.py @@ -1,3 +1,4 @@ +import difflib import re import sys from typing import Union @@ -109,3 +110,9 @@ def jaccard_text_similarity(str1: str, str2: str) -> float: set1 = set(str1) set2 = set(str2) return len(set1 & set2) / len(set1 | set2) + + +def text_similarity(str1, str2) -> float: + matcher = difflib.SequenceMatcher(None, str1, str2) + t = sum(temp.size for temp in matcher.get_matching_blocks()) + return t / min(len(str1), len(str2)) diff --git a/tests/platforms/static/rss-github-atom-0.xml b/tests/platforms/static/rss-github-atom-0.xml new file mode 100644 index 0000000..6a73ad5 --- /dev/null +++ b/tests/platforms/static/rss-github-atom-0.xml @@ -0,0 +1,52 @@ + + + tag:github.com,2008:https://github.com/R3nzTheCodeGOD/R3nzSkin/releases + + + Release notes from R3nzSkin + 2023-06-29T00:46:26+08:00 + + tag:github.com,2008:Repository/410126695/v3.0.8 + 2023-06-25T22:19:30+08:00 + + R3nzSkin + No content. + + hotline1337 + + + + + tag:github.com,2008:Repository/410126695/v3.0.7 + 2023-06-25T08:38:52+08:00 + + R3nzSkin + No content. + + hotline1337 + + + + + tag:github.com,2008:Repository/410126695/v3.0.6 + 2023-06-06T23:05:38+08:00 + + R3nzSkin + <p>Added update available information</p> + + hotline1337 + + + + + tag:github.com,2008:Repository/410126695/v3.0.5 + 2023-06-03T19:53:30+08:00 + + R3nzSkin + <p>Added "Hide to tray" option to the injector</p> + + hotline1337 + + + + \ No newline at end of file diff --git a/tests/platforms/static/rss-github-atom.xml b/tests/platforms/static/rss-github-atom.xml new file mode 100644 index 0000000..d109b69 --- /dev/null +++ b/tests/platforms/static/rss-github-atom.xml @@ -0,0 +1,63 @@ + + + tag:github.com,2008:https://github.com/R3nzTheCodeGOD/R3nzSkin/releases + + + Release notes from R3nzSkin + 2023-06-29T00:46:26+08:00 + + tag:github.com,2008:Repository/410126695/v3.0.9 + 2023-06-29T00:46:57+08:00 + + R3nzSkin + No content. + + hotline1337 + + + + + tag:github.com,2008:Repository/410126695/v3.0.8 + 2023-06-25T22:19:30+08:00 + + R3nzSkin + No content. + + hotline1337 + + + + + tag:github.com,2008:Repository/410126695/v3.0.7 + 2023-06-25T08:38:52+08:00 + + R3nzSkin + No content. + + hotline1337 + + + + + tag:github.com,2008:Repository/410126695/v3.0.6 + 2023-06-06T23:05:38+08:00 + + R3nzSkin + <p>Added update available information</p> + + hotline1337 + + + + + tag:github.com,2008:Repository/410126695/v3.0.5 + 2023-06-03T19:53:30+08:00 + + R3nzSkin + <p>Added "Hide to tray" option to the injector</p> + + hotline1337 + + + + \ No newline at end of file diff --git a/tests/platforms/static/rss-ruanyifeng-0.xml b/tests/platforms/static/rss-ruanyifeng-0.xml new file mode 100644 index 0000000..7815cbd --- /dev/null +++ b/tests/platforms/static/rss-ruanyifeng-0.xml @@ -0,0 +1,47 @@ + +阮一峰的网络日志 + + +tag:www.ruanyifeng.com,2010-04-11:/blog//1 +2023-05-20T05:55:36Z +Ruan YiFeng's Blog +Movable Type 5.2.2 + +科技爱好者周刊(第 254 期):人生是一个长板问题 + +tag:www.ruanyifeng.com,2023:/blog//1.2367 +2023-05-12T00:07:46Z +2023-05-17T14:03:44Z +这里记录每周值得分享的科技内容,周五发布。... + +阮一峰 +http://www.ruanyifeng.com + + + +这里记录每周值得分享的科技内容,周五发布。

]]> +本杂志开源,欢迎投稿。周刊另有《谁在招人》服务,发布程序员招聘信息。合作推广请邮件联系(yifeng.ruan@gmail.com)。

封面图

昆明市教场中路罕见地采用蓝花楹作为行道树,四月底进入了开花期,道路变成了一片紫色花海。(via

本周话题:人生是一个长板问题

大家可能听说过"水桶原理":水桶的容量由最短的那块木板决定。

它的意思是,某些系统的关键,不在于发展最强点,而在于避免最弱点。99%的地方都没有问题,只要1%的地方出现问题,整个系统就会失败。

人体健康就是这样,有一个器官出现严重问题,哪怕其他器官完全正常,生活甚至生命就会受到影响。

这类由短板决定的问题,统称为"短板问题"。日常生活有很多这样的例子,除了人体健康,还有食品安全,只要有一样成份不干净,你可能就会食物中毒。

汽车、电视机、手机等消费品也是这样,只要有一个部件不合格,这个产品就有质量问题。

但是,这不是今天的主题。我最近读到一篇文章,才意识到除了短板问题,还有长板问题。

"长板问题"指的是,问题的关键不在于最弱点,而在于最强点。 只要有一个点特别出色,这件事情就成功了,其他点的好坏无所谓。

文艺作品就属于这种情况。你购买了一张专辑,其他的歌曲都不爱听,但是有一首歌你特别喜欢,这张专辑就值得了。电影和小说只要有一个角色或情节特别打动人,作品就成功了。

风险投资也是这样,只要投了一个特别成功的项目,就能把所有损失补回来。

最重要的是,人生就是一个"长板问题"。 一生中,失败和挫折其实不重要,多少次都不重要,只要有一次大的成功,人生就成功了。

最大的那一次成功,决定了你一生的成就和高度。很多诺贝尔奖得主,一生就做出了一个重要的科学发现,就足够成为伟大科学家了。

程序员写过多少代码不重要,只要创造过一个重大影响力的软件,职业生涯就成功了。

我们必须学会区分"短板问题"和"长板问题",它们的解决方法完全不同。 短板问题的解决,需要盯着薄弱环节,补齐最短的那块板;长板问题的解决,只需要推进最强的环节,不要在乎别的。

人生不必在乎那些不重要的事情,没必要为了挫折和拒绝而沮丧,都会过去的。你要做的是向前看,拼命争取一次大的成功,让它足够大、更大,只要一次就够了。

亮数据

大家可能听说过,以色列的软件水平很高,但是感觉离我们很远,平时在国内接触不到。

谁能想到,五一节之前,一家以色列公司联系我。他们的软件进入了中国市场,想在周刊上向中国程序员介绍一下自己。

这家公司叫做 Bright Data(英文官网),中文名字是"亮数据"(中文官网),成立于2014年。

他们的产品是互联网数据服务,首页赫然写着"世界排名第一的互联网数据平台"。看上去业务做得很大,不少世界500强公司和欧美名校,都是他们的客户。

根据他们的说法,只要互联网可以公开访问的数据,都能提供。不管电子商务,还是 AI 训练,你想要什么样的大规模数据集,他们帮你解决。

我看了一下,其实说白了,他们做的就是数据采集生意(俗称"爬虫"),但是做到了顶级。大家可以看看,顶级的爬虫是什么样子。

他们进入中国的产品,分成三个层次,满足不同的需求。

(1)自助服务: 你在他们的基础设施上,自己跑爬虫。他们为你提供下面的能力。

  • 超过7200万的 IP 地址,随意切换国家城市。
  • 覆盖全球195个国家地区、不同运营商的基础设施。
  • CAPTCHA 解锁器,绕过网站的真人验证,99.99%成功率,不成功不收费。

你可以自己写脚本,调用他们的 API,也可以使用他们的网络数据抓取工具 Web Scraper IDE,只要填几个设置,就能大规模抓取数据。

他们还提供亮数据爬虫浏览器,封装了上面的各种功能,内置自动解锁,让你在浏览器里面大规模批量数据抓取。

(2)数据集:对于不想自己抓数据的用户,他们提供已经抓取好的最新数据。

下面是他们现成的数据集产品(部分),你也可以指定参数,他们帮你按需筛选出子集。

(3)亮数据洞察 你甚至不用自己处理数据,他们的机器算法帮你处理,提供实时商品情报,以及动态跟踪。比如,自家商品的数据分析、对手公司/竞品的数据分析、买家数据分析等等。

上面就是他们的产品介绍。需要说明的是,他们主要面向公司用户。个人程序员如果有需求,也可以使用。

如果你感兴趣,想要什么数据集或者使用他们的基础设施,欢迎访问中文官网,也可以扫描下方二维码,了解详情并注册,新用户有7天免费试用期

科技动态

1、木制晶体管

电子元件难以回收利用,对环境造成污染。瑞典林雪平大学为此发明了一种环保的电子元件。

听上去难以置信,他们发明的是木制晶体管,就是脱水的中空木纤维里面,注入一种叫做 PEDOT:PSS 的导电聚合物,使其导电并可以控制电流。

由于性能和体积,这种晶体管目前没有实用价值,但是证明了环保电路可行。也许有一天,这种电路还可以植入活的生物体。

2、NBA 无人机直播

本月的波士顿凯尔特人和费城76人的 NBA 比赛中,出现了无人机直播。

无人机飞在篮球场上,将画面传回电视台。球迷普遍很反感,认为分散了看球的注意力。

电视台则认为,这样可以拍到以前没有的镜头,提高直播效果。其他的体育比赛,比如 F1 赛车、高尔夫和极限运动,都已经使用无人机直播了。

3、地球的结局

最近,天文学家首次观察到,一颗垂死的恒星吞噬掉它的行星。

这颗恒星距离地球12,000光年,已经进入了生命周期的晚期,体积急剧膨胀了1000倍以上,变成一颗红巨星(red-giant),吞噬了靠近它的行星。

天文学家认为,地球的结局也是这样。当太阳终结的时候,地球也将随之终结。

4、亚马逊仓库监控

美国媒体透露,亚马逊仓库的工人搬运货物时,都有摄像头监控,机器学习算法会判断工人是否放错了地方。

问题是这个模型的准确率只有95%,很多时候会判断错误。于是,亚马逊又在印度和哥斯达黎加,雇佣了很多外包工人,对把握不大的监控视频进行二次审核,提供模型准确率。

于是就出现了非常科幻的场景:一群工人在仓库干活,另一群工人通过摄像头远程监控他们。软件模型用于判断,这两群工人是否都在尽职工作。高科技时代的劳动力处境,大概就是这样。

5、无电池水下相机

传统的水下相机都需要电池,无法长时间工作。麻省理工学院发明了一种全新的水下相机,不需要电池,就能拍照和传输。

它创造性地使用声波作为能源,利用过往的船只或海洋生物发出的声音。声波撞击传感器,会产生电信号,从而驱动摄像头。

由于海底没有光线,为了省电,它使用红绿蓝三颗 LED 作为照明,每次亮一颗,共拍摄三张单色底片,后期再进行合成。最后,它通过反射声波,将数码照片一位一位(bit)地传送到接收器。

文章

1、Midjourney 5.1 更新(中文)

图像生成模型 Midjourney 在5月7日发布了5.1版,效果惊人,本文进行详细介绍。

2、Redis 与作者 antirez 的故事(繁体中文)

Redis 是最常用的键值对数据库,它是意大利程序员 antirez 的作品。本文介绍他的故事,antirez 本人也看到了这篇文章,并给出了一些订正

3、我对 Svelte 的看法(英文)

Svelte 是目前国外比较流行的一种前端框架,作者详细谈了自己的使用感受,正面和负面的都有,比较客观。

4、甚至亚马逊也无法理解微服务(英文)

亚马逊 Prime Video 团队宣布放弃微服务架构,改成单体应用,主要原因是太贵。Rails 框架的创始人 DHH 对此事发表了评论。

5、.dev 域名的限制(英文)

作者讲述遇到的一个奇怪问题,最后发现原因是使用了 .dev 域名。

该域名由谷歌管理,谷歌硬性规定,所有 .dev 域名只能用 HTTPS 协议访问。谷歌管理的其他域名 .app、.day、.dev、.page 和 .new 都是如此。

6、自托管项目的选择(英文)

作者决定自托管几项服务:访客统计、邮件列表、无代码工具、日历。他逐一分析了这几项服务可用的开源产品。

7、HTTP Multipart 简介(英文)

本文解释文件上传的"multipart/form-data"模式是怎么回事。

8、AI 的硬件瓶颈(英文)

作者详细解释了 AI 模型很难做大的一个重要原因,就是硬件(主要是内存)存在瓶颈,导致很难处理特别大的模型。

工具

1、Instant Logo Design

输入产品或公司的英文名称,这个网站可以自动生成几十款 Logo,供你选择。

2、Accessibility

一个 JS 库,用来增强网页的可用性。只要插入这个库,网页就会出现一个工具栏,让用户自己选择增大字体、加深对比色、增大间隔、朗读文本等等。

3、沉浸式翻译

浏览器的双语翻译插件,可以指定翻译引擎(10多种可选),并可以翻译 pdf、epub 电子书。(@theowenyoung 投稿)

4、ChatLLM-Web

开源的浏览器 LLM 模型,只要访问作者已经部署的网页,就能使用,所有数据都在本地训练。(@Ryan-yang125 投稿)

注意,用户需要满足三个使用条件。

  • Chrome 113 以上浏览器。
  • 下载训练数据约 4GB(只需下载一次)。
  • 显卡最好有 6.4GB 以上显存。

5、1Panel

开源的 Linux 服务器运维面板。(@maninhill 投稿)

6、PyQt-Fluent-Widgets

Python 图形界面框架 PyQt 的组件库。(@zhiyiYo 投稿)

7、VizGPT

一个对话式的可视化图表生成工具,用户使用自然语言告诉 AI 生成什么样的图表,可以多轮调整。(@ObservedObserver 投稿)

8、Vue DevTools

网友实现的 Vue 开发者工具。(@webfansplz 投稿)

9、Dify.AI

一个开发者工具,帮你快速生成基于 AI 的应用。(@Panmuse 投稿)

10、dnrm

deno 实现的 npm 镜像源切换工具,每次切换都在 100ms 内,速度超级快。(@markthree 投稿)

资源

1、鸟巢大战

一位国外网友在自家谷仓,架设了一个鸟巢,立刻就有一对寒鸦住了进来。

过了几年,一对猫头鹰把寒鸦撵了出来,占了鸟巢,还在里面产了鸟蛋。寒鸦决心报复,双方展开了一场大战。

这个网友在鸟巢内外都放了摄像头,图文解说这场"鸟巢大战",很精彩。

2、AI 工具网址导航站

网友收集的 AI 工具合集。(@Jordonwang 投稿)

3、机器学习图解

这个英文网站提供机器学习的图解教程,内容还挺多的。

4、HTML with Superpowers

Web Components 的英文入门教程,源码开源

5、电路课程

这个网站提供免费的电子学教程,英文的。

图片与视频

1、艺术鸟巢

美国纽约布鲁克林植物园,举办了一次鸟巢设计展,邀请了33位艺术家,请他们设计具有艺术气息的鸟巢。

2、AI 机器人踢足球

谷歌 DeepMind 发布了一段视频,两个 AI 训练的机器人踢足球。

它们会根据对方的动作,调整自己的动作,从而形成对抗,真是太惊人了!机器人时代大概真的要来了。

文摘

1、我为什么不喜欢大城市

我最近从家乡搬到了印度的首都德里。当我在家乡时,我想去德里。当我真的来到德里,又变得想念家乡。

我发现自己不喜欢大城市,主要有下面三个原因。

(1)城市越大,生活节奏就越快。

(2)你会身处大量同行之中,不断感受到越来越多的竞争。

(3)大城市有大人物。权势越大,他们的吸引力就越大。我在德里的朋友们都忙于他们自己的大目标,我自愿或不情愿地陷入那些事情。

最终,我希望搬回小镇,那里更接近自然,让我可以更接近自己而不是更接近其他人。

2、过早优化的迹象

有一句软件开发的名言:"过早优化是万恶之源"。

下面就是我在创业公司中,见过一些过早优化的例子。

(1)Web 应用的后端是 Kubernetes。

(2)一个应用程序使用多种语言开发。后端同时用了 Golang、Ruby、PHP,或者前端同时用了 React、Vue 等框架。

(3)不使用云服务(比如 Heroku、Vercel、Netlify 和 Fly.io)来托管应用程序,而是拥有一个运维或基础架构团队,使用他们维护的基础设施。

一般来说,如果你有自己的基础架构团队,就会过度设计解决方案。

上面这些例子,就好像你真正开始某项爱好之前,就开始花费大量时间和金钱,为这个爱好挑选最好的装备。

言论

1、

一项研究发现,小团体比单独交往,更容易建立友谊,也更持久。

因为小团体经常有定期活动,容易产生更多的接触机会。因此,如果你想交朋友,加入一些小团体吧。

--《成年后交朋友太难了》

2、

为什么 AI 最终将取代人类工作?因为当你是生产链条中最慢的那个部分时,取代你将提高整个链条的生产力。

-- 《为什么"提示工程师"是无稽之谈》

3、

金钱就像疫苗,它可以避免很多痛苦,但不一定会让你快乐。

-- 《世界运作的几种方式》

4、

AI 发展到最后,无非就是两种结果。一种是人类灵魂被证明只是一种基于概率算法的预测机制,另一种是 AI 发生了质变,产生了自主意识,拥有了与人类相似的灵魂。

-- 推特网友

历史上的本周

汽车行业的顶峰可能过去了(2022 #207)

KK 给年轻人的建议(2021 #157)

致富与杠杆(2020 #107)

分享知识是否违反人性?(2019 #57)

鸣谢

周刊得到国内新一代知识管理与协作平台 FlowUs 的帮助,深表感谢。

FlowUS = 文档 + 表格 + 网盘。你可以用它写文档、做主页、管理数据、存储文件等等。

每一期周刊同时发布在 FlowUs 专栏,欢迎大家也去开通自己的专栏和主页。

(完)

]]> +

文档信息

  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
  • 发表日期: 2023年5月12日
]]> + ]]> +
+
+ +科技爱好者周刊(第 253 期):训练材料用完之日 + +tag:www.ruanyifeng.com,2023:/blog//1.2366 +2023-05-05T00:11:13Z +2023-05-09T01:00:46Z +这里记录每周值得分享的科技内容,周五发布。... + +阮一峰 +http://www.ruanyifeng.com + + + +这里记录每周值得分享的科技内容,周五发布。

]]> +本杂志开源,欢迎投稿。周刊另有《谁在招人》服务,发布程序员招聘信息。合作推广请邮件联系(yifeng.ruan@gmail.com)。

封面图

这不是美术馆,而是杭州临安三口村的杨梅大棚,沿着山坡堆叠在一起。(via

本周话题:训练材料用完之日

现在的新闻报道,天天有 AI 的新闻,里面会提到很多模型。

分辨模型的强弱,有一个关键指标,就是看它有多少个参数。一般来说,参数的数量越多,模型就越强。

GPT-2 有15亿个参数,GPT-3 和 ChatGPT 有1750亿个,GPT-4 没有公布这个指标,据传比上一代大5倍以上。

那么,什么是参数呢?

按照我粗浅的理解,参数相当于模型预测时,所依据的神经网络的节点数量。参数越多,就代表了模型所考虑的各种可能性越多,计算量越大,效果越好。

既然参数越多越好,那么参数会无限增长吗?

答案是不会的,因为参数受到训练材料的制约。必需有足够的训练材料,才能计算出这些参数,如果参数无限增长,训练材料势必也要无限增长。

我看到的一种说法是,训练材料至少应该是参数的10倍。举例来说,一个区分猫照片和狗照片的模型,假定有1,000个参数,那么至少应该用10,000张图片来训练。

ChatGPT 有1750亿个参数,那么训练材料最好不少于17500亿个词元(token)。"词元"就是各种单词和符号,以小说《红楼梦》为例,它有788,451字,就算100万个词元。那么, ChatGPT 的训练材料相当于175万本《红楼梦》。

根据报道,ChatGPT 实际上用了 570 GB 的训练材料,来自维基百科、互联网图书馆、Reddit 论坛、推特等等。

大家想一想,更强大的模型需要更多的训练材料,问题是能找到这么多材料吗,会不会材料有一天不够用?

我告诉大家,真的有学者写过论文,研究这个问题。

过去10年来,AI 训练数据集的增长速度远快于全世界的数据存量的增长速度。如果这种趋势继续下去,耗尽数据存量是不可避免的。

论文给出了三个时间点。

  • 2026年:用完一般的语言数据
  • 2030年~2050年:用完所有的语言数据
  • 2030年~2060年:用完所有的视觉数据

也就是说,根据他们的预测,大概三四年后,新的训练材料就会很难找。最迟三十年后,全世界所有材料都不够 AI 的训练。

上图是作者给的趋势图,虚线是训练材料的增长速度,红线和蓝线是模型增长速度的不同预测。到了2035年以后,这三根线就合在一起了,曲线变得越来越平。

作者认为,到了那时,由于没有足够的训练材料,AI 模型的发展速度可能就会显著放缓。

如果他的预测是正确的,就意味着,跟大家想的不一样,AI 飞速发展不会持续很久。现在也许就是发展最快的阶段,然后就会开始放慢,等到本世纪中叶就会显著放慢,接近停滞,跟量子物理学的现状差不多。

科技动态

1、车轮转向系统

韩国现代汽车发布了一项新技术,允许每个车轮独立转动90度。

演示视频中,这辆概念车可以横着开,也可以原地调头。

虽然实用性很强,但是该技术增加了车辆的复杂性和成本,对于正常行驶是否有影响也未知。现代汽车没透露,是否会将其投入生产。

2、电脑椅的静电

一位国外网友发帖说,他家的显示器经常莫名其妙暗掉几秒钟,然后又好了。

他原以为是显示器问题,后来发现只有移动电脑椅、或者坐下站起时,才会发生这个故障。

他的电脑椅是宜家的 MARKUS,很多网友回帖说,他们的这把电脑椅也有这个问题。

这把椅子的织物材料或者金属座架,容易带有静电,一移动就会导致放电,使得电脑显示器短时间关闭。

解决方法似乎只有换掉这把椅子,但也有动手能力强的网友,为椅子接上地线,让它通地,从而解决了放电问题。

3、无线耳机的助听作用

一项研究发现,无线耳机可以取代助听器,帮助听力受损的人,

苹果的 Airpods 耳机有一个"实时收听"功能,可以放大外界声音,跟助听器的功能很像,实际效果也很好。

助听器的价格非常贵,好的要几万元人民币,普通的也要几千。无线耳机如果真能替代,将造福很多失聪的人。

4、沙坝蓄水池

韩国为了解决山区在旱季断水的问题,新建了该国第一座沙坝蓄水池。

坝体内部有一个砂石的蓄水池,平时用来蓄水,需要时打开管道,让水流向下游。

这样做据说有三个好处:水的蒸发大大减少;水质在通过沙床时得到改善;冬天的水不结冰。

5、智能婚戒

一家捷克公司推出"智能婚戒",这种婚戒可以感知佩戴者的心跳,并且能将心跳曲线显示在戒指上。

有趣的地方是,它显示的不是自己的心跳,而是对方的心跳。

它通过蓝牙与手机通信,只要佩戴者按压戒指,手机就会联络另一只配对的戒指。

对方的心跳频率,就会传到你的手机上,心跳曲线也显示在戒指上。

发明者称,它让你随时感受到爱人的浪漫心跳。它采用玫瑰金材质,报价是3000美元/对。

文章

1、我的开源经历(中文)

作者分享自己的经历,开发一个图片编辑的网页应用。(@nihaojob 投稿)

2、如何自己实现 CodePen(英文)

CodePen 是著名的网页实时编辑预览工具,本文教你怎么实现它的主要功能,非常简单。

3、tcpdump 快速上手(英文)

作者教你怎么使用 tcpdump 这个命令行工具,查看某个网站的 TCP 通信。

4、WebGPU 为什么重要(英文)

操作系统的图形 API,目前是不统一的:Windows 是 DirectX,苹果是 Metal,Linux 是 Vulkan。

WebGPU 是一种跨平台的解决方案,提供了统一的接口。推荐这篇长文。

5、我开发 PCalc 的30年(英文)

作者在1992年为 Macintosh 电脑写了一个计算器 PCalc(上图)。后来,他一直维护这个项目30年,还把它移植到苹果公司的其他设备上,比如 iPhone 和 iWatch(下图)。作者回忆了他这30年。

6、使用 hurl 自动化 HTTP 测试(英文)

本文介绍一种简单的方法,使用 hurl 这个软件,对网站 API 进行自动化测试,看它是否正确响应。

7、编程语言的错误处理机制(英文)

本文讨论不同的语言如何处理报错,比如 Java 会抛出异常,而 Go 将错误赋值给一个变量。

这里还有一篇相同主题的文章,也值得参考。

8、疯狂的 C 语言字符串(英文)

本文是 C 语言的字符串教程,从结尾的\0讲到 Unicode,结论就是在 C 语言里面,正确处理字符串是一件多么麻烦的事情。

工具

1、stagit

这个软件可以将 Git 仓库转为一个静态网站,为每个文件、每次提交生成一个页面。

2、元标签生成器

很多社交媒体对于外部 URL,会显示一个卡片,上面有标题、缩略图和页面简要内容。这些信息来自网页里面的元标签,这个工具可以帮助你生成这些元标签。

3、CJK 字体识别

上传一张东亚文字的图片,这个开源工具可以识别这些文字用了什么字体。(@JeffersonQin 投稿)

4、microblog.pub

一个自托管的开源微博网站,只能一个人使用(即没有多用户),支持 ActivityPub 协议。

5、Textual Markdown Browser

一个终端窗口的 Markdown 文件渲染器,适合用来在终端下阅读 Markdown 文件。

6、HorusPass

这个网站为用户输入的文本,生成一个用于分享的 URL。但是,这个 URL 只能打开一次,第二次访问就会不存在,有点像"阅后即焚"。

7、Progress-up

一个带有上传进度显示的网页多文件上传 JS 库。

8、snappify

一个将代码片段生成截图的工具。

9、RustDesk

一个开源的远程桌面软件,让你远程操作其他电脑的桌面,有各种操作系统的客户端。

10、LosslessCut

一个视频编辑器,最大特点是不进行重新编码,按照原视频的格式进行剪切连接,因此速度极快。

资源

1、面向开发人员的 ChatGPT 提示工程

吴恩达与 OpenAI 合作的免费英文课程,教大家怎么编写 ChatGPT 提示,做出一个自己的聊天机器人。

2、Next.js 和 React 完整指南

Udemy 高分付费课程的中文字幕版。(@lyf61 投稿)

3、图解 QUIC 连接(中文版)

解释 QUIC 协议通信的每个字节的含义,原始英文版的翻译。(@cangSDARM 投稿)

4、Musico

一个自动生成音乐的 AI 模型,它的官网可以收听这个模型生成的音乐。

图片

1、云的表情

一位美国艺术家专门为各种云的照片,添加表情,使得云看上去像一个卡通人物。

他原本只是出于无聊,随手拍了一些云的照片,画上表情以后,发到网上。

后来,他发现很多人喜欢这些作品,就坚持了下来。

他说:"看着云,你会产生无穷无尽的灵感。"

现在,越来越多的读者向他投稿。他还准备出书。

文摘

1、忙碌的七个层次

生活的忙碌可以分成七个层次。

大家可以对照一下,自己属于哪个层次?

第 1 级:一点不忙。

时间很自由,怎么安排都可以,没有一定要去完成的事项,周末想睡多久就多久。

第 2 级:有一些小事。

你记得有一些事要做。这些事情是合理的事项,没有截止期,但是你知道这些事迟早要做。

第 3 级:有一些重要的事。

你有必须要做的事情,需要及时跟踪,不能拖延,你会时刻提醒自己这些事情。

第 4 级:日程排满了。

你的日程排满了,不得不经常问自己"什么事情更重要?",以便决定先做哪些事,后做哪些事。

你没有计划外的时间,不过你还能控制日程。

第 5 级:生活出现混乱。

你的事情在工作时间做不完,你开始加班了。

你经常因为事情来不及,而对别人说"对不起"。那些事情并没有被你放弃,只是你不得不赶时间,有些事情执行变得草率。

第 6 级:任务做不完。

你需要做的事情,超过了你安排日程的能力。即使放弃某些事情,你依然做不完剩下的事情。

你的工作时间大大延长,影响到正常生活。你感到非常疲劳。

第 7 级:日子过不下去。

各种任务塞满了你醒着的每一分钟。吃饭和其他生活必需的事情,都是抽时间来做。你忙起来的时候,甚至饭也没时间吃。

你不写日程安排了,因为根本没有时间做计划,每个小时情况都在发生变化。

你走路也心不在焉,常常觉得要崩溃,日子过不下去了。

言论

1、

我离开谷歌,是为了呼吁 AI 的风险,在谷歌任职不方便谈论这些事情。

-- "深度学习之父"杰弗里·欣顿(Geoffrey Hinton),宣布从谷歌辞职

2、

欧洲的问题是,没有将互联网视为可利用的经济机会,而是看成需要监管的对象。

-- 《欧洲没有准备好成为"第三超级大国"》

3、

大多数人都认为,手下的人比自己聪明,是没有问题的。一般来说,领导人都要聘请比自己聪明的顾问和幕僚。

那么,当你的手下变成了比你聪明的 AI 模型时,人们为什么会感到受威胁呢?

-- Yann LeCun,Meta 首席 AI 科学家

4、

要成为优秀程序员,请编写大量代码;要成为顶级程序员,请阅读大量代码。

--《请编写 CRISP 代码》

历史上的本周

如何走出失望和怀疑(2022 #206)

显卡缺货与异业竞争(2021 #156)

数字游民(2020 #106)

文科生为什么不容易就业?(2019 #56)

鸣谢

周刊得到国内新一代知识管理与协作平台 FlowUs 的帮助,深表感谢。

FlowUS = 文档 + 表格 + 网盘。你可以用它写文档、做主页、管理数据、存储文件等等。

每一期周刊同时发布在 FlowUs 专栏,欢迎大家也去开通自己的专栏和主页。

(完)

]]> +

文档信息

  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
  • 发表日期: 2023年5月 5日
]]> + ]]> +
+
+
\ No newline at end of file diff --git a/tests/platforms/static/rss-ruanyifeng.xml b/tests/platforms/static/rss-ruanyifeng.xml new file mode 100644 index 0000000..f030903 --- /dev/null +++ b/tests/platforms/static/rss-ruanyifeng.xml @@ -0,0 +1,66 @@ + +阮一峰的网络日志 + + +tag:www.ruanyifeng.com,2010-04-11:/blog//1 +2023-05-20T05:55:36Z +Ruan YiFeng's Blog +Movable Type 5.2.2 + +科技爱好者周刊(第 255 期):对待 AI 的正确态度 + +tag:www.ruanyifeng.com,2023:/blog//1.2368 +2023-05-19T00:12:46Z +2023-05-20T05:55:36Z +这里记录每周值得分享的科技内容,周五发布。... + +阮一峰 +http://www.ruanyifeng.com + + + +这里记录每周值得分享的科技内容,周五发布。

]]> +本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系(yifeng.ruan@gmail.com)。

封面图

武汉光谷空轨4月26日试运行,总长10.5km,这是国内首列商用的悬挂式轨道列车。虽然知道不会掉下来,看着还是觉得有点惊险。(via

本周话题:对待 AI 的正确态度

这些天,总有人问我,对于"前端已死"这个话题怎么看。

我的第一反应是,前端没死啊,很多企业还在招聘呢。

后来了解了,他们的意思是,前端正在降温,变得萧条,具体表现是技术发展放慢,没有大的热点,业务重要性下降,就业机会减少。

更让人担心的是,AI 已经能够直接生成页面了,将来会不会替代前端程序员?

我的看法没有这么悲观。现在的情况确实不好,但等过了低谷期,经济恢复了,前端程序员的需求就会上升。

至于 AI 会不会杀死前端,这个就说不准了,完全取决于 AI 的发展,尽管我是不太相信 AI 能做出复杂页面。

今天,我就想谈谈,作为程序员怎么面对不确定的未来。 AI 是不确定的,发展完全不受我们的控制。它使得程序员的职业和未来都变得不确定,这种情况下,我们怎么办?

我正好看到一篇印度程序员的文章,他也在思考这个问题,就决定亲自测试一下,AI 发展到了什么程度。

他让 ChatGPT 写一个他想要的程序,结果整整花了三个周末不断调整,才勉强写出来,代码可以运行了。

下面就是他对 AI 的评价。

"有时我对 ChatGPT 的理解能力感到惊讶,但是更多时候,我不得不拼命推动它,朝着我想要的方向前进。它有时会产生意料之外的结果,让我感到非常沮丧。"

"它像一个吸收了所有人类知识、但需要别人帮忙才能把这些知识串起来的应届毕业生。"

"看来我今年的工作是安全的。但是,我需要好好学习 ChatGPT,精通它的使用,让我明年也是安全的。"

我非常欣赏上面的最后一句话,觉得这种心态值得我们借鉴。

AI 未来会怎样,没有办法预知,但是可以确定,它目前的编码水平不会威胁到程序员。

你的工作今年是安全的。如果你努力的话,明年也是安全的,而且很可能从此都是安全的。因为如果一直不断学习 AI,你会越来越熟练地掌握它,让它为你工作,达到你的目的。也就是说,它会放大你的生产力。

这就是最关键的地方,AI 与人类不是竞争关系,它未必会减少机会,反而可能带来更多的机会。

一位英国企业家曾经总结了对 AI 的5点看法,我觉得这才是对待 AI 的正确态度。

1、AI 会大大增强程序员的生产力,并创造过去不可能的产品。

2、AI 本质是生产力工具,跟高级语言、云服务、开源代码等是一个性质。

3、写代码的门槛会降低,更多的人会进入 IT 行业,软件市场将变大。

4、AI 推动行业发展,将为所有人带来更多的增长、产品和机会。

5、我们要成为这个过程的一部分,需要让自己积极主动,不断更新技能,接受新工具。

科技动态

1、免费电视机

一家美国流媒体公司宣布,只要在官网登记一下,就能免费获得55吋液晶电视机。

之所以免费,是因为在主屏幕下方,它还有第二个屏幕,专门用来不间断播放广告。用户只要使用电视机,就会看到广告。

而且,它还要收集你观看节目的内容和时长信息。如果你不同意数据收集,就必须退还电视机。

你愿意用广告和个人信息,换取一台电视机吗?

2、汽车盗窃案

美国巴尔的摩市政府起诉了韩国起亚汽车,理由居然是这家公司的车太容易被偷。

该市的汽车盗窃案最近激增,而且偷的主要是起亚汽车。因为特别容易,TikTok 上面都有教学视频,有几百万浏览量。

汽车盗窃案增加了警察的工作量,而且小偷开着偷来的车鲁莽驾驶,造成了很多交通事故,然后弃车逃跑,市政府头痛不已。

这件事的教训就是,如果采用旧技术,又不修 Bug,就有被告的风险。

3、无线充电公路

《日经亚洲》报道,日本东京建筑公司建造了一条实验道路,内置无线充电。

这种公路在地面下埋设了电子线圈,电动汽车内部也安装了线圈,利用磁场感应,就能行车充电,让汽车行驶更多里程。

一想到这种公路造在一排线圈上面,就觉得设计者很大胆。走在这种道路上,是不是手机也可以无线充电?

4、声音授权

AI 模型可以生成一模一样的声音,很多名人不允许 AI 使用自己的声音,但也有人反其道行之。

马斯克的前女友、加拿大歌手格莱姆斯(Grimes)宣布,大家可以随便用她的声音,但是有一个前提。

你自己演唱的歌曲,必须上传到她的网站,由她来生成 AI 版本,变成她的声音在演唱。

你可以随便用这首歌,但是如果用来盈利,必须分50%给她。

文章

1、陈皓2021年直播访谈摘录(中文)

陈皓(左耳朵耗子)前年做过一次直播访谈,谈到了技术、行业、创业的各个方面。本文是访谈内容的文字整理,以此纪念他。

2、Midjourney 中国版使用指南(中文)

上周,AI 图片生成引擎 Midjourney 正式发布中国版了,本文介绍怎么使用。

3、88岁 MIT 教授的最后一堂线性代数课(中文)

麻省理工学院教授吉尔伯特・斯特朗(Gilbert Strang)的线性代数课非常著名,他已经88岁,5月15日站上讲台,讲了最后一次课,并在网上直播。

4、Bun.js 打包器测评(英文)

Bun.js 是 Node.js 的替代品,最近内置了打包器,号称比 Webpack、Esbuild 都要快。

5、数据库分片是怎么回事(英文)

本文介绍数据库分片的基本知识。

6、如何关闭失去响应的 SSH 连接(英文)

SSH 连接服务器后,如果长时间没有操作,就会失去响应。本文教你怎么退出失去响应的 SSH 连接。

7、黑客新闻的排名算法(英文)

本文讨论黑客新闻怎么根据读者的投票,算出新闻的排名。作者还通俗解释了他自己的算法。

8、IP 地址的书写方法不止一种(英文)

IP 地址一般都写成 127.0.0.1 这种形式,但是你知道吗,还存在其他形式,比如 127.1。

工具

1、Astrodon

一个使用 Deno 的跨平台桌面应用开发工具,类似于 Electron,但底层是移植到 JavaScript 环境的 Tauri 框架。

2、HuggingChat

AI 平台 HuggingFace 自家的 AI 聊天页面,底层可以配置不同模型,免费使用。

3、Chat with any PDF

上传一个 PDF 文件,就能跟该文件交谈,让它回答相关问题。

目前好像不支持中文 PDF 文件,但是支持用中文提问和回答。类似工具还有 ScholarTurbo

4、Nature 编程语言

网友发明的一种编程语言,语法追求简洁优雅、符合直觉。(@weiwenhao 投稿)

5、LaWGPT

基于中文法律知识的开源大语言模型,很适合用于司法考试。(@pengxiao-song 投稿)

6、mblog

网友开发的基于 Java + MySQL 的多用户微博系统。(@kingwrcy 投稿)

7、wallpaper-box

一个基于 Electron 的桌面壁纸客户端,支持壁纸管理、动态壁纸、动态托盘图标等功能。(@wangrongding 投稿)

8、Pho

一个开源的安卓相册应用,可以将照片同步到多种协议(smb、webdav、nfs)的网络储存。(@fregie 投稿)

9、哔哩哔哩字幕列表

一个浏览器扩展,列出 BiliBili 视频字幕内容,用户点击就可以跳转到相应的视频位置。(@IndieKKY 投稿)

10、stitching

一个 Python 软件包,用于将多幅照片合成一幅。

资源

1、Data Viz Project

这个网站收集数据可视化的各种图形,给出详细的解释和示例。

2、Awesome ChatGPT

这个 awesome 仓库收集 ChatGPT 的各种资源。

3、Spring 中文文档

网友整理的 Spring 框架中文文档。(@KevinBlandy 投稿)

4、维基大学

维基百科的官方项目,志愿者在这个网站制作各种主题的开放课程,已经有很多课程了。

5、PrintableSearch

一个搜索引擎,查找最热门的免费 3D 打印模型。

图片

1、跨国外卖

美国和墨西哥的边境墙聚集了很多等待过境的难民,他们又饿又渴,但又不愿离开。

有人拿出手机,在墨西哥网上点餐,让美国的送餐员隔着边境墙送餐。

2、蜘蛛臂

一家名为 Jizai Arms 的日本机器人公司,发明了一个机器手臂系统,可以在人体背后安装多个机器手臂,最多可以安装六个。

这些手臂完全由佩戴它们的用户控制,目前主要用途是帮助残疾人,增加灵活性和行动便利。

文摘

1、P2P 视频传输

P2P(点对点)是一种节省带宽的下载方法。

国外一般只把 P2P 用于下载,很少用于观看视频。因为体验不好,往往看一会就要缓冲几秒,有时还会等很久。

但是,中国所有主要的视频公司,几乎都使用 P2P 技术来节省带宽。

一方面因为这样省钱,另一方面也因为在中国 P2P 可能没有那么慢。

这些视频网站的业务,分成视频直播和视频点播两类。

对于直播,头部前1%的直播主会占据大部分带宽,直播房间很轻松就会有大量观看者,这时 P2P 的效果就很好。因为 P2P 的特点是看的人越多,下载速度越快。

对于点播,如果同时观看同一个节目的人比较少, P2P 的效果会很差。中国视频网站就发明了家用"种子盒",它基本上是一个带硬盘的路由器,用户买了它放在家里当作普通的无线路由器使用,但在后台它会自动连接视频网站的服务器,缓存视频用作 P2P 节点,提供带宽给其他用户,以加快下载速度。它的使用者可能会从中获得一些奖励(主要是数字积分)。本质上,这类"种子盒"是使用用户的家庭互联网,作为 CDN 边缘节点。

但是,那些观众很少的视频,P2P 的效果几乎肯定很差,所以除了"种子盒",这时还必须使用传统的 CDN 作为后备。

总的来说,P2P 技术在中国受欢迎的根本原因,还是因为中国的用户多,加速效果较好,使得它的缺点有时不那么明显。

言论

1、

人类已经处于与 AI 共同进化的阶段:AI 影响和感染了我们,然后我们又改进了 AI,让它更像人类。

-- Sam Altman,OpenAI 的 CEO

2、

时间和注意力是不一样的。正确的说法不是"我没有时间",事实上挤出时间并不难,我无法挤出的是注意力。

我每天有8小时用于工作,但真正能够专注的时间可能只有4小时。我不能再把这点时间分出来了。

-- 《时间和注意力的区别》

3、

越来越多的年轻人认为,AI 是他们的朋友。一位17岁年轻人告诉我,"我与机器人聊天的次数超过了与大多数朋友聊天的次数。"

人是孤独的,AI 提供了不变的陪伴。

-- 《AI 界面革命》

4、

创业公司有一个准则,叫做"最小可行产品",意思是产品只要做到最简单的可运行程度,就可以发布,让市场来检验是否可行。

我想提一个相反的概念,叫做"最大可行产品",意思是产品的主要功能完备以后,就到此为止了,不再添加新功能。我见过太多的优秀软件不断膨胀,功能越来越多,直到变得无比难用。

-- 《最大可行产品》

历史上的本周

晋升制度的问题(2022 #208)

内容渠道的贬值(2021 #158)

阵地战与奇袭战(2020 #108)

软件推广可以像化妆品那样吗?(2019 #58)

鸣谢

周刊得到国内新一代知识管理与协作平台 FlowUs 的帮助,深表感谢。

FlowUS = 文档 + 表格 + 网盘。你可以用它写文档、做主页、管理数据、存储文件等等。

每一期周刊同时发布在 FlowUs 专栏,欢迎大家也去开通自己的专栏和主页。

(完)

]]> +

文档信息

  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
  • 发表日期: 2023年5月19日
]]> + ]]> +
+
+ +科技爱好者周刊(第 254 期):人生是一个长板问题 + +tag:www.ruanyifeng.com,2023:/blog//1.2367 +2023-05-12T00:07:46Z +2023-05-17T14:03:44Z +这里记录每周值得分享的科技内容,周五发布。... + +阮一峰 +http://www.ruanyifeng.com + + + +这里记录每周值得分享的科技内容,周五发布。

]]> +本杂志开源,欢迎投稿。周刊另有《谁在招人》服务,发布程序员招聘信息。合作推广请邮件联系(yifeng.ruan@gmail.com)。

封面图

昆明市教场中路罕见地采用蓝花楹作为行道树,四月底进入了开花期,道路变成了一片紫色花海。(via

本周话题:人生是一个长板问题

大家可能听说过"水桶原理":水桶的容量由最短的那块木板决定。

它的意思是,某些系统的关键,不在于发展最强点,而在于避免最弱点。99%的地方都没有问题,只要1%的地方出现问题,整个系统就会失败。

人体健康就是这样,有一个器官出现严重问题,哪怕其他器官完全正常,生活甚至生命就会受到影响。

这类由短板决定的问题,统称为"短板问题"。日常生活有很多这样的例子,除了人体健康,还有食品安全,只要有一样成份不干净,你可能就会食物中毒。

汽车、电视机、手机等消费品也是这样,只要有一个部件不合格,这个产品就有质量问题。

但是,这不是今天的主题。我最近读到一篇文章,才意识到除了短板问题,还有长板问题。

"长板问题"指的是,问题的关键不在于最弱点,而在于最强点。 只要有一个点特别出色,这件事情就成功了,其他点的好坏无所谓。

文艺作品就属于这种情况。你购买了一张专辑,其他的歌曲都不爱听,但是有一首歌你特别喜欢,这张专辑就值得了。电影和小说只要有一个角色或情节特别打动人,作品就成功了。

风险投资也是这样,只要投了一个特别成功的项目,就能把所有损失补回来。

最重要的是,人生就是一个"长板问题"。 一生中,失败和挫折其实不重要,多少次都不重要,只要有一次大的成功,人生就成功了。

最大的那一次成功,决定了你一生的成就和高度。很多诺贝尔奖得主,一生就做出了一个重要的科学发现,就足够成为伟大科学家了。

程序员写过多少代码不重要,只要创造过一个重大影响力的软件,职业生涯就成功了。

我们必须学会区分"短板问题"和"长板问题",它们的解决方法完全不同。 短板问题的解决,需要盯着薄弱环节,补齐最短的那块板;长板问题的解决,只需要推进最强的环节,不要在乎别的。

人生不必在乎那些不重要的事情,没必要为了挫折和拒绝而沮丧,都会过去的。你要做的是向前看,拼命争取一次大的成功,让它足够大、更大,只要一次就够了。

亮数据

大家可能听说过,以色列的软件水平很高,但是感觉离我们很远,平时在国内接触不到。

谁能想到,五一节之前,一家以色列公司联系我。他们的软件进入了中国市场,想在周刊上向中国程序员介绍一下自己。

这家公司叫做 Bright Data(英文官网),中文名字是"亮数据"(中文官网),成立于2014年。

他们的产品是互联网数据服务,首页赫然写着"世界排名第一的互联网数据平台"。看上去业务做得很大,不少世界500强公司和欧美名校,都是他们的客户。

根据他们的说法,只要互联网可以公开访问的数据,都能提供。不管电子商务,还是 AI 训练,你想要什么样的大规模数据集,他们帮你解决。

我看了一下,其实说白了,他们做的就是数据采集生意(俗称"爬虫"),但是做到了顶级。大家可以看看,顶级的爬虫是什么样子。

他们进入中国的产品,分成三个层次,满足不同的需求。

(1)自助服务: 你在他们的基础设施上,自己跑爬虫。他们为你提供下面的能力。

  • 超过7200万的 IP 地址,随意切换国家城市。
  • 覆盖全球195个国家地区、不同运营商的基础设施。
  • CAPTCHA 解锁器,绕过网站的真人验证,99.99%成功率,不成功不收费。

你可以自己写脚本,调用他们的 API,也可以使用他们的网络数据抓取工具 Web Scraper IDE,只要填几个设置,就能大规模抓取数据。

他们还提供亮数据爬虫浏览器,封装了上面的各种功能,内置自动解锁,让你在浏览器里面大规模批量数据抓取。

(2)数据集:对于不想自己抓数据的用户,他们提供已经抓取好的最新数据。

下面是他们现成的数据集产品(部分),你也可以指定参数,他们帮你按需筛选出子集。

(3)亮数据洞察 你甚至不用自己处理数据,他们的机器算法帮你处理,提供实时商品情报,以及动态跟踪。比如,自家商品的数据分析、对手公司/竞品的数据分析、买家数据分析等等。

上面就是他们的产品介绍。需要说明的是,他们主要面向公司用户。个人程序员如果有需求,也可以使用。

如果你感兴趣,想要什么数据集或者使用他们的基础设施,欢迎访问中文官网,也可以扫描下方二维码,了解详情并注册,新用户有7天免费试用期

科技动态

1、木制晶体管

电子元件难以回收利用,对环境造成污染。瑞典林雪平大学为此发明了一种环保的电子元件。

听上去难以置信,他们发明的是木制晶体管,就是脱水的中空木纤维里面,注入一种叫做 PEDOT:PSS 的导电聚合物,使其导电并可以控制电流。

由于性能和体积,这种晶体管目前没有实用价值,但是证明了环保电路可行。也许有一天,这种电路还可以植入活的生物体。

2、NBA 无人机直播

本月的波士顿凯尔特人和费城76人的 NBA 比赛中,出现了无人机直播。

无人机飞在篮球场上,将画面传回电视台。球迷普遍很反感,认为分散了看球的注意力。

电视台则认为,这样可以拍到以前没有的镜头,提高直播效果。其他的体育比赛,比如 F1 赛车、高尔夫和极限运动,都已经使用无人机直播了。

3、地球的结局

最近,天文学家首次观察到,一颗垂死的恒星吞噬掉它的行星。

这颗恒星距离地球12,000光年,已经进入了生命周期的晚期,体积急剧膨胀了1000倍以上,变成一颗红巨星(red-giant),吞噬了靠近它的行星。

天文学家认为,地球的结局也是这样。当太阳终结的时候,地球也将随之终结。

4、亚马逊仓库监控

美国媒体透露,亚马逊仓库的工人搬运货物时,都有摄像头监控,机器学习算法会判断工人是否放错了地方。

问题是这个模型的准确率只有95%,很多时候会判断错误。于是,亚马逊又在印度和哥斯达黎加,雇佣了很多外包工人,对把握不大的监控视频进行二次审核,提供模型准确率。

于是就出现了非常科幻的场景:一群工人在仓库干活,另一群工人通过摄像头远程监控他们。软件模型用于判断,这两群工人是否都在尽职工作。高科技时代的劳动力处境,大概就是这样。

5、无电池水下相机

传统的水下相机都需要电池,无法长时间工作。麻省理工学院发明了一种全新的水下相机,不需要电池,就能拍照和传输。

它创造性地使用声波作为能源,利用过往的船只或海洋生物发出的声音。声波撞击传感器,会产生电信号,从而驱动摄像头。

由于海底没有光线,为了省电,它使用红绿蓝三颗 LED 作为照明,每次亮一颗,共拍摄三张单色底片,后期再进行合成。最后,它通过反射声波,将数码照片一位一位(bit)地传送到接收器。

文章

1、Midjourney 5.1 更新(中文)

图像生成模型 Midjourney 在5月7日发布了5.1版,效果惊人,本文进行详细介绍。

2、Redis 与作者 antirez 的故事(繁体中文)

Redis 是最常用的键值对数据库,它是意大利程序员 antirez 的作品。本文介绍他的故事,antirez 本人也看到了这篇文章,并给出了一些订正

3、我对 Svelte 的看法(英文)

Svelte 是目前国外比较流行的一种前端框架,作者详细谈了自己的使用感受,正面和负面的都有,比较客观。

4、甚至亚马逊也无法理解微服务(英文)

亚马逊 Prime Video 团队宣布放弃微服务架构,改成单体应用,主要原因是太贵。Rails 框架的创始人 DHH 对此事发表了评论。

5、.dev 域名的限制(英文)

作者讲述遇到的一个奇怪问题,最后发现原因是使用了 .dev 域名。

该域名由谷歌管理,谷歌硬性规定,所有 .dev 域名只能用 HTTPS 协议访问。谷歌管理的其他域名 .app、.day、.dev、.page 和 .new 都是如此。

6、自托管项目的选择(英文)

作者决定自托管几项服务:访客统计、邮件列表、无代码工具、日历。他逐一分析了这几项服务可用的开源产品。

7、HTTP Multipart 简介(英文)

本文解释文件上传的"multipart/form-data"模式是怎么回事。

8、AI 的硬件瓶颈(英文)

作者详细解释了 AI 模型很难做大的一个重要原因,就是硬件(主要是内存)存在瓶颈,导致很难处理特别大的模型。

工具

1、Instant Logo Design

输入产品或公司的英文名称,这个网站可以自动生成几十款 Logo,供你选择。

2、Accessibility

一个 JS 库,用来增强网页的可用性。只要插入这个库,网页就会出现一个工具栏,让用户自己选择增大字体、加深对比色、增大间隔、朗读文本等等。

3、沉浸式翻译

浏览器的双语翻译插件,可以指定翻译引擎(10多种可选),并可以翻译 pdf、epub 电子书。(@theowenyoung 投稿)

4、ChatLLM-Web

开源的浏览器 LLM 模型,只要访问作者已经部署的网页,就能使用,所有数据都在本地训练。(@Ryan-yang125 投稿)

注意,用户需要满足三个使用条件。

  • Chrome 113 以上浏览器。
  • 下载训练数据约 4GB(只需下载一次)。
  • 显卡最好有 6.4GB 以上显存。

5、1Panel

开源的 Linux 服务器运维面板。(@maninhill 投稿)

6、PyQt-Fluent-Widgets

Python 图形界面框架 PyQt 的组件库。(@zhiyiYo 投稿)

7、VizGPT

一个对话式的可视化图表生成工具,用户使用自然语言告诉 AI 生成什么样的图表,可以多轮调整。(@ObservedObserver 投稿)

8、Vue DevTools

网友实现的 Vue 开发者工具。(@webfansplz 投稿)

9、Dify.AI

一个开发者工具,帮你快速生成基于 AI 的应用。(@Panmuse 投稿)

10、dnrm

deno 实现的 npm 镜像源切换工具,每次切换都在 100ms 内,速度超级快。(@markthree 投稿)

资源

1、鸟巢大战

一位国外网友在自家谷仓,架设了一个鸟巢,立刻就有一对寒鸦住了进来。

过了几年,一对猫头鹰把寒鸦撵了出来,占了鸟巢,还在里面产了鸟蛋。寒鸦决心报复,双方展开了一场大战。

这个网友在鸟巢内外都放了摄像头,图文解说这场"鸟巢大战",很精彩。

2、AI 工具网址导航站

网友收集的 AI 工具合集。(@Jordonwang 投稿)

3、机器学习图解

这个英文网站提供机器学习的图解教程,内容还挺多的。

4、HTML with Superpowers

Web Components 的英文入门教程,源码开源

5、电路课程

这个网站提供免费的电子学教程,英文的。

图片与视频

1、艺术鸟巢

美国纽约布鲁克林植物园,举办了一次鸟巢设计展,邀请了33位艺术家,请他们设计具有艺术气息的鸟巢。

2、AI 机器人踢足球

谷歌 DeepMind 发布了一段视频,两个 AI 训练的机器人踢足球。

它们会根据对方的动作,调整自己的动作,从而形成对抗,真是太惊人了!机器人时代大概真的要来了。

文摘

1、我为什么不喜欢大城市

我最近从家乡搬到了印度的首都德里。当我在家乡时,我想去德里。当我真的来到德里,又变得想念家乡。

我发现自己不喜欢大城市,主要有下面三个原因。

(1)城市越大,生活节奏就越快。

(2)你会身处大量同行之中,不断感受到越来越多的竞争。

(3)大城市有大人物。权势越大,他们的吸引力就越大。我在德里的朋友们都忙于他们自己的大目标,我自愿或不情愿地陷入那些事情。

最终,我希望搬回小镇,那里更接近自然,让我可以更接近自己而不是更接近其他人。

2、过早优化的迹象

有一句软件开发的名言:"过早优化是万恶之源"。

下面就是我在创业公司中,见过一些过早优化的例子。

(1)Web 应用的后端是 Kubernetes。

(2)一个应用程序使用多种语言开发。后端同时用了 Golang、Ruby、PHP,或者前端同时用了 React、Vue 等框架。

(3)不使用云服务(比如 Heroku、Vercel、Netlify 和 Fly.io)来托管应用程序,而是拥有一个运维或基础架构团队,使用他们维护的基础设施。

一般来说,如果你有自己的基础架构团队,就会过度设计解决方案。

上面这些例子,就好像你真正开始某项爱好之前,就开始花费大量时间和金钱,为这个爱好挑选最好的装备。

言论

1、

一项研究发现,小团体比单独交往,更容易建立友谊,也更持久。

因为小团体经常有定期活动,容易产生更多的接触机会。因此,如果你想交朋友,加入一些小团体吧。

--《成年后交朋友太难了》

2、

为什么 AI 最终将取代人类工作?因为当你是生产链条中最慢的那个部分时,取代你将提高整个链条的生产力。

-- 《为什么"提示工程师"是无稽之谈》

3、

金钱就像疫苗,它可以避免很多痛苦,但不一定会让你快乐。

-- 《世界运作的几种方式》

4、

AI 发展到最后,无非就是两种结果。一种是人类灵魂被证明只是一种基于概率算法的预测机制,另一种是 AI 发生了质变,产生了自主意识,拥有了与人类相似的灵魂。

-- 推特网友

历史上的本周

汽车行业的顶峰可能过去了(2022 #207)

KK 给年轻人的建议(2021 #157)

致富与杠杆(2020 #107)

分享知识是否违反人性?(2019 #57)

鸣谢

周刊得到国内新一代知识管理与协作平台 FlowUs 的帮助,深表感谢。

FlowUS = 文档 + 表格 + 网盘。你可以用它写文档、做主页、管理数据、存储文件等等。

每一期周刊同时发布在 FlowUs 专栏,欢迎大家也去开通自己的专栏和主页。

(完)

]]> +

文档信息

  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
  • 发表日期: 2023年5月12日
]]> + ]]> +
+
+ +科技爱好者周刊(第 253 期):训练材料用完之日 + +tag:www.ruanyifeng.com,2023:/blog//1.2366 +2023-05-05T00:11:13Z +2023-05-09T01:00:46Z +这里记录每周值得分享的科技内容,周五发布。... + +阮一峰 +http://www.ruanyifeng.com + + + +这里记录每周值得分享的科技内容,周五发布。

]]> +本杂志开源,欢迎投稿。周刊另有《谁在招人》服务,发布程序员招聘信息。合作推广请邮件联系(yifeng.ruan@gmail.com)。

封面图

这不是美术馆,而是杭州临安三口村的杨梅大棚,沿着山坡堆叠在一起。(via

本周话题:训练材料用完之日

现在的新闻报道,天天有 AI 的新闻,里面会提到很多模型。

分辨模型的强弱,有一个关键指标,就是看它有多少个参数。一般来说,参数的数量越多,模型就越强。

GPT-2 有15亿个参数,GPT-3 和 ChatGPT 有1750亿个,GPT-4 没有公布这个指标,据传比上一代大5倍以上。

那么,什么是参数呢?

按照我粗浅的理解,参数相当于模型预测时,所依据的神经网络的节点数量。参数越多,就代表了模型所考虑的各种可能性越多,计算量越大,效果越好。

既然参数越多越好,那么参数会无限增长吗?

答案是不会的,因为参数受到训练材料的制约。必需有足够的训练材料,才能计算出这些参数,如果参数无限增长,训练材料势必也要无限增长。

我看到的一种说法是,训练材料至少应该是参数的10倍。举例来说,一个区分猫照片和狗照片的模型,假定有1,000个参数,那么至少应该用10,000张图片来训练。

ChatGPT 有1750亿个参数,那么训练材料最好不少于17500亿个词元(token)。"词元"就是各种单词和符号,以小说《红楼梦》为例,它有788,451字,就算100万个词元。那么, ChatGPT 的训练材料相当于175万本《红楼梦》。

根据报道,ChatGPT 实际上用了 570 GB 的训练材料,来自维基百科、互联网图书馆、Reddit 论坛、推特等等。

大家想一想,更强大的模型需要更多的训练材料,问题是能找到这么多材料吗,会不会材料有一天不够用?

我告诉大家,真的有学者写过论文,研究这个问题。

过去10年来,AI 训练数据集的增长速度远快于全世界的数据存量的增长速度。如果这种趋势继续下去,耗尽数据存量是不可避免的。

论文给出了三个时间点。

  • 2026年:用完一般的语言数据
  • 2030年~2050年:用完所有的语言数据
  • 2030年~2060年:用完所有的视觉数据

也就是说,根据他们的预测,大概三四年后,新的训练材料就会很难找。最迟三十年后,全世界所有材料都不够 AI 的训练。

上图是作者给的趋势图,虚线是训练材料的增长速度,红线和蓝线是模型增长速度的不同预测。到了2035年以后,这三根线就合在一起了,曲线变得越来越平。

作者认为,到了那时,由于没有足够的训练材料,AI 模型的发展速度可能就会显著放缓。

如果他的预测是正确的,就意味着,跟大家想的不一样,AI 飞速发展不会持续很久。现在也许就是发展最快的阶段,然后就会开始放慢,等到本世纪中叶就会显著放慢,接近停滞,跟量子物理学的现状差不多。

科技动态

1、车轮转向系统

韩国现代汽车发布了一项新技术,允许每个车轮独立转动90度。

演示视频中,这辆概念车可以横着开,也可以原地调头。

虽然实用性很强,但是该技术增加了车辆的复杂性和成本,对于正常行驶是否有影响也未知。现代汽车没透露,是否会将其投入生产。

2、电脑椅的静电

一位国外网友发帖说,他家的显示器经常莫名其妙暗掉几秒钟,然后又好了。

他原以为是显示器问题,后来发现只有移动电脑椅、或者坐下站起时,才会发生这个故障。

他的电脑椅是宜家的 MARKUS,很多网友回帖说,他们的这把电脑椅也有这个问题。

这把椅子的织物材料或者金属座架,容易带有静电,一移动就会导致放电,使得电脑显示器短时间关闭。

解决方法似乎只有换掉这把椅子,但也有动手能力强的网友,为椅子接上地线,让它通地,从而解决了放电问题。

3、无线耳机的助听作用

一项研究发现,无线耳机可以取代助听器,帮助听力受损的人,

苹果的 Airpods 耳机有一个"实时收听"功能,可以放大外界声音,跟助听器的功能很像,实际效果也很好。

助听器的价格非常贵,好的要几万元人民币,普通的也要几千。无线耳机如果真能替代,将造福很多失聪的人。

4、沙坝蓄水池

韩国为了解决山区在旱季断水的问题,新建了该国第一座沙坝蓄水池。

坝体内部有一个砂石的蓄水池,平时用来蓄水,需要时打开管道,让水流向下游。

这样做据说有三个好处:水的蒸发大大减少;水质在通过沙床时得到改善;冬天的水不结冰。

5、智能婚戒

一家捷克公司推出"智能婚戒",这种婚戒可以感知佩戴者的心跳,并且能将心跳曲线显示在戒指上。

有趣的地方是,它显示的不是自己的心跳,而是对方的心跳。

它通过蓝牙与手机通信,只要佩戴者按压戒指,手机就会联络另一只配对的戒指。

对方的心跳频率,就会传到你的手机上,心跳曲线也显示在戒指上。

发明者称,它让你随时感受到爱人的浪漫心跳。它采用玫瑰金材质,报价是3000美元/对。

文章

1、我的开源经历(中文)

作者分享自己的经历,开发一个图片编辑的网页应用。(@nihaojob 投稿)

2、如何自己实现 CodePen(英文)

CodePen 是著名的网页实时编辑预览工具,本文教你怎么实现它的主要功能,非常简单。

3、tcpdump 快速上手(英文)

作者教你怎么使用 tcpdump 这个命令行工具,查看某个网站的 TCP 通信。

4、WebGPU 为什么重要(英文)

操作系统的图形 API,目前是不统一的:Windows 是 DirectX,苹果是 Metal,Linux 是 Vulkan。

WebGPU 是一种跨平台的解决方案,提供了统一的接口。推荐这篇长文。

5、我开发 PCalc 的30年(英文)

作者在1992年为 Macintosh 电脑写了一个计算器 PCalc(上图)。后来,他一直维护这个项目30年,还把它移植到苹果公司的其他设备上,比如 iPhone 和 iWatch(下图)。作者回忆了他这30年。

6、使用 hurl 自动化 HTTP 测试(英文)

本文介绍一种简单的方法,使用 hurl 这个软件,对网站 API 进行自动化测试,看它是否正确响应。

7、编程语言的错误处理机制(英文)

本文讨论不同的语言如何处理报错,比如 Java 会抛出异常,而 Go 将错误赋值给一个变量。

这里还有一篇相同主题的文章,也值得参考。

8、疯狂的 C 语言字符串(英文)

本文是 C 语言的字符串教程,从结尾的\0讲到 Unicode,结论就是在 C 语言里面,正确处理字符串是一件多么麻烦的事情。

工具

1、stagit

这个软件可以将 Git 仓库转为一个静态网站,为每个文件、每次提交生成一个页面。

2、元标签生成器

很多社交媒体对于外部 URL,会显示一个卡片,上面有标题、缩略图和页面简要内容。这些信息来自网页里面的元标签,这个工具可以帮助你生成这些元标签。

3、CJK 字体识别

上传一张东亚文字的图片,这个开源工具可以识别这些文字用了什么字体。(@JeffersonQin 投稿)

4、microblog.pub

一个自托管的开源微博网站,只能一个人使用(即没有多用户),支持 ActivityPub 协议。

5、Textual Markdown Browser

一个终端窗口的 Markdown 文件渲染器,适合用来在终端下阅读 Markdown 文件。

6、HorusPass

这个网站为用户输入的文本,生成一个用于分享的 URL。但是,这个 URL 只能打开一次,第二次访问就会不存在,有点像"阅后即焚"。

7、Progress-up

一个带有上传进度显示的网页多文件上传 JS 库。

8、snappify

一个将代码片段生成截图的工具。

9、RustDesk

一个开源的远程桌面软件,让你远程操作其他电脑的桌面,有各种操作系统的客户端。

10、LosslessCut

一个视频编辑器,最大特点是不进行重新编码,按照原视频的格式进行剪切连接,因此速度极快。

资源

1、面向开发人员的 ChatGPT 提示工程

吴恩达与 OpenAI 合作的免费英文课程,教大家怎么编写 ChatGPT 提示,做出一个自己的聊天机器人。

2、Next.js 和 React 完整指南

Udemy 高分付费课程的中文字幕版。(@lyf61 投稿)

3、图解 QUIC 连接(中文版)

解释 QUIC 协议通信的每个字节的含义,原始英文版的翻译。(@cangSDARM 投稿)

4、Musico

一个自动生成音乐的 AI 模型,它的官网可以收听这个模型生成的音乐。

图片

1、云的表情

一位美国艺术家专门为各种云的照片,添加表情,使得云看上去像一个卡通人物。

他原本只是出于无聊,随手拍了一些云的照片,画上表情以后,发到网上。

后来,他发现很多人喜欢这些作品,就坚持了下来。

他说:"看着云,你会产生无穷无尽的灵感。"

现在,越来越多的读者向他投稿。他还准备出书。

文摘

1、忙碌的七个层次

生活的忙碌可以分成七个层次。

大家可以对照一下,自己属于哪个层次?

第 1 级:一点不忙。

时间很自由,怎么安排都可以,没有一定要去完成的事项,周末想睡多久就多久。

第 2 级:有一些小事。

你记得有一些事要做。这些事情是合理的事项,没有截止期,但是你知道这些事迟早要做。

第 3 级:有一些重要的事。

你有必须要做的事情,需要及时跟踪,不能拖延,你会时刻提醒自己这些事情。

第 4 级:日程排满了。

你的日程排满了,不得不经常问自己"什么事情更重要?",以便决定先做哪些事,后做哪些事。

你没有计划外的时间,不过你还能控制日程。

第 5 级:生活出现混乱。

你的事情在工作时间做不完,你开始加班了。

你经常因为事情来不及,而对别人说"对不起"。那些事情并没有被你放弃,只是你不得不赶时间,有些事情执行变得草率。

第 6 级:任务做不完。

你需要做的事情,超过了你安排日程的能力。即使放弃某些事情,你依然做不完剩下的事情。

你的工作时间大大延长,影响到正常生活。你感到非常疲劳。

第 7 级:日子过不下去。

各种任务塞满了你醒着的每一分钟。吃饭和其他生活必需的事情,都是抽时间来做。你忙起来的时候,甚至饭也没时间吃。

你不写日程安排了,因为根本没有时间做计划,每个小时情况都在发生变化。

你走路也心不在焉,常常觉得要崩溃,日子过不下去了。

言论

1、

我离开谷歌,是为了呼吁 AI 的风险,在谷歌任职不方便谈论这些事情。

-- "深度学习之父"杰弗里·欣顿(Geoffrey Hinton),宣布从谷歌辞职

2、

欧洲的问题是,没有将互联网视为可利用的经济机会,而是看成需要监管的对象。

-- 《欧洲没有准备好成为"第三超级大国"》

3、

大多数人都认为,手下的人比自己聪明,是没有问题的。一般来说,领导人都要聘请比自己聪明的顾问和幕僚。

那么,当你的手下变成了比你聪明的 AI 模型时,人们为什么会感到受威胁呢?

-- Yann LeCun,Meta 首席 AI 科学家

4、

要成为优秀程序员,请编写大量代码;要成为顶级程序员,请阅读大量代码。

--《请编写 CRISP 代码》

历史上的本周

如何走出失望和怀疑(2022 #206)

显卡缺货与异业竞争(2021 #156)

数字游民(2020 #106)

文科生为什么不容易就业?(2019 #56)

鸣谢

周刊得到国内新一代知识管理与协作平台 FlowUs 的帮助,深表感谢。

FlowUS = 文档 + 表格 + 网盘。你可以用它写文档、做主页、管理数据、存储文件等等。

每一期周刊同时发布在 FlowUs 专栏,欢迎大家也去开通自己的专栏和主页。

(完)

]]> +

文档信息

  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
  • 发表日期: 2023年5月 5日
]]> + ]]> +
+
+
\ No newline at end of file diff --git a/tests/platforms/static/rss-top5-new.xml b/tests/platforms/static/rss-top5-new.xml new file mode 100644 index 0000000..9f2eeed --- /dev/null +++ b/tests/platforms/static/rss-top5-new.xml @@ -0,0 +1,57 @@ + + + +<![CDATA[ Hot Wallpapers - wallhaven.cc ]]> + +https://wallhaven.cc/hot + + + + +RSSHub +i@diygod.me (DIYgod) +zh-cn +Tue, 04 Jul 2023 06:23:09 GMT +120 + + +<![CDATA[ 85rjej.jpg ]]> + + + ]]> + +https://wallhaven.cc/w/85rjej +https://wallhaven.cc/w/85rjej + + + +<![CDATA[ 2y322g.jpg ]]> + + + ]]> + +https://wallhaven.cc/w/2y322g +https://wallhaven.cc/w/2y322g + + + +<![CDATA[ rrj6qw.jpg ]]> + + + ]]> + +https://wallhaven.cc/w/rrj6qw +https://wallhaven.cc/w/rrj6qw + + + +<![CDATA[ 9drg1d.jpg ]]> + + + ]]> + +https://wallhaven.cc/w/9drg1d +https://wallhaven.cc/w/9drg1d + + + \ No newline at end of file diff --git a/tests/platforms/static/rss-top5-old.xml b/tests/platforms/static/rss-top5-old.xml new file mode 100644 index 0000000..2b85bd1 --- /dev/null +++ b/tests/platforms/static/rss-top5-old.xml @@ -0,0 +1,57 @@ + + + +<![CDATA[ Hot Wallpapers - wallhaven.cc ]]> + +https://wallhaven.cc/hot + + + + +RSSHub +i@diygod.me (DIYgod) +zh-cn +Tue, 04 Jul 2023 06:23:09 GMT +120 + + +<![CDATA[ 2y322g.jpg ]]> + + + ]]> + +https://wallhaven.cc/w/2y322g +https://wallhaven.cc/w/2y322g + + + +<![CDATA[ rrj6qw.jpg ]]> + + + ]]> + +https://wallhaven.cc/w/rrj6qw +https://wallhaven.cc/w/rrj6qw + + + +<![CDATA[ 9drg1d.jpg ]]> + + + ]]> + +https://wallhaven.cc/w/9drg1d +https://wallhaven.cc/w/9drg1d + + + +<![CDATA[ vq5eem.jpg ]]> + + + ]]> + +https://wallhaven.cc/w/vq5eem +https://wallhaven.cc/w/vq5eem + + + \ No newline at end of file diff --git a/tests/platforms/static/rss-twitter-ArknightsStaff-0.xml b/tests/platforms/static/rss-twitter-ArknightsStaff-0.xml new file mode 100644 index 0000000..40fc2a7 --- /dev/null +++ b/tests/platforms/static/rss-twitter-ArknightsStaff-0.xml @@ -0,0 +1,142 @@ + + + + <![CDATA[Twitter @アークナイツ公式]]> + https://twitter.com/ArknightsStaff + + + RSSHub + i@diygod.me (DIYgod) + + + + zh-cn + + + https://pbs.twimg.com/profile_images/1260264885771890689/2KcWaF8a.jpg + <![CDATA[Twitter @アークナイツ公式]]> + https://twitter.com/ArknightsStaff + + + Thu, 18 May 2023 11:56:00 GMT + 1 + + + + <![CDATA[【#統合戦略】 新テーマ「ミヅキと紺碧の樹」は5月23日(火)16:00より開催! 本日は新要素及びシステムの変更点を一部ご紹介します! 詳細は添付の画像をご確認...]]> + 新テーマ「ミヅキと紺碧の樹」は5月23日(火)16:00より開催!

本日は新要素及びシステムの変更点を一部ご紹介します!
詳細は添付の画像をご確認ください。

#アークナイツ https://t.co/o2uULEpA5x

]]>
+ Thu, 18 May 2023 04:00:10 GMT + https://twitter.com/ArknightsStaff/status/1659046193090134016 + https://twitter.com/ArknightsStaff/status/1659046193090134016 + + + + + + + + +
+ + + <![CDATA[【リマインド】 下記コーデの販売期限は、5月18日(木)3:59までです。ご注意ください。 ・リー · お目を拝借 ・アイリス · 鏡からの来訪者 ・カゼマル · 軽...]]> + 下記コーデの販売期限は、5月18日(木)3:59までです。ご注意ください。

・リー · お目を拝借
・アイリス · 鏡からの来訪者
・カゼマル · 軽やかな幻影

#アークナイツ]]>
+ Wed, 17 May 2023 10:00:23 GMT + https://twitter.com/ArknightsStaff/status/1658774457123733505 + https://twitter.com/ArknightsStaff/status/1658774457123733505 + + + + + + + + +
+ + + <![CDATA[【コーデ紹介】 ハニーベリー専用、EPOQUEサブブランドPasseシリーズ「荒野のあとに」。 学生時代の彼女が、臥せる母に語った想像上の未来の自分。 歳に見合わぬ...]]> + ハニーベリー専用、EPOQUEサブブランドPasseシリーズ「荒野のあとに」。
学生時代の彼女が、臥せる母に語った想像上の未来の自分。

歳に見合わぬ少女の夢には、残酷な現実が影を落とす。
それでも母は娘の心になおも勇気が息づくのを嬉しく思っていた。

近日入荷予定!
#アークナイツ https://t.co/R8eGG1b9r3
]]>
+ Wed, 17 May 2023 07:00:10 GMT + https://twitter.com/ArknightsStaff/status/1658729101069541377 + https://twitter.com/ArknightsStaff/status/1658729101069541377 + + + + + + + + +
+ + + <![CDATA[【オペレーター紹介】 カニパラート(CV: #佐藤元) サーミ地方からやってきたヴァルポの少年。元救助隊員。 外の大地の物事に興味津々で、部族の医療環境を向上...]]> + カニパラート(CV: #佐藤元)
サーミ地方からやってきたヴァルポの少年。元救助隊員。
外の大地の物事に興味津々で、部族の医療環境を向上させるという目的もあってか、特に機械系の扱いには積極的に取り組んでいる。

「救助開始!」

#アークナイツ https://t.co/4lmdg5guMy
]]>
+ Wed, 17 May 2023 04:00:09 GMT + https://twitter.com/ArknightsStaff/status/1658683798253608960 + https://twitter.com/ArknightsStaff/status/1658683798253608960 + + + + + + + + +
+ + + <![CDATA[【コーデ紹介】 ソラ専用、EPOQUEシリーズ「メロディオーソ」。 シラクーザのミラノ劇場で、ソラが舞台に立つ際に着る衣装。 普段はポップスターだからといって...]]> + ソラ専用、EPOQUEシリーズ「メロディオーソ」。
シラクーザのミラノ劇場で、ソラが舞台に立つ際に着る衣装。

普段はポップスターだからといって、由緒正しき異国のクラシックをマスターできないわけではない。

近日入荷予定!
#アークナイツ https://t.co/2zGzighNxk
]]>
+ Tue, 16 May 2023 07:00:06 GMT + https://twitter.com/ArknightsStaff/status/1658366698179956736 + https://twitter.com/ArknightsStaff/status/1658366698179956736 + + + + + + + + +
+ + + <![CDATA[【オペレーター紹介】 クォーツ(CV: #逢田梨香子) クルビア出身の傭兵。 常日頃から懐中時計を持ち歩き、時間厳守を信条とする彼女は、規則正しい生活を自分に...]]> + クォーツ(CV: #逢田梨香子)
クルビア出身の傭兵。
常日頃から懐中時計を持ち歩き、時間厳守を信条とする彼女は、規則正しい生活を自分に課している。しかし、ロドスに来てからは少し心にゆとりが生まれたようだ。

「力よりも、攻撃のタイミングが重要だ。」

#アークナイツ https://t.co/cX8kLz8oQh
]]>
+ Tue, 16 May 2023 05:00:09 GMT + https://twitter.com/ArknightsStaff/status/1658336510670954497 + https://twitter.com/ArknightsStaff/status/1658336510670954497 + + + + + + + + +
+ + + <![CDATA[【アップデートのお知らせ】 下記日時にメンテナンスとアップデートをあわせて実施します。 ▼実施期間 5月23日(火)10:00 ~ 16:00 ▼詳細内容 https://arknigh...]]> + 下記日時にメンテナンスとアップデートをあわせて実施します。

▼実施期間
5月23日(火)10:00 ~ 16:00

▼詳細内容
https://arknights.jp/news/328

アプリの更新が必要なため、あらかじめデータ連携をお済ませいただきますようお願いします。

#アークナイツ https://t.co/XEqAzM0XOu
]]>
+ Tue, 16 May 2023 03:02:13 GMT + https://twitter.com/ArknightsStaff/status/1658306831960412166 + https://twitter.com/ArknightsStaff/status/1658306831960412166 + + + + + + + + +
+ +
+
diff --git a/tests/platforms/static/rss-twitter-ArknightsStaff.xml b/tests/platforms/static/rss-twitter-ArknightsStaff.xml new file mode 100644 index 0000000..9767846 --- /dev/null +++ b/tests/platforms/static/rss-twitter-ArknightsStaff.xml @@ -0,0 +1,157 @@ + + + + <![CDATA[Twitter @アークナイツ公式]]> + https://twitter.com/ArknightsStaff + + + RSSHub + i@diygod.me (DIYgod) + + + + zh-cn + + + https://pbs.twimg.com/profile_images/1260264885771890689/2KcWaF8a.jpg + <![CDATA[Twitter @アークナイツ公式]]> + https://twitter.com/ArknightsStaff + + + Thu, 18 May 2023 11:56:00 GMT + 1 + + + <![CDATA[【#統合戦略】 引き続き新テーマ「ミヅキと紺碧の樹」の新要素及びシステムの変更点を一部ご紹介します! 今回は「灯火」、「ダイス」、「記号認識」...]]> + 引き続き新テーマ「ミヅキと紺碧の樹」の新要素及びシステムの変更点を一部ご紹介します!

今回は「灯火」、「ダイス」、「記号認識」、「鍵」についてです。
詳細は添付の画像をご確認ください。

#アークナイツ https://t.co/ARmptV0Zvu
]]>
+ Thu, 18 May 2023 07:00:21 GMT + https://twitter.com/ArknightsStaff/status/1659091539023282178 + https://twitter.com/ArknightsStaff/status/1659091539023282178 + + + + + + + + +
+ + + <![CDATA[【#統合戦略】 新テーマ「ミヅキと紺碧の樹」は5月23日(火)16:00より開催! 本日は新要素及びシステムの変更点を一部ご紹介します! 詳細は添付の画像をご確認...]]> + 新テーマ「ミヅキと紺碧の樹」は5月23日(火)16:00より開催!

本日は新要素及びシステムの変更点を一部ご紹介します!
詳細は添付の画像をご確認ください。

#アークナイツ https://t.co/o2uULEpA5x

]]>
+ Thu, 18 May 2023 04:00:10 GMT + https://twitter.com/ArknightsStaff/status/1659046193090134016 + https://twitter.com/ArknightsStaff/status/1659046193090134016 + + + + + + + + +
+ + + <![CDATA[【リマインド】 下記コーデの販売期限は、5月18日(木)3:59までです。ご注意ください。 ・リー · お目を拝借 ・アイリス · 鏡からの来訪者 ・カゼマル · 軽...]]> + 下記コーデの販売期限は、5月18日(木)3:59までです。ご注意ください。

・リー · お目を拝借
・アイリス · 鏡からの来訪者
・カゼマル · 軽やかな幻影

#アークナイツ]]>
+ Wed, 17 May 2023 10:00:23 GMT + https://twitter.com/ArknightsStaff/status/1658774457123733505 + https://twitter.com/ArknightsStaff/status/1658774457123733505 + + + + + + + + +
+ + + <![CDATA[【コーデ紹介】 ハニーベリー専用、EPOQUEサブブランドPasseシリーズ「荒野のあとに」。 学生時代の彼女が、臥せる母に語った想像上の未来の自分。 歳に見合わぬ...]]> + ハニーベリー専用、EPOQUEサブブランドPasseシリーズ「荒野のあとに」。
学生時代の彼女が、臥せる母に語った想像上の未来の自分。

歳に見合わぬ少女の夢には、残酷な現実が影を落とす。
それでも母は娘の心になおも勇気が息づくのを嬉しく思っていた。

近日入荷予定!
#アークナイツ https://t.co/R8eGG1b9r3
]]>
+ Wed, 17 May 2023 07:00:10 GMT + https://twitter.com/ArknightsStaff/status/1658729101069541377 + https://twitter.com/ArknightsStaff/status/1658729101069541377 + + + + + + + + +
+ + + <![CDATA[【オペレーター紹介】 カニパラート(CV: #佐藤元) サーミ地方からやってきたヴァルポの少年。元救助隊員。 外の大地の物事に興味津々で、部族の医療環境を向上...]]> + カニパラート(CV: #佐藤元)
サーミ地方からやってきたヴァルポの少年。元救助隊員。
外の大地の物事に興味津々で、部族の医療環境を向上させるという目的もあってか、特に機械系の扱いには積極的に取り組んでいる。

「救助開始!」

#アークナイツ https://t.co/4lmdg5guMy
]]>
+ Wed, 17 May 2023 04:00:09 GMT + https://twitter.com/ArknightsStaff/status/1658683798253608960 + https://twitter.com/ArknightsStaff/status/1658683798253608960 + + + + + + + + +
+ + + <![CDATA[【コーデ紹介】 ソラ専用、EPOQUEシリーズ「メロディオーソ」。 シラクーザのミラノ劇場で、ソラが舞台に立つ際に着る衣装。 普段はポップスターだからといって...]]> + ソラ専用、EPOQUEシリーズ「メロディオーソ」。
シラクーザのミラノ劇場で、ソラが舞台に立つ際に着る衣装。

普段はポップスターだからといって、由緒正しき異国のクラシックをマスターできないわけではない。

近日入荷予定!
#アークナイツ https://t.co/2zGzighNxk
]]>
+ Tue, 16 May 2023 07:00:06 GMT + https://twitter.com/ArknightsStaff/status/1658366698179956736 + https://twitter.com/ArknightsStaff/status/1658366698179956736 + + + + + + + + +
+ + + <![CDATA[【オペレーター紹介】 クォーツ(CV: #逢田梨香子) クルビア出身の傭兵。 常日頃から懐中時計を持ち歩き、時間厳守を信条とする彼女は、規則正しい生活を自分に...]]> + クォーツ(CV: #逢田梨香子)
クルビア出身の傭兵。
常日頃から懐中時計を持ち歩き、時間厳守を信条とする彼女は、規則正しい生活を自分に課している。しかし、ロドスに来てからは少し心にゆとりが生まれたようだ。

「力よりも、攻撃のタイミングが重要だ。」

#アークナイツ https://t.co/cX8kLz8oQh
]]>
+ Tue, 16 May 2023 05:00:09 GMT + https://twitter.com/ArknightsStaff/status/1658336510670954497 + https://twitter.com/ArknightsStaff/status/1658336510670954497 + + + + + + + + +
+ + + <![CDATA[【アップデートのお知らせ】 下記日時にメンテナンスとアップデートをあわせて実施します。 ▼実施期間 5月23日(火)10:00 ~ 16:00 ▼詳細内容 https://arknigh...]]> + 下記日時にメンテナンスとアップデートをあわせて実施します。

▼実施期間
5月23日(火)10:00 ~ 16:00

▼詳細内容
https://arknights.jp/news/328

アプリの更新が必要なため、あらかじめデータ連携をお済ませいただきますようお願いします。

#アークナイツ https://t.co/XEqAzM0XOu
]]>
+ Tue, 16 May 2023 03:02:13 GMT + https://twitter.com/ArknightsStaff/status/1658306831960412166 + https://twitter.com/ArknightsStaff/status/1658306831960412166 + + + + + + + + +
+ +
+
diff --git a/tests/platforms/test_rss.py b/tests/platforms/test_rss.py new file mode 100644 index 0000000..760246d --- /dev/null +++ b/tests/platforms/test_rss.py @@ -0,0 +1,169 @@ +import typing +import xml.etree.ElementTree as ET +from datetime import datetime + +import pytest +import pytz +import respx +from httpx import AsyncClient, Response +from nonebug.app import App + +from .utils import get_file + +if typing.TYPE_CHECKING: + from nonebot_bison.platform.rss import Rss + + +@pytest.fixture +def dummy_user(app: App): + from nonebot_bison.types import User + + user = User(123, "group") + return user + + +@pytest.fixture +def user_info_factory(app: App, dummy_user): + from nonebot_bison.types import UserSubInfo + + def _user_info(category_getter, tag_getter): + return UserSubInfo(dummy_user, category_getter, tag_getter) + + return _user_info + + +@pytest.fixture +def rss(app: App): + from nonebot_bison.platform import platform_manager + from nonebot_bison.utils import ProcessContext + + return platform_manager["rss"](ProcessContext(), AsyncClient()) + + +@pytest.fixture +def update_time_feed_1(): + file = get_file("rss-twitter-ArknightsStaff.xml") + root = ET.fromstring(file) + item = root.find("channel/item") + current_time = datetime.now(pytz.timezone("GMT")).strftime( + "%a, %d %b %Y %H:%M:%S %Z" + ) + pubdate_elem = item.find("pubDate") + pubdate_elem.text = current_time + return ET.tostring(root, encoding="unicode") + + +@pytest.fixture +def update_time_feed_2(): + file = get_file("rss-ruanyifeng.xml") + root = ET.fromstring(file) + current_time = datetime.now(pytz.timezone("GMT")).strftime( + "%a, %d %b %Y %H:%M:%S %Z" + ) + published_element = root.find(".//{*}published") + published_element.text = current_time + return ET.tostring(root, encoding="unicode") + + +@pytest.mark.asyncio +@respx.mock +async def test_fetch_new_1( + rss, + user_info_factory, + update_time_feed_1, +): + ## 标题重复的情况 + rss_router = respx.get("https://rsshub.app/twitter/user/ArknightsStaff") + rss_router.mock( + return_value=Response(200, text=get_file("rss-twitter-ArknightsStaff-0.xml")) + ) + target = "https://rsshub.app/twitter/user/ArknightsStaff" + res1 = await rss.fetch_new_post(target, [user_info_factory([], [])]) + assert len(res1) == 0 + + rss_router.mock(return_value=Response(200, text=update_time_feed_1)) + res2 = await rss.fetch_new_post(target, [user_info_factory([], [])]) + assert len(res2[0][1]) == 1 + post1 = res2[0][1][0] + assert post1.url == "https://twitter.com/ArknightsStaff/status/1659091539023282178" + assert ( + post1.text + == "【#統合戦略】 引き続き新テーマ「ミヅキと紺碧の樹」の新要素及びシステムの変更点を一部ご紹介します! 今回は「灯火」、「ダイス」、「記号認識」、「鍵」についてです。詳細は添付の画像をご確認ください。#アークナイツ https://t.co/ARmptV0Zvu" + ) + + +@pytest.mark.asyncio +@respx.mock +async def test_fetch_new_2( + rss, + user_info_factory, + update_time_feed_2, +): + ## 标题与正文不重复的情况 + rss_router = respx.get("https://www.ruanyifeng.com/blog/atom.xml") + rss_router.mock(return_value=Response(200, text=get_file("rss-ruanyifeng-0.xml"))) + target = "https://www.ruanyifeng.com/blog/atom.xml" + res1 = await rss.fetch_new_post(target, [user_info_factory([], [])]) + assert len(res1) == 0 + + rss_router.mock(return_value=Response(200, text=update_time_feed_2)) + res2 = await rss.fetch_new_post(target, [user_info_factory([], [])]) + assert len(res2[0][1]) == 1 + post1 = res2[0][1][0] + assert post1.url == "http://www.ruanyifeng.com/blog/2023/05/weekly-issue-255.html" + assert post1.text == "科技爱好者周刊(第 255 期):对待 AI 的正确态度\n\n这里记录每周值得分享的科技内容,周五发布。..." + + +@pytest.fixture +def update_time_feed_3(): + file = get_file("rss-github-atom.xml") + root = ET.fromstring(file) + current_time = datetime.now(pytz.timezone("GMT")).strftime( + "%a, %d %b %Y %H:%M:%S %Z" + ) + published_element = root.findall(".//{*}updated")[1] + published_element.text = current_time + return ET.tostring(root, encoding="unicode") + + +@pytest.mark.asyncio +@respx.mock +async def test_fetch_new_3( + rss, + user_info_factory, + update_time_feed_3, +): + ## 只有没有 + rss_router = respx.get("https://github.com/R3nzTheCodeGOD/R3nzSkin/releases.atom") + rss_router.mock(return_value=Response(200, text=get_file("rss-github-atom-0.xml"))) + target = "https://github.com/R3nzTheCodeGOD/R3nzSkin/releases.atom" + res1 = await rss.fetch_new_post(target, [user_info_factory([], [])]) + assert len(res1) == 0 + + rss_router.mock(return_value=Response(200, text=update_time_feed_3)) + res2 = await rss.fetch_new_post(target, [user_info_factory([], [])]) + assert len(res2[0][1]) == 1 + post1 = res2[0][1][0] + assert post1.url == "https://github.com/R3nzTheCodeGOD/R3nzSkin/releases/tag/v3.0.9" + assert post1.text == "R3nzSkin\n\nNo content." + + +@pytest.mark.asyncio +@respx.mock +async def test_fetch_new_4( + rss, + user_info_factory, +): + ## 没有日期信息的情况 + rss_router = respx.get("https://rsshub.app/wallhaven/hot?limit=5") + rss_router.mock(return_value=Response(200, text=get_file("rss-top5-old.xml"))) + target = "https://rsshub.app/wallhaven/hot?limit=5" + res1 = await rss.fetch_new_post(target, [user_info_factory([], [])]) + assert len(res1) == 0 + + rss_router.mock(return_value=Response(200, text=get_file("rss-top5-new.xml"))) + res2 = await rss.fetch_new_post(target, [user_info_factory([], [])]) + assert len(res2[0][1]) == 1 + post1 = res2[0][1][0] + assert post1.url == "https://wallhaven.cc/w/85rjej" + assert post1.text == "85rjej.jpg"