面对软件错误构建可靠的分布式系统_笔记04

软件工厂即分布式系统:构建高可用CI/CD的架构、挑战与实战 在软件工程领域,持续集成与持续交付(CI/CD)是现代研发效能的核心支柱,它通过自动化工具链将代码从提交到部署的流程标准化。其底层原理借鉴了分布式系统的设计思想,当各个CI/CD组件(如代码仓库、构建服务器、制品库)部署在不同网络节点并通过消息传递协作时,整个流水线便构成了一个分布式系统。这一架构带来了显著的技术价值:它提升了自动化水平、加快了交付频率,并增强了流程的可重复性。然而,它也引入了分布式系统的典型挑战,包括网络分区、部分故障、状态一致性与并发竞态等问题。在实际应用场景中,尤其是在微服务与云原生架 阅读详情

3.3.17 Erlang预处理程序epp

   预编译文件:complie:file(M,['p']) ,保存M.erl到M.P

3.3.18 宏

-define(Constant, Replacement).

-define(Func(Var1,Var2,...Var), Replacement).

代码中用?Constant, ?Func代替,即可替换

系统已经预定义宏:

?FILE:当前文件名

?MODULE:当前模块名

?LINE:当前行号

eg:

    -defin(macro1(X, Y), {a,X,Y}).

    foo(A) ->?macro1(A+10, b).

    被替换为

    foo(A) -> {a, A+10,b}.

3.3.19包含文件

    -include(filename). //一般为.hrl扩展文件名

    -include_lib(Name). //库文件

eg:

    -include_lib("kernel/include/file.hrl"). 

 

3.4并发编程concurrent

(1)创建进程spawn

    Pid = spawn(F).  //F为参数为0的函数,创建了对F求值的并行进程,通过Pid可以访问进程

(2)向进程发送消息

    Pid !Msg

(3)进程接收消息receive

    receive

        Msg1 [when Guard1] ->

            Expr_seq1;

        Msg2 [when Guard2] ->

            Expr_seq2;

        ....

        [after TimeOutTime ->         //超时处理

            Timeout_Expr_seq]

       end.

     

3.4.1注册进程名
给Pid起个名字,便于发送消息
    register(Name, Pid).
这样,
    Name ! Msg.   //即可发送消息
嵌入式系统中EEPROM与MCU的可靠数据存储方案 在嵌入式系统开发中,非易失性存储技术是确保设备长期稳定运行的关键。EEPROM作为一种经典的存储介质,通过SPI等接口与微控制器(MCU)通信,具有数据断电不丢失、可重复擦写等特性。其工作原理是通过浮栅晶体管存储电荷,结合特定的时序协议实现数据存取。这种技术方案在工业控制、智能家居等场景中尤为重要,能够可靠保存设备配置、用户偏好等关键数据。以M95M04 EEPROM与PIC18F86K90 MCU的组合为例,该方案支持400万次擦写和200年数据保持,通过SPI接口实现高效通信,并采用双备份存储和CRC校 阅读详情

相关推荐

Agent工程实战:构建高可靠非确定性系统的三大支柱

大语言模型驱动的智能体(Agent)本质上是高度非确定性的系统,其输出受温度参数、上下文长度与提示词微小变化等多重因素影响,无法沿用传统软件‘输入-状态-输出’的确定性验证范式。理解非确定性是Agent工程的起点,而生产即实验和闭环精炼则构成了应对该特性的核心方法论——通过将可观测性、实时评估与用户反馈深度嵌入生产环境,实现从功能交付向可靠性交付的跃迁。本文聚焦真实产线中已验证的工程实践,涵盖任务可靠性定义、七层防护架构、多智能体协同设计及LangGraph+LangSmith落地组合,为金融、电商、Saa

weixin_33796177的博客 577

Erlang 杂记2

转自:http://www.erlang-cn.com/536.html 如有侵犯,请来信oiken@qq.com 学习Erlang的时候在书的留白处随手记录了一些东西,还有一些记录在了demo的注释里面,今天又整理出来了一部分,分享一下. 上一次的地址:Erlang 需要注意的一些地方  Erlang属于面向消息的语言,面向消息的语言没有共享对象,进程间交互通

oiKen的博客 475

ROS构建农场:从云端流水线到机器人软件质量保障

在软件工程领域,持续集成与交付(CI/CD)是实现软件可重复构建和跨平台分发的核心技术。其核心原理是通过自动化流水线,在标准化、隔离的环境中完成代码编译、测试与打包,从而确保软件在不同配置下的一致性。这一技术对于机器人操作系统(ROS)这类依赖复杂、模块众多的分布式系统尤为关键,它能从根本上解决“在我机器上能运行”的经典难题。ROS构建农场正是这一理念的工程实践,它作为官方维护的云端CI/CD系统,通过容器化技术为每个软件包提供纯净的构建环境,并自动执行从依赖解析、多平台编译到生成Debian安装包的全流程

weixin_29597551的博客 299

[Erlang 0107] Erlang实现文本截断

抽时间处理一下之前积压的一些笔记.前段时间有网友 @稻草人 问字符串截断的问题"各位大侠 erlang截取字符串一般用哪个函数啊",有人支招用string:substr/3,紧接着他补充了一下"大侠们 一个字符串有汉字和字母组合我想截取 但是不管用什么方法每个汉字的长度都是3 字母是1 截取出来总是有乱码 还望高手们赐教",我们一步步看看这个问题.     在Eshell先看下什么情况

坚强2002@优快云 8493

Erlang启动参数学习

项目中脚本里大量使用erlang的启动参数配置,今天来学习一下关于erlang的启动参数

Nicer_feng's blog 2923

面向软件错误构建可靠的分布式系统

面向软件错误构建可靠的分布式系统 Making reliable distributed systems in the presence of software errors Joe Armstrong 译者: 段先德 Joe Armstrong的博士论文

Erlang优缺点

做了电商网站,就想学分布式,接触了Hadoop。喜欢上了分布式。后来听说了易语言,就发现自己对当前的语言方向没有了解。于是就查到了erlang。后来又因为开发环境问题,研究了eacms与vim ,然后又从erlang与golang语言的角度分析了语言的优劣和前景。 总的来说。Erlang是近30年前的东西。确实没有golang新。而且不具备一些散列反射等新编程理念的看法。而had...

aizhilian2040的博客 1346

从入门到实战:openEuler 系统管理与运维笔记(持续更新)

本文为openEuler系统管理与运维的实战笔记,从CentOS迁移者视角切入,详细介绍了openEuler的生态兼容性、内核优化及安全特性。内容涵盖系统安装规划、虚拟机部署、基础命令操作、文件系统管理以及用户权限配置等核心运维技能,旨在帮助读者快速上手并掌握这一企业级操作系统的日常管理。

weixin_29207149的博客 223

Erlang遇到的特殊问题,例子详解

1.apply    向一个模块的某个函数传递参数并调用次函数,与直接调用的区别在于,模块名和函数名可以动态计算    eg:apply(erlang,atom_to_list,[hello]). %用apply调用BIF    缺点:要尽量避免使用,因为编译器不能进行优化。 2.-AtomTag()    为模块属性,定义文件属性,Erlang模块属性分为预定义和用户定义属性,  

意向天下 1034

超详细 Git创建仓库及上传项目至Github操作(Windows系统)

文章目录前言一、Git下载及安装二、创建代码仓库1.配置身份2.创建本地仓库3.提交本地代码三、使用Git上传代码至Github1.创建ssh keys2.在Github中新建仓库3.关联本地仓库与Github仓库4.推送代码至Github仓库总结 前言 本文对于Windows系统上git的安装及基本使用方法进行简单介绍,并介绍如何使用git将仓库中的项目上传至个人的Github中去。内容参考《第一行代码》以及一些博客。 本文适合新手阅读哦~ 一、Git下载及安装 打开网站 git下载 下载安装包(直接

lijianyi0219的博客 2万+

【CQUT】从零开始龙芯杯-开始前的准备

不同级别的Cpu对于vivado综合的时间有较大影响,其中Cpu的单核、多核性能以及cache性能影响权重较高。因此,为了保证学习进度和效率,我们建议在Cpu不低于I5 12400的环境下进行学习。Vivado2023.2安装包约100GB,为了保证成功安装建议留出300GB硬盘空间。龙芯杯的许多资料被托管在gitee,你需要git指令将资料克隆到本地。指定用书:CPU设计实战 Loongarch版 作者:汪文祥、邢金璋。Cpu性能对比网站:https://www.cpu114.com/

weixin_73689971的博客 911

如何构建高可用分布式系统

如何构建高可用分布式系统

weixin_46619605的博客 956

gtsam 学习十(ISAM2 理论)

翻译自:iSAM2: Incremental Smoothing and Mapping Using the Bayes Tree 摘要 提出了一种新型的贝斯树处理稀疏矩阵,在转化为因子图,可以更好的求解平方根信息和映射问题。 文中提出了三个概念 使用概率密度项进行矩阵分解 介绍如何将矩阵分解转换为贝叶斯数和条件概率密度 基于贝叶斯树提供了一种新的系数非线性优化:ISAM2(进行重新排序和重新线性化,避免了批量更新) 问题描述 文章聚焦与如何用增量实时解决非线性问题, 利用增量即新的测量值实时更新估

weixin_37781153的博客 8409

从哲学到工程,聊聊构建高可用分布式系统

高可用是系统提供无故障服务的能力。有太多资料探讨如何构建高可用系统,但多是一些工程实践知识点的堆叠。这篇文章我们从更朴素的视角去透视分布式系统的高可用建设

系统工程实验室 1358

AD7768与STM32F439的硬件设计避坑指南:如何优化高精度ADC系统的电源与PCB布局

本文详细解析了AD7768与STM32F439在高精度ADC系统硬件设计中的关键问题与优化方案。从电源系统设计、PCB布局到基准电压选型,提供了实用的避坑指南和实测数据,帮助工程师提升系统性能至110dB动态范围。特别强调了SPI信号布线和电源滤波对ADC精度的重要影响。

sugar的博客 739

《无人驾驶车辆模型预测控制》(第二版)第四章详细学习——算法部分

根据代码进行的“MPC跟踪直线和圆算法”的详细推导学习记录。

Fengdf666的博客 5018

阅读笔记(十)分布式系统的8个谬论《Fallacies of Distributed Computing Explained》

一. 简介   《Fallacies of Distributed Computing Explained》是一篇经典的分布式计算相关文章,介绍了分布式领域几个常见的谬论。在做分布式开发的时候,一定要铭记于心以免出错。 ...

ty的博客 1300

深度学习-算法工程师岗位面试常见问题及解答

一、相关的问题 深度学习优化学习方法(一阶、二阶) 一阶方法:随机梯度下降(SGD)、动量(Momentum)、牛顿动量法(Nesterov动量)、AdaGrad(自适应梯度)、RMSProp(均方差传播)、Adam、Nadam。 二阶方法:牛顿法、拟牛顿法、共轭梯度法(CG)、BFGS、L-BFGS。 自适应优化算法有哪些?(Adagrad(累积梯度平方)、RMSProp(累积梯度平方的滑动平均)、Adam(带动量的RMSProp,即同时使用梯度的一、二阶矩))。 梯度下降陷入局部最优有什么解决

nobles007820的博客 2924

标题:深入掌握Postman进行分布式系统API测试:构建高弹性架构的全面指南

分布式系统由多个相互协作的节点组成,每个节点承担不同的功能。可扩展性:系统可以通过增加节点来提高处理能力。容错性:系统能够容忍部分节点的故障,继续提供服务。一致性:尽管数据分散在多个节点上,系统依然需要保证数据的一致性。分布式系统由多个相互协作的节点组成,每个节点承担不同的功能。可扩展性:分布式系统通过增加节点来提高处理能力,可以根据需求的增长动态扩展。容错性:分布式系统能够容忍部分节点的故障,继续提供服务,确保系统的高可用性。一致性。

weixin_65409651的博客 484

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MIT课程分布式系统学习04——PrimaryBackup Replication for Fault Tolerance

MIT课程分布式系统学习04——PrimaryBackup Replication for Fault Tolerance

weixin_47692652的博客 441

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

为什么你的构建总失败?深度解析Jenkins常见错误及恢复策略

快速解决Jenkins构建失败难题,深入剖析jenkins持续集成中常见的触发、配置与插件错误,提供精准恢复策略。涵盖实际开发场景,提升自动化效率,值得收藏。

PixelFlow的博客 1170

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Ubuntu 14.04 构建 RethinkDB 分片集群实战指南

分片集群是分布式数据库实现水平扩展与高可用的核心架构,其本质在于通过哈希分片(sharding)解耦数据归属,结合多副本(replication)保障容错能力。RethinkDB 采用基于 Murmur3 的 range-based 分片策略,以表为单位划分主分片,并依赖 Raft-like 协议协调节点状态,在无外部协调服务(如 ZooKeeper)前提下完成自动选举与故障恢复。该设计对系统时钟同步、TCP keepalive、文件系统调优及 ulimit 等底层配置高度敏感,尤其在 Ubuntu 14.

chuange6363的博客 409

架构设计内容分享(一百二十三):分布式系统 :架构理论

比如在我们设计的数据标注系统中,当标注员针对一份点云数据进行标注时,可能会出现成千上万个 Label,我们需要实时统计他的工作量,当前我们选择了在工程侧通用 Kafka 通道连接大数据技术体系,在大数据技术域中进行转换计算等工作,但是如果出现网络延迟、代码问题会出现实时流程丢失极少量数据的情况导致工作量的不准确,结合实际业务场景,工作量的实时指标仅做参考,最终决定结算流程的是项目完成后的最终统计数据。将系统划分为多个层次,每个层次负责特定的功能,有清晰的职责定义和边界划分,来提高系统的可维护性和可扩展性。

之乎者也·的博客 1115

架构设计系列之分布式系统 11,12,13,14,15,16,17,18

在当今互联网时代,分布式系统架构成为推动现代软件开发和服务部署的核心理念。分布式系统在解决单点故障、提高系统可扩展性和确保高可用性方面发挥着至关重要的作用。

weixin_39757802的博客 686

分布式系统的十大误区

   转载自:http://www.blogjava.net/kriswan/archive/2007/04/13/110307.html“基本上每个人,在第一次构建一个分布式应用时,多会做出下面十个假设。但是在长期的运作过程中,他们都会被证明是错误的,而且会引发大麻烦和令人痛苦的学习经历”。        1. 网络是可靠的。在面对网络时,它很难称得上是我们所谓的可靠——对于当今的互联网来说

小小顽童 716
上一篇: 面对软件错误构建可靠的分布式系统_笔记03
下一篇: 面对软件错误构建可靠的分布式系统_笔记05
cpusoft
博客等级 码龄22年 8粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值