分类 技术 下的文章

有很多的图形化工具可以用来创建 临场 live USB 驱动器。Linux 上的 Etcher 可能是最受欢迎的。为此,Ubuntu 也开发了自己的启动盘创建工具。

但是,资深 Linux 用户可能更喜欢使用 dd 命令在 Linux 终端中创建临场 USB,这会更快速便捷。

dd 命令是一个 命令行 工具,它提供了用来复制和转换文件的强大功能。

一个常见的使用示例是,用户使用 dd 命令将 ISO 文件写入到他们的外部存储设备(例如 USB 驱动盘),以用来给他们的电脑或者笔记本安装一个新的 Linux 发行版。

这就是我将在本教程中展示的内容。我将带你认识需要的命令,从终端找到我们的 USB 驱动器,然后对 ISO 文件进行实际刷写。

使用 dd 命令从 ISO 镜像创建临场 USB

在我向你展示步骤前,让我带你快速过一下你将要使用到的命令并解释它的作用。

这是一个使用命令刷写 ISO 的例子:

dd if="./filename.iso" of="/dev/sdb" status="progress" conv="fsync"

让我们来看看 dd 命令 实际都做了些什么。

理解 dd 命令

Explanation of the dd command for live USB creation

首先,你输入 dd。没错,这就是你要运行的程序的名称。

接下来,你指定 if="./filename.iso"if 代表 输入文件 input file ,告诉 dd 命令你将要向外部存储设备写入哪个文件。

之后,你输入 of="/dev/sdb"。和 if 一样,of 代表的是 输出文件 output file

要记住的是,输出文件在技术上不必是系统上的文件。你还可以指定诸如外部设备路径之类的内容(如示例所示),它看起来像系统上的普通文件,但实际上指向连接到你机器的设备。

status 可以设定为 3 个选项:nonenoxferprogress

  • 你设置的 progress 选项将使 dd 任务显示有关已将多少 ISO 文件传输到存储驱动器的定期统计信息,以及对 dd 任务完成前需要多长时间的估计。
  • 如果你改为设置 none 选项,dd 任务在写入 ISO 文件期间只会打印错误消息,并且删除进度条之类的内容。
  • noxfer 选项隐藏了传输完成后打印的一些信息,例如从开始到完成所用的时间。

最后,你将 conv 选项设置为 fsync。这会导致 dd 任务在整个 ISO 文件写入 USB 驱动器之前不会报告成功写入。

如果你省略这个选项,dd 任务会工作的很好(并且实际上可能看起来运行得更快),但你可能会发现你的系统需要很长时间才能告诉你移除 USB 驱动器是安全的,因为它会在后台完成 ISO 的内容写入,从而允许你在此期间做其它事情。

现在你明白了你必须做什么,让我们看看如何去做。

注意事项

命令行是把双刃剑。当你在命令行使用类似于 dd 命令时必须十分小心。你必须确保你目标输出文件是正确的设备。一个错误的步骤就可能会格式化你的系统硬盘,你的操作系统也会因此而损坏。

第 0 步: 下载所需的 ISO 镜像

不用说,你需要有一个 ISO 镜像文件才能将其刷写到 USB 上。

我将使用 Ubuntu 20.04 ISO(可在此处下载)来测试我之前介绍的 dd 命令。

第 1 步: 获取 USB 盘符

插入你的 USB 驱动器。

我为 of 参数输入的具体路径是 /dev/sdb。USB 磁盘通常会标记为 /dev/sdb,但这不是硬性规定。

此路径可能因你的系统而异,你可以使用 lsblk 命令确认 USB 磁盘的路径。只需从列表中查找一个看起来像你的 USB 磁盘大小的驱动器,就可以了。

如果你更熟悉 GUI 程序,还可以使用 GNOME Disks 等工具找到驱动器的路径。

现在你已经确认了外部驱动器的路径,让我们开始创建临场 USB。

第 2 步:将 ISO 文件写入 USB 磁盘

在下载 ISO 文件的目录打开一个终端,然后运行以下命令(如果 /dev/sdb 与你的存储设备名称不同,请记住将其替换):

sudo dd if="./ubuntu-20.04.2.0-desktop-amd64.iso" of="/dev/sdb" status="progress" conv="fsync"

之后,让 dd 去做剩下的事情,它会在完成后打印一条完成消息:

就像这样,你已经在 Linux 终端中使用 dd 命令刷写了 ISO 文件!

总结

现在,你可以通过终端做更多的事情,让你的工作效率大大提高。

dd 命令有任何没解决的问题,或者无法正常工作?请随时在下面的评论部分中留下你的问题。


via: https://itsfoss.com/live-usb-with-dd-command/

作者:Hunter Wittenborn 选题:lujun9972 译者:perfiffer 校对:wxy

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

大家好!昨天我与一位朋友聊天,他正在准备编程面试,并试图学习一些算法基础知识。

我们聊到了 二次时间 quadratic-time 线性时间 linear-time 算法的话题,我认为在这里写这篇文章会很有趣,因为避免二次时间算法不仅在面试中很重要——有时在现实生活中了解一下也是很好的!后面我会快速解释一下什么是“二次时间算法” :)

以下是我们将要讨论的 3 件事:

  1. 二次时间函数比线性时间函数慢得非常非常多
  2. 有时可以通过使用 hashmap 把二次算法变成线性算法
  3. 这是因为 hashmap 查找非常快(即时查询!)

我会尽量避免使用数学术语,重点关注真实的代码示例以及它们到底有多快/多慢。

目标问题:取两个列表的交集

我们来讨论一个简单的面试式问题:获取 2 个数字列表的交集。 例如,intersect([1,2,3], [2,4,5]) 应该返回 [2]

这个问题也是有些现实应用的——你可以假设有一个真实程序,其需求正是取两个 ID 列表的交集。

“显而易见”的解决方案:

我们来写一些获取 2 个列表交集的代码。下面是一个实现此需求的程序,命名为 quadratic.py

import sys

# 实际运行的代码
def intersection(list1, list2):
    result = []
    for x in list1:
        for y in list2:
            if x == y:
                result.append(y)
    return result

# 一些样板,便于我们从命令行运行程序,处理不同大小的列表
def run(n):
    # 定义两个有 n+1 个元素的列表
    list1 = list(range(3, n)) + [2]
    list2 = list(range(n+1, 2*n)) + [2]
    # 取其交集并输出结果
    print(list(intersection(list1, list2)))

# 使用第一个命令行参数作为输入,运行程序
run(int(sys.argv[1]))

程序名为 quadratic.py(LCTT 译注:“quadratic”意为“二次方的”)的原因是:如果 list1list2 的大小为 n,那么内层循环(if x == y)会运行 n^2 次。在数学中,像 x^2 这样的函数就称为“二次”函数。

quadratic.py 有多慢?

用一些不同长度的列表来运行这个程序,两个列表的交集总是相同的:[2]

$ time python3 quadratic.py 10
[2]

real    0m0.037s
$ time python3 quadratic.py 100
[2]

real    0m0.053s
$ time python3 quadratic.py 1000
[2]

real    0m0.051s
$ time python3 quadratic.py 10000 # 10,000
[2]

real    0m1.661s

到目前为止,一切都还不错——程序仍然只花费不到 2 秒的时间。

然后运行该程序处理两个包含 100,000 个元素的列表,我不得不等待了很长时间。结果如下:

$ time python3 quadratic.py 100000 # 100,000
[2]

real    2m41.059s

这可以说相当慢了!总共花费了 160 秒,几乎是在 10,000 个元素上运行时(1.6 秒)的 100 倍。所以我们可以看到,在某个点之后,每次我们将列表扩大 10 倍,程序运行的时间就会增加大约 100 倍。

我没有尝试在 1,000,000 个元素上运行这个程序,因为我知道它会花费又 100 倍的时间——可能大约需要 3 个小时。我没时间这样做!

你现在大概明白了为什么二次时间算法会成为一个问题——即使是这个非常简单的程序也会很快变得非常缓慢。

快速版:linear.py

好,接下来我们编写一个快速版的程序。我先给你看看程序的样子,然后再分析。

import sys

# 实际执行的算法
def intersection(list1, list2):
    set1 = set(list1) # this is a hash set
    result = []
    for y in list2:
        if y in set1:
            result.append(y)
    return result

# 一些样板,便于我们从命令行运行程序,处理不同大小的列表
def run(n):
    # 定义两个有 n+1 个元素的列表
    list1 = range(3, n) + [2]
    list2 = range(n+1, 2*n) + [2]
    # 输出交集结果
    print(intersection(list1, list2))

run(int(sys.argv[1]))

(这不是最惯用的 Python 使用方式,但我想在尽量避免使用太多 Python 思想的前提下编写代码,以便不了解 Python 的人能够更容易理解)

这里我们做了两件与慢速版程序不同的事:

  1. list1 转换成名为 set1 的 set 集合
  2. 只使用一个 for 循环而不是两个

看看 linear.py 程序有多快

在讨论 为什么 这个程序快之前,我们先在一些大型列表上运行该程序,以此证明它确实是很快的。此处演示该程序依次在大小为 10 到 10,000,000 的列表上运行的过程。(请记住,我们上一个的程序在 100,000 个元素上运行时开始变得非常非常慢)

$ time python3 linear.py 100
[2]

real    0m0.056s
$ time python3 linear.py 1000
[2]

real    0m0.036s
$ time python3 linear.py 10000 # 10,000
[2]

real    0m0.028s
$ time python3 linear.py 100000 # 100,000
[2]

real    0m0.048s <-- quadratic.py took 2 minutes in this case! we're doing it in 0.04 seconds now!!! so fast!
$ time python3 linear.py 1000000 # 1,000,000
[2]

real    0m0.178s
$ time python3 linear.py 10000000 # 10,000,000
[2]

real    0m1.560s

在极大型列表上运行 linear.py

如果我们试着在一个非常非常大的列表(100 亿 / 10,000,000,000 个元素)上运行它,那么实际上会遇到另一个问题:它足够 了(该列表仅比花费 4.2 秒的列表大 100 倍,因此我们大概应该能在不超过 420 秒的时间内完成),但我的计算机没有足够的内存来存储列表的所有元素,因此程序在运行结束之前崩溃了。

$ time python3 linear.py 10000000000
Traceback (most recent call last):
  File "/home/bork/work/homepage/linear.py", line 18, in <module>
    run(int(sys.argv[1]))
  File "/home/bork/work/homepage/linear.py", line 13, in run
    list1 = [1] * n + [2]
MemoryError

real    0m0.090s
user    0m0.034s
sys 0m0.018s

不过本文不讨论内存使用,所以我们可以忽略这个问题。

那么,为什么 linear.py 很快呢?

现在我将试着解释为什么 linear.py 很快。

再看一下我们的代码:

def intersection(list1, list2):
    set1 = set(list1) # this is a hash set
    result = []
    for y in list2:
        if y in set1:
            result.append(y)
    return result

假设 list1list2 都是大约 10,000,000 个不同元素的列表,这样的元素数量可以说是很大了!

那么为什么它还能够运行得如此之快呢?因为 hashmap!!!

hashmap 查找是即时的(“常数级时间”)

我们看一下快速版程序中的 if 语句:

if y in set1:
    result.append(y)

你可能会认为如果 set1 包含 1000 万个元素,那么这个查找——if y in set1 会比 set1 包含 1000 个元素时慢。但事实并非如此!无论 set1 有多大,所需时间基本是相同的(超级快)。

这是因为 set1 是一个哈希集合,它是一种只有键没有值的 hashmap(hashtable)结构。

我不准备在本文中解释 为什么 hashmap 查找是即时的,但是神奇的 Vaidehi Joshi 的 basecs 系列中有关于 hash tablehash 函数 的解释,其中讨论了 hashmap 即时查找的原因。

不经意的二次方:现实中的二次算法!

二次时间算法真的很慢,我们看到的的这个问题实际上在现实中也会遇到——Nelson Elhage 有一个很棒的博客,名为 不经意的二次方,其中有关于不经意以二次时间算法运行代码导致性能问题的故事。

二次时间算法可能会“偷袭”你

关于二次时间算法的奇怪之处在于,当你在少量元素(如 1000)上运行它们时,它看起来并没有那么糟糕!没那么慢!但是如果你给它 1,000,000 个元素,它真的会花费几个小时去运行。

所以我认为它还是值得深入了解的,这样你就可以避免无意中使用二次时间算法,特别是当有一种简单的方法来编写线性时间算法(例如使用 hashmap)时。

总是让我感到一丝神奇的 hashmap

hashmap 当然不是魔法(你可以学习一下为什么 hashmap 查找是即时的!真的很酷!),但它总是让人 感觉 有点神奇,每次我在程序中使用 hashmap 来加速,都会使我感到开心 :)


via: https://jvns.ca/blog/2021/09/10/hashmaps-make-things-fast/

作者:Julia Evans 选题:lujun9972 译者:unigeorge 校对:wxy

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

GNOME 是一款流行的 Linux 桌面环境,致力于为 Linux 用户提供现代化的桌面体验。

虽然这款桌面绝大部分功能都不错,但 GNOME 团队的某些决定确实也让许多用户恼火、质疑。

前脚不能在桌面摆放图标和文件,后脚将右键菜单中的 新建文档选项移除,现在,除此之外,GNOME 同样也移除了托盘图标栏功能。

怎么说,你总得知道托盘图标栏是什么吧?这些小图标允许你使用相应应用程序的附加功能。我自己的 Ubuntu 系统里就有许多托盘图标。

托盘图标栏

这一砍就砍出了大问题,尤其是针对那些完全依赖托盘图标的软件的致命打击。就拿 Dropbox 举例子吧,你只能通过 Dropbox 的托盘图标菜单来访问 Dropbox 的设置页面,很不幸,你在 GNOME 中就完全找不到这个图标。

这确实是个大问题,好在,我们还是有解决办法的。

借助插件来重新启用 GNOME 的托盘图标栏

如果你在用 GNOME,想必你已经知道 GNOME 插件是什么了。这些小插件基本上是由热心的独立开发者开发的。

如果你没有准备好,那么就去 启用 GNOME 插件 吧。这一步其实非常简单,使用 Chrome 或 Firefox 打开任意一个插件的页面,然后页面会提示你安装浏览器扩展。安装这个扩展,然后就可以启程了。

启用 GNOME 插件的浏览器扩展

现在,有一些可以向顶栏增加托盘图标的 GNOME 插件。在撰写本篇教程的时候,AppIndicator and KStatusNotifierItem Support 这款插件在 GNOME 的较新版本中已经有良好的开发优化与支持。

前往插件的页面:

在这个页面中,你应该能看到一个开关按钮。点击这个按钮即可安装该插件。

接下来会有一个弹窗,弹出后请点击“安装”。

安装插件

也许安装插件后,插件不会立即生效。此时,你必须重启 GNOME。在 Xorg 会话中,你只需要按下 Alt + F2 并输入 r 即可重启 GNOME,但这个操作不支持 Wayland 会话。

注销当前会话,并且重新登录,此后托盘图标应该就能成功启用了。如果你安装了任何一款带托盘图标的软件,那么你应该可以在顶栏上看见这些图标的身影了。

于我而言,我已经安装了 Dropbox,因此托盘图标就直接出现在顶栏上了。

Dropbox 托盘图标在 GNOME 下可用的截图

希望这个小技巧能帮助你恢复 GNOME 顶栏中的托盘图标。

我完全不理解,为什么 GNOME 的开发者会认为把这种实用性极强的功能删除会是个好主意。不过,上帝关上了一扇门,却(通常)会再打开一扇窗。好好享受按你的偏好运作的 GNOME 吧。


via: https://itsfoss.com/enable-applet-indicator-gnome/

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

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

有趣的是,当你刚接触一些东西时,最简单的事情也会变得复杂。

有一天,我发现我的朋友搞不清楚如何退出 top 命令。他没有中止这个命令,而是关闭了整个终端程序。

这不仅是不必要的,而且是一件不好的事情。

在 Linux 里中止程序

在 Linux 中,你可以使用 Ctrl+C 键来中止终端中的运行程序。这对 Ubuntu 和其他 Linux 发行版都适用。

ping 命令为例。如果你不中止它,它将持续显示结果。

按住 Ctrl 键并同时按下 C 键。它向正在运行的程序发送 SIGINT 信号以强制退出该命令。

Stopping a program in the Linux terminal

你看到 ^C 了吗?这个插入符号(^)代表 Ctrl。所以基本上,终端将 Ctrl+C 的按键显示为 ^C

Ctrl+C 对于那些被设计为持续运行直到被打断的命令非常有效。你觉得你需要取消命令,就用 Ctrl+C

在一个更复杂的方法中,你可以 找到进程 ID 并杀死一个正在运行的进程。这是更高级的东西,只有进程在后台或由其他用户运行或在另一个终端窗口运行时使用。

除此以外,还有一些其他的命令和命令行工具也有自己的退出命令。让我在这里简单地提一下其中的一些。

如何退出 Vim 编辑器

退出 Vim 编辑器 在 Linux 世界里闹出了很多笑话。当你刚接触这个强大的基于命令行的文本编辑器时,是很难搞清楚的。在几种退出 vim 的方法中,最常见的是按 Esc 键,然后输入冒号(:),再输入 q! 表示不保存而强制退出,或者 wq 表示保存并退出。

如何退出 Nano 编辑器

退出 Nano 编辑器比退出 Vim 要简单一些。为什么?因为 Nano 在底部有快捷方式。如果你是新手,你可能不明白,但至少你下次就能搞清楚了。

要退出 Nano,按 Ctrl+X。它将询问你是否要保存对文件所做的修改。你可以输入你的选择。

如何退出 less 命令

less 是一个奇妙的命令,它可以让你在不像 cat 命令那样杂乱的终端屏幕上进行查看。如果你在 less 命令的视图内,使用 q 键来退出 less

如何退出终端

要退出终端本身,不是关闭终端,而是使用 Ctrl+D 键盘快捷键或输入退出命令:

exit

这实际上是让你从当前的 shell 中退出。当你在 Ubuntu 或其他发行版中打开一个终端,它会运行默认的 shell。当你从这个 shell 退出时,终端也会结束。Ctrl+D 是做同样事情的快捷方式,并退出终端。

我希望你觉得这个快速教程对你有帮助。我强烈建议你学习这些 Linux 命令技巧

有问题或建议?请在下面留下评论。


via: https://itsfoss.com/stop-program-linux-terminal/

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

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

用 ImageMagick 的转换命令从你的终端缩放一张图像。

 title=

ImageMagick 是一个方便的多用途命令行工具,它能满足你所有的图像需求。ImageMagick 支持各种图像类型,包括 JPG 照片和 PNG 图形。

调整图像大小

我经常在我的 Web 服务器上使用 ImageMagick 来调整图像大小。例如,假设我想在我的个人网站上发一张我的猫的照片。我手机里的照片非常大,大约 4000x3000 像素,有 3.3MB。这对一个网页来说太大了。我使用 ImageMagick 转换工具来改变照片的大小,这样我就可以把它放在我的网页上。ImageMagick 是一套完整的工具,其中最常用的是 convert 命令。

ImageMagick 的 convert 命令使用这样的一般语法:

convert {input} {actions} {output}

要将一张名为 PXL_20210413_015045733.jpg 的照片调整到一个更容易管理的 500 像素宽度,请输入:

$ convert PXL_20210413_015045733.jpg -resize 500x sleeping-cats.jpg

现在新图片的大小只有 65KB。

 title=

你可以用 -resize 选项同时提供宽度和高度尺寸。但是,如果只提供宽度,ImageMagic 就会为你做计算,并通过调整输出图像的高度比例来自动保留长宽比。

在 Linux 上安装 ImageMagick

在 Linux 上,你可以使用你的包管理器安装 ImageMagick。例如,在 Fedora 或类似系统上:

$ sudo dnf install imagemagick

在 Debian 和类似系统上:

$ sudo apt install imagemagick

在 macOS 上,使用 MacPortsHomebrew

在 Windows 上,使用 Chocolatey 即可。


via: https://opensource.com/article/21/9/resize-image-linux

作者:Jim Hall 选题:lujun9972 译者:geekpi 校对:wxy

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

Dropbox 是 最受欢迎的云存储服务之一,可用于 Linux 和其他操作系统。

事实上,Dropbox 是最早提供原生 Linux 应用的服务之一。它仍然 支持 32 位 Linux 系统,这也是一项值得称赞的工作。

在这个初学者的教程中,我将展示在 Ubuntu 上安装 Dropbox 的步骤。这些步骤其实很简单,但有些网站把它弄得不必要的复杂。

在 Ubuntu 桌面上安装 Dropbox

让我们来看看安装步骤,一步一步来。

第一步:获取 Ubuntu 的 Dropbox 安装程序

Dropbox 为其安装程序提供 DEB 文件。进入网站的下载页面:

下载相应的 DEB 文件。考虑到你使用的是 64 位的 Ubuntu,请获取 64 位版本的 DEB 文件。

Download the Dropbox installer

第二步:安装 Dropbox 安装程序

你下载的 deb 文件只是 Dropbox 的一个安装程序。实际的 Dropbox 安装稍后开始,类似于 在 Ubuntu 上安装 Steam

安装下载的 deb 文件,可以双击它,或者右击并选择用软件安装打开。

Installing the downloaded Dropbox deb file

它将打开软件中心,你可以点击安装按钮。

Installing Dropbox deb file

等待安装完成。

第三步:开始安装 Dropbox

现在 Dropbox 安装程序已经安装完毕。按 Windows 键(也叫 Super 键),搜索 Dropbox 并点击它。

Start Dropbox for installation

第一次启动时,它显示两个弹出窗口。一个是关于重启 Nautilus(Ubuntu 中的文件资源管理器),另一个是关于 Dropbox 的安装。

Starting Dropbox installation

点击 “Restart Nautilus” -> “Close”(在 Nautilus 弹出窗口)或 “OK”(在安装弹出窗口),开始实际的 Dropbox 客户端下载和安装。如果 “Nautilus Restart” 在点击关闭按钮时没有关闭,请点击 “X” 按钮。

等待 Dropbox 的安装完成。

Installing Dropbox

哦!需要重新启动 Nautilus,因为 Dropbox 增加了一些额外的功能,如在文件资源管理器中显示同步状态。

当 Dropbox 安装完毕,它应该会自动带你到 Dropbox 的登录页面,或者你可以点击顶部的 Dropbox 图标并选择登录选项。

Sign in to Dropbox after installation

事实上,这就是你今后访问 Dropbox 设置的方式。

第四步:开始在 Ubuntu 上使用 Dropbox

Sign in into Dropbox

注意:在你成功登录之前,Dropbox 将不会工作。这里有一个问题。免费版的 Dropbox 限制了你可以链接到你的账户的设备数量。如果你已经有 3 个链接的设备,你应该删除一些你不使用的旧设备。

当你成功登录后,你应该看到在你的家目录中创建了一个 Dropbox 文件夹,你的云端文件开始出现在这里。

Dropbox folder is created under home directory

如果你想节省磁盘空间或带宽,你可以进入偏好设置并选择 选择性同步 Selective Sync 选项。该选项允许你只在本地系统上同步来自 Dropbox 云的选定文件夹。

Using selective sync in Dropbox

Dropbox 会在每次启动时自动启动。我相信,这是你应该从任何云服务中期待的行为。

这就是你在 Ubuntu 上开始使用 Dropbox 所需要的一切。我希望这个教程对你有帮助。


via: https://itsfoss.com/install-dropbox-ubuntu/

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

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