首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

Source Map入门教程

部署前端之前,开发者通常会对代码进行打包压缩,这样可以减少代码大小,从而有效提高访问速度。然而,压缩代码的报错信息是很难Debug的,因为它的行号和列号已经失真。这时就需要Source Map来还原真实的出错位置了。 为啥变换代码? 前端代码越来越复杂的情况下,开发者通常会使用webpack、UglifyJS2等工具对代码进行打包变换,这样可以减少代码大小,有效提高访问速度。关于变换代码的原因,这里不妨引用一下大神阮一峰的JavaScript Source Map 详解: 压缩,减小体积。比如jQuery 1.9的源码,压缩前是252KB,压缩后是32KB。 多个文件合并,减少HTTP请求数。 其他语言编译成JavaScript。最常见的例子就是CoffeeScript。 如何变换代码? 下面是一个简单的“hello World”程序hello.js function sayHello() { var name = "Fundebug"; var greeting = "Hello, " + Name; console.log(greeting); } sayHello(); 使用UglifyJS2对源代码进行压缩变换: uglifyjs hello.js \ -m toplevel=true \ -c unused=true,collapse_vars=true \ -o hello.min.js 压缩后的代码hello.min.js function o(){var o="Hello, "+Name;console.log(o)}o(); 为啥需要Source Map? 使用Firefox执行hello.js的报错信息是这样: ReferenceError: Name is not defined sayHello file:///Users/fundebug/sourcemap-tutorial/hello.js:4:9 <匿名> file:///Users/fundebug/sourcemap-tutorial/hello.js:8:1 而hello.min.js的报错信息是这样: ReferenceError: Name is not defined o file:///Users/fundebug/sourcemap-tutorial/hello.min.js:1:18 <匿名> file:///Users/fundebug/sourcemap-tutorial/hello.min.js:1:59 对比压缩前后的出错信息,我们会发现,错误行号和列号已经失真,且函数名也经过了变换。而对于真实的前端项目,开发者会将数十个源文件压缩为一个文件,这时,错误的列号可能多达数千,且出错的真实文件名也是很难确定的,这样的话,压缩代码的报错信息是很难Debug的。 而Source Map则可以用于还原真实的出错位置,帮助开发者更快的Debug。 什么是Source Map? 使用UglifyJS2时指定source-map选项即可生成Source Map: uglifyjs hello.js \ -m toplevel=true \ -c unused=true,collapse_vars=true \ --source-map hello.min.js.map \ --source-map-include-sources \ --source-map-root \ -o hello.min.js 各种主流前端任务管理工具,打包工具都支持生成Source Map,具体可以查看生成Source Map - Fundebug文档。 生成的hello.min.js多了sourceMappingURL,表示Source Map文件的位置。 function o(){var o="Hello, "+Name;console.log(o)}o(); //# sourceMappingURL=hello.min.js.map 生成的Source Map为hello.min.js.map: { "version": 3, "sources": ["hello.js"], "names": ["sayHello", "greeting", "Name", "console", "log"], "mappings": "AAAA,QAASA,KAEL,GACIC,GAAW,UAAYC,IAC3BC,SAAQC,IAAIH,GAGhBD", "file": "hello.min.js", "sourceRoot": "", "sourcesContent": ["function sayHello()\n{\n var name = \"Fundebug\";\n var greeting = \"Hello, \" + Name;\n console.log(greeting);\n}\n\nsayHello();\n"] } 由hello.min.js.map可知,Source Map是一个JSON文件,而它包含了代码转换前后的位置信息。也就是说,给定一个转换之后的压缩代码的位置,就可以通过Source Map获取转换之前的代码位置,反过来也一样。Source Map各个属性的含义如下: version:Source Map的版本号。 sources:转换前的文件列表。 names:转换前的所有变量名和属性名。 mappings:记录位置信息的字符串,经过编码。 file:(可选)转换后的文件名。 sourceRoot:(可选)转换前的文件所在的目录。如果与转换前的文件在同一目录,该项为空。 sourcesContent:(可选)转换前的文件内容列表,与sources列表依次对应。 Source Map真正神奇之处在于mappings属性,它记录了位置是如何对应的。JavaScript Source Map 详解已经有很好的解释,这里不再赘述。 怎样使用Source Map? 主流浏览器均支持Source Map功能,不过Chrome与Firefox需要一些简单的配置,具体步骤请参考How to enable source maps。下面以MacBook上的Chrome浏览器为例,介绍一下配置方法: 1. 开启开发者工具 使用快捷键option + command + i;或者在菜单栏选择视图->开发者->开发者工具 2. 打开设置 使用快捷键fn + F1;或者点击右上角的三个点的图标,选择Settings 3. 开启Source Map 在Sources中,选中Enable JavaScript source maps 为了测试,我写了一个简单的HTML文件hello.min.html <head> <script type="text/javascript" src="hello.min.js"></script> </head> 使用Chrome打开hello.min.html,在控制台看到的错误如下: Uncaught ReferenceError: Name is not defined at o (hello.min.js:1) at hello.min.js:1 报错的文件仍然为hello.min.js,需要刷新一下Source Map才有作用: Uncaught ReferenceError: Name is not defined at o (hello.js:4) at hello.js:8 注意,Chrome的报错信息没有列号,因此4为错误的行号。Chrome不仅可以通过Source Map还原真实的出错位置,还可以根据Source Map的sourcesContent还原出错的源代码。点击出错位置,即可跳转到源码,这样Debug将非常方便。 参考链接 JavaScript Source Map 详解 Source Map Revision 3 Proposal How to enable source maps 关于Fundebug Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了6亿+错误事件,得到了Google、360、金山软件等众多知名用户的认可。欢迎免费试用! 版权声明 转载时请注明作者Fundebug以及本文地址:https://blog.fundebug.com/2017/03/13/sourcemap-tutorial/

优秀的个人博客,低调大师

python-面向对象入门

一、面向对象介绍 介绍面向对象之前,先来回顾一下以前学的面向过程的编程思想 面向过程编程: 核心是过程二字,过程指的是解决问题的步骤,即先干什么,再干什么后干什么,基于该思想编程就好比是在设计一条流水线,是一种机械化的思维方式 优点:复杂的问题流程化,进而简单化 缺点:可扩展性差 现在轮到面向对象的编程思想了! 面向对象编程,核心是对象二字,对象是特征与技能的结合体,基于该思想编写程序(脑子里始终想的是对象二字),就好比创造一个世界,在上帝眼里任何存在的事物都是对象,任何不存在的事物都可以造出来,是一种上帝式的思维方式 优点:可扩展性强 缺点:编程的复杂度要高于面向过程 二、类 对象是特征与技能的结合体,而类则是一系列对象相同的特征与技能的结合体 强调: 1.对象是具体存在的事物,而类则是一个抽象概念 2.站在不同的角度总结出的类与对象是不同的 在现实世界中,先有一个个具体存在的对象,然后随着人类文明的发展才总结出类的概念 在程序中,先定义类,后调用类来产生对象 类体中最常见的就是变量和函数的定义,但类体中可以存在任意的python代码。 定义类: class语句创建一个新的类的定义,后面跟着冒号“:” class Student: #相同的特征 school = 'superschool' #相同的技能 def choose_course(self): print('choosing course') 类体代码会在类定义阶段立即执行,会产生一个类名称空间,用来将类体代码都丢进去。 查看类的名称空间: print(Student.__dict__) 修改,添加,删除 Student.school = 'SUPPER' Student.country = 'China'del Student.country 总结类: 1.类本质上就是一个名称空间,或者说是一个用来存放变量和函数的容器 2.类的用途之一就是当做名称空间从其内部取出名字来使用 3.类的用途之二就是调用类来产生对象 对象: 调用类的过程称之为类的实例化,调用类的返回值称之为类的一个对象/实例 stu1 = Student() 为对象定制自己独有的特性: stu1.name='李铁蛋' stu1.age=18 stu1.sex='male' stu2.name='赵钢弹' stu2.age=38 stu2.sex='female' 大家也注意到了,这里存在了冗余代码,我们来优化一下 def init(obj,name,age,sex): obj.name = name obj.age = age obj.sex = sex 产生的对象通过每次调用函数能够更简便,还有没有更好的方法呢?答案肯定是有的 class Student: #相同的特征 school = 'oldboy' # stu1,'李铁蛋',18,'male' def __init__(obj, name, age, sex): obj.name = name #stu1.name='李铁蛋' obj.age = age #stu1.age=18 obj.sex = sex #stu1.sex='male' #相同的技能 def choose_course(self): print('choosing course') 调用类会先产生一个空对象stul,然后返回,触发类中的__init__的执行,将对象连同调用类括号里指定的参数一同传入 stu1=Student('李铁蛋',18,'male') #__init__(stu1,'李铁蛋',18,'male') stu2=Student('赵钢弹',38,'female') #__init__(stu2,'赵弹',38,'female') 总结__init__的功能:是在实例化时就为对象初始自己独有的属性,要注意的是不能有返回值,默认返回None 属性查找: 1.先从对象自己的名称空间中找,没有则去所属的类中找 2.类中定义的变量是所有对象共享的,对象可以用来用,类也可以来使用,类一旦改变自己的数据属性的值,所有对象都能感知到。 绑定方法: 类中定义的函数是是类的函数属性,类可以用,类调用就是一个普通函数,但其实类中定义的函数是给对象用的,而且是绑定给对象用的 1.类的函数:该传几个参数就传几个 2.绑定方法,指向类的函数:特殊之处是绑定给谁就由谁来调用,谁来调用就会当做第一个参数自动传入。 三、一切皆对象 在python3中统一了类与类型的概念 class Foo: pass print(Foo) obj=Foo() print(type(obj)) print(int) age=10 #age=int(10) print(type(age)) l1=[1,2,3] #l1=list([1,2,3]) # print(type(l1)) # l1.append(4) # print(l1) l1.append(4) # list.append(l1,4) print(l1) l1.append就相当于调用了list类中的append函数 面向对象后期继续补充,七夕刚好new个对象!焚膏油以继晷,恒兀兀以穷年。

优秀的个人博客,低调大师

zookeeper入门与Doubbo(一)

1.zookeeper的特性 一致性:数据一致性,数据按照顺序分批入库 原子性:事务要么成功,要么失败,不会局部化 单一视图:客户端连接集群中任一zk节点,数据都是一致的 可靠性:每次对zk的操作状态都会保存在服务器端 实时性:客户端可以读取到zk服务端的最新数据 2.JDK的安装 第一步:卸载自带的openjdk: rpm -qa | grep java rpm -e --nodeps java-XXXXXX 第二步:解压 第三步:配置环境变量 [root@localhost opt]# vim /etc/profile [root@localhost opt]# source /etc/profile 3.zookeeper的安装 zookeeper的目录结构: 配置文件: 运行zookeeper:在zookeeper下的bin下运行 4.zookeeper的数据类型 ①树型结构、 ②目录结构 5.zookeeper基本数据类型的操作 主要包括客户端连接,查看znode连接,关闭客户端连接(ctrl+c退出) 6.zookeeper的作用

优秀的个人博客,低调大师

python-函数入门(二)

一、函数对象 什么是函数? 函数是第一类对象,指的是函数名指向的值(函数)可以被当做数据去使用 1.函数的特性 1.函数可以被引用,即函数可以把值赋值给一个变量 def foo(): print('from foo') foo() func=foo #引用,赋值 func() print(foo) print(func) 2.函数可以当做参数传给另一个函数 def hi(): return "hi yasoob!" def doSomethingBeforeHi(func): print("I am doing some boring work before executing hi()") print(func()) doSomethingBeforeHi(hi) 3.可以当做一个函数的返回值 def func(): # func=函数的内地址 print('from func') # print(func) age=10 def bar(x): return x res=bar(age) print(res) res=bar(func) print(res) 4.可以当做容器类型的元素 容器对象(list、dict、set等)中可以存放任何对象,包括整数、字符串,函数也可以作存放到容器对象中 def func(): # func=函数的内地址 print('from func') age=10 l=[age,func,func()] print(l) 二、函数嵌套 函数的嵌套又分为两大类 1.函数的嵌套调用:在调用一个函数的过程中,其内部代码又调用了其他函数 def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): res1=max2(a,b) res2=max2(res1,c) res3=max2(res2,d) return res3 print(max4(1,2,3,4)) 2.函数的嵌套定义:一个函数内部又定义了另外一个函数 # from math import pi # # print(pi) # # def circle(radius,action=0): # """ # 圆形相关运算 # :param radius: 半径 # :param action: 0代表求面积,1代表求周长 # :return: 面积或者周长 # """ # def area(radius): # return pi * (radius ** 2) # # def perimiter(radius): # return 2 * pi * radius # # if action == 0: # res=area(radius) # elif action == 1: # res=perimiter(radius) # # return res # # print(circle(10,0)) # print(circle(10,1)) 三、名称空间与作用域 1.什么是名称空间: 名称空间就是用来存放名字与内存地址绑定关系的地方(内存空间),但凡要查找值一定要通过名字,访问名字必须去查找名称空间 2.名称空间的三大类 内置名称空间:存放的是python解释器自带的名字 例如:len()、man()等 全局名称空间:存放的是文件级别的名字(不是函数内,不是内置的) x、y、z、b、foo都是全局 m不是 x=1 y=2 if x=1: z=3 while Ture: b=4 def foo(): m=3 局部名称空间:在函数内部定义的 生命周期: 内置名称空间:在解释器启动时生效,关闭时则失效 全局名称空间:在解释器解释执行python文件时生效,文件执行完毕后则失效 局部名称空间:只在调用函数时临时产生该函数的局部名称空间 加载顺序:内置===》全局===》局部 查找名字的顺序: 基于当前所在位置往上查找,假设当前站在局部,查找顺序:局部==》全局==》内置 假设当前站在全局,查找顺序:全局=》内置 注:名字的查找顺序,在函数定义阶段就已经被固定死了(即在检测语法时就已经确定了名字的查找顺序),与函数调 用位置无关,无论在任何地方调用函数,都必须回到当初定义函数的位置去确定名字的查找关系 # x=111 # def outer(): # def inner(): # print('from inner',x) # x访问的时全局名称空间中x # return inner # # f=outer() # # print(f) # # x=222 # f() 3.作用域 作用域指的是作用的范围,分为两种,全局作用域和局部作用域 1.全局作用域:包含的是内置名称空间与全局名称空间中的名字 特点:全局有效,全局存活 2.局部作用域:包含的是局部名称空间中的名字 特点:局部有效,临时存活 补:global 和 nonlocal #global:在局部声明一个名字是来自于全局作用域的,可以用来在局部修改全局的不可变类型 # x=1 # def foo(): # global x # x=2 # # foo() # print(x) #nonlocal:声明一个名字是来自于当前层外一层作用域的,可以用来在局部修改外层函数的不可变类型 # x=0 # def f1(): # x=111 # def f2(): # nonlocal x # x=222 # f2() # print(x) # # f1() # print(x) 四、闭包函数 1.什么是闭包函数? 指的是定义一个函数内部的函数,该内部函数包含对外层函数作用域名字的引用 需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制。 def outter(): x=111 def inner(): print(x) return inner f=outter() #f=outter内的inner # x=22222 # f() def func(): x=3333 f() func() 2.为何要用闭包函数? 闭包函数提供了一种为函数体传值的解决方案 3.如何使用闭包函数 为函数传值的方式有两种,参数和闭包(目前所学) # 为函数体传值的方式一:参数 # def func(x,y): # print(x+y) # # func(1,2) # 为函数体传值的方式二:闭包 # def outter(x,y): # # x=1 # # y=2 # def func(): # print(x+y) # return func # # f=outter(1,2) # f() 闭包的概念有的晦涩难以理解,期待接下里的学习! 焚膏油以继晷,恒兀兀以穷年。

优秀的个人博客,低调大师

Java入门之继承(下)

Object类 Object类是所有类的父类 一个类没有使用extends关键字明确标识继承关系,则默认继承Object类 (包括数组) Java中的每个类都可以使用Object中定义的方法 可以在Java官方文档中查找Object类中的自带的方法 Object类官方文档 final关键字 final关键字修饰的类 , 表示该类不允许有子类,也就是说不允许被继承 final关键字修饰的方法, 不能修饰构造方法 该方法不允许被子类重写 可以正常被子类继承使用 final关键字修饰方法内部的变量(局部变量), 只要在具体被使用之前进行赋值即可 一旦赋值不允许被修改 final关键字修饰类当中成员属性时,只有在三个特定的位置可以对final修饰的成员属性进行赋值, 定义时直接初始化 构造方法中 构造代码块中 final关键字修饰引用类型的变量, 初始化之后不能再指向另一个对象,但对象的内容是可以改变的 可配合static使用 表示静态的不允许被修改的信息 /* * final eat()修饰方法 */ public final void eat(){ } public class Animal{ public final int age = 18; //final 修饰变量 并 赋值 } 注解 从JDK1.5版本引入的一个特性 可以声明在包、类、属性、方法、局部变量、方法参数等,的前面,用来对这些元素进行说明、解释。 注解可以按照两种不同的类别来进行区分: 按照运行机制来分 源码注解 :注解只在源码中存在,编译成.class文件注解就不存在了(例:@Override) 编译时注解 :注解在源码和.class文件中都存在 运行时注解 :在运行阶段还起作用,甚至会影响运行逻辑的注解(例:Spring注解:@Autowired) 按照来源区分 来自JDK的注解 :例:@Override 来自第三方的注解 :例:Spring注解:@Autowired 我们自己定义的注解 :自己编写的注解 @Override public void eat(){ // @Override 用来标识此方法是重写父类的一个方法 System.out.println(); }

优秀的个人博客,低调大师

python-函数入门(一)

1.什么是函数: 可重复使用的,用来实现单一,或相关联功能的代码段。 函数分为内置函数和自定义函数,这里先讲自定义函数 2.如何定义函数: #语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 注:函数必须先定义才能使用,定义阶段不执行代码只检测语法.意思就是语法错误在定义阶段就会检测出来,代码的逻辑错误只有在执行时才会提示. 3.定义函数的三种形式 无参:用于执行一些打印等操作,不需要参数传进去 有参:需要根据传进去的参数进行运算 空函数:用于设计代码结构 # 1.无参函数 # def foo(): # print('from foo') # foo() # # 2.有参函数 # def bar(): # print(x,y) # bar(1,2) # # 3,空函数 # def func(): # pass 4.函数调用 函数调用就是函数名加个()即可 4.1调用函数的三种形式: # 1.语句形式 # def foo(): # print('from foo') # foo() # # 2.表达式形式 # def foo(x,y): # res = x+y # return res # res = foo(1,2) # 3.可以当做参数传给另外一个函数 # def max2(x,y): # if x>y: # return x # else: # return y # res = max2(max2(1,2),3) # print(res) 4.2函数的返回值 1.返回值没有类型限制 2.返回值没有个数限制 注:返回多个值的结果就是返回一个元组,0个值返回为None return是函数结束的标准,可以有多个return但只执行一次 # def f1(): # print('111') # return 1 # print('222') # return 2 # print('333') # return 3 #def f1() #只执行 print('111') 4.3函数的参数 函数的参数分为形参和实参.形参即为变量名,实参为变量值,在函数调用时,把值绑定到变量名上,在函数调用结束后,解除绑定 形参与实参的具体分类(重点) 1.位置参数 1.1位置形参 在定义函数阶段按照从左到右的顺序定义的形参. 注:按位置定义的形参必须被传值,多一个不行,少一个也不行 # def foo(x,y) # print(x,y) # # foo(1,2) #正确 # foo(1,2,3) #错误 1.2位置实参 在调用函数阶段按照从左到右的顺序依次传入的值. 2.关键字参数 关键字实参:在调用函数阶段,按照key=value的形式指名道姓的为指定值传值 注:可以完全打乱顺序,仍可以为指定的形参传值 可以混合使用位置实参和关键字实参,但必须注意(1)位置实参必须放在关键字实参前面(2)不能对一个形参重复赋值 def foo(name,age): print(name,age) foo('zfj',18) foo(age=18,name='egon') # foo(name='zfj',18)#报错 # foo('zfj', age=18) 3.默认参数 指的是在定义阶段就已经为某个形参赋值了,该形参称之为有默认值的形参 注意:1.在定义阶段就已经被赋值,意味着在调用阶段就可以直接使用,默认参数 2.位置形参应该放到默认形参前面 3.默认参数的值,通常应该为不可变类型 def foo(x,y=2): print(x,y) foo(1)#1,2 foo(1,3)#1,3 4.可变长度参数 站在实参的角度,参数长度可变指的是在调用函数时,传入的实参的值个数不固定 4.1在形参中带“*”:会将调用函数时溢出的位置实参保存为元组的形式,然后赋值给*后的变量 def foo(x,y,*z): print(x,y,z) foo(1,2,3,4,5)#1 2 (3, 4, 5) 4.2在形参中带“**”:会将调用函数时溢出的关键字实参保存成字典的形式,然后赋值给**后的变量名 def foo(x,y,**z): print(x,y,z) foo(1,2,a=1,b=2)#1 2 {'a': 1, 'b': 2} 4.3在实参中带“*”:在传值前先被打散成位置实参,然后再进行赋值 def foo(x,y,*z): print(x,y,z) foo(1,*[2,3,4,5,6])#1 2 (3, 4, 5, 6) 4.4在实参中带“**”:在传值前先被打散成关键字实参,然后再进行赋值 def foo(x,y,z): print(x,y,z) foo(1,**{'y':2,'z':1})#1 2 1 5.命名关键字参数 放到*与**之间的参数称为命名关键字参数。函数的调用者可以传入任意不受限制的关键字参数 注意:命名关键字参数必须按照key = value的形式传值 补充: 在形参中带*与**的,*后的变量名应该为args,**后应该是kwargs # 当我们想要将传给一个函数的参数格式原封不动地转嫁给其内部的一个函数,应该使用下面这种格式 def bar(x,y,z): print(x,y,z) def wrapper(*args,**kwargs): bar(*args,**kwargs) wrapper(1,2,z=3) #虽然调用的是wrapper,但是要遵循的却是bar的参数标准 焚膏油以继晷,恒兀兀以穷年。

优秀的个人博客,低调大师

Java入门之继承(上)

继承 概念: 一种类与类之间的关系 使用已存在的类的定义作为基础建立新类 新类的定义可以增加新的数据或功能,也可以用父类的功能,但不能选择性地继承父类,需全部把父类的东西继承过来。 子类只能继承父类非私有成员 特点: 1.利于代码复用 2.缩短开发周期 语法: 1.使用extends实现继承 2.单一继承,只能有一个父类 /* * Dog 为子类 又名派生类 * Animal 为父类 又名 超类、基类 */ class Dog extends Animal{ } 方法重载要求: 1.同一个类中 2.方法名相同,参数列表不同(参数顺序 、个数 、类型) 3.方法返回值、访问修饰符 4.与方法的参数名无关 方法重写要求: 1.有继承关系的子类中 ,子类重写父类方法 2.方法名,参数类型、顺序、个数 都要与父类的方法相同 3.方法返回值类型与父类兼容就可以,允许发生改变 4.访问修饰符,访问范围需要大于等于父类的访问范围 5.与方法的参数名无关 访问修饰符 公有的 public (允许任意位置使用) 私有的 private (只允许在本类中使用) 受保护的 protected (允许在当前类、同包子类/非子类、跨包子类调用、跨包非子类不能允许) 默认 (允许在当前类 同包子类调用;跨包子类/非子类不允许调用) super关键字 super代表父类对象的引用,通过super访问父类的成员 父类的构造方法不允许被继承,不允许被重写,但是会影响子类实例化过程 继承后的初始化顺序(子类对象的实例化过程) 父类静态成员 → 子类静态成员 → 父类对象构造 → 子类对象构造 子类的构造的过程中必须调用其父类的构造方法 如果子类的构造方法中没有显示的标注,则系统默认调用父类的无参构造方法 如果子类的构造方法中既没有显示标注,且父类中没有无参的构造方法,则编译错误 使用super调用父类指定的构造方法,必须在子类构造方法的第一行 public Cat(String name, int age){ super(name, age); } this 和 super this : 当前类对象的引用 访问当前类的成员方法、成员属性 访问当前类的构造方法 不能在静态方法中使用 super 访问父类的成员方法、成员属性 访问父类的构造方法 不能在静态方法中使用 this和super不能同时使使用 在继承(下)中会学习更深入的知识,敬请期待,很快更新。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册