Turbo Pascal 的 40 年,改变了整个 IDE 的编程恐龙

它的影响至今仍能感受到。

自 Turbo Pascal 问世以来已过去 40 年,它凭借在其时先进的集成开发环境(IDE)和超越常规的性能,彻底改写了编程领域的格局。然而,我们现今并未广泛使用它,这是为何呢?

1983 年,Turbo Pascal 的问世,这代表了在 IBM PC 兼容机早期的程序设计工具工作方式的重大变化。相比于传统工作方式下耗时的磁盘访问和多次编译、链接过程,Turbo Pascal 能在内存中直接完成所有操作,让速度大幅提升,因此得名 “Turbo”。

后来在微软参与 C# 项目的 Anders Hejlsberg 被广泛称誉为这门语言的创造者。而 Borland 的老板 Philippe Kahn 第一时间就看中了这个一站式工具的潜力和需求所在。

Turbo Pascal 的价格也相对便宜 —— 在竞争对手可能要花费数百美元的情况下,Turbo Pascal 的零售价只有 49.99 美元。不过,要是客户打算分发二进制文件,其开发商 Borland 仍会额外收取费用。

尽管第一版的 Turbo Pascal 存在一些限制。例如,源代码文件不能超过 64 KB,且仅能为 DOS 和 CP/M 生成 .COM 可执行文件,尽管还支持其他架构和操作系统。它还能从单张软盘启动运行,在一个硬盘代价昂贵、且难以得到,单驱动器成为常态的时代,这省却了用户频繁更换磁盘的麻烦。

仅几个月后,Turbo Pascal 就推出了第二版,此版本进行了一些微小的改动,后续在 1986 年发布了第三版。然而,真正让 Turbo Pascal 有了翻天覆地变化的,是 1987 年的第四版。例如,取消了对 CP/M 和 CP/M-86 的支持,开始在 DOS 环境下生成 .EXE 格式的可执行文件,打破了 .COM 文件的限制。

第四版还引入了带有下拉菜单的全屏文字用户界面。到了 1988 年的第五版,我们看到了熟悉的默认蓝色背景编辑器。在本文作者看来,1989 年的 5.5 版是 Turbo Pascal 的巅峰之作。它引入了面向对象的编程特性,包括类和继承,以及一款逐步调试器。

第六版和第七版分别引入了对内联汇编和用于创建 Windows 可执行文件和 DLL 的支持,但第七版也标志着 Borland 的 Turbo Pascal 到达了终点。尽管后面仍推出了 Turbo Pascal for Windows,但它最终被 Delphi 所取代。

然而,如 Visual Basic 3 这样的工具的火爆,使得 Borland 在 Windows 系统下再未取得过像它在 DOS 下那样的辉煌。

至于 Turbo Pascal,最后 Borland 以免费软件的方式发布了几个版本,包括用于 DOS 的第 1 版,第 5.5 版和第 7 版。

或许这款语言曾引起 Pascal 语言的纯粹主义者们的反感,如今这个 IDE 与现代工具相比可能显得有些笨拙。但在 40 年前,它引发了一个新的开发时代,其影响至今仍能感受到。

(题图:MJ/9d1f3b17-5b29-429d-8a86-e8520309d8d0)


via: https://www.theregister.com/2023/12/04/40_years_of_turbo_pascal/

作者:Richard Speed 译者:ChatGPT 校对:wxy

硬核观察 #1206 Linus Torvalds 为假期季做准备

#1 Linus Torvalds 为假期季做准备

Torvalds 上周日发布了 Linux 内核 6.7 版本的第四个候选发布版。通常,在发布新版内核之前会提供七个候选发布版。按照这个时间表,RC 7 将在耶诞节前夕发布,而正式版将在 12 月 31 日发布。不过 Torvalds “认为这个时间安排最终是可行的,因为假期在发布计划的结尾”。但是可能是由于 6.7 看起来“非常平静”,他预感“必须在 6.8 版本的合并窗口做些什么”,虽然他还不确定要做的是什么,也不确定是否需要。

消息来源:The Register

老王点评:敬业如企鹅皇帝,每年年底也必须得休个假。

#2 IBM 发布了 “实用规模” Heron 量子处理器

IBM 发布了其量子处理单元(QPU)系列的最新产品 Heron 量子处理器,IBM 声称它已达到了 “实用规模”。Heron 拥有 133 个量子比特,高于前一个型号。IBM 还宣称,与前代产品相比,Heron 的错误率降低了五倍,这一点非常重要。Heron 将为 IBM 的“量子系统二”计算集群提供动力,该集群将量子计算、经典计算和量子比特控制电子设备结合在一个模块化系统中,该计算集群有 5 米高,与许多量子系统一样,需要低温冷却才能运行。IBM 预计将在十年后推出的 QPU 拥有 2000 个量子比特。

消息来源:The Register

老王点评:像 IBM 这样的百年企业,还在继续不惜代价地投入量子计算机。

#3 Hugging Face 泄露的 API 令牌可以完全访问 LLaMA 2 仓库

研究人员在 Hugging Face 上通过字符串搜索和手动收集发现了 1500 多个泄露的 API 令牌,这使他们能够访问 723 个组织的账户。在绝大多数情况下(655 个),被暴露的令牌具有写入权限,可以修改账户存储库中的文件。共有 77 个组织以这种方式被暴露,其中包括 Meta、EleutherAI 等。Hugging Face 存储了 25 万多个数据集,还有 50 多万个人工智能模型。如果攻击者利用了暴露的 API 令牌,可能会导致数据被盗、训练数据被毒化或模型被完全窃取,从而会影响 100 多万用户。数据中毒攻击是人工智能和机器学习面临的最严重威胁之一,被列入 OWASP 的十大 LLM 风险。

消息来源:The Register

老王点评:在各种公开代码库中,你总是能捡到各种令牌和凭证,即便托管平台一再提醒和防范。

在 Ubuntu 中更改键盘布局

在 Ubuntu 中拥有多个键盘布局并在它们之间切换非常简单。下面就教你怎么做。

你安装Ubuntu 时,你可以选择键盘布局。你可能已经默认选择了美国英语布局,现在你想将其更改为英国英语、印度英语或你选择的任何其他键盘布局。

好在你可以在同一个 Ubuntu 系统中拥有多种键盘布局。这是相当方便的。

在本教程中,你将学习:

  • 在 Ubuntu 桌面中添加新的键盘布局
  • 在可用键盘布局之间切换
  • 删除额外的键盘布局
  • 改变键盘布局的命令行方法

步骤 1:添加新的键盘布局

要更改键盘布局,你需要先在系统上启用另一个键盘布局。

进入系统设置。按 Ubuntu 中的 Super 键(Windows 键)并搜索“Setting”。

在系统设置中,在左侧边栏中查找 键盘 Keyboard 。选择后,你应该会在 输入源 Input Sources 下看到添加新键盘布局的选项。单击 “+” 号。

Add new keyboard layout

你将看到一些键盘选项,但如果单击三个点,你可以获得更多选项。你可以在此处滚动浏览或搜索。

There are more keyboard layouts available

单击你想要的键盘布局。请记住,所选的键盘布局可能有子布局。

例如,当我单击**英语(印度)时,它会向我显示从丹麦到加纳等的一些英语键盘布局。在这里,我选择了英语(印度,卢比)**键盘。这是将要添加的键盘布局。

你将在“输入源”下看到新添加的键盘布局。

这与我之前在 Ubuntu 中添加印地语键盘布局 时使用的方法相同。

步骤 2:切换键盘布局

这样,你就成功添加了另一个键盘布局。但它没有被使用。你必须在可用的输入源之间切换。

有两种方法可以做到这一点。

方法 1:同时使用 Super+Space 键

切换键盘布局的更快方法是 使用键盘快捷键 ,同时按 Super 键(Windows 键)和空格键。它将立即显示所有启用的键盘布局。

你可以在按住 Super 键的同时多次按空格键在可用选项之间移动。

方法 2:使用鼠标切换键盘布局

记住所有这些键盘快捷键并不容易,这是可以理解的。

当你在系统上启用多个键盘布局时,你会注意到键盘布局名称显示在面板的右上角。单击它,你将看到在布局之间切换的选项或查看所选的键盘布局。

Switch between keyboard layouts

额外提示:删除额外的键盘布局

不喜欢系统中的多个键盘布局? 不用担心。你可以轻松删除它们。

如你之前所见,再次进入键盘设置。单击你选择的键盘旁边的三个垂直点符号。你应该在这里看到删除选项。

使用命令行更改键盘布局(不推荐)

如果你是桌面用户,我强烈推荐上面讨论的图形方法。

如果你在服务器上并且必须使用其他键盘布局,则可以选择命令行。

现在,有多种方法可以更改 Linux 中的键盘布局。但对于 Ubuntu,我更喜欢 dpkg 方式。

sudo dpkg-reconfigure keyboard-configuration

输入你的密码,你将在终端中看到:

要在此 TUI(终端用户界面)中导航,请使用箭头键在可用选项之间移动。使用 Tab 键转至 “OK” 或 “Cancel” 选项。当你位于其中之一时,请按回车键确认你的选择。

选择你选择的国家/地区,然后你可以选择键盘布局。

添加附加键盘后,系统会要求你分配键盘快捷键以在它们之间进行切换。

你也可以将新键盘布局设置为系统中的默认布局和唯一布局。不过,如果你在不相似的语言之间执行此操作,这可能会存在风险。我的意思是,如果你使用英语美国键盘(物理)并将布局切换为匈牙利语,则你将无法使用所有按键。

之后你会看到几个屏幕。

如果你对新的键盘布局不满意,可以再次键入相同的命令,然后重新配置布局。

(题图:MJ/f03362cf-72d0-4003-b334-44c533e113a0)


via: https://itsfoss.com/ubuntu-change-keyboard/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

硬核观察 #1205 苹果用 15 年完成了英特尔芯片替代

#1 苹果用 15 年完成了英特尔芯片替代

苹果的芯片实验室已经成立了 15 周年,拥有在世界各地的实验室工作的数千名工程师。从今年起,所有新款 Mac 电脑都将采用苹果自己的芯片,从而结束了该公司对英特尔 15 年来的依赖。但在成立十余年后的 2020 年,苹果公司才开始放弃使用英特尔的 PC 处理器,转而在 MacBook Air 和其他 Mac 内使用自己的 M1 芯片。突然之间,苹果制造出一款无比轻薄、没有风扇、电池续航时间长达 18 小时的 MacBook Air,而且性能超过了刚刚出货的 MacBook Pro。而配备苹果最先进芯片 M3 Max 的最新 MacBook Pro 比之前生产的最快英特尔 MacBook Pro 快 11 倍。

消息来源:CNBC

老王点评:强如苹果,从头开始也用了十几年才打造出自己的取代芯片。

#2 物理学家可能发现了大型量子计算机性能的硬限制

《物理评论快报》上的一篇新报告指出,对于基于电路的量子计算来说,可实现的电路复杂度受到计时质量的限制。维也纳技术大学解释说,该研究小组能够证明,由于任何时钟都不可能拥有无限量的可用能量(或产生无限量的熵),因此它永远不可能同时拥有完美的分辨率和完美的精度。这为量子计算机的可能性设置了根本性的限制。目前,量子计算机的精确度仍然受到其他因素的限制,例如所用元件的精度或电磁场。但该计算表明,今天我们离时间测量的基本限制发挥决定性作用的机制已经不远了。

消息来源:Science Alert

老王点评:或许,到时候会有新的量子计算机的设计?就像在真空管计算机时代是无法想象现在的超大规模集成电路的计算机一样。

#3 电子前线基金会发布《隐私优先》白皮书

电子前线基金会(EFF)发布了一份新的白皮书《隐私优先》,它认为一部全面的隐私法必须包括以下内容:无在线行为广告;数据最小化;选择同意;用户访问、移植、更正和删除信息的权利;不优先适用州法律;具有私人诉讼权的强力执法;无付费隐私计划;无欺骗性设计。

消息来源:EFF

老王点评:这样的隐私法,简直就是对现在的数字经济赤裸裸的打脸。

Linux 爱好者线下沙龙:LLUG 2023·北京,相聚在这个冬日

从夏天到冬天,LLUG 线下活动再次回到北京,与你相遇在北京。半年来,我们走过了全国 5 座不同的城市,汇聚了 200+ 小伙伴;数十位分享者,线上线下畅聊无阻,我们相聚在这钢筋水凝土所构建的城市里,在线下谈工作、谈理想,寻找心灵的共鸣。

也在线下,我们结下了一段段羁绊,收获了一场场温暖。

12 月 16 日,老王也将来到现场,和我们一起畅聊 Linux,畅聊技术。

杭州场现场照片

成都场现场照片

成都场现场照片

深圳场现场照片

深圳场现场照片

上海场现场照片

上海场现场照片

本次活动,我们将设常规的技术分享、动手实践和闪电演讲三种不同分享的形态。

  • 技术分享会邀请来自 Linux 社区的开发者,分享自己在 Linux 中的技术实践,并配合 Q&A 的环节,帮助大家理解技术难点和实践,如果你有经验和实践想要分享给大家,欢迎报名分享
  • 动手实践则会有来自各厂商的 Linux 大咖,带着大家用半个小时的时间来动手实践一个 Linux 主题,帮助大家动手体验 Linux 的种种新特性、特定的能力。
  • 闪电演讲则不设定主题,每个人有 5 分钟时间来分享自己与 Linux、技术、开源有关的话题,共计 6 个闪电演讲名额,想要试试锻炼自己的演讲能力,不妨从闪电演讲开始。

如果你对于参与活动感兴趣,或者是想要来到 LLUG 的活动上分享你的技术实践,欢迎扫描下方的二维码报名活动,抑或是提交议题~

(题图:MJ/cc68cd82-d9c9-464c-bfb5-73956e71f6ea)

Cinnamon 6.0 首次推出实验性 Wayland 支持!

Cinnamon 6.0 与 Wayland 会话听起来很有趣!

Cinnamon 成为出色的 Linux 桌面环境 有很多原因,Linux 社区喜爱 Linux Mint 部分归功于它。

它提供的用户体验和 定制 Cinnamon Desktop 的各种方法 吸引了用户。

现在,这个桌面环境升级了,Cinnamon 6.0 来了。那么,让我们来看看吧。

Cinnamon 6.0:可以期待什么? ?

Cinnamon 6.0 on Wayland

Cinnamon 6.0 的一大亮点就是Wayland。这项功能 酝酿 已久,现在作为实验支持出现。

从 Linux Mint 21.3 开始,你可以从登录屏幕切换到 Wayland 会话。

除了人们可能期望从 Wayland 获得的通常的细节之外,似乎还有对分数缩放的实验性支持,这一点从该版本的“添加缩放监视器帧缓冲区”提交中可以明显看出。

不过,开发人员已澄清,Wayland 尚未取代 Cinnamon 上的 X11。因为他们对 Wayland 的实现有其局限性,甚至缺乏一些功能。

但是,这只是一个起点,开发人员预计 Wayland 支持将在 2026 年之前完全准备就绪,也就是 Linux Mint 23.x 预计发布的时间。

? 你可以从登录屏幕在默认 Xorg 会话或 Wayland 会话之间切换。

继续,此版本还有其他更改!

例如修复电源小程序电池状态X11 的改进支持 AVIF 图像通知屏幕的新选项颜色选择器支持截图工具等等。

你可以浏览 变更日志 以了解有关 Cinnamon 6.0 的技术改进的更多信息。发布公告发布后,我们将在此处链接。

有趣的是,许多 Linux 发行版(比如 elementary OS)都在努力将默认设置过渡到 Wayland。

但是,Cinnamon 的开发人员正在采取一种相当谨慎的方法,以确保在 Cinnamon 默认切换到 Wayland 之前,他们的 Wayland 实现已经完全就绪。

? 获取 Cinnamon 6.0

好吧,如果你想在 Linux Mint 上运行它,则必须等到今年晚些时候,Linux Mint 21.3 “Virginia” 发布,其中包含 Cinnamon 6。

对于那些等不及的人,你可以从官方 GitHub 仓库 下载源代码 tarball,并手动安装。

Cinnamon 6.0(源代码)

? 你对 Cinnamon 6 提供的功能感到兴奋吗?


via: https://news.itsfoss.com/cinnamon-6-0-release/

作者:Sourav Rudra 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

硬核观察 #1204 Chrome 还有打击广告拦截器的下一个武器

#1 Chrome 还有打击广告拦截器的下一个武器

为了打击浏览器上的广告拦截器,Chrome 不但计划在 2024 年 6 月推出限制广告拦截的 Manifest V3 扩展平台,而且还会限制扩展更新过滤规则的方式,以延迟扩展开发者快速响应变化的能力。YouTube 可以立即更换广告投放系统,但一旦 Manifest V3 成为强制规定,扩展开发者就无法立即做出响应。如今,广告拦截器和隐私应用可以自行更新过滤列表,通常使用的是巨大的开源社区的列表。Manifest V3 将通过限制谷歌所说的 “远程托管代码” 来阻止这种情况。所有更新,即使是像过滤列表这样的良性更新,都需要通过 Chrome 商店进行全面的扩展更新。这些更新都需要经过 Chrome 网上应用商店的审核过程,而这将带来很大的时间延迟。

消息来源:Ars Technica

老王点评:对谷歌的反垄断审查更严厉些吧。

#2 Java 尝试使用多线程的新方法

在 Java 21 的预览版本中,Java 尝试了多线程的新方法:结构化并发。该方法允许开发者使用结构化编程语法来使用多个线程。从本质上讲,它提供了一种使用熟悉的程序流程和结构编写并发软件的方法。这样,开发人员就可以专注于手头的业务,而不是线程的协调。虚拟线程现已成为 Java 的一项正式功能,它为廉价生成线程以获得并发性能提供了可能。结构化并发为此提供了简单的语法。因此,Java 现在拥有了一个独特的、高度优化的、易于理解的线程系统。

消息来源:Info World

老王点评:这是一个很好的消息,值得关注。

#3 研究称 GPT-4 没有通过图灵测试

在一篇题为 《GPT-4 通过图灵测试了吗?》的预印本研究论文中,研究人员将 GPT-4 人工智能语言模型与人类参与者、GPT-3.5 和 ELIZA 进行了对比。其中,ELIZA 是一个上世纪 60 年代开发的基于规则的对话程序。研究人员建立了一个名为 turingtest.live 的网站,他们在该网站上通过互联网举办了一场双人图灵测试。通过该网站,人类审讯者与代表其他人类或人工智能模型的各种 “人工智能证人” 进行互动。令人惊讶的是,ELIZA 在研究中得分相对较高,成功率达到 27%,超过了 GPT-3.5 的 14% 成功率。GPT-4 的成功率为 41%,但就连 GPT-4 也不符合图灵测试的成功标准,既没有达到 50% 的成功率,也没有超过人类参与者的成功率。

消息来源:Ars Technica

老王点评:虽然这个结果令人吃惊,但是我倾向于研究方法有误,比如没有很好地设计符合 GPT 方式的提示语。

开源网页邮箱服务 Roundcube 加入 Nextcloud

Roundcube 现在正与 Nextcloud 合作以迎接未来。

Roundcube,作为最好的 开源网页邮箱服务 之一,决定与 Nextcloud 合作,后者是一个倍受欢迎的开源协作平台,以其协作工具套件而知名。

电子邮件的重要性与日俱增 ,而谷歌和微软等公司正试图垄断市场,这一联手合作的决定显得颇有战略意义。

让我来详细介绍一下。

Roundcube 的新家

这就是 Nextcloud 的 CEO,Frank Karlitschek,关于此次合作的描述:

未来,Nextcloud 将提供必要的资源,比如 项目托管引入人才的投资帮助开发,以及围绕 Roundcube 培育社区

最重要的是,Roundcube 不会取代 Nextcloud Mail;它们将作为独立的网页邮箱解决方案并存。

Frank 强调 Roundcube 是一个被许多人使用的重要的开源项目,而 Nextcloud Mail 是一款强大的邮箱客户端,但是没有合并它们的计划。

你可能会好奇,为什么会发生这个变化?

嗯,Roundcube 的创始人和维护者 Thomas Brüderli 作出了退出的决定。当被问到原因时,他如此回答:

自从孩子出生后,我如何安排我非工作的时间的关注力显然转向了家庭生活,因此我逐渐停止了贡献,也对项目的新动态失去了跟踪。

Roundcube 项目需要一个更好,更专注的领导,因此是时候让我退后,放手了。

许多人都能理解这种情况,很高兴看到 Thomas 将他心爱的项目交给了能够维持它发展的人。

我必须说,我对这个消息感到惊讶,作为多年来一直在工作场所使用 Roundcube 作为网页邮箱的用户,我亲眼见证了它自 2018 年以来的成长与变迁。

我很高兴这个项目得到了它应得的关注和关怀。

此外,我建议你浏览一下 官方博客 以及链接在其中的采访,以了解更多关于此次合并的信息。

? 你怎么看?这将如何影响未来的运作?


via: https://news.itsfoss.com/nextcloud-roundcube/

作者:Sourav Rudra 选题:lujun9972 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

人工智能教程(三):更多有用的 Python 库

在本系列的 上一篇文章 中,我们回顾了人工智能的历史,然后详细地讨论了矩阵。在本系列的第三篇文章中,我们将了解更多的矩阵操作,同时再介绍几个人工智能 Python 库。

在进入主题之前,我们先讨论几个人工智能和机器学习中常用的重要术语。 人工神经网络 artificial neural network (通常简称为 神经网络 neural network ,NN)是机器学习和深度学习的核心。顾名思义,它是受人脑的生物神经网络启发而设计的计算模型。本文中我没有插入神经网络模型的图片,因为在互联网上很容易找到它们。我相信任何对人工智能感兴趣的人应该都见过它们,左边是输入层,中间是一个或多个隐藏层,右边是输出层。各层之间的边上的 权重 weight 会随着训练不断变化。它是机器学习和深度学习应用成功的关键。

监督学习 supervised learning 无监督学习 unsupervised learning 是两个重要的机器学习模型。从长远来看,任何立志于从事人工智能或机器学习领域工作的人都需要学习它们,并了解实现它们的各种技术。这里我认为有必要简单说明两种模型之间的区别了。假设有两个人分别叫 A 和 B,他们要把苹果和橘子分成两组。他们从未见过苹果或橘子。他们都通过 100 张苹果和橘子的图片来学习这两种水果的特征(这个过程称为模型的训练)。不过 A 还有照片中哪些是苹果哪些是橘子的额外信息(这个额外信息称为标签)。这里 A 就像是一个监督学习模型,B 就像是无监督学习模型。你认为在是识别苹果和橘子的任务上,谁的效果更好呢?大多数人可能会认为 A 的效果更好。但是根据机器学习的理论,情况并非总是如此。如果这 100 张照片中只有 5 张是苹果,其它都是橘子呢?那么 A 可能根本就不熟悉苹果的特征。或者如果部分标签是错误的呢?在这些情况下,B 的表现可能比 A 更好。

在实际的机器学习应用中会发生这样的情况吗?是的!训练模型用的数据集可能是不充分的或者不完整的。这是两种模型都仍然在人工智能和机器学习领域蓬勃发展的众多原因之一。在后续文章中,我们将更正式地讨论它们。下面我们开始学习使用 JupyterLab,它是一个用于开发人工智能程序的强大工具。

JupyterLab 入门

在本系列的前几篇文章中,为了简单起见,我们一直使用 Linux 终端运行 Python 代码。现在要介绍另一个强大的人工智能工具——JupyterLab。在本系列的第一篇文章中,我们对比了几个候选项,最终决定使用 JupyterLab。它比 Jupyter Notebook 功能更强大,为我们预装了许多库和包,并且易于团队协作。还有一些其它原因,我们将在后续适时探讨它们。

在本系列的第一篇文章中,我们已经学习了如何安装 JupyterLab。假设你已经按文中的步骤安装好了 JupyterLab,使用 jupyter labjupyter-lab 命令在会默认浏览器(如 Mozilla Firefox、谷歌 Chrome 等)中打开 JupyterLab。(LCTT 译注:没有安装 JupyterLab 也不要紧,你可以先 在线试用 JupyterLab)图 1 是在浏览器中打开的 JupyterLab 启动器的局部截图。JupyterLab 使用一个名为 IPython(交互式 Python)的 Python 控制台。注意,IPython 其实可以独立使用,在 Linux 终端运行 ipython 命令就可以启动它。

图 1:JupyterLab 启动器

现阶段我们使用 JupyterLab 中的 Jupyter Notebook 功能。点击图 1 中用绿框标记的按钮,打开 Jupyter Notebook。这时可能会要求你选择内核。如果你按照本系列第一篇的步骤安装 JupyterLab,那么唯一的可选项就是 Python 3(ipykernel)。请注意,你还可以在 JupyterLab 中安装其它编程语言的内核,比如 C++、R、MATLAB、Julia 等。事实上 Jupyter 的内核相当丰富,你可以访问 Jupyter 内核清单 了解更多信息。

图 2:Jupyter Notebook 窗口

下面我们快速了解一下 Jupyter Notebook 的使用。图 2 显示的是一个在浏览器中打开的 Jupyter Notebook 窗口。从浏览器标签页的标题可以看出,Jupyter Notebook 打开的文件的扩展名是 .ipynb

在图 2 处可以看到有三个选项,它们表示 Jupyter Notebook 中可以使用的三种类型的单元。“Code”(绿色框) 表示代码单元,它是用来执行代码的。“Markdown” 单元可用于输入说明性的文本。如果你是一名计算机培训师,可以用代码单元和 Markdown 单元来创建交互式代码和解释性文本,然后分享给你的学员。“Raw”(红色框)表示原始数据单元,其中的内容不会被格式化或转换。

和在终端中不同,在 Jupyter Notebook 中你可以编辑并重新运行代码,这在处理简单的拼写错误时特别方便。图 3 是在 Jupyter Notebook 中执行 Python 代码的截图。

图 3:在 Jupyter Notebook 中执行 Python 代码

要在执行代码单元中的代码,先选中该单元格,然后点击蓝框标记的按钮。图 3 中用红框标记的是 Markdown 单元,用绿框标记的是代码单元,用黄框标记的执行代码的输出。在这个例子中,Python 代码输出的是 π 的值。

前面提到,JupyterLab 默认安装了许多库和包,我们不用自己安装了。你可以使用 import 命令将这些库导入到代码中。使用 !pip freeze 命令可以列出 JupyterLab 中目前可用的所有库和包。如果有库或包没有安装,大多数情况下都可以通过 pip install <全小写的库或者包的名称> 来安装它们。例如安装 TensorFlow 的命令是 pip install tensorflow。如果后面有库的安装命令不遵循这个格式,我会进行特别说明。随着本系列的继续,我们还会看到 Jupyter Notebook 和 JupyterLab 更多强大的功能。

复杂的矩阵运算

通过下面的代码,我们来了解一些更复杂的矩阵运算或操作。为了节省空间,我没有展示代码的输出。

import numpy as np
A = np.arr ay([[1,2,3],[4,5,6],[7,8,88]])
B = np.arr ay([[1,2,3],[4,5,6],[4,5,6]])
print(A.T)
print(A.T.T)
print(np.trace(A))
print(np.linalg.det(A))
C = np.linalg.inv(A)
print(C)
print(A@C)

下面我逐行来解释这些代码:

  1. 导入 NumPy 包。
  2. 创建矩阵 A
  3. 创建矩阵 B
  4. 打印矩阵 A 转置 transpose 。通过比较矩阵 AA 的转置,你用该可以大致理解转置操作到底做了什么。
  5. 打印 A 的转置的转置。可以看到它和矩阵 A 是相同的。这又提示了转置操作的含义。
  6. 打印矩阵 A trace 。迹是矩阵的对角线(也称为主对角线)元素的和。矩阵 A 的主对角线元素是 1、5 和 88,所以输出的值是 94。
  7. 打印 A 行列式 determinant 。当执行代码的结果是 -237.00000000000009(在你的电脑中可能略有区别)。因为行列式不为 0,所以称 A 为 非奇异矩阵 non-singular matrix
  8. 将矩阵 A inverse 保存到矩阵 C 中。
  9. 打印矩阵 C
  10. 打印矩阵 AC 的乘积。仔细观察,你会看到乘积是一个 单位矩阵 identity matrix ,也就是一个所有对角线元素都为 1,所有其它元素都为 0 的矩阵。请注意,输出中打印出的不是精确的 1 和 0。在我得到的答案中,有像 -3.81639165e-17 这样的数字。这是浮点数的科学记数法,表示 -3.81639165 × 10 -17, 即小数的 -0.0000000000000000381639165,它非常接近于零。同样输出中的其它数字也会有这种情况。我强烈建议你了解计算机是怎样表示浮点数的,这对你会有很大帮助。

根据第一篇文章中的惯例,可以将代码分成基本 Python 代码和人工智能代码。在这个例子中,除了第 1 行和第 9 行之外的所有代码行都可以被看作是人工智能代码。

现在将第 4 行到第 10 行的操作应用到矩阵 B 上。从第 4 行到第 6 行代码的输出没有什么特别之处。然而运行第 7 行时,矩阵 B 的行列式为 0,因此它被称为 奇异矩阵 singular matrix 。运行第 8 行代码会给产生一个错误,因为只有非奇异矩阵才存在逆矩阵。你可以尝试对本系列前一篇文章中的 8 个矩阵都应用相同的操作。通过观察输出,你会发现矩阵的行列式和求逆运算只适用于方阵。

方阵就是行数和列数相等的矩阵。在上面的例子中我只是展示了对矩阵执行各种操作,并没有解释它们背后的理论。如果你不知道或忘记了矩阵的转置、逆、行列式等知识的话,你最好自己学习它们。同时你也应该了解一下不同类型的矩阵,比如单位矩阵、对角矩阵、三角矩阵、对称矩阵、斜对称矩阵。维基百科上的相关文章是不错的入门。

现在让我们来学习 矩阵分解 matrix decomposition ,它是更复杂的矩阵操作。矩阵分解与整数的因子分解类似,就是把一个矩阵被写成其它矩阵的乘积。下面我通过图 4 中整数分解的例子来解释矩阵分解的必要性。代码单元开头的 %time 是 Jupyter Notebook 的 魔法命令 magic command ,它会打印代码运行所花费的时间。** 是 Python 的幂运算符。基本的代数知识告诉我们,变量 a 和 b 的值都等于 (6869 x 7873) 100。但图 4 显示计算变量 b 的速度要快得多。事实上,随着底数和指数的增大,执行时间的减少会越来越明显。

图 4:Python 代码的执行耗时

在几乎所有的矩阵分解技术技术中,原始矩阵都会被写成更稀疏的矩阵的乘积。 稀疏矩阵 sparse matrix 是指有很多元素值为零的矩阵。在分解后,我们可以处理稀疏矩阵,而不是原始的具有大量非零元素的 密集矩阵 dense matrix 。在本文中将介绍三种矩阵分解技术——LUP 分解、 特征分解 eigen decomposition 奇异值分解 singular value decomposition (SVD)。

为了执行矩阵分解,我们需要另一个强大的 Python 库,SciPy。SciPy 是基于 NumPy 库的科学计算库,它提供了线性代数、积分、微分、优化等方面的函数。首先,让我们讨论 LUP 分解。任何方阵都能进行 LUP 分解。LUP 分解有一种变体,称为 LU 分解。但并不是所有方阵都能 LU 分解。因此这里我们只讨论 LUP 分解。

在 LUP 分解中,矩阵 A 被写成三个矩阵 L、U 和 P 的乘积。其中 L 是一个 下三角矩阵 lower triangular matrix ,它是主对角线以上的所有元素都为零的方阵。U 是一个 上三角矩阵 upper triangular matrix ,它是主对角线以下所有元素为零的方阵。P 是一个 排列矩阵 permutation matrix 。这是一个方阵,它的每一行和每一列中都有一个元素为 1,其它元素的值都是 0。

现在看下面的 LUP 分解的代码。

import numpy as np
import scipy as sp
A=np.array([[11,22,33],[44,55,66],[77,88,888]])
P, L, U = sp.linalg.lu(A)
print(P)
print(L)
print(U)
print(P@L@U)

图 5 显示了代码的输出。第 1 行和第 2 行导入 NumPy 和 SciPy 包。在第 3 行创建矩阵 A。请记住,我们在本节中会一直使用矩阵 A。第 4 行将矩阵 A 分解为三个矩阵——PLU。第 5 行到第 7 行打印矩阵 PLU。从图 5 中可以清楚地看出,P 是一个置换矩阵,L 是一个下三角矩阵,U 是一个上三角矩阵。最后在第 8 行将这三个矩阵相乘并打印乘积矩阵。从图 5 可以看到乘积矩阵 P@L@U 等于原始矩阵 A,满足矩阵分解的性质。此外,图 5 也验证了矩阵 LUP 比矩阵 A 更稀疏。

图 5:用 SciPy 进行 LUP 分解

下面我们讨论特征分解,它是将一个方阵是用它的 特征值 eigenvalue 特征向量 eigenvector 来表示。用 Python 计算特征值和特征向量很容易。关于特征值和特征向量的理论解释超出了本文的讨论范围,如果你不知道它们是什么,我建议你通过维基百科等先了解它们,以便对正在执行的操作有一个清晰的概念。图 6 中是特征分解的代码。

图6:用 SciPy 进行特征分解

在图 6 中,第 1 行计算特征值和特征向量。第 2 行和第 3 行输出它们。注意,使用 NumPy 也能获得类似的效果,Lambda, Q = np.linalg.eig(A)。这也告诉我们 NumPy 和 SciPy 的功能之间有一些重叠。第 4 行重建了原始矩阵 A。第 4 行中的代码片段 np.diag(Lambda) 是将特征值转换为对角矩阵(记为 Λ)。对角矩阵是主对角线以外的所有元素都为 0 的矩阵。第 4 行的代码片段 sp.linalg.inv(Q) 是求 Q 的逆矩阵(记为 Q -1)。最后,将三个矩阵 QΛQ -1 相乘得到原始矩阵 A。也就是在特征分解中 A=QΛQ -1

图 6 还显示了执行的代码的输出。红框标记的是特征值,用绿框标记的是特征向量,重构的矩阵 A 用蓝框标记。你可能会感到奇怪,输出中像 11.+0.j 这样的数字是什么呢?其中的 j 是虚数单位。11.+0.j 其实就是 11.0+0.0j,即整数 11 的复数形式。

现在让我们来看奇异值分解(SVD),它是特征分解的推广。图 7 显示了 SVD 的代码和输出。第 1 行将矩阵 A 分解为三个矩阵 USV。第 2 行中的代码片段 np.diag(S)S 转换为对角矩阵。最后,将这三个矩阵相乘重建原始矩阵 A。奇异值分解的优点是它可以对角化非方阵。但非方阵的奇异值分解的代码稍微复杂一些,我们暂时不在这里讨论它。

图 7:用 SciPy 进行 奇异值分解

其它人工智能和机器学习的 Python 库

当谈到人工智能时,普通人最先想到的场景可能就是电影《终结者》里机器人通过视觉识别一个人。 计算机视觉 computer vision 是人工智能和机器学习技术被应用得最广泛的领域之一。下面我将介绍两个计算机视觉相关的库:OpenCV 和 Matplotlib。OpenCV 是一个主要用于实时计算机视觉的库,它由 C 和 C++ 开发。C++ 是 OpenCV 的主要接口,它通过 OpenCV-Python 向用户提供 Python 接口。Matplotlib 是基于 Python 的绘图库。我曾在 OSFY 上的一篇早期 文章 中详细介绍了 Matplotlib 的使用。

前面我一直在强调矩阵的重要性,现在我用一个实际的例子来加以说明。图 8 展示了在 Jupyter Notebook 中使用 Matplotlib 读取和显示图像的代码和输出。如果你没有安装 Matplotlib,使用 pip install matplotlib 命令安装 Matplotlib。

图 8:用 Matplotlib 读取和显示图像

在图 8 中,第 1 行和第 2 行从 Matplotlib 导入了一些函数。注意你可以从库中导入单个函数或包,而不用导入整个库。这两行是基本的 Python 代码。第 3 行从我的计算机中读取标题为 OSFY-Logo.jpg 的图像。我从 OSFY 门户网站的首页下载了这张图片。此图像高 80 像素,宽 270 像素。第 4 行和第 5 行在 Jupyter Notebook 窗口中显示图像。请注意图像下方用红框标记的两行代码,它的输出告诉我们变量 image 实际上是一个 NumPy 数组。具体来说,它是一个 80 x 270 x 3 的三维数组。

数组尺寸中的 80 x 270 就是图片的大小,这一点很容易理解。但是第三维度表示什么呢?这是因计算机像通常用 RGB 颜色模型来存储的彩色图。它有三层,分别用于表示红绿蓝三种原色。我相信你还记得学生时代的实验,把原色混合成不同的颜色。例如,红色和绿色混合在一起会得到黄色。在 RGB 模型中,每种颜色的亮度用 0 到 255 的数字表示。0 表示最暗,255 表示最亮。因此值为 (255,255,255) 的像素表示纯白色。

现在,执行代码 print(image), Jupyter Notebook 会将整个数组的一部分部分打印出来。你可以看到数组的开头有许多 255。这是什么原因呢?如果你仔细看 OSFY 的图标会发现,图标的边缘有很多白色区域,因此一开始就印了很多 255。顺便说一句,你还可以了解一下其他颜色模型,如 CMY、CMYK、HSV 等。

现在我们反过来从一个数组创建一幅图像。首先看图 9 中所示的代码。它展示了如何生成两个 3 x 3 的随机矩阵,它的元素是 0 到 255 之间的随机值。注意,虽然相同的代码执行了两次,但生成的结果是不同的。这是通过调用 NumPy 的伪随机数生成器函数 randint 实现的。实际上,我中彩票的几率都比这两个矩阵完全相等的几率大得多。

图 8:两个随机矩阵

接下来我们要生成一个形状为 512 x 512 x 3 的三维数组,然后将它转换为图像。为此我们将用到 OpenCV。注意,安装 OpenCV 命令是 pip install opencv-python。看下面的代码:

import cv2
img = np.random.randint(0, 256, size=(512, 512, 3))
cv2.imwrite('img.jpg', img)

第 1 行导入库 OpenCV。注意导入语句是 import cv2,这与大多数其他包的导入不同。第 3 行将矩阵 img 转换为名为 img.jpg 的图像。图 10 显示了由 OpenCV 生成的图像。在系统中运行这段代码,将图像将被保存在 Jupyter Notebook 的同一目录下。如果你查看这张图片的属性,你会看到它的高度是 512 像素,宽度是 512 像素。通过这些例子,很容易看出,任何处理计算机视觉任务的人工智能和机器学习程序使用了大量的数组、向量、矩阵以及线性代数中的思想。这也是本系列用大量篇幅介绍数组、向量和矩阵的原因。

图 10:OpenCV 生成的图像

最后,考虑下面显示的代码。image.jpg 输出图像会是什么样子?我给你两个提示。函数 zeros 在第 4 行和第 5 行创建了两个 512 x 512 的数组,其中绿色和蓝色填充了零。第 7 行到第 9 行用来自数组 redgreenblue 的值填充三维数组 img1

import numpy as np
import cv2
red = np.random.randint(0, 256, size=(512, 512))
green = np.zeros([512, 512], dtype=np.uint8)
blue = np.zeros([512, 512], dtype=np.uint8)
img1 = np.zeros([512,512,3], dtype=np.uint8)
img1[:,:,0] = blue
img1[:,:,1] = green
img1[:,:,2] = red
cv2.imwrite(image.jpg, img1)

本期的内容就到此结束了。在下一篇文章中,我们将开始简单地学习 张量 tensor ,然后安装和使用 TensorFlow。TensorFlow 是人工智能和机器学习领域的重要参与者。之后,我们将暂时放下矩阵、向量和线性代数,开始学习概率论。概率论跟线性代数一样是人工智能的重要基石。

(题图:MJ/ec8e9a02-ae13-4924-b6cb-74ef96ab8af9)


via: https://www.opensourceforu.com/2023/07/ai-a-few-more-useful-python-libraries/

作者:Deepu Benson 选题:lujun9972 译者:toknow-gh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

硬核观察 #1203 巴西城市颁布由 ChatGPT 编写的法令

#1 巴西城市颁布由 ChatGPT 编写的法令

巴西南部第二大城市 阿雷格里港 Porto Alegre 于 10 月份通过了一项法令,旨在防止该市在水表被盗时向纳税人收取更换水表的费用。但议员们不知道的是,该提案是议员 拉米罗·罗萨里奥 Ramiro Rosário 通过 ChatGPT 拟定的,他仅仅输入了 49 个字的提示语,在几秒钟内就返回了完整的提案草案,还包括理由说明。该提案被提交给了议会中的 35 位同僚,没有做任何改动就一致通过了该提案。对提案来源保密是有意为之,罗萨里奥说,“如果我在此之前透露了这一消息,该提案肯定不会被付诸表决。”他并不是世界上第一个测试 ChatGPT 能力的立法者。其他一些人也在更有限的范围内进行了测试,或取得了不太成功的结果。

消息来源:AP News

老王点评:其实不必惊讶,AI 以后就是和办公软件、拼写检查工具一样的工具。

#2 研究人员量化生成人工智能图像的碳足迹

Hugging Face 和卡内基梅隆大学的研究人员发现,使用人工智能生成图像的碳足迹相当于给智能手机充电,生成文本所消耗的能量相当于智能手机充电至约 16%。他们使用 30 个数据集对 88 种不同的模型进行了实验。研究结果表明,最耗能的任务是那些要求人工智能模型生成新内容的任务,无论是文本生成、摘要、图像标题还是图像生成。图像生成产生的排放量最高,而文本分类则被列为能耗最低的任务。

消息来源:Engadget

老王点评:如果从节省的时间和成本来看,降低的碳足迹更多。

#3 Servo 浏览器引擎继续走嵌入式友好之路

Servo 项目现在是欧洲 Linux 基金会的一项工作,他们在持续改进 Servo 的嵌入可能性。Servo 项目正在加快构建速度、改进离屏渲染、支持多个网页视图以及其他工作。如果 Servo 能够成为一个适合嵌入式环境的网络引擎,这将是 Servo 取得成功和发展的主要领域之一。

消息来源:Phoronix

老王点评:确实,在目前浏览器市场几乎被 Chromium 引擎统治的情况下,面向独特的领域发展更好。