BNU-FZH

fengzhenhua@outlook.com

方式一:远程仓库没有文件

1
2
3
4
5
git init(初始化git仓库);
git remote add 地址(设置remote地址);
git add . (将所有变更提交到本地仓库);
git commit -m '' (提交注释);
git push(本地仓库推送到远程仓库)

方式二:远程仓库有文件

1
2
3
4
5
6
7
git init(初始化git仓库);
git remote add origin 地址(设置远程remote地址);
git pull origin master(拉取远程仓库master的文件)
git branch --set-upstream-to=origin/master master(将本地master设置为远程master分支)
git add . (将所有变更提交到本地仓库);
git commit -m '' (提交注释);
git push

方式三:

1
2
3
4
5
git clone 地址(克隆远程仓库) test
cp -r 项目文件 test
git add . (将所有变更提交到本地仓库);
git commit -m '' (提交注释);
git push

设置用户和邮箱

一:全局

1
2
git config --global user.name "you name"
git config --global user.email "you email"

二:局部(单个项目)

1
2
git config user.name "you name"
git config user.email "you email"

强制推送

1
git push -f

APIApplication Programming Interface, 应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 ——百度百科(应用程序编程接口播报)

API 的工作原理是什么?

通过 API,您无需了解实施原理,也能将您的产品或服务与其他的互通。这样可以简化应用的开发,节省时间和成本。在您开发新的工具和产品,或管理现有工具和产品时,强大灵活的 API 可以帮助您简化设计、管理和使用,并带来更多创新机遇。

API 有时被视为合同,而合同文本则代表了各方之间的协议:如果一方以特定方式发送远程请求,该协议规定了另一方的软件将如何做出响应。

由于 API 简化了开发人员将新应用组件集成到现有基础架构中的方式,继而也对业务和 IT 团队之间的协作提供了帮助。随着数字市场日新月异,业务需求通常也会出现迅速变化,新的竞争对手利用新的应用即可改变整个行业。为了保持竞争力,支持快速开发和部署创新服务尤为重要。云原生应用开发是提高开发速度的一个明确办法,依赖于通过 API 连接微服务应用架构。

API 是通过云原生应用开发来连接您自己的基础架构的一个简化方式,此外还支持您向客户和其他外部用户分享您的数据。公共 API 有着独特的商业价值,因其可以简化和扩展您与合作伙伴的联系方式,并有望支持您从数据中实现盈利(Google Maps API 便是其中一个广为人知的案例)。

API的工作原理

例如,我们假设有这样一家图书发行公司:该发行商可以提供一个云应用,供书店店员查看书的库存情况。这款应用的开发成本高昂、有平台限制、开发周期较长,还需进行日常维护。

或者,该发行商也可以提供一个 API 来查询库存情况。这一方法有以下几个好处:

  • API 可以帮助他们将所有库存相关信息汇集到一处,供客户方便地访问数据。
  • 只要 API 的行为不发生变化,该图书发行商就能在不影响客户的情况下更改内部系统。
  • 借助公开可用的 API,开发人员可为该图书发行商、图书销售商或第三方开发一个应用,帮助客户查找所需的图书。这样不仅能提高销量,还能带来其他的商机。

简而言之,API 既能让您开放自己的资源访问权限,又能确保安全性并让您继续握有控制权。如何以及向谁开放访问权限由您自己决定。API 安全防护离不开良好的 API 管理,其中包括对 API 网关的使用。借助通联各种资源(包括传统系统和物联网,IoT)的分布式集成平台,您可以连接至 API 并创建使用 API 提供的数据或功能的应用。

API 发行政策

私有

这类 API 仅供内部使用,能让公司最大限度地控制自己的 API。

合作伙伴

您会和特定的业务合作伙伴共享这类 API。它能在不影响质量的情况下带来额外收益。

公共

这类 API 可供所有人使用。第三方可以使用这类 API 来开发应用,以便与您的 API 进行互动或实现某种创新。

如何利用 API 实现创新?

通过向合作伙伴或公众提供您的 API,可以:

  • 创造新的收入渠道,或拓展现有收入渠道。
  • 扩大您的品牌覆盖范围。
  • 通过外部开发和协作,推动开放创新或提高效率。

听上去还不错,对吗?但是,API 是如何做到上述几点的呢?

我们继续以刚才的那个图书发行公司为例。

假设该公司的某个合作伙伴开发了一个应用,可以帮助人们查找书店书架上的图书。这种体验的改进为书店带来了更多的客户(该发行商的客户),并拓展了现有的收入渠道。

或许会有第三方使用某个公共 API 来开发应用,以便人们直接从该发行商处(而非书店)购书。这样就能为该图书发行商打开新的收入渠道。

与特定合作伙伴或全世界共享 API 能带来积极的影响。除了自己公司的营销活动之外,每一个合作关系都能帮助您提高品牌辨识度。以公共 API 的形式向所有人开放技术,可以激励开发人员以您的 API 为中心构建应用生态系统。有更多的人使用您的技术,就意味着可能会有更多的人与您做生意。

公开技术可以带来意外之喜。有时,这些惊喜更会颠覆整个行业。对于这家图书发行公司而言,新形态的公司(比如图书出借服务)可能会完全改变他们的业务模式。借助合作伙伴和公共 API,您可以激发社区成员的创意(其人数远超您的内部开发团队)。各种奇思妙想会源源不断地涌现,公司只需明辨市场的变化情况并做好相应的准备。API 大有用处。

API 简史

API 概念的出现,始于计算机时代的初期,远远早于个人电脑诞生之前。当时,API 常被当作操作系统的库,而且基本上都在本地系统上运行,仅偶尔用于大型机之间传递消息。将近 30 年后,API 走出了它们的本地环境。到了 21 世纪初,API 成为了用于实现数据远程集成的一种重要技术。

远程 API

远程 API 旨在通过通信网络进行互动。这里的_远程_是指 API 操控的资源不在提出请求的计算机上。由于互联网是应用最广泛的通信网络,所以大多数 API 都是基于 Web 标准来设计的。并非所有的远程 API 都是 Web API,但可以认为 Web API 都是远程 API。

Web API 通常会使用 HTTP 来传输请求消息,并提供响应消息的结构定义。这些响应消息通常都会以 XML 或 JSON 文件的形式来提供。XML 和 JSON 都是首选格式,因为它们会以易于其他应用操纵的方式来呈现数据。

SOAP 和 REST

随着 Web API 的不断普及,相应的协议规范也随之产生了,从而推动了信息交换的标准化:简单对象访问协议,简称 SOAP。使用 SOAP 设计的 API 会使用 XML 格式来收发消息,并通过 HTTP 或 SMTP 来接收请求。使用 SOAP 时,在不同环境中运行的应用或使用不同语言编写的应用能够更加轻松地共享信息。

相关的规范还有一个,即表述性状态传递(REST)。遵循 REST 架构约束的 Web API 被称为 RESTful API。REST 与 SOAP 有着根本区别:SOAP 是一种协议,而 REST 是一种架构风格。这意味着 RESTful Web API 没有官方标准。正如 Roy Fielding 在论文“Architectural Styles and the Design of Network-based Software Architectures”(架构模式以及基于网络的软件架构的设计)中定义的那样,只要 API 符合 RESTful 系统的 6 个导向性约束,就算作 RESTful API:

  • 客户端/服务器架构:REST 架构由客户端、服务器和资源构成,通过 HTTP 来处理请求。
  • 无状态:请求所经过的服务器上不会存储任何客户端内容。与会话状态相关的信息会存储在客户端上。
  • 可缓存性:通过缓存,可免去客户端与服务器之间的某些交互。
  • 分层系统:客户机与服务器之间的交互可以通过额外的层来进行调解。这些层可以提供额外的功能,如负载均衡、共享缓存或安全防护。
  • 按需代码(可选):服务器可通过传输可执行代码来扩展客户端的功能。
  • 统一接口:这项约束是 RESTful API 的设计核心,共涵盖 4 个层面:
    • 识别请求中的资源:请求中的资源会被识别,并与返回给客户端的表示内容分离开来。
    • 通过不同的表示内容来操纵资源:客户端会收到表示不同资源的文件。这些表示内容必须提供足够的信息,以便执行修改或删除操作。
    • 自描述消息:返回给客户端的每个消息都包含充足的信息,用于指明客户端应该如何处理所收到的信息。
    • 将超媒体作为应用状态的引擎:在访问某个资源后,REST 客户端应该能够通过超链接来发现当前可用的所有其他操作。

虽然看似有很多约束需要遵循,但是这些约束遵循起来要比遵循规定的协议容易得多。因此,RESTful API 现在变得比 SOAP 更为普及。

近年来,OpenAPI 规范已发展成为定义 REST API 的通用标准。OpenAPI 为开发人员提供了一种与语言无关的方式来构建 REST API 接口,从而最大程度减少不确定的因素,让用户安心工作。

另一个新兴的 API 标准是 GraphQL,这是一种可替代 REST 的查询语言和服务器端运行时。GraphQL 可优先让客户端准确地获得所需的数据,没有任何冗多余。作为 REST 的替代方案,GraphQL 允许开发人员构建相应的请求,从而通过单个 API 调用从多个数据源中提取数据。

SOA 与微服务架构

最常使用远程 API 的 2 种架构方案分别是:面向服务的架构(SOA)和微服务架构。在这 2 种方案中,SOA 的历史更为久远一些。最初,它是在单体式应用的基础上经过改进而形成的。虽然单个单体式应用也可以完成各种操作,但通过某种集成模式(如企业服务总线(ESB))在不同应用间实现松散耦合后,即可获得某些功能。

从大多数层面来看,SOA 都要比单体式架构更简单;但是,如果无法明确理解各种组件交互,SOA 也可能会进一步加剧整个环境的复杂性。这种复杂性的加剧会重新引发 SOA 想要解决的某些问题。

对于专用松散耦合服务的使用,微服务架构与 SOA 模式类似。但是,微服务架构会对传统架构进行进一步细分。在微服务架构中,服务会采用通用消息传递框架,如 RESTful API。它们会使用 RESTful API 来实现相互通信,且无需执行繁琐的数据转换处理或使用其他的集成层。使用 RESTful API 可以加速新功能和新更新的交付;甚至还可以说,是这类 API 促进了这种速度的提升。该架构中的每一个服务都呈离散状态。一个服务可以被取代、增强或丢弃,而不会影响架构中的任何其他服务。这种轻量级架构有助于优化分布式资源或云资源,而且能够支持个别服务的动态扩展。

API 和 Webhook

Webhook 是一种基于 HTTP 的回调函数,可在 2 个 API 之间实现轻量级的事件驱动通信。许多种类的应用使用 Webhook 来从其他应用接收少量数据,但 Webhook 也可用于在 GitOps 环境中触发自动化工作流。

Webhook 通常被称为逆向 API 或推送 API,因为它们让通信责任落在了服务器而不是客户端身上。不再是客户端发送 HTTP 请求来索取数据,直到服务器响应为止,而是服务器等到数据可用时向客户端发送一个 HTTP POST 请求。虽然有这样的昵称,但 Webhook 不是 API;两者相互配合。应用必须具有 API 才能使用 Webhook。

简介

Veusz是一个具有用户界面的科研绘图集成软件,能够绘制符合出版要求的2D3D可视化图表。其能够在WindowsLinux/UnixmacOS上运行,支持矢量和位图结果输出,最重要的是Veusz是一款免费软件,Veusz支持从文本、CSVHDF5FITS文件格式中导入数据,更多关于Veusz的介绍可参考:Veusz官网

Veusz操作界面

绘图教程

如何绘制高质量的科学图表

绘制科学图表有很多技巧,本部分将介绍几个小技巧:

  • 图表的标题要简洁明了,能够清晰地表达图表的主题和目的。
  • 使用合适的颜色和字体,避免过度花哨或冗杂的设计。
  • 在图例中使用相同的颜色和线型,使其易于阅读和理解。
  • 使用清晰的坐标轴标签和单位。
  • 在图表中突出显示关键数据和结果。

通过上述技巧和 veusz 工具,可以轻松地制作出高质量的科学图表,在科学研究和学术交流中发挥重要的作用。

在数据可视化领域,Matplotlib是Python中最常用的绘图库之一。既然它被用于数据可视化,那么从图中提取数据也是Matplotlib的一个重要应用场景。在本文中,我们将介绍如何使用Matplotlib从图中提取数据并利用这些数据进行进一步的处理。

一个简单实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import matplotlib.pyplot as plt

# 生成500个0~1之间的随机数作为x轴数据
x = np.random.rand(500)
# 生成与x轴数据数量相同的随机数作为y轴数据
y = np.random.rand(500)

# 绘制散点图
plt.scatter(x, y)

# 设置横轴标签和纵轴标签
plt.xlabel("x")
plt.ylabel("y")

# 设置图表的标题
plt.title("Scatter Plot")

# 显示图表
plt.show()

上述代码通过numpy库生成了5000~1之间的随机数,并将这些随机数分别作为x轴y轴的数据,最终绘制出了一个散点图。其中,plt.scatter()函数是用于绘制散点图的函数,plt.xlabel()plt.ylabel()函数是用于设置横轴标签和纵轴标签的函数,plt.title()函数是用于设置图表标题的函数。

如何从Matplotlib图中提取数据

在Matplotlib中,要提取图中的数据,最常见的方式是获取图中的Artist对象,然后从这些对象中获取数据。Artist是所有绘图元素的基类,包括坐标轴、文字、点、线等。因此,从Artist对象中获取数据可以获取到图表中所有的信息。

获取散点图的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
import matplotlib.pyplot as plt

# 生成500个0~1之间的随机数作为x轴数据
x = np.random.rand(500)
# 生成与x轴数据数量相同的随机数作为y轴数据
y = np.random.rand(500)

# 绘制散点图
plt.scatter(x, y)

# 获取散点图的Artist对象
scatter_plot = plt.gca().collections[0]

# 打印每个散点的x轴坐标和y轴坐标
for i in range(len(scatter_plot._offsets)):
print("x: ", scatter_plot._offsets[i][0], "y: ", scatter_plot._offsets[i][1])

上述代码中,plt.gca()函数返回当前的Axes对象,我们通过对这个对象调用collections属性获取到了散点图的Artist对象。获取到这个对象后,我们可以从_offsets属性中获取到每个散点的坐标信息。上述代码中使用了一个for循环打印出了每个散点的x轴坐标和y轴坐标。

获取拆线图数据

折线图是绘制曲线最常见的方式之一。在Matplotlib中,使用plt.plot()函数可以方便地绘制折线图。为了演示从折线图中获取数据的方法,我们来生成一个简单的折线图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import matplotlib.pyplot as plt

# 生成0~10之间的100个数作为x轴数据
x = np.linspace(0, 10, 100)
# 生成sin函数在0~10之间的值作为y轴数据
y = np.sin(x)

# 绘制折线图
plt.plot(x, y)

# 设置横轴标签和纵轴标签
plt.xlabel("x")
plt.ylabel("y")

# 设置图表的标题
plt.title("Line Plot")

# 显示图表
plt.show()

在得到了折线图之后,我们可以通过如下代码从折线图中获取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
import matplotlib.pyplot as plt

# 生成0~10之间的100个数作为x轴数据
x = np.linspace(0, 10, 100)
# 生成sin函数在0~10之间的值作为y轴数据
y = np.sin(x)

# 绘制折线图
plt.plot(x, y)

# 获取折线的Artist对象
line_plot = plt.gca().lines[0]

# 打印每个点的x轴坐标和y轴坐标
for i in range(len(line_plot.get_xdata())):
print("x: ", line_plot.get_xdata()[i], "y: ", line_plot.get_ydata()[i])

在上述代码中,plt.gca()函数获取到当前的Axes对象,我们通过对这个对象调用lines属性获取到了折线图的Artist对象。获取到这个对象后,我们可以通过get_xdata()get_ydata()方法获取到折线图上每个点的x轴坐标和y轴坐标。上述代码中使用了一个for循环将获取到的x轴坐标和y轴坐标打印出来。

取柱状图数据

柱状图是绘制分布最常见的方式之一。在Matplotlib中,使用plt.bar()函数可以方便地绘制柱状图。为了演示从柱状图中获取数据的方法,我们来生成一个简单的柱状图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import matplotlib.pyplot as plt

# 生成5个0~1之间的随机数作为x轴数据
x = np.random.rand(5)
# 生成5个0~1之间的随机数作为y轴数据
y = np.random.rand(5)

# 绘制柱状图
plt.bar(x, y)

# 设置横轴标签和纵轴标签
plt.xlabel("x")
plt.ylabel("y")

# 设置图表的标题
plt.title("Bar Plot")

# 显示图表
plt.show()

在得到了柱状图之后,我们可以通过如下代码从柱状图中获取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
import matplotlib.pyplot as plt

# 生成5个0~1之间的随机数作为x轴数据
x = np.random.rand(5)
# 生成5个0~1之间的随机数作为y轴数据
y = np.random.rand(5)

# 绘制柱状图
plt.bar(x, y)

# 获取柱状图的Artist对象
bar_plot = plt.gca().patches

# 打印每个柱子的x轴坐标和y轴坐标
for i in range(len(bar_plot)):
print("x: ", bar_plot[i].get_x(), "y: ", bar_plot[i].get_height())

在上述代码中,plt.gca()函数获取到当前的Axes对象,我们通过对这个对象调用patches属性获取到了柱状图的Artist对象。获取到这个对象后,我们可以通过get_x()get_height()方法获取到柱状图的每个柱子的x轴坐标和y轴坐标。上述代码中使用了一个for循环将获取到的x轴坐标和y轴坐标打印出来。

总结

本文介绍了如何使用Matplotlib从图中提取数据的方法,包括散点图、折线图和柱状图的例子。通过这些例子,我们可以发现从Matplotlib图中获取数据的办法都是类似的,都是获取到图中的Artist对象,然后从这些对象中获取需要的数据。在实际使用中,我们还可以通过定制Artist对象来控制绘图过程,更好地实现我们的数据可视化需求。

NumPy库

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

SciPy库

SciPy 是一个开源的 Python 算法库和数学工具包。

Scipy 是基于 Numpy 的科学计算库,用于数学、科学、工程领域的常用软件包,可以处理最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理、图像处理、常微分方程求解器等。 。

SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

NumPySciPy 的协同工作可以高效解决很多问题,在天文学、生物学、气象学和气候科学,以及材料科学等多个学科得到了广泛应用。

Matplotlib库

Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

IPython 以及 pylab 模式

IPython 是 Python 的一个增强版本。它在下列方面有所增强:命名输入输出、使用系统命令(shell commands)、排错(debug)能力。我们在命令行终端给 IPython 加上参数 -pylab (0.12 以后的版本是 --pylab)之后,就可以像 Matlab 或者 Mathematica 那样以交互的方式绘图。

pylab

pylab 是 matplotlib 面向对象绘图库的一个接口。它的语法和 Matlab 十分相近。也就是说,它主要的绘图命令和 Matlab 对应的命令有相似的参数。

Pandas 库

Pandas教程

  • Pandas 是 Python 语言的一个扩展程序库,用于数据分析。

  • Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)。

  • Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。

  • Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。

Seaborn 库

Seaborn 教程

  • Seaborn 是一个基于 Matplotlib 的数据可视化库,专注于统计图形的绘制,旨在简化数据可视化的过程。

  • Seaborn 提供了一些简单的高级接口,可以轻松地绘制各种统计图形,包括散点图、折线图、柱状图、热图等,而且具有良好的美学效果。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 创建一个示例数据框
data = {'A': [1, 2, 3, 4, 5], 'B': [5, 4, 3, 2, 1]}
df = pd.DataFrame(data)

# 计算 Pearson 相关系数
correlation_matrix = df.corr()
# 使用热图可视化 Pearson 相关系数
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.show()

这段代码将生成一个热图,用颜色表示相关系数的强度,其中正相关用温暖色调表示,负相关用冷色调表示。annot=True 参数在热图上显示具体的数值。

示例热图

在 Python 3.8 及更高版本中,引入了一种新的语法特性,称为"海象运算符"( Walrus Operator ),它使用 := 符号。这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。使用海象运算符可以在一些情况下简化代码,尤其是在需要在表达式中使用赋值结果的情况下。这对于简化循环条件或表达式中的重复计算很有用。

演示海象运算符的使用
1
2
3
4
5
6
7
8
# 传统写法
n = 10
if n > 5:
print(n)

# 使用海象运算符
if (n := 10) > 5:
print(n)
  • if (n := 10) > 5::这是使用海象运算符(:=)的写法。海象运算符在表达式中进行赋值操作。
    • (n := 10):将变量 n 赋值为 10,同时返回这个赋值结果。
    • > 5:检查赋值后的 n 是否大于 5。如果条件为真,则执行接下来的代码块。
  • print(n):如果条件为真,打印变量 n 的值(即 10)。

海象运算符的优点:

  • 海象运算符(:=)允许在表达式内部进行赋值,这可以减少代码的重复,提高代码的可读性和简洁性。
  • 在上述例子中,传统写法需要单独一行来赋值 n, 然后在 if 语句中进行条件检查。而使用海象运算符的写法可以在 if 语句中直接进行赋值和条件检查。

编程注释是程序中用来解释代码功能和作用的文字内容,它们对于代码的可读性和可维护性非常重要。不同的编程语言对注释符号有不同的要求和规范,下面将介绍一些常见的编程语言中常用的注释符号。

C/C++、Java、C#等类C语言风格的注释:

  • 单行注释:使用双斜线(//)开头,注释文字直至该行结束。
  • 多行注释:使用斜线加星号(/)开头,星号加斜线(/)结尾,中间的内容都会被注释掉。

Python风格的注释:

  • 单行注释:使用井号(#)开头,注释文字直至该行结束。

JavaScript风格的注释:

  • 单行注释:使用双斜线(//)开头,注释文字直至该行结束。
  • 多行注释:使用斜线加星号(/)开头,星号加斜线(/)结尾,中间的内容都会被注释掉。

Shell脚本风格的注释:

  • 单行注释:使用井号(#)开头,注释文字直至该行结束。

HTML、CSS风格的注释:

  • 单行注释:使用斜线加星号(/)开头,星号加斜线(/)结尾,中间的内容都会被注释掉。

SQL风格的注释:

  • 单行注释:使用双连字符(–)开头,注释文字直至该行结束。
  • 多行注释:使用斜线加星号(/)开头,星号加斜线(/)结尾,中间的内容都会被注释掉。

需要注意的是,不同编程语言中注释的使用方式可能会有所不同,因此在具体的编程项目中,需要遵循对应编程语言的注释规范来使用注释符号。同时,良好的注释应该准确、清晰地解释代码的意图和功能,避免在注释中出现笔误或误导性的信息,以提高代码的可读性和可维护性。

在许多编程语言和日常工作中都会遇到斜杠和反斜杠。它们的具体解释为:

  • 斜杠(slash): “ / ”是斜杠,因为它的顶端是向前面倾斜的,英文中有时候也叫做“forward slash”;

  • 反斜杠(backslash):“\”是反斜杠,注意,它的顶端是向后倾斜的。要将它和普通的斜杠(“/”)区分开来。

斜杠经常会用来在诸如Unix的文件系统中和万维网网址中表示目录和子目录路径等。很遗憾的是,很多人都把反斜杠(“\”)当做是普通斜杠(“/”)的某种技术用语,错误的使用术语,混淆斜杠和反斜杠的风险让那些足够了解他们的人可以区分他们,但是了解仍不够他们意识到万维网的地址中很少会包含反斜杠(“\”)的。

Windows 和 Linux 的路径区别

  • 路径分隔符不同:Windows使用反斜杠“\”,而Linux使用正斜杠“/”。
  • 文件名大小写敏感:Windows不区分大小写,Linux区分大小写。
  • 文件系统根目录不同:Windows的根目录是盘符(如C:\),Linux的根目录是“/”。
  • 文件权限不同:Linux采用基于权限的访问控制,Windows采用基于用户的访问控制。
  • 文件扩展名不同:Windows的文件扩展名以“.”作为分隔符,Linux通常没有特定的分隔符

Linux Shell 参数续行

Shell命令行下反斜线"\"有两种含义:

对有特殊含义的字符进行转义

例如 echo "123\ \$",结果是"123$"

\Enter, 反斜杠后面紧跟回车,表示下一行是当前行的续航

1
2
3
4
5
6
7
./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http\_ssl\_module \
--with-pcre=/usr/local/src/pcre-8.21 \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-openssl=/usr/local/src/openssl-1.0.1c

Python 多行语句

Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 \\ 来实现多行语句,例如:

1
2
3
total = item_one + \
item_two + \
item_three

[], {}, 或 () 中的多行语句,不需要使用反斜杠 \\,例如:

1
2
total = ['item_one', 'item_two', 'item_three',
'item_four', 'item_five']

LaTeX 中的反斜杠

LaTeX 中的命令通常是由一个反斜杠加上命令名称,再加上花括号内的参数构成的。

1
\documentclass{ctexart}

LaTeX 中有许多字符都有特殊的意义, LaTeX 中的保留字符有 \#,\$,\%,\&,\_,{ }, \,这些在正文中都不能直接呈现,需借助反斜杠转义。

为了实现远程文件访问,决定在ArchLinux上部署SFTP, 虽然技术上仍然没有测试成功,但是先记录下参考的主要文档How to set up an SFTP server on Arch Linux,以期日后解决。

In this guide we are going to set up an sftp server on an Arch Linux system. We will also set up a form of chroot where users can only access sftp with the shared credentials.

The File Transfer Protocol is a standard communication protocol used for the transfer of computer files from a server to a client on a computer network.

FTP isn’t popular today because it Lacks Security. When a file is sent using this protocol, the data, username, and password are all shared in plain text, which means a hacker can access this information with little to no effort. For data to be secure, you need to use an upgraded version of FTP like SFTP.

SFTP Secure File Transfer Protocol is a file transfer protocol that provide secure access to a remote computer to deliver secure communications. It leverages SSH – Secure Socket Shell and is frequently also referred to as ‘Secure Shell File Transfer Protocol’.

Prerequisites

To follow along this guide ensure you have the following:

  1. Arch Linux machine
  2. Root access to the server or a user with root access
  3. Internet access from the server

Table of Content

  1. Ensuring that the server is up to date
  2. Ensuring that the SSH service is installed
  3. Creating users and groups and adding the necessary directories
  4. Configuring the ssh service
  5. Verifying that the set up is working as expected

1. Ensuring that the server is up to date

Before proceeding, ensure your system is up to date. Use this command to refresh the system packages and update them.

1
sudo pacman -Syyu

2. Ensuring that the SSH service is installed

Verify that the ssh is installed:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ sudo pacman -Qi openssh
Name : openssh
Version : 8.6p1-1
Description : Premier connectivity tool for remote login with the SSH protocol
Architecture : x86_64
URL : https://www.openssh.com/portable.html
Licenses : custom:BSD
Groups : None
Provides : None
Depends On : glibc krb5 openssl libedit ldns libxcrypt libcrypt.so=2-64 zlib pam
Optional Deps : xorg-xauth: X11 forwarding
x11-ssh-askpass: input passphrase in X
libfido2: FIDO/U2F support
Required By : None
Optional For : None
Conflicts With : None
Replaces : None
Installed Size : 5.79 MiB
Packager : Giancarlo Razzolini <grazzolini@archlinux.org>
Build Date : Mon 19 Apr 2021 11:32:46 AM UTC
Install Date : Thu 03 Jun 2021 03:23:32 AM UTC
Install Reason : Explicitly installed
Install Script : Yes
Validated By : Signature

If ssh is not installed, install with this command:

1
sudo pacman -S openssh

Now that it is installed, start the service

1
sudo systemctl start sshd

Confirm its status

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ sudo systemctl status sshd
● sshd.service - OpenSSH Daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2021-12-03 10:19:02 UTC; 17min ago
Main PID: 467 (sshd)
Tasks: 1 (limit: 4606)
Memory: 5.0M
CGroup: /system.slice/sshd.service
└─467 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups

Dec 04 14:53:30 ip-10-2-40-103 sshd[13109]: Unable to negotiate with 141.98.10.246 port 34078: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exc>
Dec 04 14:53:42 ip-10-2-40-103 sshd[13111]: Unable to negotiate with 141.98.10.246 port 38674: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exc>
Dec 04 14:53:53 ip-10-2-40-103 sshd[13115]: Unable to negotiate with 141.98.10.246 port 43268: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exc>
Dec 04 14:54:05 ip-10-2-40-103 sshd[13117]: Unable to negotiate with 141.98.10.246 port 47864: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exc>
Dec 04 14:54:17 ip-10-2-40-103 sshd[13119]: Unable to negotiate with 141.98.10.246 port 52460: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exc>
Dec 04 14:54:41 ip-10-2-40-103 sshd[13123]: Unable to negotiate with 141.98.10.246 port 33418: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exc>
Dec 04 14:54:53 ip-10-2-40-103 sshd[13127]: Unable to negotiate with 141.98.10.246 port 38014: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exc>
Dec 04 14:55:05 ip-10-2-40-103 sshd[13129]: Unable to negotiate with 141.98.10.246 port 42614: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exc>
Dec 04 15:16:10 ip-10-2-40-103 sshd[13191]: Received disconnect from 61.177.173.21 port 60983:11: [preauth]
Dec 04 15:16:10 ip-10-2-40-103 sshd[13191]: Disconnected from authenticating user root 61.177.173.21 port 60983 [preauth]

3. Creating users and groups and adding the necessary directories

Next we will ensure that the necessary users are present in the system. In my case, I would like to have the sftp users home as /srv/sftp

Let us create the home /srv/sftp with this command:

1
sudo mkdir /srv/sftp

Then let us create an umbrella group for SFTP only

1
sudo groupadd sftpusers

Then create an sftp only user called citizix:

1
sudo useradd -G sftpusers -d /srv/sftp/citizix -s /sbin/nologin citizix

The above options do the following:

  • -G sftpusers: Create user, append to sftpusers group
  • -d /srv/sftp/citizix: Set home dir as /srv/sftp/citizix
  • -s /sbin/nologin: We do not want the user to login, so no ssh login shell
  • Finally, username as citizix

Then add password to the created user using this command:

1
2
3
4
5
$ sudo passwd citizix
Changing password for user citizix.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

3. Configuring the ssh service

Now that we have installed the necessary software and created the users and groups, let us configure ssh.

Ensure password authentication is enabled for ssh. Edit the config file here /etc/ssh/sshd_config:

1
sudo vim /etc/ssh/sshd_config

Then ensure this line is not commented:

1
PasswordAuthentication yes

Next, we need to add rules for the users in the sftpusers group to be considered as sftp. Edit the config file:

1
sudo vim /etc/ssh/sshd_config

Add this content at the bottom of the file:

1
2
3
4
5
Match Group sftpusers  
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /srv/sftp
ForceCommand internal-sftp

Then restart sshd to reload the config:

1
sudo systemctl restart sshd

Verify that sshd is running as expected:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo systemctl status sshd
● sshd.service - OpenSSH Daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2021-12-04 15:48:19 UTC; 18s ago
Main PID: 14269 (sshd)
Tasks: 1 (limit: 4606)
Memory: 892.0K
CGroup: /system.slice/sshd.service
└─14269 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups

Dec 04 15:48:19 ip-10-2-40-103 systemd[1]: Started OpenSSH Daemon.
Dec 04 15:48:19 ip-10-2-40-103 sshd[14269]: Server listening on 0.0.0.0 port 22.
Dec 04 15:48:19 ip-10-2-40-103 sshd[14269]: Server listening on :: port 22.

4. Verifying that the set up is working as expected

After successfully creating the user and adding sftp configurations, let is test the set up using the command:

1
2
3
4
❯ sftp citizix@10.2.11.8
citizix@<meta charset="utf-8">10.2.11.8's password:
Connected to <meta charset="utf-8">10.2.11.8.
sftp>

Now we have sftp server up and running with a user configured!

The users will be able to login to the server and access files and directories located in their home directory. If you want to give the user to other directories outside their own directory, just make sure the user has enough rights to access. These directories and files have to be within the sftp directory – /srv/sftp.

Example: if i want user to access the directory /srv/sftp/paymentfiles, do the following:

Create the directory

1
sudo mkdir /srv/sftp/paymentfiles

Then assign the user(citizix) access by making them own the directory:

1
sudo chown citizix:sftpusers /srv/sftp/paymentfiles

That is it. Users should now have access.

Conclusion

We managed to set up sftp server in an Archlinux Server in this guide.

为什么需要局域网

一般工作过程中会有一个台式机电脑和一个笔记本电脑,为了提高效率两台电脑均安装了固态硬盘. 但是我们还会遇到了文件传输的问题, 比如在台式机上的文件需要传输到笔记本电脑上,我们可以借助U盘移动硬盘网盘(百度网盘、阿里网盘等), 它们各有优点和不足:

  • U盘在转移资料时最方便,但是仅限于对于小文件,如果文件体积过大,那从台式机传输到U盘需要大量的时间,同时从U盘再到笔记本又需要再消耗几乎相同的时间,而且U盘的传输速度一般比较慢,但是它的最大的优点是一旦资料存储在U盘上,那可以方便的携带到其他电脑,实现多次传输。
  • 移动硬盘容量比较大,性能要远优于U盘, 一些重要的资料可以保存的上面,但是对于那些需要经常读取和编辑的资料就不适合存放在上面,因为移动硬盘经常随身携带也远不如U盘小巧。但是其传输速度非常快,特别是使用固态硬盘组装的移动硬盘,但是移动硬盘的最大作用应当是备份,备份资料就要求存储介质足够稳定,而目前就价格和稳定性上讲,机械硬盘仍是不二选择,相同价格机械硬盘的容量要远大于固态硬盘,机械硬盘的缺点是在工作时不能随便移动。
  • 网盘兴起有好多年了,目前比较有名的有:百度网盘、阿里云盘、坚果云盘、123网盘和中国移动网盘等. 平时可以把资料存在网盘上,但是你不能保证上传和下载速度,同时还有各种广告,各种限制,以及有些涉及隐私的资料都不适合存储在网盘,所以就当前来看这是一个不太明智的作法。

综上,在工作中对于那些需要经常访问的资料应当保存的电脑上,同时为了方便在不同电脑中传输,本文提供一个新的方法:使用网线组成局域网,借助samba在局域网中分享文件,分享方法参考:ArchLinux 局域网共享文件.

使用移动硬盘等中间媒介时,其传输速度要高于局域网。在测试时,我发现使用局域网传输时速度稳定在60M左右,但是局域网的总速度是1000M,这就意味着可以同时传输多个文件夹,每个传输速度都会在60M左右,显然多线程可以弥补移动硬盘单一高速的优势,但是局域网的点对点的直达优势却是移动硬盘所不具备的. 如果两台电脑处于同一个局域网,或两台电脑就在身边且有一根网线,则推荐使用局域网. 如果两电脑距离较远,且所需资料是不经常编辑的,则推荐使用移动硬盘。

设置局域网的方法

1. 准备工作

在开始之前,请准备好:

  • 两台运行Ubuntu操作系统的电脑。
  • 一根网线(建议不要超过80米,否则信号会衰减)。

2. 连接网线

将网线一端插入第一台电脑的网口,将另一端插入另一电脑的网口。确保网线插紧并且连接稳固。

3. 配置网络

  • 打开第一台Ubuntu电脑的系统设置(Settings)。
  • 选择“网络”(Network)选项。
  • 在网络设置中,点击“有线连接”(Wired Connection)。
  • 确保“有线连接”开关处于打开状态。
  • 选择需要修改的以太网设置,点击右侧的“选项”(Options)按钮(齿轮形的按钮),进入高级网络设置。
  • 在IPv4设置中,选择“手动”(Manual)。
  • 点击“添加”按钮,添加一个新的IP地址。
  • 在“地址”(Address)字段中输入IP地址,例如:192.168.189.13。子网掩码通常为255.255.255.0
  • 在“网关”(Gateway)字段中输入网关地址,例如:192.168.189.1。设置完毕的窗口如下图所示:
    置局域网网关
  • 点击“应用”并关闭网络设置窗口。

解释:

(1)为什么要设置成192.168.189.13?其他可以吗?
IP地址是局域网中用来标识设备的地址,而192.168.189.13是IPv4地址中的一个私有地址段,通常用于局域网中。在一个子网内,每台设备的IP地址应该是唯一的,因此我们选择一个未被占用的地址,以便在同一网络中找到对应的设备。其他私有地址段,如192.168.0.0192.168.1.0等也可以使用,只要保证两台电脑在同一个子网内,并且IP地址唯一。

(2)网关怎么设置?
本教程选择了192.168.189.1这个地址作为网关,是因为它处于私有IP地址范围内(私有IP地址范围是指专门供局域网使用的IP地址范围,不会在全球互联网上被路由器转发),并且与我们选择的IP地址192.168.189.x在同一个子网中。只需要保证两台电脑上的网关相同即可。

(3)子网掩码为什么是255.255.255.0
子网掩码用于定义哪些部分是网络地址,哪些部分是主机地址。在一个局域网中,通常使用的子网掩码是255.255.255.0,这意味着前三个字节是网络地址,最后一个字节是主机地址。这样,同一子网内的设备可以相互通信,而不同子网的设备则需要通过路由器进行通信。

4. 配置第二台电脑

重复步骤三,但在IPv4设置中将IP地址更改为另一个可用的地址,例如:192.168.189.8。子网掩码为255.255.255.0,网关字段中输入相同的网关地址:192.168.189.1
第二台电脑网关设置

5. 测试连接

打开终端,使用ping命令测试两台电脑之间的连接。在第一台电脑上输入以下命令:

1
ping 192.168.189.8

如果一切正常,你应该会收到类似以下的回复:

1
64 bytes from 192.168.189.8: icmp_seq=1 ttl=64 time=0.504 ms

在第二台电脑上输入以下命令:

1
ping 192.168.189.13

如果一切正常,你应该会收到类似以下的回复:

1
64 bytes from 192.168.189.13: icmp_seq=1 ttl=64 time=0.425 ms

这意味着两台电脑之间的网络连接已经建立并且正常工作。

macOS和Windows用户,可以按照类似的步骤进行网线连接和网络配置。在macOS上,你可以打开“系统偏好设置”,选择“网络”,然后配置IP地址、子网掩码和网关等参数。而在Windows操作系统上,可以通过“控制面板”中的“网络和共享中心”来进行相似的设置。(如果无法A可以ping通B,B无法ping通A,请检查A的防火墙设置)