2019年1月

资深软件开发人员都知道 Hello World 程序,这是一个能在设备显示器上输出某种变体的 “Hello, World!” 的程序,是学习编程的第一步。在这个编程中只涉及到一些最基本语法的程序,可以用大多数编程语言了来编写。事实上,路易斯安纳理工学院计算机协会(ACM)在最近统计发现这个程序至少有 204 个版本。

传统意义上,Hello World 程序是用于说明编码过程是如何工作的,以及确保编程语言或系统能正常运行。它们经常是新手程序员学习的第一个程序,因为即使是经验很少或者没有经验的人也能轻松正确的执行 Hello World。

首先,Hello World 简单,这就是为什么它经常被用做程序执行成功的晴雨表。如果 Hello World 在该框架中无法有效执行,那么其它更复杂的程序中也可能会失败。正如 Win-Vector 的一位专家所说,Hello World 实际上是一个对抗性程序。“该作者还说道,‘你的计算机系统能不能工作并不是一目了然,除非我能看到它至少能打印一行文字,否则我不会在上面浪费太多时间。’” Win-Vector 博主 John Mount 说。

但是这个两词短语在计算机科学领域有着重大的影响。以 Hello World 为基础,新手程序员可以轻松的理解计算机科学原理或元素,而拥有多年编码经验的程序员可以用它来学习编程语言的工作原理,特别是在结构与语法方面。这样的一个小程序,在任何难度的应用程序和几乎所有语言中都有着悠久的历史。

用途

以上概括了 Hello World 程序的主要用途:这是新手程序员熟悉新语言的一种方式。然而,这些程序不仅仅是对编码世界的介绍。例如,Hello World 可以作为测试,以确保语言的组件(编译器、开发和运行环境)安装正确。因为配置完整的编程工具链的过程复杂而漫长,所以像 Hello World 这样简单的程序通常用作新工具链的首次运行测试。

根据 Cunningham & Cunningham(C2)的编程顾问所说,在系统设计人员并不预期可以执行代码的地方,黑客经常使用 Hello World 程序作为一个可以通过漏洞执行任意代码的概念验证(POC)。事实上,它是在设备上使用自制内容或者“自酿”的第一步,当有经验的编码人员正在配置环境或在学习新事物时,他们会通过 Hello World 来验证其行为是否正确。

它也作为调试过程的一部分,允许程序员检查他们是否正确地编辑了可在运行时修改的程序并重新加载。

Hello World 的一个更常用的用途是作为基础比较。根据 C2 的 wiki 所讲,程序员可以“比较语言生成的可执行文件的大小,以及程序背后必须存在多少支持的基础设施才能执行。”

开端

虽然 Hello World 的起源还有些不太明了,不过人们普遍认为它作为测试用语,最早出现在 Brian Kernigham 在 1972 年发布的《 B 语言简介教程 A Tutorial Introduction to the Language B 》中。在此文中,该程序的第一个已知版本用于说明外部变量。因为该教程中的前一个例子在终端上打印了 “hi!”,而需要更多的字符常量来表达相对复杂的 “hello,world!”,这是学习过程的下一步。

在那以后,它还被用于 1974 年的贝尔实验室备忘录,以及 1987 年的《 C 语言程序设计 The C Programming Language 》。这两篇著名的文字是让 Hello World 闻名于世的主要原因。在书中的一个例子(第一个,也是最著名的例子)打印了没有大写字母和感叹号的 “hello,world”。此时的 Hello World 几乎只是用于说明语言的一些功能,而不是测试系统是否正常运行。

在 Kernigham 的关于 B 语言和 C 语言的开创性文章之前,没有真正意义上的第一个程序,甚至直到 1974 年,它也没被广泛使用。著名的 BASIC 教程 “ 我的电脑喜欢我用 BASIC 跟它讲话 My Computer Likes Me,When I Speak BASIC ”,从一个写一行文本的简单程序开始,不过那句话是 “MY HUMAN UNDERSTANDS ME”,跟如今程序员侃侃而谈的这个双词问候语差的有点远。不过,当 Hello World 被发明后,它就迅速传播,并在 20 世纪 70 年代后变成了众所周知。直到今天它也依然受欢迎。

一个声明,多种语言

以下是目前正在被使用的一些流行的编程语言中的 Hello World 代码。

Java

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

C

using System;
class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello, world!");
    }
}

Python

print("Hello, world!")

Ruby

puts "Hello, world!"

Scala

object HelloWorld extends App {
    println("Hello, world!")
}

ASP.NET

Response.Write("Hello World!");

Lisp

(princ "Hello, world!")

Haskell

main = putStrLn "Hello, world!"

Malbolge

('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>

Go

package main
import "fmt"
func main() {
    fmt.Println("Hello, world!")
}

如今的 Hello world:各种形式下的标准实践

在现在的编程语言中,Hello World 有着不同的复杂程度。例如,Go 语言中引入一个多语言版的 Hello World 程序,XL 则会提供一个具有图形、可旋转的 3D 版本。一些编程语言,像 Ruby、Python,仅仅需要一个语句去打印“Hello World”,但是低级汇编语言则需要几个命令才能做到这样。现在的编程语言还引入对标点符号和大小写的变化,包括是否有逗号或者感叹号,以及两个词的大写形式。举个例子,当系统只支持大写字母,会呈现像“HELLO WORLD”的短语。值得纪念的第一个 Malbolge 程序打印出了“HEllO WORld”(LCTT 译注:Malbolge 是最难的编程语言之一。事实上,在它诞生后,花了 2 年时间才完成第一个 Malbolge 程序)。它的变体跨越了原本的字面意思。像 Lisp、Haskell 这样函数语言,用阶乘程序替代了 Hello World,从而注重递归技术。这与原来的示例不同,后者更强调 I/O 以及产生的副作用。

随着现在的编程语言越来越复杂,Hello World 比以往显得更加重要。作为测试和教学工具,它已经成为程序员测试配置的编程环境的标准方法。没有人能确切说出为什么 Hello World 能在快速创新著称的行业中经受住时间的考验,但是它又确实留下来了。


via: https://www.thesoftwareguild.com/blog/the-history-of-hello-world/

作者:thussong 选题:lujun9972 译者:zzzzzzmj 校对:wxy

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

使用 WTF 将关键信息置于视野之中,这个系列中第六个开源工具可使你在 2019 年更有工作效率。

每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心,渴望开启新的一年,当然,“抛弃旧的,拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件,但事实上并不用这样。

这是我挑选出的 19 个新的(或者对你而言新的)开源项目来帮助你在 2019 年更有效率。

WTF

曾几何时,我在一家使用彭博终端的公司做咨询。我的反应是,“哇,在一个屏幕上显示的信息太多了。” 然而,现在,当我正在工作并且打开多个网页、仪表板和控制台应用程序以试图跟踪事物时,我似乎无法在屏幕上获得足够的信息。

虽然 tmuxScreen 可以进行分屏和打开多个窗口,但它们很难设置,并且它们的键绑定可能需要一段时间才能学会(还经常与其他应用程序冲突)。

WTF 是一个简单的、易于配置的终端信息仪表板。它是用 Go 语言编写的,使用 YAML 配置文件,可以从几个不同的源提取数据。所有的数据源都包含在模块中,包括天气、问题跟踪器、日期和时间、Google 表格以及更多内容。有些窗格是交互式的,有些窗格只是使用最新的信息进行更新。

安装它就像下载适用于您的操作系统的最新版本并运行命令一样简单。因为它是用 Go 编写的,所以它的移植性很好,应该可以在任何可以编译它的地方运行(尽管开发人员目前只为 Linux 和 MacOS 做了构建)。

当您第一次运行 WTF 时,您将看到如上图的默认屏幕。

其默认配置文件在 ~/.wtf/config.yml,您可以编辑该文件以满足您的需要。网格布局的配置在文件的顶部。

grid:
  columns: [45, 45]
  rows: [7, 7, 7, 4]

网格设置中的数字表示每个块的字符尺寸。默认配置是两列,每列 40 个字符,两行 13 个字符高,一行 4 个字符高。在上面的代码中,我使列更宽(45,45),行更小,并添加了第四行,所以我可以放更多的小部件。

我喜欢在仪表板上看到当天的天气。有两个天气模块可供选择:Weather,它只显示文本信息;Pretty Weather 则色彩丰富,并使用基于文本的图形显示。

prettyweather:
  enabled: true
  position:
    top: 0
    left: 1
    height: 2
    width: 1

此代码创建了一个窗格,高为两个块(height: 2),宽为一个块(width: 1),位于顶行(top: 0)的第二列(left: 1)上,包含 Pretty Weather 模块.

一些模块是交互式的,如 Jira、GitHub 和 Todo,您可以在其中滚动、更新和保存信息。您可以使用 Tab 键在交互式窗格之间移动。\ 键会显示活动窗格的帮助屏幕,以便您可以查看可以执行的操作以及操作方式。Todo 模块允许您添加、编辑和删除待办事项,并在完成后勾掉它们。

还有一些模块可以执行命令并显示输出、监视文本文件,以及监视构建和集成服务器的输出。所有文档都做得很好。

对于需要在不同来源的一个屏幕上查看大量数据的人来说,WTF 是一个有价值的工具。


via: https://opensource.com/article/19/1/wtf-information-dashboard

作者:Kevein Sonney 选题:lujun9972 译者:wxy 校对:wxy

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

最近 Fedora Magazine 中题为 Fedora 28 服务器版的模块化在解释 Fedora 28 中的模块化方面做得很好。它还给出了一些示例模块并解释了它们解决的问题。本文将其中一个模块用于实际应用,包括使用模块安装设置 Review Board 3.0。

入门

想要继续并使用模块,你需要一个 Fedora 28 服务器版并拥有 sudo 管理权限。另外,运行此命令以确保系统上的所有软件包都是最新的:

sudo dnf -y update

虽然你可以在 Fedora 28 非服务器版本上使用模块,但请注意上一篇文章评论中提到的警告

检查模块

首先,看看 Fedora 28 可用的模块。运行以下命令:

dnf module list

输出列出了一组模块,这些模块显示了每个模块的关联的流、版本和可用安装配置文件。模块流旁边的 [d] 表示安装命名模块时使用的默认流。

输出还显示大多数模块都有名为 default 的配置文件。这不是巧合,因为 default 是默认配置文件使用的名称。

要查看所有这些模块的来源,请运行:

dnf repolist

与通常的 fedora 和更新包仓库一起,输出还显示了 fedora-modular 和 updates-modular 仓库。

介绍声明你将设置 Review Board 3.0。也许名为 reviewboard 的模块在之前的输出中引起了你的注意。接下来,要获取有关该模块的一些详细信息,请运行以下命令:

dnf module info reviewboard

根据描述确认它是 Review Board 模块,但也说明是 2.5 的流。然而你想要 3.0 的。查看可用的 reviewboard 模块:

dnf module list reviewboard

2.5 旁边的 [d] 表示它被配置为 reviewboard 的默认流。因此,请明确你想要的流:

dnf module info reviewboard:3.0

有关 reviewboard:3.0 模块的更多详细信息,请添加详细选项:

dnf module info reviewboard:3.0 -v

安装 Review Board 3.0 模块

现在你已经跟踪了所需的模块,请使用以下命令安装它:

sudo dnf -y module install reviewboard:3.0

输出显示已安装 ReviewBoard 以及其他几个依赖软件包,其中包括 django:1.6 模块中的几个软件包。安装还启用了 reviewboard:3.0 模块和相关的 django:1.6 模块。

接下来,要查看已启用的模块,请使用以下命令:

dnf module list --enabled

输出中,[e] 表示已启用的流,[i] 表示已安装的配置。对于 reviewboard:3.0 模块,已安装默认配置。你可以在安装模块时指定其他配置。实际上,你仍然可以安装它,而且这次你不需要指定 3.0,因为它已经启用:

sudo dnf -y module install reviewboard/server

但是,安装 reviewboard:3.0/server 配置非常平常。reviewboard:3.0 模块的服务器配置与默认配置文件相同 —— 因此无需安装。

启动 Review Board 网站

现在已经安装了 Review Board 3.0 模块及其相关软件包,创建一个本地运行的 Review Board 网站。无需解释,请复制并粘贴以下命令:

sudo rb-site install --noinput \
    --domain-name=localhost --db-type=sqlite3 \
    --db-name=/var/www/rev.local/data/reviewboard.db \
    --admin-user=rbadmin --admin-password=secret \
    /var/www/rev.local
sudo chown -R apache /var/www/rev.local/htdocs/media/uploaded \
    /var/www/rev.local/data
sudo ln -s /var/www/rev.local/conf/apache-wsgi.conf \
    /etc/httpd/conf.d/reviewboard-localhost.conf
sudo setsebool -P httpd_can_sendmail=1 httpd_can_network_connect=1 \
    httpd_can_network_memcache=1 httpd_unified=1
sudo systemctl enable --now httpd

现在启动系统中的 Web 浏览器,打开 http://localhost,然后享受全新的 Review Board 网站!要以 Review Board 管理员身份登录,请使用上面 rb-site 命令中的用户 ID 和密码。

模块清理

完成后清理是个好习惯。为此,删除 Review Board 模块和站点目录:

sudo dnf -y module remove reviewboard:3.0
sudo rm -rf /var/www/rev.local

总结

现在你已经探索了如何检测和管理 Review Board 模块,那么去体验 Fedora 28 中提供的其他模块吧。

Fedora 模块化网站上了解有关在 Fedora 28 中使用模块的更多信息。dnf 手册页中的 module 命令部分也包含了有用的信息。


via: https://fedoramagazine.org/working-modules-fedora-28/

作者:Merlin Mathesius 选题:lujun9972 译者:geekpi 校对:wxy

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

大众电子 Popular Electronics 》的订阅者们是个复杂的群体,该杂志的编辑 Arthur Salsberg 不得不在 1974 年 12 月刊 中的前言部分指出这点。此前,杂志编辑组曾收到了对《如何搭建家庭媒体中心》文章的抱怨,称这篇文章激励了许多业余电视爱好者走出去,削弱了专业修理人员存在的必要性,这对许多人的电视造成了极大伤害。Salsberg 认为,这个担忧的产生可能是因为大家不清楚《大众电子》读者们的真实水平。他解释道,据杂志内部调查的数据显示,52% 的订阅者都是某方面的电子专家,并且其中的 150,000 人在最近 60 天之内都修过电视。此外,订阅者们平均在电子产品上花费了 470 美金(2018 年则是 3578 美金),并且他们拥有万用表、真空管伏特计、电子管测试仪、晶体管测试仪、射频讯号产生器和示波器等必要设备。“《大众电子》的读者们并不全都是新手。”Salsberg 总结道。

熟悉《大众电子》的人居然会质疑它的订阅者,这令我十分吃惊。不过最近 60 天我的确没修过电视。我的电脑对我来说就是一块铝,我甚至没把它拆开看过。1974 年 12 月的《大众电子》刊登的像《驻波比是什么以及如何处理它》和《对万用表的测试》之类的特色文章,甚至连广告都令人生畏。它们中有个看起来像某种立体声系统的东西大胆地写道“除了‘四通道单元(即内建的 SQ、RM 和 CD-4 解码接收器)’,没有任何音频设备是值得期待的”。这也表明了《大众电子》的订阅者一定对电子有很多深入的了解。

不过在 1975 年 1 月刊 中,该杂志为读者们带来了一些他们从没见过的东西。在标题“突破性项目”下面,杂志的封面是一个大大的黑灰色盒子,其前面板上有一组复杂开关和灯。这便是 Altair 8800,“世界上首个有商业竞争力的小型机”,它的售价低于 400 美元。尽管 Altair 被宣传作“ 小型机 minicomputer ”,但它实际上是首个商业上成功的新型计算机成员,它首先被称为“ 微型计算机 microcomputers ”,最终被称为 PC( 个人计算机 Personal Computer )。Altair 十分小巧而且很便宜,以至于它成为了当时家家户户都能用起的电脑。正如 Salsberg 所写道,它在《大众电子》上的出现意味着:“家用电脑的时代终于到来了。”

《大众电子》1975 年 1 月刊的封面

此前,我曾写过 关于 Altair 的文章,但我觉得 Altair 值得重新审视。与当时其它的计算机相比,它并不是一台性能强劲的计算机(尽管它的成本要低得多),它也不是首个采用微处理器的通用计算机(在它之前已经至少有三个基于微处理器的计算机)。但是 Altair 是一种可供我们所有人使用的计算机。它是历史上我们所拥有的设备中首台流行的计算机,而早于 Altair 计算机都是完全不同的机器,那些大型机和笨重的迷你计算机由穿孔卡编程并且很少与之直接交互。不过 Altair 也是台极其简单的计算机,它没有附带任何操作系统甚至是引导程序。除非你为它购买外围设备,否则 Altair 就是一台装配了 RAM、前面板只有一组开关和灯泡的机器。由于 Altair 操作简单,使得重新理解基本的计算概念都成了十分简单的事情,正如模拟信号时代的人们第一次接触到数字设备一样。

Roberts 和他的公司

Altair 是由一家名为 微型仪器和遥测系统 Micro Instrumentation and Telemetry Systems (MITS)的公司所设计制造,这家公司位于美国新墨西哥州的阿尔布开克。MITS 由一个叫 H. Edward Roberts 的人经营。在进入计算器市场之前,该公司已经开始制造模型火箭的遥测系统,该市场在 20 世纪 70 年代初期蓬勃发展。集成电路大大降低了计算器的成本,突然之间它就成了美国每个在职的专业人士的必需品。不幸的是,由于计算器市场竞争过于激烈,到了 1974 年初,MITS 便负债累累。

1974 年在计算机界是 奇迹迭出的一年 annus mirabilis 1 一月的时候,惠普公司推出了世界首个可编程的手持计算器 HP-65。四月的时候,Intel 发布了 Intel 8080,这是他们的第二款 8 位微处理器,它也是首款广受欢迎的微处理器。接着,六月的时候,《 无线电电子 Radio Electronics 》杂志宣传了一台名为 Mark-8 的自制小型计算机,它使用了 Intel 在 1972 年推出的 Intel 8008 微处理器。Mark-8 是有史以来使用微处理器搭建的第三台电脑,它的首次登场是在杂志的封面上。 2 Mark-8 在《无线电电子》上的出现促使了《大众电子》寻找他们要自己宣传的小型机项目。

《大众电子》的订阅者们其实早在 1974 年 12 月就通过邮件获得了 1975 年 1 月刊的刊物。 3 所以 Altair 的宣布为这个 奇迹迭出的一年 annus mirabilis 画上了圆满的句号。Altair 的出现是十分重要的,因为此前从未有过向公众提供的价格公道而又功能齐全的电脑。当时,作为最受欢迎的小型计算机之一的 PDP-8 要几千美金才能买到。然而作为 Altair 核心的 Intel 8080 芯片几乎能与 PDP-8 匹敌,甚至更强;8080 支持更广泛的指令集,而且 Altair 可以扩展到 64 kb 内存,显然强于仅有 4 kb 内存的 PDP-8。并且,Mark-8 也不是它的对手,因为它搭载的是只能处理 16 kb 内存的 Intel 8008。在 Mark-8 必须由用户按照说明书在印刷电路板上手动拼装的情况下,Altair 在购买时就已经被组装好了(不过由于后来 MITS 被大量订单淹没,最后真正能获得 Altair 的方式也只有买套件拼装了)。

对许多《大众电子》的读者来说,Altair 是他们了解数字计算的起点。1975 年 1 月刊上那篇介绍 Altair 的文章由 Roberts 和 Altair 的共同设计师 William Yates 所写。Roberts 和 Yates 煞费苦心地用电工和无线电狂热者们所熟悉的词汇来介绍了数字硬件和计算机编程的基本概念。他们写道:“一台计算机其实由一块可变的硬件。仅需修改储存于内存之中的位组合形式,便可改变硬件设备的种类。”同时,Roberts 和 Yates 认为编程的基本概念是“足够简单并能在较短时间内掌握,但是想要成为一个高效的程序员必须经验丰富且富有创造力。”对此我十分认同。尽管该部分已经完全组装好了,文章仍包含了用来讲解 Intel 8080 的组成电路的详细图表。文章解释了 CPU 和计算机内存单元的区别,堆栈指针的用法,和汇编语言以及更高级的语言(例如 FORTRAN 和 BASIC)比起手动输入机器码所带来的巨大优势。

其实,《大众电子》在 1975 年 1 月刊之前就出版过 Roberts 撰写的系列文章。这一系列作为短期课程被收录在“数字逻辑”专栏中。在 1974 年 12 月刊中,Roberts 为读者们带来了关于构建“超低成本计算机终端”的文章,文章中介绍了可以用于 8 位电脑中输入值的八进制键盘。在介绍这个键盘时,Roberts 解释了晶体管到晶体管的逻辑工作原理,以及关于构建一种可以“记住”数字值的触发器的方法。Roberts 承诺说,这个键盘可以在下个月即将公布的 Altair 电脑中使用。

有多少《大众电子》的读者制作了这个键盘我们无从得知,但是那个键盘的确是个很有用的东西。如果没有键盘和其它输入设备,我们只能通过拨动 Altair 面板上的开关来输入值。Altair 的前面板上有一行 16 个开关被用来设置地址,而下方的 8 个则是用来操作计算机的。一行 16 个开关中最右边的 8 个开关也能用来指定要储存在内存中的值。这么做不无道理,因为 Intel 8080 使用 16 位的值来寻址 8 位的字。而前面板的这 16 个开关每一个都代表了一个位,当开关向上时代表 1,向下则代表 0。用这样的方式与计算机交互是个启示(一会儿我们就会讲到),因为 Altair 的面板是真正的二进制界面。这使得你可以尽可能地接触到计算机实体。

尽管在当下 Altair 的界面对我们来说完全不像是人用的,不过在那个时代却并不罕见。比如 PDP-8 的面板上有个类似的但更漂亮的二进制输入装置,而且它被涂上了吸引人的黄色和橙色,不过讲真,它真的应该卷土重来。然而 PDP-8 经常与纸带阅读器或电传打字机配合使用,这使得程序输入更加容易。这些 I/O 设备价格高昂,这意味着 Altair 的用户们大都会被那个前面板拦住。正如你可能想象的那样,通过这一堆开关输入一个大型程序是个苦差事。不过幸运的是,Altair 可以与盒式记录器连接,这样一来载入程序就不是什么难事了。Bill Gates 和 Paul Allen 在 MITS 的授权下为 Altair 编写了一个 BASIC 语言版本,并在 1975 年中期发行,这成为了微软有史以来的首次商业尝试。此后,那些买得起电传打字机的用户就能 通过纸带来将 BASIC 载入 Altair 了,并能使得用户能够通过文字与 Altair 交互。之后,BASIC 便成为了学生们最爱的入门编程语言,并成了早期小型机时代的标准接口。

z80pack

多亏了网络上一些人,特别是 Udo Munk 的努力,你可以在你的计算机上运行 Altair 的模拟器。这个模拟器是在 Zilog Z80 CPU 的虚拟套件上构建的,这个 CPU 可以运行 Intel 8080 的软件。Altair 模拟器允许你像 Altair 的早期用户们一样拨动前面板上的开关。尽管点击这些开关的感觉不如拨动真实开关的触觉,但是使用 Altair 模拟器仍是一个能让你感受二进制人机交互效率有多低的途径,至少在我看来这非常简明直观。

z80pack 是 Udo Munk 开发的 Z80 模拟器套件,你可以在 z80pack 的官网上找到它的下载链接。我在 上一篇介绍 Altair 的文章中 写到过在 macOS 上使用它的详细过程。如果你能编译 FrontPanel 库和 altairsim 可执行程序,你应该能直接运行 altairsim 并看到这个窗口:

模拟器中的 Altair 面板

在新版的 z80pack 中(比如我正在使用的 1.36 版本),你可以使用一个叫 Tarbell boot ROM 的功能,我觉得这是用来加载磁盘镜像的。经我测试,这意味着你不能写入到 RAM 中的前几个字。在编辑 /altairsim/conf/system.conf 之后,你可以构建带有一个 16 页 RAM 且没有 ROM 或引导加载器的 Altair。除此之外,你还可以用这个配置文件来扩大运行模拟器的窗口大小,不得不说这还是挺方便的。

Altair 的面板看起来令人生畏,不过事实上并没有我们想象中的这么可怕。Altair 说明书 对解释开关和指示灯起到了很大的作用,这个 YouTube 视频 也是如此。若想输入和运行一个简易的程序,你只需要了解一点点东西。Altair 右上方标签为 D0 到 D7 的指示灯代表当前寻址的字的内容。标签为 A0 到 A15 的指示灯表示当前的地址。地址指示灯下的 16 个开关可以用来设置新地址;当 “EXAMINE” 开关被向上推动时,数据指示灯才会更新以显示新地址上的内容。用这个功能,你便能“观察”到内存中所有的信息了。你也可以将 “EXAMINE” 推下来“EXAMINE NEXT”位置,以自动检查下一个位置上的信息,这使得查看连续的信息更容易了。

要将位组合方式保存到内存信息中,请使用最右边的 8 个标签为 0 到 7 的开关。然后,请向上推动 “DEPOSIT” 按钮。

在《大众电子》 的 1975 年 2 月刊 中,Roberts 和 Yates 引导用户输入一小段程序来确保他们的 Altair 正常工作。这个程序从内存中读取两个整型数据并相加之后将和存回内存中。这个小程序仅由 6 条指令组成,但是这 6 条指令涉及了 14 个字的内存,所以要正确地输入它们需要一点时间。这个示例程序也被写入了 Altair 的说明书,原文如下:

AddressMnemonicBit PatternOctal Equivalent
0LDA00 111 0100 7 2
1(address)10 000 0002 0 0
2(address)00 000 0000 0 0
3MOV B, A01 000 1111 0 7
4LDA00 111 0100 7 2
5(address)10 000 0012 0 1
6(address)00 000 0000 0 0
7ADD B10 000 0002 0 0
8STA00 110 0100 6 2
9(address)10 000 0102 0 2
10(address)00 000 0000 0 0
11JMP11 000 0113 0 3
12(address)00 000 0000 0 0
13(address)00 000 0000 0 0

如果你通过开关来将上表的这些值输入到 Altair,最终会得到一个程序,它会读取内存 128 中的值,并将其与 129 中的值相加,最终将其保存至 130 中。伴随每条取一个地址的指令的地址,它们最开始会给出最低有效位,这便是第二个字节总会被清零的原因了(没有高于 255 的地址)。在输入这个程序并在 128 和 129 中输入了一些值之后,你可以向下短暂推动 “RUN” ,之后再将它推到 “STOP” 位置。因为程序循环执行,以一秒内执行上千次的速度反复地添加并保存那些值。并且最后得到的值总是相同的,如果你停止该程序并查看 130 的内容,你应该能找到正确答案。

我不知道普通的 Altair 用户是否使用过汇编程序,不过 z80pack 包括了一个:z80asm,意思是 适用于 Z80 的汇编程序 Z80 assembly ,所以它使用了一组不同的助记符。不过因为 Z80 是被设计来兼容为 Intel 8080 写的软件的,所以即使助记符不一样,它们的操作码也是相同的。你可以直接将 z80asm 汇编码装载进 Altair:

        ORG  0000H
START:  LD   A,(80H)   ;Load from address 128.
        LD   B,A       ;Move loaded value from accumulator (A) to reg B.
        LD   A,(81H)   ;Load from address 129.
        ADD  A,B       ;Add A and B.
        LD   (82H),A   ;Store A at address 130.
        JP   START     ;Jump to start.

编译之后,你可以调用汇编程序来将其转换为 Intel HEX 文件:

$ ./z80asm -fh -oadd.hex add.asm

我们用带有 h 参数的 -f 标识来定义输出的 HEX 文件。你可以用 -x 标识来传递 HEX 文件,从而使得 Altair 能够加载该程序:

$ ./altairsim -x add.hex

这会在内存中自动设置前 14 个字,就和你通过开关手动输入这些值一样。你可以直接使用 “RUN” 按钮来替代以前那些繁琐的步骤,这是如此的简单!

我不觉得有很多 Altair 用户以这种方式来编写软件。Altair BASIC 发布后,使得 BASIC 成为了 Altair 编程最简单的方法。z80pack 同时也包括了一些不同版本 Altair BASIC 的 HEX 文件;在模拟器中,你可以用这个方式加载 4.0 版本的 4K BASIC:

$ ./altairsim -x basic4k40.hex

当你开启模拟器并按下 “RUN” 按钮之后,你就会看到 BASIC 开始执行了,同时它会在终端中与你交互。它首先会提示你输入你的内存可用量,我们输入 4000 字节。随后,在显示 “OK” 提示符之前,它会问你几个问题,Gates 和 Allen 用这个“OK”来代替标准的 “READY” 并以此节省内存。在这之后,你便可以使用 BASIC 了:

OK
PRINT 3 + 4
 7

虽然运行 BASIC 只有 4kb 的内存并没有给你足够的空间,但你可以看到它是如何从使用前面板迈出了重要的一步。

很显然,Altair 远不及如今的家用电脑和笔记本电脑,并且比它晚十多年发布的 Mac 电脑看上去也是对这个简朴的 Altair 电脑的巨大飞跃。但是对第一批购买并亲手组装了 Altair 的《大众电子》的读者们来说,Altair 才是他们拥有的第一个真正的全功能电脑,而这一切只用了 400 美金低价和一半的书柜空间。对那时只能用 一叠卡片 或一卷磁带来与计算机交互的人们来说,Altair 是个令人眼前一亮的玩意。这之后的微型计算机基本都是在对 Altair 改进,使得它更易用。从某种意义上来说,它们只是更复杂的 Altair。Altair,一个野兽派的极简作品,却为之后的许多微型计算机打下了铺垫。

如果你觉得这篇文章写的不错,你可以在推特上关注 @TwoBitHistory 或订阅 RSS feed 来获得我们文章的更新提醒。文章每两周就会更新一次!


  1. Paul E. Ceruzzi, A History of Modern Computing (Cambridge, Mass: MIT Press, 2003), 226.
  2. “Mark-8 Minicomputer,” Byran’s Old Computers, accessed July 21, 2018, http://bytecollector.com/mark_8.htm.
  3. Paul E. Ceruzzi, A History of Modern Computing (Cambridge, Mass: MIT Press, 2003), 226.

via: https://twobithistory.org/2018/07/22/dawn-of-the-microcomputer.html

作者:Sinclair Target 选题:lujun9972 译者:zhs852 校对:wxy

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

曾经想通过网络共享你的文件或项目,但不知道怎么做?别担心!这里有一个名为 serve 的简单实用程序,可以通过网络即时共享你的文件。这个简单的实用程序会立即将你的系统变成一个静态文件服务器,允许你通过网络提供文件。你可以从任何设备访问这些文件,而不用担心它们的操作系统是什么。你所需的只是一个 Web 浏览器。这个实用程序还可以用来服务静态网站。它以前称为 “list” 或 “micri-list”,但现在名称已改为 “serve”(提供),这更适合这个实用程序的目的。

使用 Serve 来设置一个静态文件服务器

要安装 serve,首先你需要安装 NodeJS 和 NPM。参考以下链接在 Linux 中安装 NodeJS 和 NPM。

NodeJS 和 NPM 安装完成后,运行以下命令来安装 serve:

$ npm install -g serve

完成!现在是时候 serve 文件或文件夹了。

使用 serve 的典型语法是:

$ serve [options] <path-to-files-or-folders>

提供特定文件或文件夹

例如,让我们共享 Documents 目录里的内容。为此,运行:

$ serve Documents/

示例输出:

正如你在上图中看到的,给定目录的内容已通过两个 URL 提供网络支持。

要从本地系统访问内容,你只需打开 Web 浏览器,输入 URL http://localhost:5000/

serve 实用程序以简单的布局显示给定目录的内容。你可以下载(右键单击文件并选择“将链接另存为…”)或只在浏览器中查看它们。

如果想要在浏览器中自动打开本地地址,使用 -o 选项。

$ serve -o Documents/

运行上述命令后,serve 实用程序将自动打开 Web 浏览器并显示共享项的内容。

同样,要通过网络从远程系统访问共享目录,可以在浏览器地址栏中输入 http://192.168.43.192:5000。用你系统的 IP 替换 192.168.43.192。

通过不同的端口提供内容

你可能已经注意到,默认情况下,serve 实用程序使用端口 5000。因此,确保防火墙或路由器中允许使用端口 5000。如果由于某种原因被阻止,你可以使用 -p 选项使用不同端口来提供内容。

$ serve -p 1234 Documents/

上面的命令将通过端口 1234 提供 Documents 目录的内容。

要提供文件而不是文件夹,只需给它完整的路径,如下所示。

$ serve Documents/Papers/notes.txt

只要知道路径,网络上的任何用户都可以访问共享目录的内容。

提供整个 $HOME 目录

打开终端输入

$ serve

这将通过网络共享整个 $HOME 目录的内容。

要停止共享,按下 CTRL+C

提供选定的文件或文件夹

你可能不想共享所有文件或目录,只想共享其中的一些。你可以使用 -i 选项排除文件或目录。

$ serve -i Downloads/

以上命令将提供整个文件系统,除了 Downloads 目录。

仅在本地主机上提供内容

有时,你只想在本地系统而不是整个网络上提供内容。为此,使用 -l 标志,如下所示:

$ serve -l Documents/

此命令会仅在本地提供 Documents 目录。

当你在共享服务器上工作时,这可能会很有用。系统中的所有用户都可以访问共享,但远程用户不能。

使用 SSL 提供内容

由于我们通过本地网络提供内容,因此我们不需要使用 SSL。但是,serve 实用程序可以使用 -ssl 选项来使用 SSL 共享内容。

$ serve --ssl Documents/

要通过 Web 浏览器访问共享,输入 https://localhost:5000https://ip:5000

通过身份验证提供内容

在上面的所有示例中,我们在没有任何身份验证的情况下提供内容,所以网络上的任何人都可以在没有任何身份验证的情况下访问共享内容。你可能会觉得应该使用用户名和密码访问某些内容。

为此,使用:

$ SERVE_USER=ostechnix SERVE_PASSWORD=123456 serve --auth

现在用户需要输入用户名(即 ostechnix)和密码(123456)来访问共享。(LCTT 译注:123456 是非常不好的密码,仅在实验情况下使用)

serve 实用程序还有一些其它功能,例如禁用 Gzip 压缩,设置 CORS 头以允许来自任河源的请求,防止自动复制地址到剪贴板等。通过以下命令,你可以阅读完整的帮助部分。

$ serve help

好了,这就是全部了。希望这可以帮助到你。更多好东西要来了,敬请关注!

共勉!

资源:


via: https://www.ostechnix.com/how-to-setup-static-file-server-instantly/

作者:SK 选题:lujun9972 译者:MjSeven 校对:wxy

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

tmux 是 终端复用器 terminal multiplexer 的缩写,它允许用户在单个窗口中创建或启用多个终端(垂直或水平),当你处理不同的问题时,可以在单个窗口中轻松访问和控制它们。

它使用客户端-服务器模型,允许在用户之间共享会话,也可以将终端连接到 tmux 会话。我们可以根据需要轻松移动或重新排列虚拟控制台。终端会话可以从一个虚拟控制台自由切换到另一个。

tmux 依赖于 libeventncurses 库。tmux 在屏幕底部提供了一个状态行,它显示当前 tmux 会话的有关信息,例如当前窗口编号、窗口名称、用户名、主机名、当前时间和日期。

启动 tmux 时,它会在一个单独窗口上创建一个新的会话,并将其显示在屏幕上。它允许用户在同一个会话中创建任意数量的窗口。

许多人说它类似于 screen,但我不这么认为,因为它提供了许多配置选项。

注意: Ctrl+b 是 tmux 中的默认命令前缀,因此,要在 tmux 中执行任何操作,你必须先输入该前缀然后输入所需的选项。

tmux 特性

  • 创建任意数量的窗口
  • 在一个窗口中创建任意数量的窗格
  • 它允许垂直和水平分割
  • 分离并重新连接窗口
  • 客户端-服务器架构,这允许用户之间共享会话
  • tmux 提供许多配置技巧

建议阅读:

如何安装 tmux 命令

大多数 Linux 系统默认预安装 tmux 命令。如果没有,按照以下步骤安装。

对于 Debian/Ubuntu,使用 APT-GET 命令APT 命令来安装:

$ sudo apt install tmux

对于 RHEL/CentOS,使用 YUM 命令来安装:

$ sudo yum install tmux

对于 Fedora,使用 DNF 命令来安装:

$ sudo dnf install tmux

对于 Arch Linux,使用 Pacman 命令来安装:

$ sudo pacman -S tmux

对于 openSUSE,使用 Zypper 命令来安装:

$ sudo zypper in tmux

如何使用 tmux

在终端上运行以下命令来启动 tmux 会话。启动 tmux 后,它会在一个新窗口中创建新会话,并将使用你的用户账户自动登录到你的默认 shell。

$ tmux

你会得到类似于我们上面的截图。tmux 附带状态栏,显示有关当前会话详细信息、日期、时间等。

状态栏信息如下:

  • [0]:它表示由 tmux 服务器创建的会话号。默认情况下,它从 0 开始。
  • 0:bash:表示会话号、命令行提示符(这里的 bash 表示 shell 名称)。
  • *:这表示该窗口现在处于活动状态。
  • 主机名:显示服务器的完全主机名。
  • 日期与时间:显示当前日期和时间。

(LCTT 译注:tmux 的状态可以根据需要定制,也会因环境、版本的不同而不同。)

如何拆分窗口

tmux 允许用户垂直或水平分割窗口,称为窗格。每个窗格都包含自己独立运行的终端实例。我们来看看如何做到这一点。

按下 Ctrl+b, % 来垂直分割窗格。

按下 Ctrl+b, " 来水平分割窗格。

如何在窗格之间移动

假设,我们创建了一些窗格,希望在它们之间移动,这该怎么做?如果你不知道怎么做,那么使用 tmux 就没有意义了。使用以下控制键执行操作。在窗格之间移动有许多方法。

  • Ctrl+b, ← - 选择左边的窗格
  • Ctrl+b, → - 选择右边的窗格
  • Ctrl+b, ↑ - 选择上边的窗格
  • Ctrl+b, ↓ - 选择下边的窗格
  • Ctrl+b, { - 来向左交换窗格
  • Ctrl+b, } - 来向右交换窗格
  • Ctrl+b, o - 切换到下一个窗格(从左到右,从上到下)
  • Ctrl+b, ; - 移动到先前活动的窗格

出于测试目的,我们将在窗格之间移动。现在我们在 pane2 中,它展示了 lsb_release -a 命令的输出。

我们将移动到 pane0,它显示 uname -a 命令的输出。

如何打开/创建新窗口

你可以在一个终端内打开任意数量的窗口。

  • Ctrl+b, c 来创建一个新窗口。
  • Ctrl+b, n 移动到下一个窗口。
  • Ctrl+b, p 移动到上一个窗口。
  • Ctrl+b, 0 ~ Ctrl+b, 9 立即移动到特定窗口。
  • Ctrl+b, l 移动到先前选择的窗口。

我有两个窗口,第一个窗口有三个窗格,其中包含操作系统版本信息,top 命令输出和内核信息。

第二个窗口有两个窗格,其中包含 Linux 发行版 logo 信息。使用以下命令执行操作:

Ctrl+b, w 以交互方式选择当前窗口。

如何缩放窗格

你正在一些非常小的窗格中工作,并且你希望将其缩小以进行进一步的工作。要做到这一点,使用以下键绑定。

目前我们有三个窗格,我在 pane1 工作,它使用 top 命令显示系统活动信息,我将缩放它。

缩放窗格时,它将隐藏所有其它窗格,并只显示窗口中的缩放窗格。

Ctrl+b, z 缩放窗格,并再次按下它使缩放窗格恢复原状。

显示窗格信息

要了解窗格编号及其大小,运行以下命令。

Ctrl+b, q 可简单显示窗格索引。

显示窗口信息

要知道窗口编号、布局大小,与窗口关联的窗格数量及其大小等,运行以下命令。

只需运行 tmux list-windows 即可查看窗口信息。

如何调整窗格大小

你可能需要调整窗格大小来满足你的要求。你必须按下 Ctrl+b, :,然后在页面底部的黄色颜色条上输入以下详细信息。

在上一部分中,我们打印了窗格索引,它同时也显示了窗格大小。为了测试,我们要向增加 10 个单元。参考以下输出,该窗格将 pane1 和 pane2 的大小从 55x21 增加到 55x31

语法: Ctrl+b, : 然后输入 resize-pane [options] [cells size]

  • Ctrl+b, : 然后输入 resize-pane -D 10 将当前窗格大小向下调整 10 个单元。
  • Ctrl+b, : 然后输入 resize-pane -U 10 将当前窗格大小向上调整 10 个单元。
  • Ctrl+b, : 然后输入 resize-pane -L 10 将当前窗格大小向左调整 10 个单元。
  • Ctrl+b, : 然后输入 resize-pane -R 10 将当前窗格大小向右调整 10 个单元。

分离并重新连接 tmux 会话

tmux 最强大的功能之一是能够在需要时分离和重新连接会话。

运行一个长时间运行的进程,然后按下 Ctrl+b,接着按 d,通过离开正在运行的进程安全地分离你的 tmux 会话。

建议阅读: 如何在断开 SSH 会话后保持进程/命令继续运行

现在,运行一个长时间运行的进程。出于演示目的,我们将把此服务器备份移动到另一个远程服务器以进行灾难恢复(DR)。

$ rsync -avzhe ssh /backup [email protected]:/backups/week-1/

在分离 tmux 会话之后,你将获得类似下面的输出。

[detached (from session 0)]

运行以下命令以列出可用的 tmux 会话。

$ tmux ls
0: 3 windows (created Tue Jan 30 06:17:47 2018) [109x45]

现在,使用适当的会话 ID 重新连接 tmux 会话,如下所示:

$ tmux attach -t 0

如何关闭窗格和窗口

只需在相应的窗格中输入 exit 或按下 Ctrl-d 即可关闭它,和终端关闭类似。要关闭窗口,按下 Ctrl+b, &

好了,就到这里了,希望你喜欢上它。


via: https://www.2daygeek.com/tmux-a-powerful-terminal-multiplexer-emulator-for-linux/

作者:Magesh Maruthamuthu 译者:MjSeven 校对:wxy

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