保护你的程序(转)

Spring Boot应用在Ubuntu上的生产级部署:从jar包到systemd守护 在Java服务端开发中,Spring Boot凭借其自动配置和内置容器特性,极大地简化了应用启动流程,但真正将应用部署到Linux服务器并实现稳定运行,仍需要一套系统化的工程实践。本文从部署思维切换出发,梳理了Ubuntu环境下从JDK安装、Maven构建、专用用户创建到目录规划的关键步骤,并着重讲解如何利用systemd托管Java进程,实现开机自启与崩溃自动拉起。同时深入探讨配置外置、环境变量注入、HikariCP连接池调优、Nginx反向代理与日志轮转等生产环节的细节。针对常见故障,文章给出了基于日志 阅读详情


我们知道windowsXP现在使用了在线激活的功能来实现保护正版的功能,它是通过你的硬件的一些标识生成一个原始数据(通常是一个字符串),然后把这个原始字符串通过inernet发送到ms网站的一个程序里,而这个程序接受到这个原始字符串后经过一些不为人知的算法处理后再发送给你的机器,我想或多或少是在你的机器上做了一些手脚,我们假设在你的硬盘生成一段密文。然后你的机器启动的时候就读取你的硬件标识并还生成那个原始数据,在本地还是经过那个不为人知的算法后得到一段密文,然后用刚刚生成的密文和在线激活的时候生成到你硬盘上的那段密文比较,如果相同,那你就能进入桌面,如果不同,那你就进不了桌面,而如果你机器更改了硬件配置,生成密文的原始数据就变了,所以密文就不同了,你就需要重新算号了。
当然了,我是把问题描述简单化了,winxp是把激活文件放在一个特殊文件里了,要不我们破解winxp和window 2003的时候也不替换那几个文件了,另外我还有意忽略了一些在线激活的细节。
我们可以把这个激活技术推广到我们自己的软件中去,毕竟我们程序员最不愿意看到的就是我们费了很久的时间,投入了很大的精力开发出的软件在被人们疯狂的拷贝使用,并且没有给你一点好处,尽管这是事实,我们还是要做一些措施的。
微软的用以确定硬件杂凑编码的10项硬件设备特征分别是:显示适配器、SCSI适配器、IDE适配器、网络适配器MAC地址、RAM容量范围(例如0至64兆或64至128兆)、处理器类型、处理器序列号、硬盘驱动器设备、硬盘驱动器卷序列号、CD-ROM/CD-RW/DVD-ROM。我们就不要这么复杂了,我们只要其中3个就行了。

一.获取硬件杂凑编码
把下面的代码复制到剪贴版里,并保存成一个.vbs文件,这个脚本文件用来获取你的机器的CPUID,硬盘的PNP DeviceID,和网卡MAC号,得到的这3个字符串都能代表你的机器特征,而3个字符串组合起来几乎是就是表示你的机器的一个全球唯一标识。按理说,无论你重装系统,还是格式化硬盘,得到的这个组合字符串是唯一不变的,我们可以用它作为我们生成软件安装序列号的原始数据,当然这个组合字符串是很长的,你可以把这个字符串进行摘要算法处理后作为原始数据,比说把把这个字符串进行MD5加密。
On Error Resume Next

strComputer = "."
strOut = ""
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!//" & strComputer & "/root/cimv2")

'获取网卡的MAC地址,因为一个机器可能有多个网络适配器,所以我们只获取AdapterType值为"Ethernet 802.3"的适配器MAC号,也就是AdapterTypeID=0的网络适配器,网卡号其实不是很保险,有的小网卡厂商生产的网卡可能会有重复的.
Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapter")
For Each objItem in colItems
    If objItem.AdapterTypeID = 0 Then strOut = strOut & "MAC Address: " & objItem.MACAddress &vbcrlf
Next
'获取CPU的序列号,这个号可不是全球唯一哦,有可能一批CPU使用一个序列号
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objItem in colItems
   strOut = strOut & "Processor ID: " & objItem.ProcessorId&vbcrlf
Next
'获取硬盘的PNP DeviceID,这个号和传说中的磁盘序列号差不多,应该是也是唯一的,大家都把这个值给偶发上来偶看看.
Set colDiskDrives = objWMIService.ExecQuery _   
    ("Select * from Win32_DiskDrive")
For each objDiskDrive in colDiskDrives
    strOut = strOut & "DiskDrives PNP DeviceID: " & vbTab &  objDiskDrive.PNPDeviceID&vbcrlf
Next
'建立一个IE对象,并利用它的功能巧妙的把输出字符串复制到剪贴版里.
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", strOut
objIE.Quit
Wscript.Echo strOut
以上是通过WSH脚本来获取硬件字符串的,我们让用户复制这个字符串,并通过你提供的在线算号的web程序里算号,当然你可以在算号前要求对方做一些事,比如说点击一下广告啦,照顾你一些money啦什么的。

CLI-Anything 技术原理拆解:提示词如何取代传统命令行引擎 命令行工具的开发长期以来依赖参数解析、命令分发、错误处理等硬编码引擎逻辑。随着大模型能力的增强,一种新的架构思路正在兴起:将传统引擎的职责压缩进自然语言提示词中,由模型在循环中自主完成意图理解、命令生成、执行结果分析与自我修正。这种设计并非取消引擎,而是将规则集合以更灵活的形式呈现,让命令行交互从固定分支转向智能决策。在实际工程中,这种模式适合快速搭建终端助手、处理模糊需求与一次性脚本编写,同时也面临确定性、安全性和上下文管理等挑战。理解提示词如何承担引擎职责,以及如何编写严谨的规则化提示词,是落地此类项目 阅读详情

相关推荐

Python地理空间库安装指南:从gdal到geopandas的完整流程

本文详细介绍了Python地理空间库的完整安装流程,包括gdal、rasterio和geopandas等核心库的安装与配置。通过Anaconda环境管理和conda-forge频道,帮助开发者高效解决依赖问题,确保地理空间数据处理环境的稳定运行。

weixin_29091105的博客 465

基于类Win32_NetworkAdapterConfiguration实现Windows的网络配置

示例代码:strComputer = "."Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")Set colNetAdapters = objWMIService.ExecQuery _    ("Select * from Win32_NetworkAdapterConfigurat

xutom2006的专栏 1万+

【Labview】对连续采集数据的一种采样方法

图1如图1,想要对这样一个连续信号进行数据点的采集,我根据网上收集到的方法,在此分享一下最终的结果。可以拓展结合文件的写入,完成对连续信号的采集和输出。 已知: 一个连续信号,如图1. 目标: 设定一定采集点个数、采集点时间间隔、和采集周期次数,得到这条连续信号的数据点,如图2. 图2 方法如下: 主要利用的是队列的方法。 在连续信号生成的时候,不断的写入队列,并且清除队列。 ...

李时珍食疗志的博客 1万+

C#判断是否存在已连接的真实网卡(NetConnectionStatus)

C#判断是否存在已连接的真实网卡 这个问题可以拆成两个小问题: 1、如何判断一个网卡是否为真实网卡(即物理网卡),因为可能还有虚拟网卡,比如装了某个虚拟机; 2、如何判断一个网卡有没有连接(连接不代表就能上Internet)。 注:这里的网卡确切地应该叫网络适配器(Network Adapter)。 用C#获取硬件信息最方便的莫过于WMI了,与网卡相关的信息就在W

6814

Ad hoc网络路由协议概述4——按需路由协议(2)AODV协议 (Ad-hoc on-demand distance vector algorithm protocol)

AODV协议的基本流程。

weixin_42982240的博客 7705

FDTD远场分析实战:从monitor数据到3D远场可视化的完整流程

本文详细介绍了FDTD远场分析的完整流程,从monitor采集的近场数据出发,通过近场-远场变换(NFFFT)生成3D远场可视化结果。文章重点解析了远场转换的物理原理、关键参数设置,并提供了构建稳健数据处理流水线及高级可视化(如3D辐射方向图)的实战脚本与技巧,适用于天线设计与光学器件分析。

weixin_29063035的博客 228

SystemParametersInfo调置壁纸、屏幕保护程序(转)

SystemParametersInfo调置壁纸、屏幕保护程序 应用SystemParametersInfo函数可以获取和设置数量众多的windows系统参数。这个小程序就是运用了SystemParametersInfo函数来设置桌面的墙纸,而且程序可以让我们选择多幅墙纸图片,程序会以一定的时间间隔自动改变墙纸。 我们先来看看SystemParametersInfo函数的定义和参数: 使用API函...

weixin_30768661的博客 622

中山大学_数据科学与计算机_预推免

前言 2019 年 9 月中旬是中山大学预推免时间,本人没能进到夏令营,但是最后在预推免上岸也算不幸中的万幸。 记忆不一定准确,但希望能帮到他人。 想看 流程 的可以直接看总结,正文部分有本人心路历程。 预推免 中山大学的预推免大致可以分为 报道,机试,面试 三大部分,而且尤其是面试,所有人加起来总时长 3 天,幸运的是,本人被安排在第一天的下午第一场,上午就是机试,报道,机试,面试,无缝衔接。 ...

一把健 5208

[转]用汇编编写屏幕保护程序

  屏幕保护程序是什么,相信大家都用过,但对于它的结构也许就不那么熟悉了。屏幕保护程序是一种特使的 .exe 文件,实际上它是一个标准的 PE 文件,除了有扩展名 .scr,当然这个扩展名也是用连接程序产生的 .exe 文件改名得到的。但在编程中,屏幕保护程序又有它的特殊的地方,说穿了就是它的编程规范。屏幕保护程序有以下特点:屏幕保护程序是Win32 API 支持一种特殊的应用程序并由系统自动激活

hoverlees的专栏 749

家庭宽带IPv6避坑指南:如何通过DHCPv6-PD获取公网地址(附OpenWRT配置)

本文详细解析了家庭宽带IPv6的地址分配机制,重点介绍了通过DHCPv6-PD获取公网地址的方法,并提供了OpenWRT路由器的具体配置步骤。从路由器通告(RA)标记位到前缀委派(PD)流程,帮助用户解决IPv6部署中的常见问题,实现稳定高效的IPv6网络连接。

backprop5master的博客 1206

Python 爬虫实战:豆瓣 / IMDB 电影数据抓取(评分 + 剧情 + 演员阵容结构化处理)

在数据为王的时代,电影数据是进行市场分析、推荐系统构建和学术研究的重要资源。豆瓣和 IMDB 作为国内外最具影响力的电影评分和资讯网站,包含了海量高质量的电影数据。本文将带领你从零开始,构建一个健壮的 Python 爬虫,用于抓取豆瓣和 IMDB 的电影信息,并将其中的非结构化数据(如剧情简介、演员列表)进行清洗和结构化处理,最终存储到便于分析的结构化文件(如 CSV)中。

yansideyucsdn的博客 956

用C#Builder编写屏幕保护程序 (转)

用C#Builder编写屏幕保护程序 (转)[@more@]作者:徐长友 C# Builder是Borland公司推出的又一款基于.NET的开发工具。我们下面就用它做个简单的屏幕保护程序。屏幕保护程序是以scr为扩展名的标准w...

ciya3282的博客 113

32位快速加法器设计

32位快速加法器设计

好好学习,天天向上 3290

深入浅出屏幕保护程序编程 (转)

深入浅出屏幕保护程序编程 (转)[@more@]深入浅出屏幕保护程序编程  作者:董晓 发布时间:2001/03/28 文章摘要:   现在V程序画面越来越精美,功能越来越强大,可以提供图象,动画,音频,视频等所有的多媒体功...

csd3176的博客 288

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

深度学习工具包 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")

在桌面上创建屏幕保护程序图标(转)

在桌面上创建屏幕保护程序图标(转)[@more@]   大家都知道,屏幕保护具有设置密码保护的功能,利用此功能,我们只需为屏幕保护设置适当的密码,此后当我们离开计算机之后屏幕保护就会自动激活,相应的密码保护就会生效,从而起到安...

cuiji1279的博客 202

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

用VB制作屏幕保护程序 (转)

用VB制作屏幕保护程序 (转)[@more@]用VB制作屏幕保护程序利用Visual Basic 制作屏幕保护程序非常容易。本文将详细给大家介绍制作屏幕保护程序的方法。 ---- 一. 基本编程思路 ---- 大家都知道屏幕保护...

csd3176的博客 187

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[转].net程序混淆、安全、保护、加密

原文链接:http://www.svnhost.cn/Article/Detail-173.shtml 反编译工具:.net 反编译工具reflector 工具.NET Reflector插件FileDisassembler 大家都知道.net开发的软件,无论WebForm项目还是WinForm项目,发布的时候都是编译成dll或者exe文件。但是我们经常会无论是出于学习还是...

weixin_30297281的博客 65

利用VB编写屏幕保护程序 (转)

利用VB编写屏幕保护程序 (转)[@more@]利用VB编写屏幕保护程序 http://www.tongyi.NET作者:刘明点击:628   熟悉windows操作系统的朋友一定对Windows的屏幕保护程序...

csd3176的博客 154

如何有效的保护JAVA程序 (转)

第一章 流行的加密方式简介关于JAVA程序的加密方式,一直以来都是以JAVA模糊处理(Obfuscator)为主。这方面的研究结果也颇多,既有模糊器(如现在大名鼎鼎的JODE),也有针对反编译器的"炸弹"(如针对反编译工具Mocha的 "炸弹" Crema和HoseMocha)。模糊器,从其字面上,我们就可以知道它是通过模糊处理JAVA代码,具体的说,就是更换变量名,函数名,甚至类名等方法使其

JofeeDong's Blog 1142

让应用程序禁止Windows屏幕保护 (转)

让应用程序禁止Windows屏幕保护 (转)[@more@]让应用程序禁止windows屏幕保护2000-03-21· 周新栋·计算机世界日报 如果在你的程序中需要一个很长的时间段来进行大量的数据处理,这段时间长得足以使...

csd3176的博客 146

从任务通知区启动屏幕保护程序 (转)

从任务通知区启动屏幕保护程序 (转)[@more@]  本文通过一个快速启动屏幕保护程序的小程序SSLaunch,来介绍应用程序如何向任务栏通知区加入图标、如何禁止多个win32实例以及屏幕保护程序的有关内容。   SSLaun...

congmi8078的博客 113

基于STM32F103的ID号对应用程序的保护方法(转)

由于现在市场激烈竞争、混乱的市场机制及已失去的市场道德,迫使在产品设计时,必需要考虑到对产品的保护,以防产品的技术被第三方所用。无论是从硬件方面来保护,还是从软件方面来保护,都无法保证产品100%的安全。由于嵌入式系统的特点就是软件、硬件相结合,才具有实际的意义,失去任何一个平台都是废品一堆,因此将系统的软件、硬件结合起来对产品进行加密保护,可靠性会大大地增加。STM32F103系列ARM处理...

u012816562的博客 941
上一篇: 用脚本获取网卡MAC,CPUID,硬盘序列号(转)
下一篇: ASP.NET 2.0中的登陆控件简介
devfan
博客等级 码龄22年 45粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值