Alan Smithee 发布的文章

家庭自动化是一个令人兴奋的技术分支。现在开始用开源工具为你的家庭自动化设计一套解决方案吧。

 title=

行动起来吧。科技的关键是让生活更加美好。

当然,“更好”的标准因人而异,取决于他们在特定时刻的需求。尽管如此,技术具有影响许多不同阶段生活的独特能力。对一些人来说,科技提供了一个轻松的下午娱乐,而对另一些人来说,它提供导航帮助、改善医疗保健或更精确的科学研究。

有趣的是,为一个目的开发的技术很少与用于另一个目的的技术完全无关。例如,运动相机的进步使得一个人可以记录她们在滑雪场上的滑雪过程,也可以使得人体摄像头来帮助防止警察侵犯人权。3D 打印的进步可以让一个人可以制作超级英雄的动作手办,也使得志愿者可以为体弱者制造氧气呼吸机成为可能。技术很重要,它影响着我们所有人。

开源的工作之一是确保每个人都能获得技术进步,无论种族、性别、国籍、身体能力、宗教信仰或财富如何。可悲的是,有些公司将技术视为一种工具来获取有关其客户(即你和我!)的数据,即使这些客户为该技术的研究和开发提供资金。不过,这不是开源的目标,开源项目保护其用户。

是的,家庭自动化是一种现代便利,它正在变得一天比一天好。但这是你的家。开源家庭自动化可以让生活变得更轻松,更像是所有科幻书籍和电影中承诺的未来。但它也可以改善那些身体能力与电器制造商计划不同的人的生活。一个简单的 Python 脚本对一个用户来说可能只是带来了一些便利,而对其他人来说却可能会改变生活。

家庭自动化是一个令人兴奋和有趣的技术分支。 借助这本 电子书,立即开始设计你的家庭自动化解决方案,然后与他人分享你的创新,让每个人都能受益。

这就是开源的真正意义所在:可以帮助世界上的所有人。


via: https://opensource.com/article/21/6/home-automation-ebook

作者:Alan Smithee 选题:lujun9972 译者:zepoch 校对:wxy

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

Quarkus 受益于 20 多年的 Java 开发历史,使开发应用变得更快、更容易。

 title=

在云上发布服务部分是为了通过简单可靠的方式为用户和开发者提供对这些服务的便捷访问。与在线应用对接的最流行的方法之一是通过应用编程接口(API),这是一个花哨的术语,意味着你允许用户通过代码与你的应用进行互动。

API 的概念很重要,因为它可以帮助其他人在你的应用基础上进行开发。假设你设计了一个网站,当用户点击一个按钮时返回一个随机数字。通常情况下,这需要用户打开你的网站并点击一个按钮。网站可能是有用的,但只是在一定程度上。如果你包含一个 API,用户可以直接向你的服务器发送一个信号,要求一个随机数,或者他们可以自己编程,“调用”你的服务器来获取一个数字,而不需要点击或手动交互。开发者可以使用你的随机数作为游戏的数值,或作为密码生成器的一部分,或其他任何开发者需要随机数的地方(总是有的)。一个好的 API 可以解锁你的应用,让其他人使用你的代码结果,本质上,将你在网络上的工作转变为一个软件库。

什么是 Quarkus?

Quarkus 是一个原生 Kubernetes Java 栈,为无服务器应用交付而设计。与有 20 年历史的 Java 相比,Quarkus 相对年轻,但受益于这 20 年的发展,用该项目的话说,是 “超音速的亚原子 Java”。可能没有人知道这句话的确切含义,但你肯定可以通过一下午使用 Quarkus 来感受到它对你的开发生活的意义。

Quarkus 让你用一个有用的 API 开发应用,几乎不需要配置,也不用担心启动一个复杂的环境。你不需要学习关于云计算或边缘计算的所有知识,就可以学习并擅长使用 Quarkus。了解 Quarkus 可以使你的开发更快,它可以帮助你为现代计算机网络制作灵活的应用。

下面是我们最近的一些涉及 Quarkus 的文章。

开始使用 Quarkus

在 Saumya Singh 的《如何创建你的第一个 Quarkus 应用》中,你可以了解 Quarkus 和无服务器交付的好处,并在大约 10 分钟内创建了一个简单的演示应用。事实上,10 分钟以内更准确,因为在 Maven 和 Quarkus 之间,几乎没有你想象中的那么多设置。它几乎感觉不到像 Java 一样的坏处,而感觉像 Java 一样好。

边缘开发

Linux 是创建物联网 (IoT) 边缘应用 的一个流行平台。这有很多原因,包括安全性、编程语言和开发模型的广泛选择以及协议支持。不出所料,Quarkus 对物联网的处理非常好。Quarkus 的内存效率高,启动快,并且有快速的运行时,所以它不仅是物联网的可行解决方案,而且是理想的解决方案。你可以通过 Daniel Oh 的《在 Linux 上使用开源的边缘开发入门》来开始使用 Quarkus 和物联网。

Quarkus 和 VS Code

当你处理代码时,一个集成开发环境(IDE)会有很大的不同。微软的开源 VS Code(或无品牌标志的 VSCodium)是一个伪装成 IDE 的流行文本编辑器(或者说是伪装成文本编辑器的 IDE?),它有很多扩展,可以使它成为几乎任何编程语言的专门环境。如果你正在使用或考虑使用 VS Code,那么请阅读 Daniel Oh 的《Quarkus in VS Code》使用指南,了解一些关于 Maven、Quarkus 和 VS Code 如何协同工作的专业技巧。

获得 Quarkus

使用 Quarkus 开发,可以像 Python 一样简单地设置环境,但它为你提供了强大的 Java 语言及其众多的库。它是进入云计算、Knative 和边缘计算的一个重要入口。获取 Quarkus 并开始编码。


via: https://opensource.com/article/21/5/quarkus

作者:Alan Smithee 选题:lujun9972 译者:geekpi 校对:wxy

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

在将嵌入式系统操作系统移植到不同的芯片架构时,RT-Thread 的维护者们从中学到了什么。

 title=

曾经有人问我,为什么计算机被称为“计算机”,它们做的事情可远不止计算数字。一台现代的个人电脑可以浏览互联网、播放音频和视频、为视频游戏和电影生成漂亮的图形、模拟和预测复杂的天气模式和流行病风险、将建筑和工程蓝图变为现实等等。

计算机之所以能做到这些,是因为所有这些问题都可以归结为数字方程,而计算机的 CPU —— 其中央处理单元 —— 实际上不过是一个简单的计算器。

为了让 CPU 向硬盘驱动器发送信号以写入数据,或向显示器发送信号以显示图像,它必须接收指令。这些指令是以 “代码” 的形式出现的,这是一种简明的说法,即必须有人写一个 程序 ,与CPU “说” 同样的语言。CPU 理解的是 机器语言,这是一个大多数人都无法理解的比特阵列,大多数人都不可能手动写出来。相反,我们使用像 C、C++、Java、Python 等编程语言。这些语言被解析并编译成机器语言,然后交付给 CPU。

如果你试图用一种它不理解的语言来指示 CPU,它不知道该怎么做。你可以通过尝试用 x86\_64 RHEL 镜像启动 树莓派 来体验这种误传尝试的尴尬结果。如果它能工作就好了,但是不能。

将一个操作系统移植到一个新的架构上

RT-Thread 项目 为嵌入式系统程序员提供了一个开源的操作系统(OS)。嵌入式领域是非常多样化的,有很多物联网(IoT)、定制工业和业余设备。RT-Thread 的目标是使嵌入式编程对每个人来说都很容易,无论你使用什么设备。有时,这意味着要将一个操作系统移植到一个新的架构上,不管是用于相同架构但指令集略有不同的的芯片,还是用于全新的架构。

一开始处理这个问题可能会有点吓人 —— 你可能不知道从哪里开始或如何开始。这篇文章收集了 RT-Thread 维护者在将 RTOS 移植到新的芯片架构时学到的经验。

你在开始之前需要知道什么

这里是一个看似难以逾越的过程的高屋建瓴的观点。这对你的项目来说可能有所不同,但从概念上来说,这是相对普遍的,即使一些具体的细节是不同的:

  1. 准备好一个 C 语言的执行环境
  2. 确认可以通过串行端口发送和接收字符
  3. 确认上下文切换代码可以工作
  4. 获取支持的硬件定时器
  5. 确认中断程序可以通过串口接收和解析数据

执行模式

对于大多数先进的体系结构,操作系统和用户应用程序运行在不同的权限级别上。这可以防止有功能故障的代码影响操作系统的集成和安全。例如,在 ARMv7-A 架构中,操作系统通常在系统模式下运行,而在 ARMv8-A 中,操作系统可以在 EL2 或 EL3 权限级别上运行。

通常情况下,芯片在通电时以最高权限级别执行启动代码。但在此之后,操作系统会将特权级别切换到其目标模式。

1、执行 C 代码

这一步的关键动作是将 块起始符号 block starting symbol (.bss)部分设置为零,并设置堆栈指针。

在 C 语言的实现中,未初始化的全局变量和静态变量通常存储在 .bss 部分,它不占用存储设备的任何空间。当程序被加载时,相应的空间被分配到内存中,并被初始化为零。当操作系统启动时,它必须自己做这项工作。

另一方面,操作系统必须初始化堆栈空间并设置堆栈指针。由于 C 语言程序在进入和退出函数时在堆栈上保存和恢复局部变量,所以在调用任何 C 函数之前必须设置堆栈指针。RT-Thread 必须为每个新创建的线程做这个步骤。

2、至少使用一个串行驱动器

RT-Thread 通过串口输出信息和日志,这也有助于在移植过程中对代码进行调试。在这个阶段,通过串口 接收 数据是不必要的。当我们第一次在串口上看到我们友好的、熟悉的 RT-Thread 的标志时,我们就知道我们走对了路!

3、确认上下文切换逻辑

一个任务的上下文是它的整个执行环境,它包含通用寄存器、程序计数器、堆栈帧的位置等等。当一个新的线程被创建时,RT-Thread 必须手动分配和设置它的上下文,这样调度器就可以切换到新的线程,就像它对其他线程一样。

有三件事需要注意:

  • 首先,当 RT-Thread 启动时,默认情况下中断是禁用的。当任务调度器第一次被启用时,它们就会被启用;这个过程是在上下文切换期间用汇编语言实现的。
  • 第二,当一个线程退出时,下一个调度将开始,这时拥有的资源会被空闲的线程回收。
  • 第三,数据被推入堆栈的顺序必须与从堆栈中弹出数据的顺序一致。

一般来说,你希望正常进入主函数和 msh 控制台。然而,在这个阶段无法实现输入控制,因为串行输入中断还没有实现。当串行中断实现后,就可以进行 msh 输入了。

4、设置定时器

RT-Thread 需要一个定时器来定期产生中断;它被用来计算自系统启动以来所经过的“滴答”。计数器的编号用于提供软件中断功能,并指示内核何时开始调度一个任务。

设置时间片的值可能是一件棘手的事情。它通常是 10ms 到 1ms。如果你在一个慢速的 CPU 上选择一个小的时间片,大部分时间就会花在任务切换上 —— 不利于完成其他事情。

5、确认串口工作正常

在这一步,我们通过串口与 RT-Thread msh 进行交互。我们发送命令,按回车键,然后看着 msh 执行命令并显示结果。

这个过程通常不难实现。不过,有一点要提醒大家。在某些平台上,在处理完串口中断后,别忘了清除中断标志。

一旦串口工作正常,移植过程基本上就完成了。

实践

为了将你的项目移植到不同的芯片架构上,你需要非常清楚地了解你所针对的芯片的架构。熟悉你的项目中最关键的部分的底层代码。通过对照芯片的手册结合大量的实际工作经验,你会了解芯片的特权模式、寄存器和编译方法。

如果你没有需要移植到新芯片的项目,请加入我们;RT-Thread 项目总是需要帮助将 RTOS 移植到新的芯片上!作为一个开源项目,RT-Thread 正在改变开源嵌入式编程的面貌。请在 RT-Thread 俱乐部介绍你自己并寻求帮助!


本文基于 DEV 社区上的 如何将操作系统移植到不同的芯片架构上?,并经许可转载。


via: https://opensource.com/article/21/5/port-chip-architectures

作者:Alan Smithee 选题:lujun9972 译者:wxy 校对:wxy

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

Cython 创建的 C 模块可以加速 Python 代码的执行,这对使用效率不高的解释型语言编写的复杂应用是很重要的。

 title=

Cython 是 Python 编程语言的编译器,旨在优化性能并形成一个扩展的 Cython 编程语言。作为 Python 的扩展,Cython 也是 Python 语言的超集,它支持调用 C 函数和在变量和类属性上声明 C 类型。这使得包装外部 C 库、将 C 嵌入现有应用程序或者为 Python 编写像 Python 一样简单的 C 语言扩展语法变得容易。

Cython 一般用于创建 C 模块来加速 Python 代码的执行。这在使用解释型语言编写的效率不高的复杂应用中非常重要。

安装 Cython

你可以在 Linux、BSD、Windows 或 macOS 上安装 Cython 来使用 Python:

$ python -m pip install Cython

安装好后,就可以使用它了。

将 Python 转换成 C

使用 Cython 的一个好的方式是从一个简单的 “hello world” 开始。这虽然不是展示 Cython 优点的最好方式,但是它展示了使用 Cython 时发生的情况。

首先,创建一个简单的 Python 脚本,文件命名为 hello.pyx.pyx 扩展名并不神奇,从技术上它可以是任何东西,但它是 Cython 的默认扩展名):

print("hello world")

接下来,创建一个 Python 设置脚本。一个像 Python 的 makefile 一样的 setup.py,Cython 可以使用它来处理你的 Python 代码:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("hello.pyx")
)

最后,使用 Cython 将你的 Python 脚本转换为 C 代码:

$ python setup.py build_ext --inplace

你可以在你的工程目录中看到结果。Cython 的 cythonize 模块将 hello.pyx 转换成一个 hello.c 文件和一个 .so 库。这些 C 代码有 2648 行,所以它比一个一行的 hello.pyx 源码的文本要多很多。.so 库也比它的源码大 2000 倍(即 54000 字节和 20 字节相比)。然后,Python 需要运行单个 Python 脚本,所以有很多代码支持这个只有一行的 hello.pyx 文件。

要使用 Python 的 “hello world” 脚本的 C 代码版本,请打开一个 Python 提示符并导入你创建的新 hello 模块:

>>> import hello
hello world

将 C 代码集成到 Python 中

测试计算能力的一个很好的通用测试是计算质数。质数是一个比 1 大的正数,且它只有被 1 或它自己除后才会产生正整数。虽然理论很简单,但是随着数的变大,计算需求也会增加。在纯 Python 中,可以用 10 行以内的代码完成质数的计算。

import sys

number = int(sys.argv[1])
if not number <= 1:
    for i in range(2, number):
        if (number % i) == 0:
            print("Not prime")
            break
else:
    print("Integer must be greater than 1")

这个脚本在成功的时候是不会提醒的,如果这个数不是质数,则返回一条信息:

$ ./prime.py 3
$ ./prime.py 4
Not prime.

将这些转换为 Cython 需要一些工作,一部分是为了使代码适合用作库,另一部分是为了提高性能。

脚本和库

许多用户将 Python 当作一种脚本语言来学习:你告诉 Python 想让它执行的步骤,然后它来做。随着你对 Python(以及一般的开源编程)的了解越多,你可以了解到许多强大的代码都存在于其他应用程序可以利用的库中。你的代码越 不具有针对性,程序员(包括你)就越可能将其重用于其他的应用程序。将计算和工作流解耦可能需要更多的工作,但最终这通常是值得的。

在这个简单的质数计算的例子中,将其转换成 Cython,首先是一个设置脚本:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("prime.py")
)

将你的脚本转换成 C:

$ python setup.py build_ext --inplace

到目前为止,一切似乎都工作的很好,但是当你试图导入并使用新模块时,你会看到一个错误:

>>> import prime
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "prime.py", line 2, in init prime
    number = sys.argv[1]
IndexError: list index out of range

这个问题是 Python 脚本希望从一个终端运行,其中参数(在这个例子中是要测试是否为质数的整数)是一样的。你需要修改你的脚本,使它可以作为一个库来使用。

写一个库

库不使用系统参数,而是接受其他代码的参数。对于用户输入,与其使用 sys.argv,不如将你的代码封装成一个函数来接收一个叫 number(或者 num,或者任何你喜欢的变量名)的参数:

def calculate(number):
    if not number <= 1:
        for i in range(2, number):
            if (number % i) == 0:
                print("Not prime")
                break
    else:
        print("Integer must be greater than 1")

这确实使你的脚本有些难以测试,因为当你在 Python 中运行代码时,calculate 函数永远不会被执行。但是,Python 编程人员已经为这个问题设计了一个通用、还算直观的解决方案。当 Python 解释器执行一个 Python 脚本时,有一个叫 __name__ 的特殊变量,这个变量被设置为 __main__,但是当它被作为模块导入的时候,__name__ 被设置为模块的名字。利用这点,你可以写一个既是 Python 模块又是有效 Python 脚本的库:

import sys

def calculate(number):
    if not number <= 1:
        for i in range(2, number):
            if (number % i) == 0:
                print("Not prime")
                break
    else:
        print("Integer must be greater than 1")

if __name__ == "__main__":
    number = sys.argv[1]    
    calculate( int(number) )

现在你可以用一个命令来运行代码了:

$ python ./prime.py 4
Not a prime

你可以将它转换为 Cython 来用作一个模块:

>>> import prime
>>> prime.calculate(4)
Not prime

C Python

用 Cython 将纯 Python 的代码转换为 C 代码是有用的。这篇文章描述了如何做,然而,Cython 还有功能可以帮助你在转换之前优化你的代码,分析你的代码来找到 Cython 什么时候与 C 进行交互,以及更多。如果你正在用 Python,但是你希望用 C 代码改进你的代码,或者进一步理解库是如何提供比脚本更好的扩展性的,或者你只是好奇 Python 和 C 是如何协作的,那么就开始使用 Cython 吧。


via: https://opensource.com/article/21/4/cython

作者:Alan Smithee 选题:lujun9972 译者:ShuyRoy 校对:wxy

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

由于物联网(IoT)的兴起,对硬件进行编程变得越来越普遍。RT-Thread 可以让你可以用 FinSH 从 Linux 命令行与设备进行沟通、

RT-Thread 是一个开源的实时操作系统,用于对物联网(IoT)设备进行编程。FinSH 是 RT-Thread 的命令行组件,它提供了一套操作界面,使用户可以从命令行与设备进行沟通。它主要用于调试或查看系统信息。

通常情况下,开发调试使用硬件调试器和 printf 日志来显示。但在某些情况下,这两种方法并不是很有用,因为它是从运行的内容中抽象出来的,而且它们可能很难解析。不过 RT-Thread 是一个多线程系统,当你想知道一个正在运行的线程的状态,或者手动控制系统的当前状态时,这很有帮助。因为它是多线程的,所以你能够拥有一个交互式的 shell,你可以直接在设备上输入命令、调用函数来获取你需要的信息,或者控制程序的行为。如果你只习惯于 Linux 或 BSD 等现代操作系统,这在你看来可能很普通,但对于硬件黑客来说,这是极其奢侈的,远超将串行电缆直接连线到电路板上以获取一丝错误的做法。

FinSH 有两种模式。

  • C 语言解释器模式,称为 c-style。
  • 传统的命令行模式,称为 msh(模块 shell)。

在 C 语言解释器模式下,FinSH 可以解析执行大部分 C 语言的表达式,并使用函数调用访问系统上的函数和全局变量。它还可以从命令行创建变量。

在 msh 模式下,FinSH 的操作与 Bash 等传统 shell 类似。

GNU 命令标准

当我们在开发 FinSH 时,我们了解到,在编写命令行应用程序之前,你需要熟悉 GNU 命令行标准。这个标准实践的框架有助于给界面带入熟悉感,这有助于开发人员在使用时感到舒适和高效。

一个完整的 GNU 命令主要由四个部分组成。

  1. 命令名(可执行文件):命令行程序的名称;
  2. 子命令:命令程序的子函数名称。
  3. 选项:子命令函数的配置选项。
  4. 参数:子命令函数配置选项的相应参数。

你可以在任何命令中看到这一点。以 Git 为例:

git reset --hard HEAD~1

这一点可以分解为:

 title=

可执行的命令是 git,子命令是 reset,使用的选项是 --head,参数是 HEAD~1

再举个例子:

systemctl enable --now firewalld

可执行的命令是 systemctl,子命令是 enable,选项是 --now,参数是 firewalld

想象一下,你想用 RT-Thread 编写一个符合 GNU 标准的命令行程序。FinSH 拥有你所需要的一切,并且会按照预期运行你的代码。更棒的是,你可以依靠这种合规性,让你可以自信地移植你最喜欢的 Linux 程序。

编写一个优雅的命令行程序

下面是一个 RT-Thread 运行命令的例子,RT-Thread 开发人员每天都在使用这个命令:

usage: env.py package [-h] [--force-update] [--update] [--list] [--wizard]
                      [--upgrade] [--printenv]

optional arguments:
  -h, --help      show this help message and exit
  --force-update  force update and clean packages, install or remove the
                  packages by your settings in menuconfig
  --update        update packages, install or remove the packages by your
                  settings in menuconfig
  --list          list target packages
  --wizard        create a new package with wizard
  --upgrade       upgrade local packages list and ENV scripts from git repo
  --printenv      print environmental variables to check

正如你所看到的那样,它看起来很熟悉,行为就像你可能已经在 Linux 或 BSD 上运行的大多数 POSIX 应用程序一样。当使用不正确或不充分的语法时,它会提供帮助,它支持长选项和短选项。这种通用的用户界面对于任何使用过 Unix 终端的人来说都是熟悉的。

选项种类

选项的种类很多,按长短可分为两大类。

  1. 短选项:由一个连字符加一个字母组成,如 pkgs -h 中的 -h 选项。
  2. 长选项:由两个连字符加上单词或字母组成,例如,scons- --target-mdk5 中的 --target 选项。

你可以把这些选项分为三类,由它们是否有参数来决定。

  1. 没有参数:该选项后面不能有参数。
  2. 参数必选:选项后面必须有参数。
  3. 参数可选:选项后可以有参数,但不是必需的。

正如你对大多数 Linux 命令的期望,FinSH 的选项解析非常灵活。它可以根据空格或等号作为定界符来区分一个选项和一个参数,或者仅仅通过提取选项本身并假设后面的内容是参数(换句话说,完全没有定界符)。

  • wavplay -v 50
  • wavplay -v50
  • wavplay --vol=50

使用 optparse

如果你曾经写过命令行程序,你可能会知道,一般来说,你所选择的语言有一个叫做 optparse 的库或模块。它是提供给程序员的,所以作为命令的一部分输入的选项(比如 -v--verbose)可以与命令的其他部分进行解析。这可以帮助你的代码从一个子命令或参数中获取一个选项。

当为 FinSH 编写一个命令时,optparse 包希望使用这种格式:

MSH_CMD_EXPORT_ALIAS(pkgs, pkgs, this is test cmd.);

你可以使用长形式或短形式,或者同时使用两种形式来实现选项。例如:

static struct optparse_long long_opts[] =
{
    {"help"        , 'h', OPTPARSE_NONE}, // Long command: help, corresponding to short command h, without arguments.
    {"force-update",  0 , OPTPARSE_NONE}, // Long comman: force-update, without arguments
    {"update"      ,  0 , OPTPARSE_NONE},
    {"list"        ,  0 , OPTPARSE_NONE},
    {"wizard"      ,  0 , OPTPARSE_NONE},
    {"upgrade"     ,  0 , OPTPARSE_NONE},
    {"printenv"    ,  0 , OPTPARSE_NONE},
    { NULL         ,  0 , OPTPARSE_NONE}
};

创建完选项后,写出每个选项及其参数的命令和说明:

static void usage(void)
{
    rt_kprintf("usage: env.py package [-h] [--force-update] [--update] [--list] [--wizard]\n");
    rt_kprintf("                      [--upgrade] [--printenv]\n\n");
    rt_kprintf("optional arguments:\n");
    rt_kprintf("  -h, --help      show this help message and exit\n");
    rt_kprintf("  --force-update  force update and clean packages, install or remove the\n");
    rt_kprintf("                  packages by your settings in menuconfig\n");
    rt_kprintf("  --update        update packages, install or remove the packages by your\n");
    rt_kprintf("                  settings in menuconfig\n");
    rt_kprintf("  --list          list target packages\n");
    rt_kprintf("  --wizard        create a new package with wizard\n");
    rt_kprintf("  --upgrade       upgrade local packages list and ENV scripts from git repo\n");
    rt_kprintf("  --printenv      print environmental variables to check\n");
}

下一步是解析。虽然你还没有实现它的功能,但解析后的代码框架是一样的:

int pkgs(int argc, char **argv)
{
    int ch;
    int option_index;
    struct optparse options;

    if(argc == 1)
    {
        usage();
        return RT_EOK;
    }

    optparse_init(&options, argv);
    while((ch = optparse_long(&options, long_opts, &option_index)) != -1)
    {
        ch = ch;

        rt_kprintf("\n");
        rt_kprintf("optopt = %c\n", options.optopt);
        rt_kprintf("optarg = %s\n", options.optarg);
        rt_kprintf("optind = %d\n", options.optind);
        rt_kprintf("option_index = %d\n", option_index);
    }
    rt_kprintf("\n");

    return RT_EOK;
}

这里是函数头文件:

#include "optparse.h"
#include "finsh.h"

然后,编译并下载到设备上。

 title=

硬件黑客

对硬件进行编程似乎很吓人,但随着物联网的发展,它变得越来越普遍。并不是所有的东西都可以或者应该在树莓派上运行,但在 RT-Thread,FinSH 可以让你保持熟悉的 Linux 感觉。

如果你对在裸机上编码感到好奇,不妨试试 RT-Thread。


via: https://opensource.com/article/20/9/hardware-command-line

作者:Alan Smithee 选题:lujun9972 译者:wxy 校对:wxy

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

来试下这些开源工具。你的效率一定会提升。

 title=

诚然,很多人使用计算机来娱乐。但是一些人会用来工作,他们的理论是计算机应当能帮我们更快、更好、更有条理地做事。实际应用中,如果没有根据每个人的工作风格来做一些小小的手动配置,计算机也不会提升我们的效率。

Kevin Sonney 喜欢设计系统,今年他在一个 20 篇文章的系列中介绍了 18 种不同的生产力工具,不仅涵盖了网络方面,也涉及了一些能提升他的工作效率的工具。Kevin 最喜欢的所有的工具都收集到了本文,下面概括介绍每种工具的用途。

文件同步

重要的文件应谨慎管理。

  • Syncthing 能使不同设备上的文件彼此同步。设备可以是 Linux、Windows 或 Mac,也可以是服务器、Android 平板或手机,等等。文件可以是你期望在多台机器间同步的任意文件。Syncthing 是轻量级的点对点工具,因此你不需要支付服务费,你不需要第三方的服务器,而且它很快。
  • 同步是一件事,但有时你还需要帮忙处理你拥有的文件。假设你想要一个应用程序在作为一个图形化应用和作为控制台应用时表现不同行为,你可以通过修改符号链接指向的不同的配置文件来达成,如 .foo-gui.foo-term。这完全可以手动修改,但也可以用脚本处理,或者你可以试试 GNU Stow

邮件管理

我们都依赖于邮件和收件箱,但似乎很少有人对自己管理邮件的方式满意。如果你喜欢用终端工作,为什么不在终端里管理邮件呢?在终端里收发邮件是一件事,但是要能在终端里组织你的邮件就更棒了。如果你的职业是打字员或是天生写脚本的人,试试这类工具吧。

  • 我每天用 OfflineIMAP 把工作邮件同步到笔记本,以便用 Mutt 看邮件。它是很特别的工具,只做一件事:保证本地的邮件副本与远程的收件箱完全同步。配置和用 cron 调度它都相当简单,然后你就可以忘了它的存在。它相当简单,你与 IMAP 打交道的每一刻时间都应该用它。
  • Notmuch 能为邮件消息建立索引、加标签以及搜索邮件。如果你的收件箱出了问题,它可以让你不需要花费很大精力去补救。
  • Vim 可以收发邮件和管理你的日历。
  • 当然,Emacs 可以收发邮件和管理你的日历。

日历和联系人

我用过的所有的 Linux 系统都预装了 cal 命令。这是一个在终端下用的便捷小日历,它也是个很好的速查工具。然而,它几乎不能被称为一个日历应用程序。iCalendar 规范(与 Apple 的旧桌面日历无关)中提供了丰富的共享日历功能,虽然 .ics 的约会和事件是纯文本的,但没有在终端中管理它们的工作流。至少,在 khal 和 vdirsyncer 出现之前不存在。

  • Khal 是基于控制台的读写 .ics 文件的日历工具。
  • Vdirsyncer 是一个能把线上日历(和联系人)同步到本地的终端命令。Khal 在本地运行,vdirsyncer 在远程运行,这样远程的日历能与你管理的本地日历保持同步。
  • 管理联系人可能会很难,但是如果你用了 Khard 这个可以读写 vCard 格式文件的终端命令,就会变得简单。反过来,这些文件可以使用 vdirsyncer(你可能已经在使用 khal 日历)同步到远程服务器上。这使得日历和联系人管理变得简单,而且搭建个人信息管理(PIM)服务器也比以前容易得多。

待办清单

  • 组织你每天的行程有很多种方式,但是最简单的一种是用 todo.txt,一个简单、便携、易于理解的系统,即使设备上没有安装 todo.txt 也不会出现问题。todo.txt 能正常运行的原因是,它就是一个 Bash 脚本,能在几乎所有你能找到的的设备上运行。操作过程很简单:下载脚本,安装到家目录,用一个简单的命令开始调度任务。如果你的计算机上没有安装 todo.sh 命令,那么你的待办清单仍然可以作为纯文本文件来使用,你可以在需要时手动更新它。
  • Jrnl 是一个能追踪的你的日常议程和活动的数字笔记本。如果你要摘抄桌面上的报纸的片段或者把随意的想法写下来,那么这就是你要找的程序。

保持联络

沟通是关键,然而现在似乎比以往更多的是聊天平台的问题。这不仅仅是几个客户端,而是几个独立的网络。你怎么管理它们?这里有两个方案。

  • 如果你有很多的联系人分布在太多的聊天网络中,那么你应该试试 BitlBee,使用这个单一的聊天客户端就可以关联其他所有的聊天网络。
  • Rainbow Stream 是个推特客户端,能让你不被开放的网页浏览器分心,而又能紧跟时事。

消息通知

网页浏览器很好,但有时过犹不及。你希望能及时收到消息,但是你又不想全身心地陷入到互联网中。因为互联网是建立在开放的规范和大量的开源技术的基础上的,你不必在一个界面中做所有的事。对于不同的任务有不同的客户端,它们可以让你用自己喜欢的界面来获取你需要的信息。

  • Tuir 是一个 Reddit 终端客户端。
  • Newsboat 是一个 RSS 阅读器。
  • Wego 是天气预报工具。
  • Vim 可以帮助你登录 Reddit 和 Twitter。
  • Emacs 能让你保持与 Reddit、Twitter 和聊天客户端的联系。

保持终端一直开启

如果你正在用终端工作,那么关闭它的意义是什么呢?摆脱 exitCtrl+D 的诱惑,让你的控制台一直开启着。

  • Tmux 能分割你的终端,让一个终端窗口“分层"到另一个窗口之上,甚至从一台计算机离开到另一台计算机后,能保持相同的终端会话。
  • DESQview 是另一种方式:它本质上是一个终端窗口管理器。

未完待续

本文列出的工具只是 Linux 终端的神奇生产力工具中的一小部分。这个清单会结束,但你自己的清单可以继续。找到你喜欢的工具,学习它们,并将其发挥出最大的优势。当然,一个好的工具不一定要提高你的生产力:有时你最喜欢的命令也可以是能让你最快乐的命令。你的工作是找到自己喜欢的命令,用它们来改变世界。

玩得愉快!


via: https://opensource.com/article/20/6/productivity-tools-linux-terminal

作者:Alan Smithee 选题:lujun9972 译者:lxbwolf 校对:wxy

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