Ronan Blog

罗华东的博客 | 向前每多走一步,热爱和勇气就会多一分。

那天,他决定偷走一架飞机

2024-09-02 1 min read Docs Ronan

2018年8月10日,地平线航空一架庞巴迪Dash 8 Q400在美国西雅图的塔科马国际机场(Sea-Tac)被盗。肇事者,29岁的理查德·罗素(Richard Russell),是一名没有驾驶经验的地平线航空地勤人员。他进行了一次未经授权的飞行,随后两架麦克唐纳道格拉斯F-15鹰式战斗机升空进行拦截。塔科马国际机场的塔台人员与理查德进行了无线电联系劝说他返回机场,最后飞机在普吉特海湾(Puget Sound)中人烟稀少的科特罗岛(Ketron island)时坠毁,事件最终造成机上人员理查德·罗素遇难,事后调查认定坠毁属于人为操作导致。


塔台:你右侧大概一英里的地方有一条跑道,你能看到吗?

理查德:如果我降落在那里的话,那些家伙会打我的,而且我很可能会把那里弄得一团糟,我可不想那样。对了,他们可能还有防空武器把我打下来。

塔台:他们可没那些东西,我们只是想给你找一个安全降落的地方。

理查德:可我还没想降落呢,不过天啊,我不能再盯着燃油表看了,油用得太快了。

塔台:好了,理查德,如果可以的话,请你向左转,我们会指引你往东南方向飞。

理查德:我得判个无期徒刑吧?对我这样的人来说,我倒希望会是这样。

很明显他的动机并不是想搞破坏,也不是想伤害谁。

理查德:我不想伤害任何人,我只是想你在我耳边说一些好听的废话……你觉得如果我能够成功降落的话,阿拉斯加航空会不会给我一份飞行员的工作?

塔台:如果你能成功降落,我想他们会给你任何你想要的工作。

理查德:我知道有很多人关心我,他们如果知道我做了这样的事一定会失望的。我想向他们每一个人道歉。我只是一个已经坏掉的人,我猜是不知道哪里有几颗螺丝松了吧。以前我没意识到,刚刚才弄明白。

塔台:如果你想降落的话,最好的机会是你左前方的那条跑道,或者还有另一个办法,就是普吉特海湾,你可以降落到海面上。

理查德:你和那儿的人说过了吗,我可不想把那里弄得一团糟。

塔台:我已经和他们说过了,我,还有我们所有人,都不希望你或者任何其他人受伤。你如果想降落的话,就试试这个办法。

理查德:可我想知道那条虎鲸的位置,你知道,就是那条背着宝宝的虎鲸。我想去看看那家伙。

于是一个人、一架飞机、两只鲸鱼,就这样奇妙的联系在一起了。

理查德:我准备降落了,我想我会先做几个翻滚,如果成功的话,我就会开始下降,今晚就到此结束了。(第一次开飞机的理查德,在面对战斗机追踪的情况下,还完了一个超难度的飞行动作。这个动作一般是战斗机才会做的,他驾驶的这种客机不会。)

塔台:理查德,如果可以的话,请尽量把飞机贴近水面。

理查德:我有点头晕。哥们,旁边的景色过得好快,我在想,我要好好看着这些风景,享受这一刻的宁静。一切都很美,但如果从另一个角度来看,它们就更美了。

塔台:你能看清楚周围的地形吗?能见度有没有问题?

理查德:没有,一切都非常清楚。我刚刚绕着雷尼尔山飞了一小圈,很美,我想剩下来的油还够让我飞到奥林匹克山去看看。

理查德:我不知道该怎么降落,其实我本来就没打算降落。

Makefile

2024-09-02 3 min read Docs Ronan

1.规则

Makefile的框架是由规则构成的。make命令执行时先在Makefile文件中查找各种规则,对各种规则进行解析后运行规则。规则的基本格式为:

每条规则的语法格式:
target1,target2...: depend1, depend2, ...
	command
	......
	......

每条规则由三个部分组成分别是目标(target), 依赖(depend)命令(command)

  • 命令(command): 当前这条规则的动作,一般情况下这个动作就是一个 shell 命令 例如:通过某个命令编译文件、生成库文件、进入目录等。 动作可以是多个,每个命令前必须有一个Tab缩进并且独占占一行。
  • 依赖(depend): 规则所必需的依赖条件,在规则的命令中可以使用这些依赖。 例如:生成可执行文件的目标文件(*.o)可以作为依赖使用 如果规则的命令中不需要任何依赖,那么规则的依赖可以为空 当前规则中的依赖可以是其他规则中的某个目标,这样就形成了规则之间的嵌套 依赖可以根据要执行的命令的实际需求, 指定很多个
  • 目标(target): 规则中的目标,这个目标和规则中的命令是对应的 通过执行规则中的命令,可以生成一个和目标同名的文件 规则中可以有多个命令, 因此可以通过这多条命令来生成多个目标, 所有目标也可以有很多个 通过执行规则中的命令,可以只执行一个动作,不生成任何文件,这样的目标被称为伪目标

这里看着脑疼,举个例子

################# 例1 #################
app:a.c b.c c.c
	gcc a.c b.c c.c -o app

################# 例2 #################
# 有多个目标, 多个依赖, 多个命令
app,app1:a.c b.c c.c d.c
	gcc a.c b.c -o app
	gcc c.c d.c -o app1
	
################# 例3 #################	
# 规则之间的嵌套
app:a.o b.o c.o
	gcc a.o b.o c.o -o app
# a.o 是第一条规则中的依赖
a.o:a.c
	gcc -c a.c
# b.o 是第一条规则中的依赖
b.o:b.c
	gcc -c b.c
# c.o 是第一条规则中的依赖
c.o:c.c
	gcc -c c.c

2.规则的执行

在调用 make 命令编译程序的时候,make 会首先找到 Makefile 文件中的第 1 个规则,分析并执行相关的动作。但是需要注意的是,好多时候要执行的动作(命令)中使用的依赖是不存在的,如果使用的依赖不存在,这个动作也就不会被执行。

Continue reading

fire,一个强大的「python」库

2024-09-02 2 min read Docs Ronan

Github地址:https://github.com/google/python-fire

在开发命令行工具时,开发者通常需要编写大量代码来解析命令行参数,这既耗时又容易出错。Python Fire 是 Google 开源的一个库,旨在简化命令行界面的开发。它可以将任何 Python 对象自动生成一个命令行界面,从而大大减少了开发时间和代码复杂度。本文将详细介绍 Python Fire 库,包括其安装方法、主要特性、基本和高级功能,以及实际应用场景,帮助全面了解并掌握该库的使用。

安装

要使用 Python Fire 库,首先需要安装它。以下是安装步骤:

使用 pip 安装

可以通过 pip 直接安装 Python Fire:

pip install fire

特性

  1. 自动生成命令行界面:将任何 Python 对象(函数、类、模块、字典等)自动转换为命令行界面。
  2. 简洁性:只需一行代码即可生成命令行界面,大大减少了开发时间和代码复杂度。
  3. 灵活性:支持多种数据类型和参数,能够处理复杂的命令行需求。
  4. 易用性:与 Python 标准库无缝集成,易于上手和使用。

基本功能

将函数转换为命令行工具

可以将一个简单的函数转换为命令行工具:

import fire

def greet(name):
    return f'Hello, {name}!'

if __name__ == '__main__':
    fire.Fire(greet)

在命令行中运行:

python greet.py John

输出:

Hello, John!

将类转换为命令行工具

可以将一个类转换为命令行工具:

import fire

class Calculator:
    def add(self, a, b):
        return a + b

    def multiply(self, a, b):
        return a * b

if __name__ == '__main__':
    fire.Fire(Calculator)

在命令行中运行:

Continue reading
Older posts Newer posts