首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

JavaScript 基础--- (正则表达式 / 事件监听与绑定)

正则表达式 创建正则表达式: 方法一: var reg = /pattern/; 方法二:var reg = new RegExp('pattern'); RegExp 对象的常用方法: 示例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var str = 'awddsafasei'; var reg = new RegExp('weiwel'); var reg = /weiwei/; //正则表达式中有两个方法 exec() :返回,符合条件的字符串 test(): alert(reg.exec(str)); alert(reg.test(str)); </script> </head> <body> </body> </html> 输出: 2.正则表达式所支持的常用通配符 3.正则表达式量词 4.正则表达式修饰符 案例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var str = 'awddsafasei'; var reg = /^a(\w){2,}i$/g; //正则表达式中有两个方法 exec() :返回,符合条件的字符串 test(): alert(reg.exec(str)); alert(reg.test(str)); </script> </head> <body> </body> </html> 输出: 事件绑定 HTML 事件: 示例:点击按钮,弹出警示框 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="button" id="button1" value="button1"/> </body> <script type="text/javascript"> document.getElementById("button1").onclick = fun; function fun(){ alert('hello'); } </script> </html> 输出:点击---弹出 事件监听 使用返回值改变 HTML 元素的默认行为(可以通过在绑定事件中加上 return false 来阻止其默认行为) 通用性的事件监听方法: 1.绑定 HTML 元素属性 <input type ="button" value="click" onclick="check(this)"/ > 2.绑定 DOM 对象属性 document.getElementById("btn1").onclick=test; 推荐尽量采用与浏览器无关的事件绑定方法,保证有更好的跨浏览器特性 标准DOM中的事件监听方法: 1.[object].addEventListener("事件类型","处理函数","冒泡事件或捕获事件") 2.[object].removeEventListener("事件类型","处理函数","冒泡事件或捕获事件") 案例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="text" id="username" value="" /> <div id="div1" style="width:100px;height: 50px;background: red;"> <input type="button" id="button1" value="button1"/> </div> </body> <script type="text/javascript"> var username = document.getElementById("username"); /*username.addEventListener("focus",function(){ alert('focus'); }) */ // 获取焦点弹出警示框 username.onblur = function(){ alert('blur'); } //焦点消失弹出警示框 var btn = document.getElementById("button1"); var div1 = document.getElementById("div1"); btn.addEventListener("click",btnclick); function btnclick(){ alert('button'); } div1.addEventListener("click",function(){ alert('div1'); },false); div1.addEventListener("mouseout",function(){ alert('mousedo'); }) //鼠标移入 div1 中就弹出警示框 </script> </html> 输出:点击、获取焦点,失去焦点,鼠标移入红色区域均弹出警示框 、 综合案例:注册验证 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="" method="post"> 用户名:<input type="text" id="username" onchange="checkUn()"/> <span id="unspan" style="color: red;"> </span><br /> 密码:<input type="text" id="password"/><br /> 手机号:<input type="text" id="phone" onchange="checkPhone()"/> <span id="phonespan" style="color: red;"> </span> <br /> 邮箱:<input type="text" id="email" onchange="checkEmail()"/> <span id="emailspan" style="color: red;"> </span> <br /> <input type="submit" value="提交"/> </form> </body> <script type="text/javascript"> //校验用户名 function checkUn(){ var reg = /(\w){4,}/ var username = document.getElementById("username").value; if(!reg.test(username)){ document.getElementById('unspan').innerHTML = '用户名最少四个字符'; }else{ document.getElementById('unspan').innerHTML = ''; } } function checkPhone(){ //15944556789 var reg = /^1[3578](\d){9}/; var phone = document.getElementById("phone").value; if(!reg.test(phone)){ document.getElementById('phonespan').innerHTML = '手机号格式不正确'; }else{ document.getElementById('phonespan').innerHTML = ''; } } function checkEmail(){ //weiwei234@163.com.cn var reg = /^[a-zA-Z_](\w){2,12}@[a-zA-Z0-9]{2,7}((\.)([a-zA-Z]){2,3}){1,2}$/; var email = document.getElementById("email").value; if(!reg.test(email)){ document.getElementById('emailspan').innerHTML = '邮箱格式不正确'; }else{ document.getElementById('emailspan').innerHTML = ''; } } </script> </html> 输出:

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

学习Java基础知识,打通面试关~十三锁机制

静态创建线程池 我们平常使用的大部分还是依靠java中自带的静态工厂产生的线程池。先了解下自带的线程池。 newFixedThreadPool(int numThreads) 该线程池会在初始化的指定线程数量。具有以下的特点1.在任何时刻都是最多有numThreads的线程数量活动。如果超过限制会在LinkedBlockingQueue中等待。 2.当达到核心线程数的时候,线程数不在继续增加。3.有工作线程退出,新的工作线程被创建来达到设置的线程数。 Executors.newFixedThreadPool(1); //源码实现 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } newCachedThreadPool 该线程池是一个可以用来缓存的线程池。1.尝试缓存使用过的线程。2.没有缓存的线程池时,就会使用工厂方法创建线程池,最大的容量理论上是Integer.MAX_VALUE。这个跟服务器的配置有关。所以如果过来大量的线程任务,那么该线程池会在瞬间创建多个线程来执行工作。3.时间上多余的线程超过60秒会被终止移除缓存中。4.内部使用的SynchronousQueue实现的队列,该队列在实现的时候没有容量。适合来做交换的工作。 Executors.newCachedThreadPool(); //源码实现 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } newSingleThreadExecutor 该线程池是用来设置单个的线程池,使用的队列是无界队列。因为提交的任务只要一个是能活动的,剩下的是放到无界队列中。队列是先进先出的。那么执行顺序是有序的。 Executors.newSingleThreadExecutor(); //源码 public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } newWorkStealingPool 工作线程,该线程是在jdk1.8以后新增加的.使用的是ForkJoinPool创建线程池。该任务执行没有顺序。需要考虑到硬件的cpu核心数。 Executors.newWorkStealingPool(); public static ExecutorService newWorkStealingPool() { return new ForkJoinPool (Runtime.getRuntime().availableProcessors(), //默认使用的是硬件的cpu数目 ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); } Executors.newWorkStealingPool(10); public static ExecutorService newWorkStealingPool(int parallelism) { return new ForkJoinPool (parallelism, // 使用的是自定义的核心数 ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); } newSingleThreadScheduledExecutor()与newScheduledThreadPool(int poolSize) 周期性的调度执行任务的线程池。 单个执行。 Executors.newSingleThreadScheduledExecutor(); public static ScheduledExecutorService newSingleThreadScheduledExecutor() { return new DelegatedScheduledExecutorService (new ScheduledThreadPoolExecutor(1)); } //核心周期执行的线程数 Executors.newScheduledThreadPool(10); public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); } 了解其java内部的静态线程池,并且在程序中使用其策略。当然在这种我们没有看到的是线程池的拒绝策略。无界队列和有界队列,核心数的与最大的核心数的设置,这些不同。那么我们的执行拒绝策略也是不同的。在接下里的文章我们会具体了解拒绝策略。 原文发布时间为:2018-07-09本文作者:mengrui本文来自云栖社区合作伙伴“LuckQI”,了解相关信息可以关注“LuckQI”。

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

十五道Python小案例,学会这些,Python基础已过关!

十五道Python的小案例,不知道各位都会了多少! 一、猜数字 1到4能组成多少个互不相同且不重复数字的三位数?分别是? 分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 程序源代码: 二、公司发放的奖金的计算 分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 程序源代码: 三、一个整数加上100后是一个完全平方数,再加168又是一个完全平方数,请问该数是多少? Python的学习 q-u n 二二七,四三五,四五零 ,是想转行还是想入行都可以来了解一起进步一起学习!内有开发工具,很多干货和技术资料分享!希望新手少走弯路 分析: 程序源代码: 四、输入*年*月*日,判断这一天是这一年的第几天? 分析:以3月5日为例,先把前两月的加起来,再加上5天就是本年的第几天,特殊情况下闰年且输入月份大于2时需考虑多加一天: 程序源代码: 以上实例输出结果为: 五、输入三个整数x,y,z,把这三个数由小到大输出 Python的学习 q-u n 二二七,四三五,四五零 ,是想转行还是想入行都可以来了解一起进步一起学习!内有开发工具,很多干货和技术资料分享!希望新手少走弯路 分析:我们把最小数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,再用x与z进行比较,当x>z则将x与z的值进行交换,这样能使x最小。 程序源代码: 六、斐波那契数列 分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。 在数学上,费波那契数列是以递归的方法来定义: 程序源代码: 方法一 方法二 以上实例输出了第10个斐波那契数列,结果为: 55 方法三 以上程序运行输出结果为: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 七、将一个列表的数据复制到另一个列表中 程序分析:使用列表[:] 程序源代码: 以上实例输出结果为: [1, 2, 3] 八、输出 9*9 乘法口诀表 分析:分行与列考虑,共9行9列,i控制行,j控制列。 源代码: 以上实例输出结果为: 九、暂停一秒输出 分析:使用 time 模块的 sleep() 函数 程序源代码: 以上实例输出结果为(会有停顿效果): 1 a 2 b 十、暂停一秒输出,并格式化当前时间 源代码: 以上实例输出结果为: 2015-10-21 17:48:40 2015-10-21 17:48:41 十一、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... 程序源代码: 以上实例输出结果为: 十二、判断101-200之间有多少个素数,并输出所有素数 分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 代码: 以上实例输出结果为: 十三、打印出所有的"水仙花数" 程序源代码: 以上实例输出结果为: 153 370 371 407 十四、将一个正整数分解质因数 程序源代码: 以上实例输出结果为: 90 = 2 * 3 * 3 * 5 100 = 2 * 2 * 5 * 5 十五、利用条件运算符的嵌套来完成学习成绩计算 学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 分析:(a>b)?a:b这是条件运算符的基本例子。 代码: 以上实例输出结果为: 输入分数: 89 89 属于 B

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

C++程序设计基础(4)宏定义和内联

1.知识点 1.1宏定义 (1)不带参数的宏定义 1 #define ERROR_MESSAGE -100 2 #define SECONDS_PER_DAY 60*60*60 (2)带参数宏定义,这种形式称为宏函数,但其实并不是函数 #define OUTPUTINT(x) cout<<"INT:"<<x<<endl #define OUTPUTCHAR cout<<"CHAR:"<<x<<endl 1.2内联函数 宏定义是在预处理阶段进行宏展开的,但是经常会出现一些意想不到的错误,故出现内联函数,内联函数既发挥了宏定义的优势,又弥补了其缺点。 内联函数是在定义时在函数最前面加上inline,或者将函数声明的同时进行定义(这种方式不推荐)。 下面是一个内联函数的例子: 1 class Rectangle { 2 public: 3 Rectangle(int, int); 4 int getSquare(); 5 int getGirth() { return 2 * (length, width); } //直接在声明时定义函数,形成内联函数 6 private: 7 int length; 8 int width; 9 }; 10 11 Rectangle::Rectangle(int l,int w):length(l),width(w){} 12 inline int Rectangle::getSquare() { //在函数定义时使用inline形成内联函数 13 return length * width; 14 } 2.面试题 2.1简述内联函数和宏定义的区别 相同点:二者都能够节省频繁的函数调用过程中所产生的时间和空间消耗,提高执行的效率;二者都是哦谈过将函数调用替换成完整的函数体,二者的实现也类似。 区别:(1)二者的根本区别在于宏定义仅仅是字符串的替换,并不是函数,而内联函数是函数。 (2)二者的代码展开发生在不同阶段,宏定义是在预处理阶段展开的,而内联函数是在编译阶段展开的。 (3)内联函数作为类的成员函数时,可以访问类的所有成员,包括公有、私有、保护成员,隐式使用this指针,而宏定义无法实现这些功能。 (4)内联函数可以完全替代宏定义,故尽量少使用宏定义。 (5)另外在使用内联函数时要注意代码膨胀问题,内联函数应该尽量简短(另外现在编译器一般都有优化功能,当检测到内联函数代码很长时,不会进行内联,即使使用了内联函数)。 2.2宏定义的宏展开错误 指出下面程序中宏定义的错误并修改 1 #define MAX(a,b) a>b?a:b 2 #define MUL(a,b) a*b 3 int main(int argc, char *argv[]) { 4 int x = 4, y = 2; 5 int max = MAX(x, y); 6 int product = MUL(x, y); 7 cout << "the max is " << max << endl; 8 cout << "the product is " << product << endl; 9 getchar(); 10 return 0; 11 } 知识点:宏定义自身缺陷主要是宏展开之后,由于运算符的优先级等原因,使得宏定义展开后的语义和预想的发生偏差。 以下时两个宏展开出错的例子 1 int product=MUL(x,y+3) 2 int max=MAX(x,y)+2 3 4 //本意是 5 int product=x*(y+3) 6 int max=(x>y?x:y)+2 7 //实际宏展开变成了 8 int product=x*y+3 9 int max=x>y?x:y+2 解决办法包括以下两点: (1)给参数自身加上括号 (2)给整个宏定义加上括号 其修改结果如下: #define MAX(a,b) ((a)>(b)?(a):(b)) #define MUL(a,b) ((a)*(b)) 2.3内联函数的常识性问题 下列关于内联函数描述错误的是 (A)内联函数可以被重载; (B)构造函数可以被定义成内联函数; (C)内联函数能够减少函数调用的开销; (D)内联函数应该在函数声明时使用inline关键字 答案:D,一定要在定义时使用inline,在声明时使用不会起到任何作用。

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

java基础巩固-浅析String源码及其不可变性

字符串可以说是广泛应用在日常编程中,jdk从1.0就提供了String类来创建和操作字符串。同时它也是不可改变类(基本类型的包装类都不可改变)的典型代表。 源码查看(基于1.8) public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; //这边只是引用并不是真正对象 ... } //首先string类创建的对象是不可变的(一个对象在创建完成后不能再改变它状态,说明是不可变的,并发程序最喜欢不可变量了), //里面最主要的成员为char类型的数组 几个构造方法 //空的构造方法 例如 String a = new String(); a为""空字符 public String() { this.value = new char[0]; } //带参构造方法 将源的hash和value赋给目标String public String(String original) { this.value = original.value; this.hash = original.hash; } 几个常用经典的String类方法 1.equals //如果引用指向的内存值都相等 直接返回true public boolean equals(Object anObject) { if (this == anObject) { return true; } //instanceof判断是否属于或子类 但Stringfinal修饰不可继承 只考虑是否为String类型 //上面说过String的成员为char数组,equals内则比较char类数组元素是否一一相等 if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; //长度不相等返回false if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; //从后往前单个字符判断,如果有不相等,返回false while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; } 2.subString(beginIndex,endIndex) subString这边存在一个小插曲 在jdk1.7以前,该方法存在内存泄漏问题。之所以存在是因为在此之前,String三个参数的构造方法是这么写的。成员变量为这三个,jdk7以后取消掉了offset和count加入了hash,虽然原来的构造方法简洁高效但存在gc问题。所以7以后放弃了性能采取了更为保守的写法。 /** The value is used for character storage. */ private final char value[]; /** The offset is the first index of the storage that is used. */ private final int offset; /** The count is the number of characters in the String. */ private final int count; ... public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > count) { throw new StringIndexOutOfBoundsException(endIndex); } if (beginIndex > endIndex) { throw new StringIndexOutOfBoundsException(endIndex - beginIndex); } //虽然这边返回的是新的String对象,但构造方法中还引用着原先的value return ((beginIndex == 0) && (endIndex == count)) ? this : new String(offset + beginIndex, endIndex - beginIndex, value); } ... String(int offset, int count, char value[]) { this.value = value; this.offset = offset; this.count = count; } //这边开始this.value = value; 出现问题,这三个个原来为String类中的三个私有成员变量,因为这种实现还在引用原先的字符串变量value[] 通过offset(起始位置)和count(字符所占个数)返回一个新的字符串,这样可能导致jvm认为最初被截取的字符串还被引用就不对其gc,如果这个原始字符串很大,就会占用着内存,出现内存泄漏等gc问题。 jdk1.7以后的写法变化 //虽然这边还是有offse和count参数 但不是成员变量了 private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 ... public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > value.length) { throw new StringIndexOutOfBoundsException(endIndex); } int subLen = endIndex - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return ((beginIndex == 0) && (endIndex == value.length)) ? this : new String(value, beginIndex, subLen);//构造函数参数顺序也有所变化 } ... public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count < 0) { throw new StringIndexOutOfBoundsException(count); } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } //新的不是引用之前的而是重新新建了一个。 this.value = Arrays.copyOfRange(value, offset, offset+count); } 3.hashcode public int hashCode() { int h = hash; //如果hash没有被计算过,并且字符串不为空,则进行hashCode计算 if (h == 0 && value.length > 0) { char val[] = value; //计算过程 //s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } //hash赋值 hash = h; } return h; } //String重写了Object类的hashcode方法,根据值来计算hashcode值,不过Object的该方法为native本地方法。 //该方法设计十分巧妙,它先从0判断字符大小,如果 //hashcode其实就是散列码 这种算法的话 同样的字符串的值一定相等 但不同的字符串其实也有可能得到同样的hashcode值 n=3 i=0 -> h = 31 * 0 + val[0] i=1 -> h = 31 * (31 * 0 + val[0]) + val[1] i=2 -> h = 31 * (31 * (31 * 0 + val[0]) + val[1]) + val[2] //以字符串 "123"为例 1的的ascil码为49 所以 "1".hashcode()的值为49,2为50... h = 31 * (31 * (31 * 0 + val[0]) + val[1]) + val[2] = 31 * (31 * 49 + 50) + 51 = 48690 详细算法参考这里 String的不可变性 //这边可能存在一个疑问 s对象是否发生了改变 String s = "hello"; s = "world"; //String不可变不是在原内存地址上修改数据,而是重新指向一个新对象,新地址,所以这里的hello对象并没有被改变。 //同样的类似replace方法源码中 public String replace(char oldChar, char newChar) { if (oldChar != newChar) { int len = value.length; int i = -1; char[] val = value; /* avoid getfield opcode */ while (++i < len) { if (val[i] == oldChar) { break; } } if (i < len) { char buf[] = new char[len]; for (int j = 0; j < i; j++) { buf[j] = val[j]; } while (i < len) { char c = val[i]; buf[i] = (c == oldChar) ? newChar : c; i++; } return new String(buf, true);//这边返回的是新的一个String对象 而不改变原来的对象 } } return this; //如果都一样 就指向同一个对象了 } String对象不可变 String对象为什么不可变 String用final修饰是为了防止被继承进而破坏,而让String对象不可变主要也是为了安全。 这里原来我有一个误区,仅仅认为说final修饰了String类,所以String对象不可变,想法很天真,,final修饰类的话主要是让类不可被继承,final修饰基本类型变量不能对基本类型对象重新赋值,但对于引用类型的变量(如数组),它保存的只是一个引用,final只需保证这个引用的地址不改变,即一直引用同一个对象即可,但是这个对象还是能改变的。 比如 final int[] arr = {1}; arr[0] = 3; //改变 arr = new int[]{3}; //因为这个是个新的数组 这样改变了数组的地址 编译不通过 除非去掉final //String类源码中的成员变量 (jdk1.8) /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 String.png 思考 1.String对象是否真的不可变 可以通过反射改变 String的成员变量为final修饰,就是初始化之后不可改变,但是这几个成员中value比较特殊,因为他是个引用变量而不是真正的对象,value[]是final修饰的,也就是说不能再指向其他数组对象,但是可以改变数组内部的结构来改变。 注:简单来说就是final修饰数组,指定数组所指向的内存空间固定,数组内部值还能改。因为数组是引用类型,内存地址是不可改变的。 实例代码 public static void testReflection() throws Exception { String s = "Hello,World"; System.out.println("s = " + s); //Hello World //获取String类中的value字段 Field valueOfString = String.class.getDeclaredField("value"); //改变value属性的访问权限 valueOfString.setAccessible(true); //获取s对象上的value属性的值 char[] value = (char[]) valueOfString.get(s); //改变value所引用的数组中的第5个字符 value[5] = '_'; System.out.println("s = " + s); //Hello_World } String为什么要设计成不可变 1.允许String对象缓存hashcode: Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中。字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存。 2.安全性 String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。 对于一个方法而言,参数是为该方法提供信息的,而不是让方法改变自己。 3.字符串常量池的需要 字符串常量池(String pool, String intern pool, String保留池) java堆内存放了一个特殊的区域用于常量池, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。

资源下载

更多资源
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文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册