使用 Stripe 订阅和 Firestore 集成构建大型 Streamlit 应用程序

news2024/11/15 9:31:01

将创意转化为软件产品的能力是一项值得学习的技能。在这篇博客中,我将描述需要做些什么,以及如何将各个部分组合在一起以创建一款无需启动成本但具有订阅模式和 Firestore 集成的软件产品。

       欢迎来到雲闪世界。 无论您是数据科学家、数据工程师还是从事其他软件开发领域,仅使用笔记本电脑将您的想法转化为真正可用的软件产品可能都是最棒的技能。软件开发的各个领域都汇集在这样一个过程中,从用户体验、前端到后端开发、数据处理、可视化、云/服务器配置等等。这是一个来来回回的过程。挑战在于决定从哪个想法开始,以及如何避免(启动)成本,直到人们想要您的产品。在这篇博客中,我将讨论不同类型的想法,并展示如何使用Streamlit创建和部署SkyWalk,使用Stripe进行订阅,以及使用Google Firestore进行数据存储。

构建大型 Streamlit 应用程序:个人项目。

从事个人项目与你的日常工作有着根本的不同。也许一开始看起来很相似,因为你可能以类似的方式开发,使用相同的工具。但是,没有人会询问你项目的状态,而且在从事个人项目时也没有收入。开发自己的软件应用程序是最棒的事情。这是让你变得更快、更有经验、快速获得新知识的方法。但是,如果你独自一人从头开始一个项目,并朝着功能齐全的应用程序甚至订阅模式的产品的方向努力,可能需要数月甚至数年的时间。你很可能会在晚上和周末工作。设定完成应用程序的现实时间表被严重低估了。原因可能多种多样,从错误的假设到缺乏专业知识,更重要的是,你也不需要屏幕时间来保持身体健康并与家人/朋友见面。

每个(软件)开发人员都有一个很棒但被放弃的软件项目。

当你在软件开发方面变得更加有经验时,你会在问题变成真正的问题之前就解决许多问题,时间也会得到更好的管理。因此,从事个人项目是变得更加有经验的好方法。许多博客都写到被动收入是从事个人项目的理由,但有一个问题。让我们进入下一节,我将在其中更详细地描述被动收入。

被动收入可能是一个动力,但是......

构建一款可以产生被动收入的软件产品的想法听起来很棒,但是却有一个陷阱。

天下没有免费的午餐。

让我把“被动收入”分为两部分。像大多数其他事情一样,你首先需要投资,在这种情况下,就是你宝贵的时间(第 1 部分)。第二部分是,没有保证能以金钱的形式弥补你花费的任何时间。那么你为什么要做个人项目呢? 嗯,一个很好的理由就是学习。学习是最明智的做法,因为它可以带来你正在寻找的长期机会。

学习能力是每个人都应该不断锻炼的能力,成为终身学习者可能是你能给予自己的最好礼物。

在做个人项目时,随着时间的推移,您可能会变得更加有经验,并积累大量新知识。因此,请明智地选择您的项目。但如何决定呢?

如何决定要实施哪个想法?

你可能有很多想法,如果结合朋友/家人等的建议,你的想法会更多。但如何决定要构建什么?让我区分一下我最常见的三种想法:

  1. 来自其他人的想法,该人不是开发者,但在发展过程中仍然是赞助商。
  2. 一个超出您专业领域的想法(来自您自己或他人)。
  3. 您熟悉的领域中并且您个人也需要该产品的想法(来自您自己或他人)。

时间只能花一次。所以要珍惜。

让我们来看看这 3 个类别。

  1. 想法 1:在类别 1 中启动项目会很快让您感到压力,因为只有您在晚上和周末完成所有工作。这在某些时候可能会变得棘手。另一方面,如果有人在您身边帮助您,并激励您继续前进,可能会有所帮助。或者确保另一个人正在做营销和其他宣传工作(网站、文档、示例等)。
  2. 想法 2:您可能会因为缺乏特定领域的知识而陷入困境。您可能需要一个拥有相关知识的人,或者您需要通过课程等来学习。另一方面,如果您对某个特定主题感兴趣,这是一种学习和获得该领域经验的好方法。这甚至可能帮助您获得未来工作的正确资格。
  3. 想法 3:在自己熟悉的领域为自己制作工具。动机很明确,因为它将直接自动化流程,从长远来看节省您的时间。所有要素都已到位,可以让它持续进行直至完成。

无论想法是什么,通常一开始都会充满热情,这很好,但开始一个项目不是问题,坚持下去并完成通常才是问题。个人项目中的挑战部分是保持自己对它的兴趣,逐步构建,尤其是在大型应用程序中;重构是关键,但也耗时。你可以连续几天或几周进行重构,以达到已经存在的功能点。

重构就像暂停项目一样。你需要花一点时间回顾、重新校准和整理错综复杂的代码,以确保当你再次按下播放键时,一切都运行得更顺畅,并且产生悖论或意外错误的风险更小。

走向软件产品。

你可能已经连续几个月开发应用程序,直到可以称其为“完成”。一个功能齐全的应用程序是进入下一个阶段的良好起点;将其开源或制作产品。在开源的情况下,你向世界展示了你的编程方式。这将帮助你成长为一名开发人员,并让你更有经验。此外,开源是向公司展示你开发的内容/方式的好方法。另一种选择是创建一个产品,你的应用程序可能是一个很好的起点。

创造一个产品需要什么。

软件应用程序和消费产品之间存在很大差异。产品需要直观的用户界面,不再需要个人的脑力劳动,并且您需要以清晰、结构化的方式编写大量文档。应该有关于其工作原理的示例、注册系统、订阅模式,并且如果应用程序没有达到预期目的,您将是联系人。

当创建一个产品时,它不仅仅是编码那么简单。

上线前测试您的产品。

在我们继续之前,让我们先退一步,因为在拥有第一个真正的用户之前,一定要彻底测试它。也许在朋友/家人之间。要求他们非常挑剔,因为最好在这个阶段发现所有问题,避免与真正的用户发生冲突。认真对待每一个问题并解决它。然后在一组潜在的真实用户中测试它。创建一个模拟账户并免费提供给您的测试人员。更好的是,为所有测试人员提供终身免费账户。通过这种方式,您将拥有最好的赞助商,他们将帮助您在此过程中制作更好的产品。

开发人员面临的真正困难不是技术挑战,而是随之而来的结果。

接下来就是营销你出色的产品。我可以坦诚地说,开发软件总是比后续的事情有趣得多。

SkyWalk 的发展。

SkyWalk 是我根据个人需求和兴趣开发的应用程序。到目前为止,我专门开发和发布开源项目,这真的很棒。在以下部分中,我将从技术角度描述我如何创建 SkyWalk,这也可能有助于您构建产品。

SkyWalk 标志。图片由作者提供。

SkyWalk 简介。

在介绍技术细节之前,让我先解释一下这款产品为何如此重要。飞行准备是一个复杂的过程,需要在飞行前进行许多规划和组织步骤。飞行员需要执行评估天气状况、确定飞机性能、计算燃油消耗以及确保遵守监管准则和安全等任务。没有一个数据源可以找到所有信息,而是需要从各种来源收集信息,将信息组合起来,然后进行计算。这是一个手动过程,容易出错且耗时。

对于飞行准备,有许多数据源需要合并、计算和解释。

在 SkyWalk 中,飞行准备信息被组织在不同的选项卡中。提供数千个机场的信息,连接实时来源,例如 METAR 和 NOTAM 信息,并可提供自定义用户信息。

SkyWalk:底层架构。

SkyWalk 中的多个组件相互连接,将各种数据源整合在一起并处理所有信息。一般来说,在构建第一个版本时,应使其1. 轻量级、2. 严格控制外部成本和 3. 使其具有功能性。与其制作最小可行产品 (MVP),不如着眼于制作最小优秀产品 (MAP)。当更多人想要您的产品(比您自己多一个)时,您就可以开始考虑第 2 版了。以下组件用于构建 SkyWalk:

  • Streamlit:开发和部署框架。费用:免费使用。阅读以下详细信息。
  • Google Firestore:用于数据管理的云数据平台。升级非常简单,只需选择不同的层级(订阅计划)。费用:基本层级免费。阅读以下详细信息。
  • Stripe:处理用户订阅的安全支付系统。费用:每个订阅者的交易费。阅读以下详细信息。
  • Google Gmail 帐户:用于联系和发送丢失密码的自动电子邮件。费用:免费使用。
  • Github:管理(私有)源代码、文档页面和其他小示例。费用:免费使用。

SkyWalk 的架构。紫色箭头表示用户操作。蓝色箭头表示开发人员需要的手动操作(仅一次)。灰色箭头是预编程的操作,用于使用 Gmail 处理电子邮件、使用 Firestore 存储和加载数据以及在 Stripe 中检查用户订阅状态。(作者绘制)。

不会收集用户数据,使用欧洲数据服务器进行存储。密码使用 256 位加密进行安全散列。

def hash_password(password):
    """Password hashing."""
    return hashlib.sha256(password.encode('utf-8')).hexdigest()


def verify_password(hashed_password, password):
    """Verify password.

    Parameters
    ----------
    hashed_password : String
        Hashed password.
    password : String
        Login password.

    Examples
    --------
    >>> password = "secretpassword"
    >>> stored_password = hash_password("secretpassword")
    >>> verify_password(hashed_password, input_password)

    """
    input_hashed_password = hashlib.sha256(input_password.encode('utf-8')).hexdigest()
    return stored_password == input_hashed_password

Streamlit:框架和部署。

Streamlit 是一个很棒的框架,可用于构建适用于中小型应用程序的应用程序。SkyWalk 是一个大型应用程序,因此我需要进行许多优化。我将描述我的学习成果,但让我先介绍一下 Streamlit 的一些实际优缺点:

优点:

  • 易于使用,非常适合创建应用程序的第一个版本。
  • 在Streamlit社区云中部署无需任何成本。
  • 一个私人应用程序可以托管在社区云中。
  • 您的代码保留在(私人)GitHub 上,并且在推送新更新时应用程序也会更新。

缺点:

  • 创建大型应用程序可能会变得麻烦,因为代码自上而下运行并且刷新可能会出现重影(旧信息仍然存在)。
  • 没有模块化(每次执行时都会重新运行整页)。这会使大型应用程序变得非常慢。
  • 可用资源有限,并且没有(付费)升级层。让您的应用程序轻量级并高效处理数据内存,因为截至 2024 年 2 月的限制大约为:CPU:至少 0.078 个内核,最多 2 个内核。内存:至少 690MB,最多 2.7 GB。

避免重复加载数据。

使用 Streamlit 时,请在数据加载、数据计算和可视化之间建立清晰的分离。由于上述原因,这一点很重要。这样做时,您可以使用st.cache_data或进行性能优化st.cache_resource

使用缓存功能加速 Streamlit 进程。(图片由作者提供)

SkyWalk 中有许多函数、多个页面、繁重的(数据)处理任务以及对 Firestore 的 API 调用等。我将数据加载分开,并使用st.session_statest.cache_data进行st.cache_resource优化。此外,我通过分析优化了 SkyWalk,测量了函数调用的频率以及与之相关的时间。我重构了热点,这通常是我处理数据和缓存的一些简单更改。如果这对您的应用程序来说已经不够了,并且您需要更高的性能和响应能力,那么您的应用程序的版本 2 需要不同的解决方案。

@st.cache_data  # Add the caching decorator
def load_data('https://github.com/plotly/datasets/raw/master/uber-rides-data1.csv'):
    df = pd.read_csv(url)
    return df

# Load data from url
df = load_data()

# Show results in Streamlit dataframe
st.dataframe(df)

使用社区云进行部署。

使用 Streamlit 的一大优势是在 Streamlit 社区云中部署的方式。它设计精良,您可以直接从 GitHub 源部署应用程序,而无需使用 docker 或无休止的配置。步骤如下:

  1. 创建你的应用程序的 GitHub 仓库;
  2. 创建您的 Streamlit 应用程序并将其推送到 GitHub;
  3. 在社区云上建立一个账户;
  4. 将您的帐户连接到 GitHub;
  5. 按照本指南,只需单击几下即可部署您的应用程序。

将您的密钥放在其所属的位置。

SkyWalk 的部署也是使用 Streamlit 提供的服务进行的。重要的是使用st.secrets密钥。切勿将密钥直接放入代码中,也不要将其推送到 GitHub。对 Stripe、Firestore、Gmail 和其他应用程序进行 API 调用时需要使用密钥代码。

通过 3 个步骤在 Streamlit Community Cloud 中配置您的密钥。(图片来自作者)。

选择退出数据收集。

强烈建议您选择退出 Streamlit 中的用户数据收集。您需要gatherUsageStats=false在 Streamlit 配置文件中进行设置。这应该可以防止数据被发送到美国服务器(归 Snowflake 所有)。

# Put this in your ./streamlit/config.toml file

# Opt-out for user data collection. GDPR policy in Europe.
[browser]
gatherUsageStats = false

成本。

在 Streamlit 社区云中部署开源或私有应用程序无需任何费用。但是,只能部署一个私有应用程序。

Stripe 创建订阅。

Stripe 是一家流行的支付处理公司。它提供了一种简单的支付处理方式,并提供接受各种支付方式的服务,包括 Apple Pay 和 Google Pay。在 SkyWalk 中,所有付款都包含在 Stripe 中,Stripe 会在您的应用程序之外处理整个交易(这是一个巨大的优势)。通过 API 调用,您可以查看用户是否已订阅且处于活动状态。然后可以使用此状态授予对您应用程序的访问权限。用户只需登录他们的个人 Stripe 帐户,即可管理他们的付款方式以及何时结束订阅。Stripe 的另一个优点是提供低代码解决方案来创建可用于您的应用程序的支付链接。换句话说,支付和与用户结算的全部责任都由 Stripe 处理。这项服务并非完全免费,但肯定值得,可以避免所有麻烦。另一个优点是,只有在有订阅者时,您才需要支付交易费。有关 Stripe 和其他支付系统的更多详细信息,请参见此处。费用摘要如下。

成本

Stripe 可以免费集成到您的应用程序中,并且其服务不收取月费或年费。相反,所有 Stripe 费用都是按交易收取的。费用根据交易方式确定。例如,当使用 Visa、Mastercard、American Express 和 Google Pay 等付款时,每笔成功的卡收费将收取 2.9% 的交易费和 30 美分。此外,国际卡还收取 +1% 的费用,如果需要货币兑换,则收取 +1% 的费用。

SkyWalk 的登录屏幕。图片由作者提供。

Google Firestore 用于数据处理。

各种云服务均可用于数据存储和管理。我使用 Google Firestore 是因为它简单且具有 NoSQL 面向文档的数据库。与 SQL 数据库不同,它没有表或行。相反,您将数据存储在文档中,文档被组织成集合。每个文档包含一组键值对。详情请参阅此处。这意味着,如果您是数据科学家,并且需要转储 CSV 或 Pandas DataFrame 或 Numpy 数组,则可以将其转储到 Firestore 中。Firestore 的 Python 库非常易于使用。请参阅下面的示例,其中使用 Python API 添加包含一些信息的新用户。

# Create an initial document to update
frank_ref = db.collection("users").document("frank")
frank_ref.set(
    {
        "name": "Frank",
        "favorites": {"food": "Pizza", "color": "Blue", "subject": "Recess"},
        "age": 12,
    }
)

# Update age and favorite color
frank_ref.update({"age": 13, "favorites.color": "Red"})

将 Firestore 与 AWS 和 Azure 等服务进行比较时,后两者拥有更多选项、配置和无限可能性。虽然这很棒,但灵活性可能会变得麻烦,因为您可能不需要所有功能,并且可能需要您处理所有不需要的功能。但是,如果您已经知道由于数百万每日用户和复杂查询而导致扩展将是一个问题,那么这些服务可能更适合您。对于 SkyWalk,我尽量减少使用数据处理,因为更多数据通常会导致更多维护和更高成本。

从很多角度来看,智能数据加载和写入都是一个好习惯。

此外,还选择了 Firestore 的合适数据存储位置,使用 Streamlit 缓存方法通过智能缓存优化数据加载,并尽可能减少读/写操作的数量。使用 Streamlit 会话状态是理想的选择。这也有利于提高应用程序的速度。下图显示了延迟数字的概览。有关设置 Firestore 的更多详细信息,请参见此处。

不同类型的访问的延迟数字。(图片来自作者)。

成本。

Firestore 提供免费套餐,其中包含一个(默认)数据库,无需付费。免费配额限制为每天 50K 次读取、20K 次写入、1GiB 空间和最多 20GiB 的出站数据传输。这就是数据加载和处理之间的明确分离。当您正确构建数据时,您可以加载一次数据并将其保存在缓存中。Streamlit 的缓存功能可帮助您避免重复执行读取操作和传输数据。但是,将整个数据集转储到 Streamlit 缓存中可能会导致超出其免费套餐限制。

准备发布您的应用了吗?请稍候。法律方面的问题。

您可能已经准备好发布产品了。在发布产品之前,您还需要考虑一些其他事项。我说的是法律方面。当您将应用推向生产、开放测试或封闭测试轨道时,您需要弄清楚您推出应用的国家/地区的法律方面。在商店(例如 Apple 的 App Store)中发布应用时,您可以选择在哪些国家/地区提供该应用。使用 Streamlit 时,它基本上对所有具有有效互联网连接的人开放(除非该国拒绝)。规则是,您托管或处理数据的国家/地区的法律也将适用。例如,如果您在欧洲托管,则适用通用数据保护条例 (GDPR)。这意味着用户应该能够根据需要从您的数据库中删除他们的数据,即使他们不在欧盟境内。此外,在欧盟境内,未经同意不得收集用户信息。没有选择加入这回事!因此,在使用 Streamlit 时,强烈建议在 Streamlit 配置文件中设置 gatherUsageStats = false。这应该可以防止数据发送到美国服务器(归 Snowflake 所有)。或者,您可以创建一个复选框,用户需要同意并同意收集用户信息。

SkyWalk。尝试一下吧!

欢迎使用SkyWalk。先注册,然后登录。更多文档可在此处找到。试用期过后,您需要订阅才能继续使用 SkyWalk。如果您发现任何错误或看到任何改进,请告诉我!

构建自己的应用程序是最棒的事情。它将帮助您在各个方面成长为一名经验丰富的开发人员。设定一个学习目标,您不会失望的。最好的想法是那些您最感兴趣的想法。就我而言,我创建了 SkyWalk,并以此为契机,向您展示了如何以高效的方式创建第一个版本。创建您自己的产品所需的所有要素都已具备,时机成熟时,可以轻松升级和升级各个部分。

感谢关注雲闪世界。(亚马逊aws和谷歌GCP服务协助解决云计算及产业相关解决方案)

 订阅频道(https://t.me/awsgoogvps_Host)
 TG交流群(t.me/awsgoogvpsHost)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyAR_稠密空间图

EasyAR稠密空间图 1.稠密空间图 EasyAR稠密空间地图利用RGB相机图像对周围环境进行三维稠密重建,得到稠密的点云地图和网格地图。利用稠密空间地图让虚拟物体更好的融入真实环境之中,用以实现真实物体和虚拟物体正确遮挡、碰撞等AR应用。 2.在Unity中的…

深度学习入门——卷积神经网络

本章的主题是卷积神经网络(Convolutional Neural Network,CNN)。CNN被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以CNN为基础。本章将详细介绍CNN的结构,并用Python实…

从 Pandas 到 Polars 三十九:Polars 和 Matplotlib

Polars 与 matplotlib 配合得很好。 在matplotlib中,你可以直接使用polars的数据进行绘制图形,而无需把polars的dataframe转为pandas的dataframe: import polars as pl import matplotlib.pyplot as plt# 创建一个polars DataFrame df_pl …

5 道互联网大厂面试遇到的场景题

1.外卖单子只能被一个骑手接单 这是一个典型的分布式锁问题。可以采用以下几种方案: 基于Redis的分布式锁: 使用Redis的SETNX命令尝试获取锁设置合理的锁超时时间,防止死锁使用Lua脚本保证原子性操作考虑Redis集群环境下的一致性问题 基于Zookeeper的分布式锁: 创建临时顺…

openEuler系统合并home分区到root分区

为了支持国产系统底座,不受美帝卡脖子,加入openEuler,想把业务全部移植到openEuler系统上。在使用默认安装的情况下,会把home分区单独分配一个出来,为了方便,还是想合并到/根目录上。怎么做呢?发…

2023年码蹄杯专科组第三场初赛 解题报告 | 珂学家

前言 题解 这是2023年第三场码蹄杯职业院校算法比赛,3D眩晕(字符串hash)挺有意思的。 这个系列赛,喜欢出典题。 3D眩晕 难度: 钻石 思路: 字符串hash 这题难在容错性上,就是允许有x次修改( x ≤ 3 x \le 3 x≤3)&…

NICE Seminar(2023-07-16)|演化算法的理论研究到底有什么用?(南京大学钱超教授)

模式定理(Schema Theorem) 模式定理(Schema Theorem)是遗传算法(Genetic Algorithm, GA)的重要理论基础,由约翰霍兰德(John Holland)在1975年提出。它描述了具有特定模式…

【机器学习】回归类算法-相关性分析

一、前言 前面的几篇博客我们学习了分类算法,今天我们来了解一下回归类的算法吧。首先我们来谈谈两者有什么区别,首先是我们在之前的分类算法,这类算法可以将让我们学会如何将不同的数据划分到不同的类里面,输出的是一些离散的值。…

新书速览|AI创意商业广告设计:Adobe Firefly + Photoshop

《AI创意商业广告设计:Adobe Fire.yPhotoshop》 本书内容 随着AI技术的出现,平面设计领域也出现了利用人工智能进行创作的程序,比如Firefly、Midjourney、 Stable Di.usion等。这些程序能够创作出高质量的设计作品。其中,Fire.y是由Adobe公司…

内网权限维持——创建影子账户

文章目录 一、RID简介二、修改RID进行权限维持 影子账户,顾名思义就是隐藏的用户,无法通过“计算机管理”或命令行查询,只能在注册表中找到其信息。下面的实验是在win 7上进行的。真正的影子账户其实是windwos RID 劫持。 一、RID简介 在wi…

线程池工具类 Executors源代码详解

​ 快捷导航 一、提供了什么功能?源码中的定义:此类支持以下几种方法: 二、源码中是怎么实现的?1、创建并返回一个配置了常用设置的ExecutorServicenewFixedThreadPool()newSingleThreadExecutor()newCachedThreadPool()newWorkS…

学习C#调用LazyCaptcha模块生成验证码的基本用法

LazyCaptcha是仿EasyCaptcha和SimpleCaptcha的.net开源图形验证码模块,其支持生成验证码及对应的静态图或动态图,还支持在图形中增加气泡、干扰线等噪音以提升图片自动识别难度。LazyCaptcha既能在B/S程序中使用(本文的原由即Admin.NET中使用…

【数据结构初阶】深度理解 “栈” (附源码)

hello,又见面了! 目录 1. 栈的概念与结构 2、栈的实现 Stack.h Stack.c test.c 3、习题 正文开始—— 1. 栈的概念与结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端…

小试牛刀-Telebot区块链游戏机器人(TS升级)

目录 1.编写目的 2.为什么使用TypeScript实现? 3.实现功能 3.1 AI图片生成 3.2 签到 3.3 邀请 3.4 WalletConnect连接 4.功能实现详解 4.1 AI图片生成 4.2 签到 4.3 邀请 4.4 WalletConnect连接 5.功能截图 ​6.问题整理 Welcome to Code Blocks blog 本篇文章主…

塑造美好心灵,激发创造活力|第三届瓷艺中华“陶溪川杯”儿童青少年陶瓷作品展开展

第三届瓷艺中华“陶溪川杯”儿童青少年陶瓷作品展 展览现场 由中央美术学院、景德镇陶瓷大学、景德镇陶文旅控股集团共同主办,由中国非物质文化遗产保护协会陶瓷分会、中国文化艺术发展促进会陶瓷专业委员会、中央美术学院陶瓷艺术研究院、中央美术学院少儿美术教…

无人机无刷电机技术详解及选型

1. 技术原理 无人机无刷电机(Brushless DC Motor, BLDC)是现代无人机动力系统的核心部件,其工作原理基于电磁感应和换向技术,实现了无需物理接触即可持续旋转的高效率动力输出。与传统有刷电机相比,无刷电机通过电子换…

你好! Git——如何进行多人协作

多人协作(5) 一、标签管理二、多人协作2.1 场景一(这种方式不常见)2.2 场景二(常见) 一、标签管理 标签 tag ,可以简单的理解为是对某次 commit 的⼀个标识,相当于起了⼀个别名。 …

【给嵌入式新人的几条建议(共勉):三-C语言基础怎么补?】

给嵌入式新人的几条建议(共勉):三-C语言基础怎么补? 前言1、先回答一个问题,对C语言的害怕到底在哪?(纠正认知)2、C语言基础,要补全部吗?No2.1 先看下自己属于…

深耕编程语言18年,对话 Rust、TypeScript、Nushell 核心贡献者 Sophia Turner | Open AGI Forum

作者 | Annie Xu 采访 | 卢威 责编 | Echo Tang 出品丨GOSIM 开源创新汇 编程语言的种类令人眼花缭乱,但成功的、常用的编程语言却是凤毛麟角。在深耕编程语言研发 18 年的 Sophia June Turner 看来,编程语言成功的关键在于其研发团队的透明度和机制建…