RK3399的Rock pi 4B怎么装Docker Community Edition

以ubuntu20.04为例子,

如果你过去安装过 docker,先删掉:

sudo apt-get remove docker docker-engine docker.io

首先安装依赖:

sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

根据你的发行版,下面的内容有所不同。如果你使用的发行版是Ubuntu。

信任 Docker 的 GPG 公钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

对于 amd64 架构的计算机,添加软件仓库:

sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian \
   $(lsb_release -cs) \
   stable"

如果你是树莓派或其它 64位ARM 架构计算机,请运行:

echo "deb [arch=arm64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
     $(lsb_release -cs) stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list

最后安装。

sudo apt-get update
sudo apt-get install docker-ce

构建一个镜像:

docker build -t huaan/mypro:v1 .
# -f指定Dockerfile文件的路径,不一定要指定
# -t指定镜像名字和TAG
# .指当前目录,这里实际上需要一个上下文路径

进入一个已经运行的容器:

docker exec -it be97856fab35 bash

普通停止容器操作:

docker stop $(docker ps -aq)

docker 如何删除none镜像?

删除none的镜像,要先删除镜像中的容器。要删除镜像中的容器,必须先停止容器。

sudo docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') //停止容器
sudo docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') //删除容器
sudo docker rmi $(docker images | grep "none" | awk '{print $3}') //删除镜像

查看当前的文件卷:

docker volume ls

删除查询到的数据卷:

docker volume rm $(docker volume ls -q)

删除网络:

docker network rm $(docker network ls -q)

强制清除:

docker system prune --all --force

将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下:

docker cp /www/runoob 96f7f14e99ab:/www/

将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为aaa:

docker cp /www/runoob 96f7f14e99ab:/aaa

将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中:

docker cp 96f7f14e99ab:/www /tmp/

树莓派摄像头Picamera2库公测中

作者:大卫·普洛曼

如果你使用过任何 Raspberry Pi 相机,你可能对Picamera很熟悉,这是一个出色的 Python 库,旨在轻松操作 Raspberry Pi 的拍摄功能。

但你可能也知道,随着我们最近转向更开放和更标准的 Linux API,Picamera库(建立在专有的 Broadcom 相机堆栈之上)将来不会再支持了。

带有Raspberry Pi HQ 摄像头的Raspberry Pi 4

最初的Picamera库是第三方软件,由 Dave Jones 开发。事实证明该库在我们的用户中非常受欢迎,因此我们承诺提供替代品。命名为Picamera2的新库正在由 Raspberry Pi 在剑桥内部开发,最终将成为官方支持的软件包。

所以今天我们要宣布Picamera2的第一个预览版

在 Bullseye 桌面上运行的Picamera2示例

预览版是什么意思?

我们所说的预览版是指正在进行的工作。它已经有很多你可以尝试的功能,但仍然缺少一些重要的东西,在我们更广泛地发布该库之前,功能和API 的许多方面也会发生变化。

当前版本中支持的功能包括:

  • 你可以配置和启动摄像头,并接收多个图像流。
  • Picamera2支持预览窗口,无论是独立的还是嵌入在Qt应用程序中。
  • 可以查询和设置相机参数。
  • 你可以将全分辨率图像捕获为JPEGPNG
  • 或者,你可以将它们捕获为numpy数组,以提供给图像分析程序。

但有一个明显缺失的功能,就是我们仍在使用 Raspberry Pi 的硬件h.264编码器进行视频录制。如果你想使用Picamera2从 Python 录制视频,那现在还无法做到,可能还需要“几周”的时间。

如果你有兴趣查看新的Picamera2库(预览版),我们也很想听到相关反馈。比如不该忽略的功能,或者可以优化的地方。

我能用它做什么?

最好的解释可能只是显示一些代码片段!第一个示例启动一个预览窗口,然后进行全分辨率的JPEG捕获:

from qt_gl_preview import *
from picamera2 import *
import time

picam2 = Picamera2()
preview = QtGlPreview(picam2)

preview_config = picam2.preview_configuration()
capture_config = picam2.still_configuration()
picam2.configure(preview_config)

picam2.start()
time.sleep(2)

picam2.switch_mode_and_capture_file(capture_config, "capture.jpg")

在下一个示例中,我们捕获预览图像并将它们传递给OpenCV,以查看它是否可以使用Haar 级联检测图像中的任何人脸。

一位树莓派博主的脸部识别测试

它会在找到的任何人脸周围绘制检测框,并再次在预览窗口中显示图像:

#!/usr/bin/python3

import cv2

from null_preview import *
from picamera2 import *

# Grab images as numpy arrays and leave everything else to OpenCV.

face_detector = cv2.CascadeClassifier("/usr/local/lib/python3.9/dist-packages/cv2/data/haarcascade_frontalface_default.xml")
cv2.startWindowThread()

picam2 = Picamera2()
preview = NullPreview(picam2)
picam2.configure(picam2.preview_configuration(main={"size": (640, 480)}))
picam2.start()

while True:
    im = picam2.capture_array()

    grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    faces = face_detector.detectMultiScale(grey, 1.1, 5)

    for (x, y, w, h) in faces:
        cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0))

    cv2.imshow("Camera", im)

除了这两个之外,我们还创建了 20 多个小示例脚本作为非正式教程,并帮助人们探索此预览版本中可用的功能。在适当的时候,一旦事情变化的速度稳定下来,我们将努力扩展这些信息并添加一些更正式的文档和教程。

我该如何尝试?

你可以在 Github 上找到Picamera2 的预览版,并且存储库README.md提供了完整的安装说明。

但是,预览版不适合胆小的人。由于Picamera2是建立在libcamera自己的 Python 绑定之上的,这些绑定目前处于原始阶段,因此目前的安装涉及libcamera库的一个特殊版本,需要手动编译它。

目前还无法通过包管理器或其他机制安装Picamera2的预览版。你必须从源代码构建它。如果你对此感到不自在,最好等待稳定版本。

但是,如果你有机会查看示例代码并尝试使用该库,我们将非常感谢任何有用的建议。我将密切关注相机论坛上的讨论,以便尝试回答你遇到的任何问题。

树莓派可以网络安装了—— Beta版正在公测

大部分时候,我们都是用另一台计算机(比如运行 Raspberry Pi Imager写入镜像)来给树莓派装系统的。

但是,如果你一开始没有PC,如何将操作系统安装到 SD 卡上呢?

这是经典的先有鸡还是先有蛋的问题,我们刚刚解决了它。

新的网络安装程序正在运行

现在有一个实现网络安装的 Raspberry Pi 引导加载程序beta 版本,我们希望你能帮助我们对其进行测试。

新的网络安装功能可直接在 Raspberry Pi 4 或 Raspberry Pi 400 上启动Raspberry Pi Imager应用程序,方法是:先用以太网电缆从 Internet 下载它。

Raspberry Pi Imager 应用程序将在你的 Raspberry Pi 内存中运行,然后把操作系统写入空白 SD 卡或 USB 磁盘,就像平常一样。

如何使用网络安装程序

如果你想试用这个网络安装程序,首先必须安装bootloader的测试版。

对于当前已经上市的电路板,需要更新bootloader。

不过一旦测试期结束,我们最终将在树莓派出厂时直接安装新的网络引导加载程序,不再需要此步骤。

安装新的 beta 引导加载程序

在 Raspberry Pi 4 或 400 上更新bootloader最简单方法是在 Raspberry Pi 或另一台计算机上运行Raspberry Pi Imager,将所需的软件复制到 SD 卡上。

你需要一张备用的空白 SD 卡,如果你使用的是 Raspberry Pi 或另一台没有 SD 卡插槽的计算机,则需要一个 USB to SD转接头。

你应该知道,用于更新 Raspberry Pi 引导加载程序的 SD 卡将被擦除所有现有数据,因此不要将有重要数据的 SD 卡装在当前Raspberry Pi上 。

在 Imager 应用程序中,单击“选择操作系统”按钮并在弹出窗口中向下滚动“操作系统”列表。选择“Misc utility images”,然后选择“Beta Test Bootloader”。

选择新的 Beta 测试引导加载程序

接下来,你需要选择引导顺序。

所有选项相同,但启动顺序不同。有其他理由,否则应该选择“SD Card Boot”。

选择引导顺序

然后按照正常说明将更新的引导加载程序写入 SD 卡。

当 SD 卡完成写入后,你应该关闭 Raspberry Pi 并移除现有的 SD 卡并将其放在安全的地方。

将刚用 Imager 应用程序写过的卡插入 Raspberry Pi 并重新打开电源。板子 LED 会定期闪烁,屏幕会变绿,表示新的 beta 版本引导加载程序成功启动。

如果你想将引导加载程序恢复到“Release”版本,可以再次执行这些步骤,选择顶部的“引导加载程序”选项而不是“Beta 测试引导加载程序”选项。

现在移除你的引导加载程序更新 SD 卡并重启树莓派。

尝试网络启动

现在你已经更新了引导加载程序,一切应该和以前一样工作。

当 Raspberry Pi 启动时,引导加载程序会搜索要加载的软件。它首先查找 SD 卡,然后查找 USB 记忆棒,依此类推。

它会一直循环下去,直到找到要使用的软件。几秒钟后,你会在屏幕上看到一个诊断信息,告知它正在做什么。

如果你想插入原来的 SD 卡(你在这一切开始之前使用的那个),你的 Raspberry Pi 应该会像往常一样无缝地引导回操作系统。

如果你在插槽中没有 SD 卡或使用空白 SD 卡的情况下启动 Raspberry Pi,并且连接了键盘,那么你现在会看到一些不同的东西。

如果你连接了键盘(Raspberry Pi 400 总是如此),但 Raspberry Pi 无法找到操作系统,它将显示新的网络安装界面。

新的网络安装界面


在后台,你的 Raspberry Pi 仍在寻找可运行的操作系统。但是此时,你可以通过按住该Shift键三秒钟来启动网络安装过程。在出现提示时按确认你要继续按Space,它应该会要求你插入以太网电缆。

你将需要通过以太网电缆将 Raspberry Pi 物理连接到路由器,而不是将其连接到无线网络。你需要一根两端都有公头 RJ45 连接器的以太网电缆。大多数家用路由器的背面都有网口,可让你插入以太网电缆,因此将电缆的一端插入路由器,另一端插入树莓派。

记得插网线

当它检测到已插入电缆时,它会自动下载 Raspberry Pi Imager。如果下载失败,你可以重复该过程。

安装 Raspberry Pi Imager

最终,Raspberry Pi Imager 应用程序在树莓派上启动,允许你将完整的操作系统安装到新的空白 SD 卡或 USB 记忆棒上。

如果你还没有这样做,此时应该将另一张空白 SD 卡插入 Raspberry Pi 卡槽。Raspberry Pi Imager 允许你直接从 Internet 烧录系统。

系统装好后不会在启动时看到网络安装界面。如果还想运行它,只需要删除所有可启动磁盘,等 Raspberry Pi Imager 运行再重新插入它们。但注意不要覆盖任何有重要工作内容的磁盘!

Python的各种排序

一、插入排序(Insertion-Sort)

  插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

  把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

1、原理

  • 从第二个元素开始和前面的元素进行比较,如果前面的元素比当前元素大,则将前面元素 后移,当前元素依次往前,直到找到比它小或等于它的元素插入在其后面
  • 然后选择第三个元素,重复上述操作,进行插入
  • 依次选择到最后一个元素,插入后即完成所有排序

2、举例

举个例子,假设我现在有一个数列[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]需要使用插入排序,我们来看看使用插入排序的详细步骤:

  • 首先第二个元素99和前面的元素11比较,99>11,第一轮完了,列表是 1 [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22] 
  • 然后,33作为比较元素,和前面的元素99比较,11<33<99交换位置,33插入到11和99之间,列表为 1 [11, 33, 99, 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22] 
  • 接着,33<69<99交换位置,列表变为    1 [11, 33, 69, 99, 77, 88, 55, 11, 33, 36,39, 66, 44, 22] 
  • 以此类推,69<77<99,77插入到69和99之间,列表变为   1 [11, 33, 69, 77, 99, 88, 55, 11, 33, 36,39, 66, 44, 22] 
  • 77<88<99, 88插入到77和99之间,列表变为    1 [11, 33, 69, 77, 88, 99, 55, 11, 33, 36,39, 66, 44, 22]  
  • 33<55<69<77<88<99,55插入到33和69之间,列表变为   1 [11, 33, 69, 77, 88, 99, 55, 11, 33, 36,39, 66, 44, 22]  
  • 。。。。。。。
  • 最终得到列表  1 [11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99] 

注:从第二个元素开始,以此和前面的元素比较,找出相应位置插入。

3、特点

插入排序的适用场景:一个新元素需要插入到一组已经是有序的数组中,或者是一组基本有序的数组排序

  • 比较性:排序时元素之间需要比较,所以为比较排序
  • 稳定性:从代码我们可以看出只有比较元素大于当前元素,比较元素才会往后移动,所以相同元素是不会改变相对顺序
  • 时间复杂度:插入排序同样需要两次循坏一个一个比较,故时间复杂度也为O(n^2)
  • 空间复杂度:只需要常数个辅助单元,所以空间复杂度也为O(1)
  • 记忆方法:想象成在书架中插书:先找到相应位置,将后面的书往后推,再将书插入
def insertion_sort(arr):
    """插入排序"""
    # 第一层for表示循环插入的遍数
    for i in range(1, len(arr)):
        # 设置当前需要插入的元素
        current = arr[i]
        # 与当前元素比较的比较元素
        pre_index = i - 1
        while pre_index >= 0 and arr[pre_index] > current:
        # 当比较元素大于当前元素则把比较元素后移
            arr[pre_index + 1] = arr[pre_index]
        # 往前选择下一个比较元素
            pre_index -= 1
        # 当比较元素小于当前元素,则将当前元素插入在 其后面
            arr[pre_index + 1] = current
    return arr

arr = [4,5,6,1,3,2]
print (insertion_sort(arr))

正确的输出内容:

[1, 2, 3, 4, 5, 6]

二、选择排序(Selection sort)

  选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,所以称为:选择排序。

1、原理

(1)设第一个元素为比较元素,依次和后面的元素比较,比较完所有元素找到最小的元素,将它和第一个元素互换。
(2)重复上述操作,我们找出第二小的元素和第二个位置的元素互换,以此类推找出剩余最小元素将它换到前面,即完成排序。

2、举例

举个例子,假设我现在有一个数列需要使用冒泡来排序 [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],

我们来看看使用冒泡的详细步骤:

1、首先11作为比较元素和列表后面的所有元素比较,找到最小的11,并放在第一位,第一轮完了,列表是  [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]

2、然后,99作为比较元素,和后面的元素[33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]作比较,找到最小的11,和第二位元素99交换位置,即第二轮比较完后,列表为   [11, 11, 33 , 69, 77, 88, 55, 99, 33, 36,39, 66, 44, 22]      

3、第三轮比较完,22最小,和第三个元素33交换位置,列表变为  [11, 11, 22, 69, 77, 88, 55, 99, 33, 36,39, 66, 44, 33]

4、最终得到列表  [11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]

注:是一轮比较完后,找出最小的,再交换这个元素和对应轮数位置处的元素位置,每轮只交换一次。二冒泡排序是,没比较一次,就交换一次位置,每轮要交换很多次。回到顶部(go to top)

 3、代码

   实现思路: 使用双重for循环,内层变量为i, 外层为j,在内层循环中不断的比较相邻的两个值(j, j+1)的大小,如果j+1的值大于j的值,交换两者位置,每循环一次,外层的i增加1,等到i等于(len(arr) – 1)的时候,结束循环。

def selection_sort(arr):
    """选择排序"""
    # 第一层for表示循环选择的遍数
    for i in range(len(arr) - 1):
        # 将起始元素设为最小元素
        min_index = i
        # 第二层for表示最小元素和后面的元素逐个比较
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[min_index]:
                # 如果当前元素比最小元素小,则把当前元素角标记为最小元素角标
                min_index = j
        # 查找一遍后将最小元素与起始元素互换
        arr[min_index], arr[i] = arr[i], arr[min_index]
    return arr

A = [64, 25, 12, 22, 11] 
print (selection_sort(A))

正确的输出内容:

[11, 12, 22, 25, 64]

Raspberry Pi OS官方的64位正式版来了

树莓派 Raspberry Pi 的官方操作系统 Raspberry Pi OS 此前一直是 32 位版本。

后来开始内测,但一直没有确定正式版本的发布时间。

近日,树莓派基金会宣布,Raspberry Pi OS 64 位版本正式推出,大家在官网下载频道可以直接下载了。

地址:

https://www.raspberrypi.com/software/operating-systems/

64 位的主要好处是内存超过 4GB 的硬件可以得到充分利用。在所有 Raspberry Pi 计算机中,Raspberry Pi 1、Pi 2 和 Zero 支持 32 位操作系统,而 Zero 2、Pi 3 和 Pi 4 都能够运行 64 位操作系统。

官方表示,由于一些闭源软件仅适用于 arm64 硬件,新推出的 64 位版本系统能够更好地运行这些软件。

需要注意的是,Raspberry Pi OS 64 位操作系统默认安装的 Chromium 不包含 WidevineCDM 库,因此无法在诸如网飞这类网站上观看 DRM 加密的内容。