分类 技术 下的文章

OpenWrt 是一个基于 Linux 的开源操作系统,主要针对嵌入式网络设备。

如果你在家里阅读这篇文章,你可能是用一个 LTE/5G/DSL/WIFI 路由器联网的。这种设备通常负责在你的本地设备(智能手机、PC、电视等)之间路由数据包,并通过内置的调制解调器提供对 WWW 的访问。你家里的路由器很可能有一个基于网页的界面,用于配置该设备。这种界面往往过于简单,因为它们是为普通用户制作的。

如果你想要更多的配置选项,但又不想花钱买一个专业的设备,你应该看看其他的固件,如 OpenWrt

OpenWrt 的特点

OpenWrt 是一个基于 Linux 的、针对嵌入式网络设备的开源操作系统。它主要用于替代各种家用路由器上的原始固件。OpenWrt 具备一个好的路由器应该具备的所有有用功能,如 DNS 服务器(dnsmasq),WiFi 接入点(AP)和客户端功能,用于调制解调器功能的 PPP 协议,而且,与标准固件不同,这一切都是可以完全配置的。

LuCI 网页界面

OpenWrt 可以通过命令行(SSH)或使用 GUI 配置界面(LuCI)进行远程配置。LuCI 是一个用 Lua 编写的轻量级、可扩展的网页 GUI,它可以精确地配置你的设备。除了配置,LuCI 还提供了很多额外的信息,如实时图表、系统日志和网络诊断。

LuCI 网页界面

LuCI 有一些可选的扩展,以增加更多的配置选择。

可写文件系统

它的另一个亮点是可写文件系统。原有的固件通常是只读的,而 OpenWrt 配备了一个可写的文件系统,这要归功于一个巧妙的解决方案,它将 OverlayFS 与 SquashFS/JFFS2 文件系统相结合,允许安装软件包以增强功能。在 OpenWrt 文档 中可以找到更多关于文件系统架构的信息。

扩展

OpenWrt 有一个相关的软件包管理器,opkg,它允许安装额外的服务,比如 FTP 服务器、DLNA 媒体服务器、OpenVPN 服务器、用于实现文件共享的 Samba 服务器、控制电话的 Asterisk 等等。当然,有些扩展需要适当的底层硬件资源。

动机

你可能想知道为什么要冒着对你的设备造成不可修复的损害和失去保修的风险,而尝试更换路由器制造商的固件。如果你的设备以你想要的方式工作,那么你可能不应该。永远不要碰一个正在运行的系统!但是,如果你想增强功能,或者你的设备缺乏配置选项,那么你应该看看 OpenWrt 是否可以成为一种补救措施。

在我的例子中,我想要一个旅行用的路由器,当我在露营地的时候,我可以把它放在一个合适的位置,以便让其它设备与这个本地 WiFi 接入点(AP)保持良好连接。该路由器将作为一个普通的客户端连接到互联网,并广播它的 WiFi 接入点让我的其它设备连接到它。这样我就可以配置我的所有设备与这个路由器的接入点连接,当我在其他地方时我只需要改变路由器的客户端连接。此外,在一些露营地,你只能得到一个单一设备的访问代码,我可以通过这种设置来加强。

作为我的旅行路由器,我选择 TP-Link TL-WR902AC 的原因如下:

  • 很小
  • 两根 WiFi 天线
  • 5V 电源(USB)
  • 低功耗
  • 成本效益高(你以 30 美元左右的价格得到它)

为了了解它的尺寸,这里是它在树莓派 4 旁边的样子:

TP-Link TL-WR902AC 在树莓派旁边

尽管这个路由器带来了我所需要的所有硬件功能,但我很快发现,默认的固件并不能让我按照我想要的方式配置它。该路由器主要是作为一个 WiFi 接入点,它可以复制现有的 WiFi 网络或通过板载以太网接口将自己连接到网络。默认的固件对于这些使用情况是非常有限的。

(LCTT 译注:此型号国内没有销售,它的特点之一是可以通过插入 3G/4G USB 网卡连接到互联网,但由于它不在国内销售,所以没有支持哪种国内 3G/4G USB 网卡的说明,我 查下来 似乎华为的 E3372h-320 是可用的。有相关实践的同学可以分享一下经验。

国内销售的其它类似型号只能通过以太网口或 WiFi 连接到互联网,这种情况下,如果只能通过 3G/4G 连接互联网,那需要另外买一个随身 WiFi /移动路由器。)

幸运的是,该路由器能够运行 OpenWrt,所以我决定用它来替换原来的固件。

安装

当你的 LTE/5G/DSL/WiFi 路由器符合 最低要求 时,很有可能在它上面运行 OpenWrt。下一步,你要查看 硬件表,检查你的设备是否被列为兼容,以及你要选择哪个固件包。OpenWrt 的 TP-Link TL-WR902AC 的页面还包括安装说明,其中描述了如何刷入内部存储器。

刷入固件的过程在不同的设备之间可能会有所不同,所以我就不详细介绍了。简而言之,我必须通过将设备连接到一个具有特定 IP 地址的网络接口上的 TFTP 服务器,重命名 OpenWrt 固件文件,然后按复位按钮启动设备。

配置

一旦刷入成功,你的设备现在应该用新的固件启动了。现在启动可能需要更长的时间,因为与默认固件相比,OpenWrt 具有更多的功能。

为了开始配置,需要在你的 PC 和路由器之间建立一个直接的以太网连接,OpenWrt 在此充当了一个 DHCP 服务器,并将你的 PC 的以太网适配器配置为一个 DHCP 客户端。

在 Fedora Linux 上,要激活你的网络适配器的 DHCP 客户端模式,首先你必须通过运行找出连接的 UUID:

$ nmcli connection show
NAME          UUID         TYPE      DEVICE 
Wired Conn 1  7a96b...27a  ethernet  ens33
virbr0        360a0...673  bridge   virbr0
testwifi      2e865...ee8  wifi     --
virbr0        bd487...227  bridge   --
Wired Conn 2  16b23...7ba  ethernet --

选择你要修改的连接的 UUID,然后运行:

$ nmcli connection modify <UUID> ipv4.method auto

你可以在 Fedora 联网维基 中找到更多关于这些命令的信息。

在你连接到路由器后,打开一个网页浏览器并导航到 http://openwrt/。现在你应该看到 LuCI 的登录管理器:

LuCI 登录

使用 root 作为用户名,并将密码留空。

配置 WiFi 和路由

要配置你的 WiFi 天线,请点击 “ 网络 Network ” 菜单并选择 “ 无线 Wireless ”。

LuCI 无线配置

在我的设备上,上面的天线 radio0 工作在 2.4GHz 模式,并连接到名为 MOBILE-INTERNET 的本地接入点。下面的天线 radio1 工作在 5GHz,有一个相关的接入点,SSID 为 OpenWrt_AV。通过点击 “ 编辑 Edit ” 按钮,你可以打开设备配置,以决定该设备属于 LAN 还是 WWAN 网络。在我的例子中,接入点 OpenWrt_AV 属于 LAN 网络,客户端连接 MOBILE-INTERNET 属于 WWAN 网络。

LuCI 配置屏幕

配置的网络在 “ 接口 Interfaces ” 面板的 “ 网络 Network ” 下列出。

设备列表

为了获得我想要的功能,网络流量必须在 LAN 和 WWAN 网络之间进行路由。路由可以在 “ 网络 Network ” 面板的 “ 防火墙 Firewall ” 部分进行配置。我没有在这里做任何改动,因为在默认情况下,网络之间的流量是被路由的,而传入的数据包(从 WWAN 到 LAN)必须通过防火墙。

防火墙设置

因此,你需要知道的是一个接口是属于 LAN 还是 (W)WAN。这个概念使它相对容易配置,特别是对初学者来说。你可以在 OpenWrt 联网基础 指南中找到更多信息。

专属门户

公共 WiFi 接入点通常受到 专属门户 的保护,你必须输入一个访问代码或类似的代码。通常情况下,当你第一次连接到接入点并试图打开一个任意的网页时,这种门户就会出现。这种机制是由接入点的 DNS 服务器实现的。

默认情况下,OpenWrt 激活了一个安全功能,可以防止连接的客户端受到 DNS 重新绑定攻击。OpenWrt 的重新绑定保护也阻止了专属门户网站被转发到客户端,所以你必须禁用重新绑定保护,以便你可以到达专属门户网站。这个选项在 “ 网络 Network ” 菜单的 “ DHCP 和 DNS DHCP and DNS ” 面板中。

尝试 OpenWrt

由于升级到 OpenWrt,我得到了一个基于商品硬件的灵活的旅行路由器。OpenWrt 使你的路由器具有完全的可配置性和可扩展性,而且由于其制作精良的网页 GUI,它也适合初学者使用。甚至有一些 精选路由器 在出厂时已经安装了 OpenWrt。你还可以用很多 可用的软件包 来增强你的路由器的功能。例如,我正在使用 vsftp FTP 服务器,在连接的 U 盘上托管一些电影和电视剧。看看该 项目主页,在那里你可以找到许多切换到 OpenWrt 的理由。

图片来自: Stephan Avenwedde,CC BY-SA 4.0


via: https://opensource.com/article/22/7/openwrt-open-source-firmware

作者:Stephan Avenwedde 选题:lkxed 译者:wxy 校对:wxy

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

介绍最新的 Ubuntu 23.04 “Lunar Lobster” 版本,它包含了大量的新功能和改进。

代号为 “ 月球龙虾 Lunar Lobster ” 的 Ubuntu 23.04 是 2023 年的第一个短期版本,它将被支持 9 个月,直到 2024 年 1 月。这个版本采用了新的软件包和技术来改进 Ubuntu 的核心后台和进展工作。在某种程度上,许多变化是作为明年的 LTS 版本(Ubuntu 24.04)的准备工作而被确定的。

它的开发周期几乎接近结束。截至发稿时,测试版已经冻结。所以,现在是探索这个版本的新功能的好时机。

但在此之前,先来看看即将到来的里程碑:

  • 测试版冻结: 2023 年 3 月 27 日
  • 测试版发布: 2023 年 3 月 30 日
  • 候选版本:2023 年 4 月 13 日
  • 最终版本:2023 年 4 月 20 日

Ubuntu 23.04 Lunar Lobster Daily Live desktop

Ubuntu 23.04 的新功能

新的桌面安装程序

Ubuntu 新的基于 Rust 的桌面安装程序终于可以在这个版本中体验了。这项工作历经了两年多的时间。在经历了许多障碍和关键错误的修复后,现在已经稳定到可以在正式版本中发布。从这个版本开始,经典的 Ubiquity 被全新的安装程序所取代,如下面一组图片所示:

新的 Ubuntu 安装程序--主页面

分区摘要页

外观变化

用户信息页面

然而,正如我从一些消息来源听到的,旧的 Uqiuity 将继续保留(直到明年)。但我不完全确定旧的安装程序将如何启动。因为默认的 立付介质 Live Media 会启动新的安装程序。

与旧安装程序的相比,新的有一些变化。首先,相对于旧的 Uqiuity 对话框和小工具控制,外观和感觉更加现代。

关于分区的摘要细节现在作为一个单独的页面出现,而不是一个弹出框。

此外,Ubuntu 23.04 现在在安装前会询问深色/浅色模式选项。我不确定这样做的必要性,因为 Ubuntu 已经在一个单独的应用程序中定义了一些开箱步骤。

GNOME 44 桌面

Ubuntu 23.04 桌面版采用了 GNOME 44。这个版本的 GNOME 44 带来了一堆长期等待的更新。例如,在这个版本中,你可以在本地文件选取器对话框中体验到图像预览。此外,文件应用得到了期待已久的缺失功能,即原生的文件夹展开视图(树状视图)。你可以使用下面的设置来启用它。

新的可展开文件夹视图

启用树状视图的设置

在 GNOME 44 中的其他关键变化包括:文件应用现在支持在粘贴图像数据时创建文件,改进的无障碍设置页面可以提供更好的导航,以及大大改进的 GNOME 网页浏览器。

你可以在下面这篇功能亮点页面上了解更多关于 GNOME 44 的发布:

GNOME 44 - 最佳功能

精简 ISO 镜像

这是一个令人惊讶的举动,Ubuntu 团队在这个版本中 引入 一个官方的精简 ISO 镜像(不到 200MB)。一旦发布,你可以使用这个精简 ISO 镜像来创建自定义的 Ubuntu Linux。截至发稿时,我们还没有得到这个精简镜像的日常构建 ISO。

然而,Xubuntu 团队 已经发布了 一个精简 ISO 镜像,我尝试了一下。同样地,所有的官方风味版都有望得到他们自己的精简 ISO 文件。

更多的信息将在未来几天内到达。

多用 Snap,少用 Flatpak

一些与 Snap 和 Flatpak 相关的重要变化即将到来,你应该为此做好准备。

首先,推行更多的 Snap 包是显而易见的,因为官方 Telegram 桌面应用程序现在在 Ubuntu 中使用 Snap 包。

此外,Ubuntu 计划将 Steam 桌面客户端作为 Snap 包发布,该客户端 目前正在测试中。Steam 桌面客户端现在以原生 deb 和 Flatpak 包的形式提供。Steam Snap 预计将在今年年底到来,而不是在这个版本中。

与此同时,默认的 Flatpak 和 Flathub 集成现在已经正式从所有支持的 Ubuntu 官方风味版中 移除。这个决定在网上引起了一些 “讨论”。

因此,从这个版本开始,Ubuntu MATE 和 Kubuntu 将不会默认搭载 Flatpak/Flathub。然而,你可以通过 只需几个步骤 安装它。

新的应用程序

Ubuntu 23.04 的默认应用程序集合一如既往地进行了升级。然而,你可能会注意到一些关键的变化。

首先,LibreOffice 可能看起来有点不同。LibreOffice 团队最近改变了默认的图标主题,在 Ubuntu GNOME 的桌面环境中,它看起来非常棒。

在这个版本中包含的 LibreOffice 7.5 中, Writer 有一个改进的书签模块,Calc 电子表格有了新的数字格式,Impress 有了新的表格设计风格等等。

你可以在这里阅读更多关于 LibreOffice 7.5 的功能

新的 LibreOffice 图标

Ubuntu 23.04 中其他应用程序的总结:

  • Firefox 111(Snap)
  • LibreOffice 7.5
  • Transmission 3.0
  • Shotwell 图像查看器 0.30

官方风味版

对于所有的教育工作者和学生来说,有一个好消息。从 23.04 版本开始,Edubuntu 将 正式出现。它是 Ubuntu 官方风味版列表中的另一个补充。Edubuntu 可能会有一个更大的 ISO 文件(大约 5GB),并安装了所有与教育有关的 FOSS 软件。我将会有一篇单独的文章来点评这个风味版。

此外,如下的风味版都有其对应的桌面环境:

Ubuntu Budgie 23.04 带来了一些令人兴奋的功能,如边缘平铺、热角等。

内核和工具链更新

截至发稿时,每日构建副本都是 Linux 内核 6.1。然而,在内核冻结(2023 年 4 月 6 日)之前,目前的主线内核 6.2 可能会到达 Ubuntu 23.04。Linux 内核 6.2 改进了对 GPU、CPU、端口和 Rust 更新的支持。

在核心部分,Python 3.11 现在可以在 Ubuntu 23.04 中开箱即用。你不需要再单独 安装 Python 3.11。值得一提的是,Python 3.12 版本将在今年发布,目前正在进行多次 RC 测试。

其他工具链的更新如下:

  • GCC 13
  • GlibC 2.37
  • Ruby 3.1
  • golang 1.2
  • LLVM 16

Ubuntu 23.04 的新壁纸

桌面版本永远不会缺席一些新的很酷的壁纸。在成功的 壁纸竞赛 之后,获胜者被选为以 “月亮和龙虾” 为特色的默认壁纸。

这里是默认的一张。而其余的你可以在 这里 找到。

Ubuntu 23.04 Lunar Lobster 默认壁纸

下载

每日构建的 ISO 文件存在于以下 Ubuntu 桌面和风味版的链接中。

请注意,你不应该将这些作为主要用途。它们有一些错误(至少我发现了一些),而且还不完全稳定。

Ubuntu 风味版.iso 镜像 - 日常构建
Ubuntu 23.04 桌面(GNOME)https://cdimage.ubuntu.com/ubuntu/daily-live/pending/
Xubuntu 23.04https://cdimage.ubuntu.com/xubuntu/daily-live/current/
Ubuntu MATE 23.04https://cdimage.ubuntu.com/ubuntu-mate/daily-live/current/
Ubuntu Kylin 23.04尚无
Lubuntu 23.04https://cdimage.ubuntu.com/lubuntu/daily-live/current/
Kubuntu 23.04https://cdimage.ubuntu.com/kubuntu/daily-live/current/
Ubuntu Budgie 23.04https://cdimage.ubuntu.com/ubuntu-budgie/daily-live/current/
Ubuntu Unity 23.04https://cdimage.ubuntu.com/ubuntu-unity/daily-live/current/
Edubuntu 23.04https://cdimage.ubuntu.com/edubuntu/daily-live/current/

总结

总之,新的 Ubuntu 23.04 有望为桌面用户提供更流畅、更无缝的体验。

从改进的安全功能到增强的生产力工具和应用程序,这次更新肯定会让 Ubuntu 的爱好者和粉丝感到高兴。无论你是经验丰富的用户还是 Ubuntu 生态系统的新手,这个版本都值得一看。

最后,Ubuntu 23.04 将于 2023 年 4 月 20 日发布。


via: https://www.debugpoint.com/ubuntu-23-04-features/

作者:Arindam 选题:lkxed 译者:wxy 校对:wxy

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

本教程解释了 Python 中变量的概念、它们的类型,以及如何在实际项目中使用的示例。

在 Python 中,变量是存储值的保留内存位置。

它们是个名称,可以分配一个值给它并在整个代码中引用它。使用变量使值可访问并为值提供与你的代码相关的上下文/含义。

在开始之前,我希望你已经安装了 Python 并设置了一个基本的编辑器。如果没有,请参考我的以下指南:

变量规则

  • 变量区分大小写。
  • 变量名称只能包含大写和小写字母(A–Z、a–z)、数字(0–9)和下划线(\_)。
  • 它们不能以数字开头。
  • Python 变量是 动态类型
  • Python 支持 Unicode 变量(例如 é 和 ü 等装饰字母,甚至中文、日文和阿拉伯符号)。
  • 根据 PEP 8 标准,变量名只能是小写,单词可以用下划线分隔(例如 total\_price)。

Python 变量:示例

要在 Python 中创建一个变量,我们需要使用赋值运算符(=)为其赋值。例如,下面的代码行创建了一个名为 x 的变量并为其赋值 10

x = 10

在 Python 中,变量是动态类型的,这意味着解释器可以根据分配给它的值来确定变量的数据类型。Python 支持各种类型的变量,包括整数、浮点数、字符串、布尔值和复数。

# 整型变量
age = 20

# 浮点变量
price = 4.99

# 字符串变量
name = "John Doe"

# 布尔变量
is_active = True

# 复数变量
z = 2 + 3j

变量在编程中很有用,因为它们允许我们存储和操作数据。例如,我们可以使用变量来执行数学运算、连接字符串以及根据布尔变量的值做出决策。

# 数学运算
x = 5
y = 10
z = x + y
print(z)  # 输出:15

# 字符串连接
first_name = "John"
last_name = "Doe"
full_name = first_name + " " + last_name
print(full_name)  # 输出:John Doe

A simple demonstration of variables in Python

变量也可以在现实世界的项目中用于存储和操作数据。例如,在 Web 应用中,我们可以使用变量来 存储用户输入、数据库查询以及向用户输出数据。

# 用户输入
name = input("What is your name? ")
print("Hello, " + name + "!")  # 输出: Hello, John!

# 数据库查询
import sqlite3

conn = sqlite3.connect("example.db")
cursor = conn.cursor()

cursor.execute("SELECT * FROM users WHERE id = ?", (1,))
user = cursor.fetchone()

print(user)  # 输出: (1, 'John Doe', '[email protected]')

# 输出数据给用户
balance = 100.00
print("Your current balance is ₹" + str(balance))  # 输出: Your current balance is ₹100.0

使用变量时的常见错误

在处理变量时,你可能会遇到一些常见错误。这里是其中的一些。

  • NameError:当你尝试访问尚未定义的变量时会发生此错误。例如,如果你尝试打印一个尚未赋值的变量的值,你将得到一个 NameError。以下代码给出了 NameError,因为变量 Full_name 未定义。
# NameError 演示
first_name = "John"
last_name = "Doe"
full_name = first_name + " " + last_name
print(Full_name)  # NameError

NameError example

  • TypeError:当你尝试对错误数据类型的变量进行操作时会发生此错误。例如,如果你尝试连接一个字符串和一个整数,你将得到 TypeError。下面的代码片段给出了 TypeError
# TypeError 演示
first_name = "John"
age = 10
print(first_name + age)

TypeError example in Python

  • ValueError:当你尝试将变量转换为不同的数据类型但无法进行转换时会发生此错误。例如,如果你尝试将包含字母的字符串转换为整数,你将得到 ValueError
# ValueError 演示
first_name = "John"
age = 10
print(int(first_name))

ValueError in Python

总结

了解变量对于任何 Python 开发人员来说都是必不可少的。变量允许我们存储和操作数据、执行数学运算、连接字符串等。如果你是 Python 编程的初学者,我希望本指南能够阐明这个概念。


via: https://www.debugpoint.com/python-variables/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

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

嗨!这周我一直在写一些 Javascript,和往常一样,当我开始一个新的前端项目时,我面临的问题是:我是否应该使用构建系统?

我想谈谈构建系统对我有什么吸引力,为什么我(通常)仍然不使用它们,以及一些前端 Javascript 库要求你使用构建系统时,为什么我觉得这让我感到沮丧。

我写这篇文章是因为我看到的大多数关于 JS 的文章都假定你正在使用构建系统,而对于像我这样的人来说,编写非常简单的、不需要构建系统的小型 Javascript 项目时,构建系统可能反而添加了很多麻烦。

什么是构建系统?

构建系统的思路是,你有一堆 Javascript 或 Typescript 代码,你想在把它放到你的网站上之前把它翻译成不同的 Javascript 代码。

构建系统可以做很多有用的事情,比如:

  • (出于效率的考虑)将 100 多个 JS 文件合并成一个大的捆绑文件
  • 将 Typescript 翻译成 Javascript
  • 对 Typescript 进行类型检查
  • 精简化
  • 添加 Polyfills 以支持旧的浏览器
  • 编译 JSX
  • 摇树优化 Tree Shaking (删除不使用的 JS 代码以减少文件大小)
  • 构建 CSS(像 tailwind 那样)
  • 可能还有很多其他重要的事情

正因为如此,如果你今天正在构建一个复杂的前端项目,你可能会使用 Webpack、Rollup、Esbuild、Parcel 或 Vite 等构建系统。

很多这些功能对我很有吸引力,我过去使用构建系统也是出于这样一些原因: 例如,Mess With DNS 使用 Esbuild 来翻译 Typescript,并将许多文件合并成一个大文件。

目标:轻松地对旧的小网站进行修改

我做了很多简单的小网站(之一之二之三之四),我对它们的维护精力大约为 0,而且我改变它们的频率很低。

我的目标是,如果我有一个 3、5 年前做的网站,我希望能在 20 分钟内,

  • 在一台新的电脑上从 GitHub 获取源代码
  • 做一些修改
  • 把它放到互联网上

但我对构建系统(不仅仅是 Javascript 构建系统!)的经验是,如果你有一个 5 年历史的网站,要重新构建这个网站会非常痛苦。

因为我的大多数网站都很小,所以使用构建系统的 优势 很小 —— 我并不真的需要 Typescript 或 JSX。我只要有一个 400 行的 script.js 文件就可以了。

示例:尝试构建 SQL 实验场

我的一个网站(SQL 试验场)使用了一个构建系统(它使用 Vue)。我最后一次编辑该项目是在 2 年前,是在另一台机器上。

让我们看看我今天是否还能在我的机器上轻松地构建它。首先,我们要运行 npm install。下面是我得到的输出:

$ npm install
[lots of output redacted]
npm ERR! code 1
npm ERR! path /Users/bork/work/sql-playground.wizardzines.com/node_modules/grpc
npm ERR! command failed
npm ERR! command sh /var/folders/3z/g3qrs9s96mg6r4dmzryjn3mm0000gn/T/install-b52c96ad.sh
npm ERR! CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/surface/init.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/avl/avl.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/backoff/backoff.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channel_args.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channel_stack.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channel_stack_builder.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channel_trace.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channelz.o

在构建 grpc 时出现了某种错误。没问题。反正我也不需要这个依赖关系,所以我可以花 5 分钟把它拆下来重建。现在我可以 npm install 了,一切正常。

现在让我们试着构建这个项目:

$ npm run build
  ?  Building for production...Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:130:10)
    at module.exports (/Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/NormalModule.js:414:16)
    at handleParseError (/Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/NormalModule.js:467:10)
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/NormalModule.js:499:5
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/NormalModule.js:356:12
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:373:3
    at iterateNormalLoaders (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
    at iterateNormalLoaders (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:236:3
    at runSyncOrAsync (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:130:11)
    at iterateNormalLoaders (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:232:2)
    at Array.<anonymous> (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:205:4)
    at Storage.finished (/Users/bork/work/sql-playground.wizardzines.com/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:43:16)
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:79:9

这个 Stack Overflow 的答案 建议运行 export NODE_OPTIONS=--openssl-legacy-provider 来解决这个错误。

这很有效,最后我得以 npm run build 来构建这个项目。

这其实并不坏(我只需要删除一个依赖关系和传递一个略显神秘的 Node 选项!),但我宁愿不被那些构建错误破坏。

对我来说,对于小项目来说,构建系统并不值得

对我来说,一个复杂的 Javascript 构建系统对于 500 行的小项目来说似乎并不值得 —— 它意味着放弃了在未来能够轻松更新项目的能力,以换取一些相当微小的好处。

Esbuild 似乎更稳定一些

我想为 Esbuild 大声叫好: 我 在 2021 年了解到 Esbuild,并用于一个项目,到目前为止,它确实是一种更可靠的构建 JS 项目的方式。

我刚刚尝试在一台新电脑上构建一个我最后一次改动在 8 个月前的 Esbuild 项目,结果成功了。但我不能肯定的说,两年后我是否还能轻松的建立那个项目。也许会的,我希望如此!

不使用构建系统通常是很容易的

下面是 Nginx 实验场 代码中导入所有库的部分的样子:

<script src="js/vue.global.prod.js"></script>
<script src="codemirror-5.63.0/lib/codemirror.js"></script>
<script src="codemirror-5.63.0/mode/nginx/nginx.js"></script>
<script src="codemirror-5.63.0/mode/shell/shell.js"></script>
<script src="codemirror-5.63.0/mode/javascript/javascript.js"></script>
<link rel="stylesheet" href="codemirror-5.63.0/lib/codemirror.css">
<script src="script.js "></script>

这个项目也在使用 Vue,但它只是用 <script src 来加载 Vue —— 前端没有构建过程。

一个使用 Vue 的无构建系统模板

有几个人问如何在没有构建系统的情况下开始编写 Javascript。当然,如果你想的话,你可以写原味的 JS,但我常用的框架是 Vue 3。

这是我做的一个小模板,用于启动一个没有构建系统的 Vue 3 项目。它只有 2 个文件和大约 30 行的 HTML/JS。

有些库需要你使用构建系统

构建系统这些事情最近盘旋在我的脑海里,因为这周我正在用 CodeMirror 5 做一个新项目,我看到有一个新版本,CodeMirror 6。

所以我想 —— 很酷,也许我应该使用 CodeMirror 6 而不是 CodeMirror 5。但是 —— 似乎没有构建系统你就不能使用 CodeMirror 6(根据 迁移指南),所以我打算坚持使用 CodeMirror 5。

同样地,你以前可以把 Tailwind 作为一个巨大的 CSS 文件下载,但是 Tailwind 3 似乎根本不能作为一个大的 CSS 文件使用,你需要运行 Javascript 来构建它。所以我现在要继续使用 Tailwind 2。(我知道,我知道,你不应该使用大的 CSS 文件,但是它验收只有 300KB,而且我真的不希望有构建步骤)

(更正:看起来 Tailwind 在 2021 年发布了一个 独立的命令行工具,这似乎是一个不错的选择)

我不完全确定为什么有些库不提供无构建系统版本 —— 也许发布无构建系统版本会给库增加很多额外的复杂性,而维护者认为这不值得。或者,库的设计意味着由于某种原因,不可能发布无构建系统版本。

我希望有更多的无构建系统的 Javascript 技巧

到目前为止,我的主要策略是:

  • 在某个库的网站上搜索 “CDN”,找到一个单独的 Javascript 文件
  • 使用 https://unpkg.com 来查看该库是否有一个我可以使用的内置版本
  • 托管我自己的库的版本,而不是依赖可能崩溃的 CDN
  • 编写我自己的简单集成方案,而不是拉入另一个依赖关系(例如,前几天我为 Vue 编写了自己的 CodeMirror 组件)。
  • 如果我想要一个构建系统,就使用 Esbuild

还有一些看起来很有趣但我还没有研究过的东西:


via: https://jvns.ca/blog/2023/02/16/writing-javascript-without-a-build-system/

作者:Julia Evans 选题:lkxed 译者:wxy 校对:wxy

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

安装之后,你会发现 NixOS 与通用的 Linux 发行版有很大的不同。

当然,作为 高级 Linux 发行版之一,大多数新用户对它并不熟悉。

如果你不知道 为什么你应该使用 NixOS,并且出于好奇而尝试它,那么在继续进行之前,知道它是为谁准备的至关重要。

虽然我假设你已经安装了这个发行版,但如果你是第一次使用,我建议先 在虚拟机上安装 NixOS

1、更新软件包

即使你使用最新的 ISO 进行安装,也总是会有更新的。那么为什么不从更新软件包开始呢?

要升级软件包,首先,你必须在添加的频道中检查是否有更新:

nix-channel --update

然后,使用下面的命令来安装这些更新(如果有的话):

sudo nixos-rebuild switch --upgrade

这就行了!它将处理其余的事情。

2、在 NixOS 中改变主机名

如果你尝试用传统的方法 改变主机名(使用 hostnamectl 命令),会出现以下错误:

在 NixOS 中改变主机名的错误

在 NixOS 中,你可以用它的主配置文件轻松地改变主机名。使用如下命令:

sudo nano /etc/nixos/configuration.nix

在这个配置文件中,寻找以下一行:

networking.hostName = "nixos";

然后把它改成:

networking.hostName = "Your_Hostname";

例如,我把我的主机名改为 itsFOSS

networking.hostName = "itsFOSS";

在 NixOS 中改变主机名

现在,保存更改并退出 nano 文本编辑器。

为了使你对主机名的修改生效,执行以下命令:

sudo nixos-rebuild switch

最后,重新打开终端,主机名的变化应该反映出来。

3、设置 Flatpak

我知道你可能在想什么。Nix 软件包管理器已经提供了大量的软件包。那么,为什么你需要 Flatpak 呢?

安装你所需要的东西对于第一次使用的人来说可能有点费时。所以,Flatpak 应该能给你带来方便。

设置 Flatpak 与你在 Ubuntu 上做的不一样。

要设置 Flatpak,你必须对 configuration.nix 文件进行修改,可以通过以下方式访问该文件:

sudo nano /etc/nixos/configuration.nix

在 nano 中移动到最后一行,在 } 前添加以下一行:

services.flatpak.enable = true;

在 NixOS 上设置 Flatpak

Ctrl + O 保存更改,按回车键,按 Ctrl + X 退出。

接下来,使用以下命令重建并切换到新的配置文件:

sudo nixos-rebuild switch

最后,使用下面的命令将 Flathub 软件库添加到系统中:

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

想知道到底什么是 Flatpak 包吗?你可以参考我们关于它的文章:

什么是 Flatpak?你需要知道的关于这个通用包装系统的一切重要信息

4、启用垃圾收集

NixOS 以其不可改变性而闻名,这是有充分理由的。

每当你升级一个软件包时,旧的软件包不会被删除。只是指向旧包的符号链接将被指向最新的版本。

而这样做,你的系统中会积累下不必要的垃圾。

但是,删除每一个旧世代将违背 NixOS 的初衷。

所以,在这种情况下,你可以将你的系统配置为每周删除垃圾包。

要做到这一点,首先,打开 NixOS 配置文件:

sudo nano /etc/nixos/configuration.nix

并在配置文件末尾的 } 前添加以下一行:

# Automatic Garbage Collection
nix.gc = {
                automatic = true;
                dates = "weekly";
                options = "--delete-older-than 7d";
        };

在 NixOS 中启用自动垃圾收集

保存修改并退出 nano 文本编辑器。

为了激活垃圾收集,重建并切换到新的配置文件:

sudo nixos-rebuild switch

如果你不确定垃圾收集器是否在后台正常运行,你可以用以下命令列出活动的计时器:

systemctl list-timers

正如你所看到的,Nix 垃圾收集器正在如期运行,并显示距离下次清理还有 5 天。

5、安装你喜欢的软件

我是说这是我们使用电脑的唯一原因 —— “为了使用我们最喜欢的软件”,如果还不是,我们就把它变成现实!

寻找软件包的最好地方是 Nix 软件包搜索,可以使用你喜欢的任何浏览器访问。

  • 搜索软件包
  • 选择软件包
  • 点击 “nix-env” 并复制给定的 NixOS 的命令
  • 执行该命令,就可以了

你可以查看我们的 NixOS 软件包管理 指南,了解所有的细节。

让我在这里给你一个简单的回顾。例如,在这里,我想安装 Librewolf,所以我采用了以下方法:

搜索 NixOS 的软件包

但如果你想安装 SSH 或 Plex 等服务,上述方法就不能用了

为此,你得查看位于页面顶部的 “ NixOS 选项 NixOS options ”。

因此,假设我想安装 OpenSSH,那么我必须按照给定的步骤进行:

  • 进入 “NixOS 选项”。
  • 搜索服务的名称
  • 获取服务的名称并将其粘贴到 configuration.nix 中,将其值改为 true

搜索 NixOS 的服务

services.openssh.enable = true

在 NixOS 上启用 OpenSSH

在配置文件中加入这一行后,重建服务:

sudo nixos-rebuild switch

6、在 NixOS 中启用自动更新(可选)

一些用户喜欢启用自动更新功能,而另一些用户则可以在他们方便的时候更新软件包。

所以这完全取决于你。

要启用自动更新,首先打开 configuration.nix 文件:

sudo nano /etc/nixos/configuration.nix

接下来,在配置文件的末尾,在 } 之前添加以下一行:

# Auto system update
system.autoUpgrade = {
      enable = true;
};

在 NixOS 中启用自动系统更新

保存修改并退出 nano。

要启用自动更新,你必须用以下方法重建并切换到该文件:

sudo nixos-rebuild switch

你也可以用下面的命令检查 NixOS 的升级定时器:

systemctl list-timers

NixOS 的自动升级定时器

正如你所看到的,nixos-upgrade.service 正在后台如期运行!

7、减少交换度

如果你正在利用交换分区,你可能想减少交换度。

交换度只不过是你想要多积极地使用交换分区(或内存)的数值,其范围从 0 到 100。

交换度越小,你的系统就会越多地使用物理内存(RAM),而交换分区只不过是你的存储驱动器的一部分而已。

另外,存储驱动器的速度相对比内存慢,所以如果可能的话,你应该减少交换度。

要检查你的系统的默认交换度,请使用以下方法:

cat /proc/sys/vm/swappiness

检查 Linux 系统的交换度

而对于大多数 Linux 发行版,它被设置为 60

我建议你把这个值降低到 10

要做到这一点,首先,用以下命令打开配置文件:

sudo nano /etc/nixos/hardware-configuration.nix

并在 } 之前的行末添加以下一行:

boot.kernel.sysctl = { "vm.swappiness" = 10;};

减少 NixOS 中的交换度

保存修改并退出文本编辑器。

现在,重建配置并使用下面的方法切换到它:

sudo nixos-rebuild switch

现在,你可以再次检查交换度,它应该反映出变化:

cat /proc/sys/vm/swappiness

减少 NixOS 中的交换度

就这些了。

总结

如果你在第一次安装 NixOS 后马上遵循这些要点,你应该得到一个良好的用户体验。

当然,根据你的要求,还可以有一些其他的东西。但是,我认为上面提到的事情是最基本或最常见的事情。

在本系列的下一部分,我将讨论在 NixOS 上设置家庭管理器,这对有多个用户的系统应该是有帮助的。

? 安装NixOS后,你首先做什么?让我知道你的想法。


via: https://itsfoss.com/things-to-do-after-installing-nixos/

作者:Sagar Sharma 选题:lkxed 译者:wxy 校对:wxy

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

Linux 初学者可能会被官方的 Debian 下载 ISO 的页面弄得不知所措。这篇指南旨在简化下载体验。

对于 Debian 初学者来说,安装 Debian 可能会是一次艰难的经历。官方的下载页面包含了不少链接,以至于到底需要下载哪个令人困惑。

我准备这篇指南来帮助你从下载页面挑选合适的 Debian ISO 文件。

总的来说,你可以将 Debian ISO 文件分为两大类。它们是 “自由” 和 “非自由” 。

关于 “自由” 和 “非自由” Debian 镜像之间的一些注意事项

  • Debian “非自由” 镜像是指包含不符合 Debian 自由软件准则的软件包的 Debian 操作系统的安装镜像。
  • “非自由” 软件包包含专有的、有版权的或受许可证限制的软件,这些软件包禁止用户修改或分发代码。Debian 项目提供这些 “非自由” 镜像作为用户的一种可选下载项,以便他们使用需要专有驱动或固件的特定硬件设备或软件。
  • “自由” 版本的 Debian,仅包含开源和可自由分发的软件包,这意味着用户有修改、分发和与他人分享的自由,而不受任何法律和道德上的限制。

从 Debian 12 “Bookworm”(即将发布)之后,非自由固件软件包将正式包含在主 ISO 文件中。因此,这篇指南将分为两个部分。

下载: Debian 12 “Bookworm”

这里是一份下载 ISO 版本的 Debian 12 “Bookworm” 的简单的表格(当前还不稳定,正在测试)。

描述最大 ISO 体积选择此 ISO 的情形ISO 下载链接(amd64)
最小的体积;非常适合基本安装700 MB你想下载基础的软件包,然后通过互联网来安装iso-cd
完整的 DVD 体积5 GB你想先下载所有的东西,然后开始安装,它非常适合离线安装iso-dvd

下载: Debian 11 “Bullseye”

自由版本的 ISO 文件(没有专有软件包)

下面的 ISO 镜像是 “自由” 版本的镜像,这意味着它们不包含用于固件的大量专有软件包。

描述最大 ISO 体积选择此 ISO 的情形ISO 下载链接(amd64)
最小的体积(网络安装 CD);需要联通互联网下载软件包500 MB你有稳定高速的互联网,希望开始时下载较少iso-cd torrent
完整的 CD 体积;带有 CD 1、2 和 3;对于最基础的安装,你只需要 CD 1700 MB你希望下载基础的软件包,然后不使用互联网来安装它们iso-cd torrent
完整的 DVD 体积;带有 DVD 1、2 和 3;对于最基础的安装,你只需要 DVD 15 GB你想先下载所有的东西,然后开始安装,这是离线安装的最理想方式iso-dvd torrent

非自由版本的 ISO 文件(带有专有软件包)

如果你有 Wi-Fi、蓝牙等特殊硬件 – 你可能会希望从下面的表中获取 “非自由” 版本的软件包。

类型镜像种类选择此 ISO 的情形ISO 下载链接(amd64)
非自由完整的 CD 、DVD你想要减少工作量,并希望 Debian 能够在所有受支持的硬件上工作cd-dvd (然后转到 *-nonfree 目录)
非自由完整的 CD 、DVD( 立付 Live 版) – 独立的桌面环境软件包你想要减少工作量,Debian 能够工作,并且带有一个立付系统。立付系统也提供完整的安装cd-dvd-live(然后转到 *-nonfree 目录)

其它的架构

针对 Debian 11 “Bullseye”

所有的镜像,下载链接: 单击这里

较旧的版本(Debian 10 “Buster”)

如果你需要一些针对 Debian 10 “Buster” 的镜像,请访问这个 页面

总结

对新用户来说,如果想要从官方网站上下载 Debian ISO 镜像,网站的信息可能多到无所适从。因此,我以一种恰当的格式总结下载链接。我希望这篇文章有助于你找到适合于你系统的目标 Debian ISO 镜像。


via: https://www.debugpoint.com/download-debian-iso/

作者:Arindam 选题:lkxed 译者:robsean 校对:wxy

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