![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
软件开发
文章平均质量分 72
运维开发王义杰
我是一名使用go的运维开发工程师,我的博客是我与朋友们共享最新软件工程知识的门户。我致力于将我在软件开发领域的实践经验和心得分享给我大家。我的目标是通过我的博文,为朋友们的学习和成长提供支持,同时也从他们的反馈和问题中获得新的启发和成长
展开
-
软件开发:动态编译、即时编译、预编译与静态编译的对比与分析
动态编译是一种在程序运行时进行编译的技术。与静态编译不同,动态编译在程序执行时监控代码执行情况,根据需要将代码编译成机器码,以提高执行效率。即时编译是一种特殊的动态编译技术,在程序运行时将字节码(或中间代码)转换成机器码,以提高程序的执行效率。JIT编译通常在虚拟机中实现。预编译是在程序运行之前将源代码或中间代码编译成目标机器码的技术。预编译在程序运行之前完成所有的编译工作,生成可执行文件或库文件。静态编译是一种在程序执行之前将源代码完全编译成目标机器码的技术。原创 2024-07-22 22:19:09 · 1013 阅读 · 0 评论 -
GRPC: 理解Protocol Buffers和gRPC的基本概念和使用方法
Protocol Buffers(简称protobuf)是由Google开发的一种灵活、高效的结构化数据序列化方法。它类似于XML或JSON,但具备更小、更快、更简单的特点。protobuf主要用于定义数据的结构,然后生成用于解析和序列化数据的代码。这些代码可以用于各种编程语言,如Java、C++、Python、Go等。原创 2024-07-22 22:17:54 · 1012 阅读 · 0 评论 -
Python:使用标准库编写单元测试
单元测试是一种软件测试方法,通过对软件中的最小可测试部分(称为“单元”)进行验证,确保其行为符合预期。在Python中,一个单元通常是一个函数或一个方法。unittest是 Python 标准库中自带的单元测试框架,灵感来自于 Java 的 JUnit。测试用例(Test Case)测试套件(Test Suite)测试运行器(Test Runner)测试夹具(Test Fixture)本文介绍了如何使用 Python 标准库中的unittest模块编写单元测试。原创 2024-07-05 21:13:12 · 463 阅读 · 0 评论 -
AI: 从零开始训练一个最小化的Transformer聊天机器人
定义一个简单的Transformer模型。# 参数设置# 初始化模型本文介绍了如何从零开始构建一个最小化的Transformer聊天机器人。从数据准备、模型定义到训练和评估,每一步都尽量简化,以便于理解。希望这个例子能够帮助大家了解Transformer模型在聊天机器人中的基本应用。原创 2024-06-27 22:33:17 · 372 阅读 · 0 评论 -
Jupyter 笔记本的创新与意义
Jupyter 笔记本的出现和发展,极大地促进了数据科学和机器学习的进步。它通过提供一个多语言支持的交互式计算环境,简化了数据分析和可视化的过程,增强了协作能力,并在教学和科研中发挥了重要作用。用户可以通过 Jupyter 笔记本记录完整的分析流程,包括代码、数据和可视化结果,从而确保分析的可重现性。在数据科学和机器学习的领域中,Jupyter 笔记本因其强大的交互性和灵活性而备受欢迎。Jupyter 笔记本提供了强大的数据可视化支持,用户可以直接在笔记本中生成图表和图形,进行数据探索和分析。原创 2024-06-26 21:18:49 · 412 阅读 · 0 评论 -
Python: 制作可通过pip安装的zip格式的Python库
在Python开发过程中,将自己的库打包并通过pip进行安装是一项重要的技能。这篇文章将详细讲解如何制作一个zip格式的Python库,并确保它可以通过pip安装。我们将涵盖从代码准备到最终发布的每个步骤。原创 2024-06-19 21:00:59 · 345 阅读 · 0 评论 -
Protocol Buffers vs Swagger: 为什么Google选择设计Protocol Buffers?
Protocol Buffers(protobuf)是一种由Google开发的用于序列化结构化数据的灵活、高效的机制。它主要用于定义数据的结构,并生成用于解析和序列化数据的代码。protobuf使用紧凑的二进制格式,支持多种编程语言,包括C++、Java、Python、Go等。Swagger,也称为OpenAPI,是一种用于定义、生成和可视化RESTful API的框架。Swagger使用JSON或YAML格式来描述API的端点、请求和响应格式。原创 2024-06-16 12:50:41 · 643 阅读 · 0 评论 -
GRPC: Protocol Buffers 3 语法与使用探讨
Protocol Buffers是一种用于定义结构化数据的语言。它允许你定义数据结构,然后自动生成用于读写这些结构化数据的代码。与XML和JSON相比,Protobuf更加紧凑和高效,特别适合用于需要高性能和小数据量的场景,如网络通信和数据存储。原创 2024-06-16 12:49:34 · 814 阅读 · 0 评论 -
软件开发:了解LLVM,现代编译器基础设施的基石
LLVM的架构可以分为三个主要部分:前端、中间表示(IR)和后端。前端:前端负责将源代码转换为LLVM的中间表示。LLVM支持多种语言的前端,例如Clang(用于C/C++)、Swift、Rust等。中间表示(IR):LLVM的IR是一种强类型、低级别的指令集,设计用于优化和代码生成。IR是LLVM的核心,支持三种形式:文本、二进制和内存中的数据结构。后端:后端将IR转换为目标机器码。LLVM的后端支持多种架构,如X86、ARM、PowerPC等。原创 2024-06-15 19:04:49 · 365 阅读 · 0 评论 -
Python: PEP 440 版本号约定指南
PEP 440(Python Enhancement Proposal 440)为Python生态系统提供了一套标准的版本号命名规则。遵循PEP 440的版本号格式不仅能提高软件包的兼容性,还能确保版本控制和依赖管理的一致性。原创 2024-06-14 21:31:08 · 1066 阅读 · 0 评论 -
Git:git credential cache store 让我们的开发生活更便捷
Git Credential Cache 是 Git 提供的一种机制,用于临时缓存用户的凭证信息,以便在一定时间内免去重复输入用户名和密码的烦恼。与永久存储凭证的方式不同,Credential Cache 更加安全,因为它只会在指定时间内有效,减少了凭证泄露的风险。wincred功能: 直接利用 Windows 系统自带的 Credential Manager 来存储和管理 Git 凭证。配置命令特点: 简单直接,适合一般用户的需求。manager 或 manager-core功能。原创 2024-06-14 21:19:56 · 775 阅读 · 0 评论 -
软件设计:统一过程(RUP)的辉煌历史与现代应用探讨
统一过程(Rational Unified Process,RUP)是由Rational Software公司开发的一种软件开发过程框架,后来被IBM收购。RUP是一种软件开发过程框架,旨在为软件开发提供一种结构化的方法,广泛用于软件开发项目中。其主要特点是迭代和增量开发,通过在多个迭代中逐步构建软件系统,降低风险并提高质量。原创 2024-06-10 17:58:46 · 896 阅读 · 0 评论 -
Python: 类封装技巧, 以 Log 类为例
封装是面向对象编程(OOP)的四大基本原则之一。封装通过将数据和操作数据的方法包装在一个单独的单元中,即类中,来保护数据不被外部代码直接访问和修改。通过这种方式,我们可以隐藏类的内部实现细节,仅暴露必要的接口给外部使用者,从而提高代码的可维护性和重用性。通过以上示例,我们展示了如何在 Python 中使用类封装技巧实现一个功能强大的日志记录系统。封装不仅提高了代码的可维护性和重用性,还使得日志记录器的配置和使用更加灵活和简洁。在实际开发中,掌握这些技巧将帮助你写出更优雅和高效的代码。原创 2024-06-07 21:38:00 · 646 阅读 · 1 评论 -
Linux:编写 Shell 脚本时如何优雅地处理函数返回状态,多行文本和脚本路径
在 Shell 脚本中,正确处理函数返回状态、设计和使用main函数、利用 Heredoc 处理多行文本以及获取脚本所在位置是编写高质量脚本的重要技巧。通过掌握这些技巧,可以编写出更加灵活、可读和易于维护的 Shell 脚本。原创 2024-06-07 21:37:00 · 1032 阅读 · 0 评论 -
从RUP到敏捷:软件开发方法的演变
在20世纪90年代后期,Rational统一过程(RUP)迅速成为主导的软件开发过程。然而,到了2000年代初期,RUP逐渐被敏捷方法所取代。RUP在特定情况下应用得当时确实能非常有效,但在实际应用中,往往难以达到预期效果。本文将深入探讨RUP的兴衰历程以及敏捷方法的崛起。原创 2024-06-06 22:26:50 · 329 阅读 · 0 评论 -
软件设计:推荐ISO/IEC 25010:2023标准,软件质量框架与设计指南
ISO/IEC 25010:2023标准定义了软件质量的八个主要属性,每个属性进一步分解为多个子属性。这些属性帮助开发者全面评估和提升软件质量。功能适用性 (Functional Suitability):软件满足明确和隐含需求的能力。功能完整性 (Functional Completeness)功能正确性 (Functional Correctness)功能适当性 (Functional Appropriateness)性能效率 (Performance Efficiency)原创 2024-06-06 21:10:10 · 1475 阅读 · 0 评论 -
共识算法探讨:拜占庭容错算法
拜占庭将军问题描述了一组分布式系统中的节点如何在某些节点可能故障或恶意作出错误信息的情况下,达成一致性决定。问题的核心是如何在分布式系统中处理和解决这些恶意节点带来的不确定性。原创 2024-06-05 20:48:03 · 1061 阅读 · 0 评论 -
共识算法探讨:委托权益证明算法及其应用
委托权益证明(Delegated Proof of Stake,DPoS)是一种创新的区块链共识机制,旨在通过代表投票的方式提高区块链网络的效率和治理能力。委托权益证明算法作为一种重要的区块链共识机制,通过持币投票选举代表的方式,确保了网络的高效运行和去中心化治理。随着技术的发展和应用的扩展,DPoS在未来的区块链生态系统中将发挥更加重要的作用。TRON采用了与EOS类似的DPoS机制,网络中的持币者通过投票选出27个超级代表,这些超级代表负责区块的生成和网络的治理。这些代表会负责验证交易和生成新区块。原创 2024-06-05 20:38:11 · 1095 阅读 · 0 评论 -
共识算法探讨:权益证明算法及其应用
权益证明(Proof of Stake,PoS)算法是区块链领域的一种重要共识机制,与工作量证明(Proof of Work,PoW)相比,PoS以其能源效率高和运行成本低的优势受到广泛关注。权益证明算法作为一种重要的区块链共识机制,通过质押和随机选择验证者的方式,确保了网络的安全性和去中心化。Polkadot采用了一种称为Nominated Proof of Stake(NPoS)的机制,在NPoS中,持币者可以选择信任的验证者,并将其持有的加密货币委托给这些验证者。原创 2024-06-04 21:07:50 · 606 阅读 · 0 评论 -
共识算法探讨:工作量证明算法及其应用
尽管工作量证明在确保区块链网络安全性和去中心化方面具有显著优势,但其高能源消耗和效率低下的问题促使许多区块链项目开始探索新的共识机制,如权益证明(PoS)和授权权益证明(DPoS)等。PoW的主要目标是确保网络的安全性和去中心化,防止双重支付问题和其他潜在的攻击。工作量证明算法作为区块链技术的重要组成部分,通过计算难题的方式确保了网络的安全性和去中心化。随着技术的发展和新的共识机制的引入,未来的区块链网络将更加高效和环保。比特币网络中的每个矿工都通过不断尝试计算新的区块哈希值,来竞争添加新区块的权利。原创 2024-06-04 20:59:08 · 366 阅读 · 0 评论 -
MSVC 编译工具 cl.exe 入门指南
在 Windows 平台上开发 C++ 程序时,Microsoft Visual C++ (MSVC) 提供了强大的编译工具集,其中最核心的命令行编译工具是cl.exe。本文将详细介绍如何使用cl.exe手动编译和链接 C++ 程序,帮助开发者理解其基本用法和常见选项。通过本文的介绍,相信读者已经掌握了如何使用cl.exe手动编译和链接 C++ 程序的基本方法。cl.exe提供了丰富的选项以满足不同的编译需求,熟练掌握这些选项可以显著提高开发效率。原创 2024-06-02 23:04:02 · 1338 阅读 · 0 评论 -
MSVC+ VS code搭建C/C++开发环境
MSVC是一个功能强大的编译器,支持C++标准及其最新特性,同时提供许多微软特有的扩展。它具有高效的编译性能和优秀的优化能力,能够生成高质量的机器代码。此外,MSVC还集成了调试器、库和工具,极大地简化了开发过程。原创 2024-06-02 22:36:57 · 769 阅读 · 0 评论 -
Go: 实现支持名称注入的依赖管理
首先,我们需要定义一个接口及其不同的实现。例如,假设我们有一个用于处理数据的接口和两个不同的实现。// Processor 定义处理器接口// UpperCaseProcessor 实现Processor接口,将数据转换为大写// LowerCaseProcessor 实现Processor接口,将数据转换为小写通过以上步骤,我们实现了一个简单的名称注入机制,允许我们通过名称来注册和获取具体的实现。这种机制在许多场景下非常有用,例如插件系统、策略模式实现等。原创 2024-06-01 15:00:54 · 336 阅读 · 0 评论 -
Go: 使用 `github.com/google/wire` 实现和管理复杂的依赖注入
Google Wire是由Google开源的一个用于Go语言的依赖注入生成器。它通过读取注解和静态分析代码来自动生成依赖项的初始化代码,从而简化了手动管理依赖关系的过程。首先,我们需要定义依赖项。import ("fmt""net/http"// Database 定义数据库结构体DSN string// NewDatabase 创建一个新的数据库实例// Server 定义HTTP服务器结构体// NewServer 创建一个新的服务器实例。原创 2024-06-01 11:17:47 · 1059 阅读 · 0 评论 -
Go:依赖注入设计模式温故
依赖注入(Dependency Injection,DI)是一种软件设计模式,用于管理对象之间的依赖关系。在DI模式中,对象的依赖关系不再由对象本身创建,而是由外部容器负责创建和管理。这使得代码更加灵活和可维护,并易于测试。Go语言是一种静态类型语言,这使得DI的实现比在动态类型语言中更具挑战性。DI是一种强大的设计模式,可以提高代码的可测试性、灵活性和可维护性。但是,DI也有一些缺点,因此需要谨慎使用。这些只是一些简单的示例。DI模式可以用于更复杂的情况,例如具有多个依赖项的对象和层次结构的对象。原创 2024-06-01 11:11:50 · 426 阅读 · 0 评论 -
Go:开发命令行工具访问 Oracle 数据库
本文将介绍如何基于提供的 Go 语言代码,开发一个命令行工具,用于用户输入参数测试登录 Oracle 数据库并执行简单的 SQL 查询。该工具将采用提供的函数来实现数据库连接,并扩展其功能以支持命令行交互。我们将使用flag包来解析命令行参数。host: Oracle 数据库主机地址port: Oracle 数据库端口username: 用户名password: 密码serviceName: 服务名sql: 要执行的 SQL 查询import ("flag""fmt""log"原创 2024-05-31 21:11:52 · 245 阅读 · 0 评论 -
Go: Gin框架中的binding验证器使用指南
Gin是一个用Go语言编写的高性能Web框架,具有简单易用、速度快、灵活性高等特点。Gin通过中间件机制扩展功能,支持路由、参数解析、数据绑定和验证等功能,非常适合开发RESTful API。Gin的binding包提供了一组功能,用于将请求的数据自动绑定到结构体,并根据结构体标签进行数据验证。常用的标签有binding和validate,通过这些标签可以指定数据的类型和验证规则。原创 2024-05-30 22:04:25 · 1296 阅读 · 0 评论 -
Go:golang的未来潜在应用
Go语言,自2009年由Google发布以来,凭借其简洁的语法、强大的并发能力以及出色的性能,迅速在开发者中间获得了广泛的认可。Go语言因其高效的编译速度、较低的内存占用和强大的并发处理能力,使其在构建云计算平台和微服务架构时具有显著优势。Go语言在区块链开发中的应用也逐渐增多,特别是在一些高性能需求的区块链项目中,Go语言展现出了强大的竞争力。Go语言的标准库已经提供了丰富的网络支持,加上Gin、Beego等高性能Web框架,使得开发高效、稳定的Web应用变得轻而易举。物联网设备通常要求低功耗和高效能。原创 2024-05-29 23:37:55 · 1139 阅读 · 3 评论 -
Go: 基于前缀树的API路径权限校验方案及实现
在现代Web开发中,API路径的权限校验是确保系统安全性和数据隐私的重要手段。传统的权限校验方法可能效率较低,尤其是当API数量庞大且路径复杂时。前缀树(Trie)作为一种高效的字符串存储和查询数据结构,可以很好地解决这个问题。本文将介绍如何利用前缀树来实现基于API路径的权限校验。原创 2024-05-29 23:37:37 · 677 阅读 · 0 评论 -
Go:如何编写安全的代码
在现代软件开发中,安全性始终是一个至关重要的考虑因素。本文将介绍一些编写安全的Go代码的最佳实践,以帮助开发人员构建更加安全、可靠的应用程序。原创 2024-05-28 22:03:18 · 215 阅读 · 0 评论 -
Go: 使用依赖注入实现Gin框架路由处理函数的解耦
依赖注入是一种设计模式,旨在将对象的创建和它们的依赖关系从类内部抽离出来,通过外部注入的方式进行管理。依赖注入的主要目的是为了提高代码的可测试性和可维护性。在Go语言中,依赖注入可以通过构造函数注入、属性注入等方式实现。ID int// 模拟获取用户信息通过依赖注入,我们成功地将Gin框架的路由处理函数与具体的业务逻辑解耦。提高代码的可维护性:业务逻辑和路由处理函数的解耦使得修改其中一方时不需要修改另一方。增强代码的可测试性:可以轻松地为业务逻辑编写单元测试,而无需启动整个Gin应用。原创 2024-05-27 23:04:47 · 387 阅读 · 0 评论 -
软件设计: 为什么仅用结构化编程是不够的
每个账户有自己的余额(balance),并提供存款(deposit)和取款(withdraw)的方法,用户则可以登录(login)和登出(logout)。通过封装,OOP 将数据和操作封装在对象内部,减少了外部依赖,提高了模块的独立性。这种依赖关系过强的问题会导致系统的耦合度增加,使得修改一个模块时,可能需要连带修改其他模块,增加了维护成本。:在软件开发过程中,需求的变化是不可避免的。这种设计不仅实现了结构化编程中的模块化,同时利用OOP的封装特性,减少了模块之间的耦合,提高了系统的灵活性和可维护性。原创 2024-05-27 21:18:11 · 314 阅读 · 0 评论 -
Go:如何编写安全的代码
在现代软件开发中,安全性始终是一个至关重要的考虑因素。本文将介绍一些编写安全的Go代码的最佳实践,以帮助开发人员构建更加安全、可靠的应用程序。原创 2024-05-26 21:24:58 · 322 阅读 · 0 评论 -
Go: 深度解析指针与切片、映射的关系
在Go语言中,理解指针与切片、映射之间的关系是编写高效代码的关键。切片通过指针操作底层数组,映射使用指针高效地存储和访问数据。通过掌握这些知识,我们可以更好地管理内存,提高程序性能。原创 2024-05-26 21:05:18 · 291 阅读 · 0 评论 -
Go:软件开发中的抽象类型温故:简化抽象、泛化抽象与分层抽象
简化抽象、泛化抽象和分层抽象在软件开发中扮演着重要角色。简化抽象通过移除不必要的细节,简化了系统的使用和理解;泛化抽象通过识别和合并相似特性,提高了代码的通用性和复用性;分层抽象通过将系统分解为多个层次,每一层次只处理特定职责,从而实现系统复杂性管理。在Go语言开发中,利用接口、类型断言和分层架构可以有效地实现这些抽象,进而提高代码的质量和维护性。在实际开发过程中,选择合适的抽象方式至关重要。过度简化可能导致代码难以扩展,而过度泛化则可能导致系统过于复杂。原创 2024-05-26 21:04:51 · 829 阅读 · 0 评论 -
GitHub Copilot Workspace 和 Kubernetes:重新定义基础设施的设计理念
GitHub Copilot Workspace 是一种集成了 GitHub Copilot 的开发环境,旨在通过自然语言处理和人工智能技术,简化和自动化开发者从需求分析到代码编写、测试和部署的整个过程。开发者可以在其中利用自然语言进行头脑风暴、规划、编写、测试和运行代码,极大地提升了开发效率和代码质量。原创 2024-05-25 09:40:07 · 742 阅读 · 0 评论 -
探索 GitHub Copilot Workspace:开发者体验的未来
GitHub Copilot Workspace 是一种以 Copilot 为核心的开发环境,旨在从头到尾提供完整的开发支持。开发者可以在这个环境中利用自然语言来进行头脑风暴、规划、构建、测试和运行代码。Copilot Workspace 集成了多种由 Copilot 驱动的代理,从而使得每一个开发步骤都更加智能和高效,同时开发者也拥有对整个过程的完全控制。原创 2024-05-25 09:27:11 · 903 阅读 · 0 评论 -
Go:操作系统进程控制块详解
进程控制块是操作系统中管理进程的核心数据结构。在Go语言中,我们可以通过结构体模拟PCB的实现,从而更好地理解其工作原理和应用。原创 2024-05-24 21:37:36 · 459 阅读 · 0 评论 -
Go:计算机程序执行中的上下文切换深入解析
上下文切换是指操作系统将处理器从一个任务的执行状态切换到另一个任务的执行状态的过程。在这个过程中,操作系统需要保存当前任务的上下文(例如寄存器状态、程序计数器等),并加载下一个任务的上下文,以便继续执行。保存当前任务的上下文。加载下一个任务的上下文。切换处理器到下一个任务。原创 2024-05-24 21:23:21 · 937 阅读 · 0 评论 -
Go:深入探讨取程序调用栈帧,runtime 库中的 Frame
PC uintptr // 程序计数器Func *Func // 函数信息Function string // 函数名称File string // 文件名称Line int // 行号startLine int // 函数起始行号Entry uintptr // 函数入口地址funcInfo funcInfo // 函数的内部视图通过这些字段,Frame 结构体可以提供调用栈中每个帧的详细信息,包括函数名、文件名、行号等。原创 2024-05-23 22:25:04 · 233 阅读 · 0 评论