首页 文章 精选 留言 我的

精选列表

搜索[流量结构],共10000篇文章
优秀的个人博客,低调大师

openStack 主机流量计运行状态 随笔记录

root@ruiy-controller:~# ifconfigeth0 Link encap:Ethernet HWaddr 0c:c4:7a:0d:97:2c inet addr:192.168.3.5 Bcast:192.168.3.255 Mask:255.255.255.0 inet6 addr: fe80::ec4:7aff:fe0d:972c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3566242 errors:0 dropped:0 overruns:0 frame:0 TX packets:2854582 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1110677818 (1.1 GB) TX bytes:805105769 (805.1 MB) Interrupt:16 Memory:dfc00000-dfc20000lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:22454891 errors:0 dropped:0 overruns:0 frame:0 TX packets:22454891 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:5845934619 (5.8 GB) TX bytes:5845934619 (5.8 GB)root@ruiy-controller:~# w22:25:49 up 5 days, 6:56, 1 user, load average: 0.06, 0.12, 0.15USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot pts/2 60.168.51.211 22:21 5.00s 0.11s 0.01s w root@ruiy-controller:~# cat /etc/hosts#127.0.0.1 localhost# The following lines are desirable for IPv6 capable hosts::1 localhost ip6-localhost ip6-loopbackff02::1 ip6-allnodesff02::2 ip6-allrouters#yrzl-cloud ploatform hosts conf by ruiy192.168.3.5 ruiy-controller192.168.3.6 ruiy-network192.168.3.7 ruiy-compute01root@ruiy-controller:~# ssh ruiy-compute01root@ruiy-compute01's password:Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.2.0-34-generic x86_64)* Documentation: https://help.ubuntu.com/ System information as of Tue Mar 29 18:11:49 CST 2016 System load: 2.85 Users logged in: 0 Usage of /: 4.9% of 1.22TB IP address for eth0: 192.168.3.7 Memory usage: 32% IP address for eth1: 192.168.3.9 Swap usage: 0% IP address for virbr0: 192.168.122.1 Processes: 340 Graph this data and manage this system at: https://landscape.canonical.com/3 packages can be updated.0 updates are security updates.Last login: Tue Mar 29 18:11:49 2016 from 192.168.3.5root@ruiy-compute01:~# w22:26:23 up 16 days, 17 min, 1 user, load average: 1.42, 1.68, 1.84USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot pts/17 192.168.3.5 22:26 0.00s 0.04s 0.00s w

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

shell 运算符、控制结构和函数

## shell运算符 - 原始 bash 不支持简单的数学运算符,但可以通过 `awk` 或 `expr` 实现,`expr` 命令常用,也可使用 `bc`(需安装) ``` val=`expr 2 + 2` # 运算符要和表达式间要有空格,不能是 expr 2+2,写在 (()) 中不受此限制 # 假设 a=10,b=20 `expr $a + $b` # 30 `expr $a - $b` # -10 `expr $a \* $b` # 200 `expr $a / $b` # 2 `expr $a % $b` # 取余 0 a=$b # 把b的值赋给a [ $a == $b ] # 数值比较 false [ $a != $b ] # true echo "2 + 3" | bc # 输出 5 echo "10 / 3" | bc # 输出: 3 除法默认只返回整数部分 echo "scale=4; 22 / 7" | bc # 输出: 3.1428 scale控制精度 # 进制转换,ibase:输入数字的进制,obase:输出数字的进制 echo "ibase=16; FF" | bc # 输出:255 ``` **条件表达式要放在方括号中,并且要有空格**,`[$a==$b]`是错误的 - 关系、布尔、逻辑运算符 ``` [ $a -eq $b ] # a==b equal [ $a -ne $b ] # a!=b not equal [ $a -ge $b ] # a≥b great equal [ $a -le $b ] # a≤b less equal [ $a -gt $b ] # a>b great than [ $a -lt $b ] # a<b less than [ ! false ] # ! 非运算 [ $a -lt $b -a $b -gt $a ] # -a 与运算 and [ $a -lt $b -o $b -gt $a ] # -o 或运算 or # 优先级:! > -a > -o [ $a -lt $b && $b -gt $a ] # && 逻辑的and [ $a -lt $b || $b -gt $a ] # || 逻辑的or ``` - 字符串运算符 ``` # a="abc", b="efg" [ $a = $b ] # a==b [ $a != $b ] # a!=b [ -z $a ] # 字符串长度为0返回true,a.size()==0 [ -n $a ] # 字符串长度不为0返回true,a.size()!=0 [ $a ] # 字符串不为空返回true a.isNotEmpty() ``` - 文件测试运算符 ``` [ -b $file ] # file是块设备文件返回true [ -c $file ] # file是字符设备文件返回true [ -d $file ] # file是目录返回true [ -f $file ] # file是普通文件返回true(既不是目录也不是设备文件) [ -g $file ] # file设置了SGID位返回true [ -k $file ] # file设置了粘着位(Sticky Bit)返回true [ -p $file ] # file是有名管道返回true [ -u $file ] # file设置了SUID位返回true [ -r $file ] # file可读返回true [ -w $file ] # file可写返回true [ -x $file ] # file可执行返回true [ -s $file ] # file为不为空返回true(文件大小大于0) [ -e $file ] # file存在返回true(包括目录) [ -S $file ] # file是socket文件返回true [ -L $file ] # file存在并且是一个符号连接返回true [ -t $fd ] # 检查文件描述符 fd 是否连接到一个终端 [ -v $var ] # 检查变量 var 是否设置(Bash 4.2+) ``` - `echo` 命令(会自动换行) - 显示普通字符:`echo "It is a test"`,可省略双引号 `echo It is a test` - 显示转义字符:`echo "\"It is a test\""` - 显示变量:`echo "$var_name It is a test"` - 显示换行:`echo -e "OK! \n It is a test" # -e 开启转义` - 显示不换行:`echo -n "OK! \n It is a test" # -n 不换行` - 显示结果定向至文件:`echo "It is a test" > myfile` - 显示命令执行结果:`echo `date`` - `printf` 命令(不自动换行):`printf format-string [args...]` ``` printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 ``` > `%-10s`:字符串,宽度为10个字符,`-`表示左对齐,没有则右对齐 > `%d`:十进制整数 > `%-4.2f`:浮点数,`.2` 表示保留两位小数 > `%c`:字符 > `%x`:十六进制数 > `%o`:八进制数 > `%b`:二进制数 > `%e`:科学计数法表示的浮点数 - `test` 命令:用于检查某个条件是否成立,对数值、字符和文件进行检测 ``` a=100 b=200 if test $[a] -eq $[b] then echo '两数相等!' else echo '两数不相等!' fi # 输出:两数不相等! []执行基本的算数运算:res=$[a+b] res为300 ``` ## 控制流 ### if 语句 - 一个条件后就要跟一个 `then`,以 `fi` 结束(`if` 的倒序) - 条件写在 `[]` 中用 `-gt,-lt,-eq`,例如:`[ $a -gt $b ]` - 条件写在 `(())` 中可直接用 `>, $b ))` ``` # 多行写法 if condition; then command1 else commandN fi # 一行写法 if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo 'true'; fi if [ $a -gt $b ] then echo 'a > b' elif [ $a -eq $b ] then echo 'a = b' else echo 'a , =~` 等运算符,数值使用 `-eq, -ne` 等,逻辑运算:`-a, -o, !` - `if [[ ... ]]`:Bash/Zsh 的增强测试(推荐在 Bash 中使用),是 Bash 内置语法,不是命令,更安全、功能更强。支持: - 通配符匹配:`==` 可用于模式匹配,如 `if [[ $var == file*.txt ]]; if [[ $var == $pattern ]]`,`file*.txt, $pattern` 不能加双引号,会阻止通配符展开 - 正则表达式:`[[ $str =~ ^[0-9]+$ ]]` - 逻辑运算符:`&&`、`||`、`!` - 无需对变量加双引号(但仍建议加) - 不会因分词或路径展开出错 - 不兼容 POSIX(`/bin/sh` 在 Debian/Ubuntu 下是 dash,不支持) - 对于字符串的比较使用 `==/=, !=, >, `、`>=`、`&&`、`||`、`!`、位运算等 - 表达式结果非 0 → true;结果为 0 → false - 仅适用于 Bash、Zsh 等,非 POSIX - `if command; then`:以命令的退出状态作为条件 - **任何命令都可以作为条件!** - `if command`:命令成功(exit 0) - `if ! command`:命令失败(exit ≠ 0) - `if command1 && command2`:两个都成功 - `if command1 || command2`:至少一个成功 - 这是 `if` 最本质的用法,其他 `[ ]`、`[[ ]]`、`(( ))` 都是特例。 ### for 循环 ``` # 多行写法 for var in item1 item2 ... itemN do command1 command2 ... done # 一行写法 for var in item1 item2 ... itemN; do command1; command2; ...; done ``` ### while、until 循环 ``` while [until] [ $a -gt $b ] # : 冒号用于无限循环,也可使用 true,for (( ; ; )) do command done while read FILM # read 读取键盘信息,按结束 do echo "FILM = $FILM" done ``` ### case 语句 - 每个 `case` 分支以 `)` 开始,用 `;;` 表示 break,执行结束,`esac` 作为结束标记(`case` 的倒序) ``` case $var in var1|var2|var3|...) command1 ... ;; varN) command2 ... ;; *) # 以上未匹配时捕获 command3 ... ;; esac ``` - 跳出循环 - `break`:跳出所有循环(终止执行后面的所有循环) - `continue`:跳出当前循环 ### shell 函数 ``` # 函数定义 # 通过 $1 $2 ... $n 获取参数,当 n>=10 时,需使用 ${n} 获取参数 [ function ] fun (){ action; [return int;] } # 函数调用 只需用函数名 fun fun arg1 agr2 ... agrN ``` - `function`关键字是可选的 - 不加`return`则以最后一条命令的运行结果作为返回值 - 显示加`return`返回值只能是数值,介于(0-255) - 如果`return`值超出255,直接使用`echo`输出而不是用`return` - 函数返回值在调用函数后通过`$?`来获得 - 函数必须在使用前定义,一般放于脚本开始部分 欢迎大家关注【扶锐随笔】

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

Transformer Debugger —— Transformer 内部结构分析工具

Transformer Debugger 是 OpenAI 的 Superalignment 团队开发的一款工具,旨在支持对小语言模型的特定行为进行研究。 TDB 可以在编写代码之前进行快速探索,能够干预前向传递并查看它对特定行为的影响。它可以用来回答诸如 "为什么模型会输出 token A 而不是 token B" 或 "为什么 attention head H 会关注 token T" 之类的问题。它通过识别对行为有贡献的特定组件(neurons、attention heads、autoencoder latents),显示自动生成的关于导致这些组件激活最强烈的原因的解释,以及追踪组件之间的连接以帮助发现联系。 本次开源发布的内容包括: Neuron viewer:一个 React 应用程序,托管 TDB 以及包含有关各个模型组件(MLPneurons、attention heads and autoencoder latents for both)信息的页面。 Activation server:对主题模型进行推理,为 TDB 提供数据的后端服务器。它还从公共 Azure 存储桶读取数据并提供数据。 Models:一个用于 GPT-2 模型及其自动编码器的简单推理库,带有用于捕获激活的 hook。 Collated activation datasets:MLP neurons、attention heads 和 autoencoder latents 的顶级激活数据集示例。 设置 按照以下步骤安装存储库。首先需要 python/pip 以及 node/npm。 虽然可选,但官方建议用户使用虚拟环境或等效环境: # If you're already in a venv, deactivate it. deactivate # Create a new venv. python -m venv ~/.virtualenvs/transformer-debugger # Activate the new venv. source ~/.virtualenvs/transformer-debugger/bin/activate 设置环境后,按照以下步骤操作: git clone git@github.com:openai/transformer-debugger.git cd transformer-debugger # Install neuron_explainer pip install -e . # Set up the pre-commit hooks. pre-commit install # Install neuron_viewer. cd neuron_viewer npm install cd .. 要运行 TDB 应用程序,需要按照说明设置激活服务器后端和神经元查看器前端。 Making changes 要验证更改: 运行pytest 运行mypy --config=mypy.ini . 运行激活服务器和神经元查看器并确认 TDB 和神经元查看器页面等基本功能仍然有效

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

源码详解数据结构Linked List

摘要:java.util.LinkedList 是 Java 集合框架中的成员之一,底层是基于双向链表实现,集合容量可动态变化的。 本文分享自华为云社区《LinkedList 源码分析》,作者: 陈皮的JavaLib。 LinkedList 简介 java.util.Linked List 是 Java 集合框架中的成员之一,底层是基于双向链表实现,集合容量可动态变化的。它继承自 Abstract Sequential List 抽象类,实现了 List 接口。同时还实现了 Cloneable 和 Serializable 三个标记接口,说明 Array List 是可克隆复制的,可序列化的。 Array List 数组列表底层是基于动态数组实现的,所以优点是能支持快速随机访问,但是增删操作可能会比较慢(因为可能需要进行数组扩容,数据拷贝)。而且数组需要先申请一定的内存空间,可能会造成浪费。而链表列表 LinkedList 的优点是增删操作速度比较快,而且列表存储多少元素就动态申请多少节点来存储,比较节省内存空间。 为何要使用双向链表呢,主要在于遍历效率比单向链表高。例如当我们需要查找指定下标的节点,在指定下标进行增删改操作时,先判断这个位置是靠近头部还是尾部,从而决定从头部还是从尾部开始查找,提高效率。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { } 2 LinkedList 源码分析 2.1 内部变量 LinkedList 的元素是存储在节点对象中的,节点类是 LinkedList 类的一个内部私有静态类,源码如下所示: private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } } LinkedList 中定义了3个变量,一个代表当前列表的元素个数,另外两个变量指向链表的头部和尾部。以及它的父类 AbstractList 中的 modCount 变量,每次对链表的增删改操作都会使它加1。 transient int size = 0; transient Node<E> first; transient Node<E> last; protected transient int modCount = 0; 2.2 构造函数 ArrayList 有2个构造函数,一个无参构造函数,另一个使用指定 Collection 集合来构造集合的构造函数。 无参构造函数,什么都没有操作。 public LinkedList() {} 使用指定 Collection 集合来构造链表,如果 Collection 不能为 null ,否则会抛出 npe 。 public LinkedList(Collection<? extends E> c) { this(); addAll(c); } public boolean addAll(Collection<? extends E> c) { return addAll(size, c); } public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (numNew == 0) return false; Node<E> pred, succ; if (index == size) { succ = null; pred = last; } else { succ = node(index); pred = succ.prev; } for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; Node<E> newNode = new Node<>(pred, e, null); if (pred == null) first = newNode; else pred.next = newNode; pred = newNode; } if (succ == null) { last = pred; } else { pred.next = succ; succ.prev = pred; } size += numNew; modCount++; return true; } 2.3 常用方法 public E getFirst() 获取链表的第一个元素,如果不存在第一个节点,抛出异常。 public E getFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return f.item; } public E getLast() 获取链表的最后一个元素,如果链表为空,则抛出异常。 public E getLast() { final Node<E> l = last; if (l == null) throw new NoSuchElementException(); return l.item; } public E removeFirst() 删除第一个元素,如果链表为空,则抛出异常。 public E removeFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return unlinkFirst(f); } public E removeLast() 删除最后一个元素,如果链表为空,则抛出异常。 public E removeLast() { final Node<E> l = last; if (l == null) throw new NoSuchElementException(); return unlinkLast(l); } public void clear() 情况链表,遍历每一个节点,将每一个节点的内部引用都置为 null ,便于进行垃圾回收。 public void clear() { for (Node<E> x = first; x != null; ) { Node<E> next = x.next; x.item = null; x.next = null; x.prev = null; x = next; } first = last = null; size = 0; modCount++; } public boolean add(E e) 在链表尾部添加一个元素。 public boolean add(E e) { linkLast(e); return true; } public Iterator iterator() 获取 list 的迭代器,用于遍历集合中的元素。 public Iterator<E> iterator() { return new Itr(); } public int size():返回集合元素个数。 public boolean contains(Object o):是否包含某个元素。 public boolean remove(Object o):删除某个元素。 public E get(int index):获取指定下标的元素。 public E set(int index, E element):在指定下标修改元素值。 public void add(int index, E element):在指定下标添加元素。 3 常见面试题分析 3.1 LinkedList 是线程安全的吗? 我们通过分析源码可知,对它的任何操作都是没有加锁的,所以在多线程场景下,它是线程不安全的。它适合在非多线程使用场景下,并且增删操作比较多的情况。 public static void main(String[] args) throws InterruptedException { LinkedList<String> list = new LinkedList<>(); Thread thread1 = new Thread(() -> { for (int i = 0; i < 1000; i++) { list.add(Thread.currentThread().getName() + i); } }, "Thread01"); thread1.start(); Thread thread2 = new Thread(() -> { for (int i = 0; i < 1000; i++) { list.add(Thread.currentThread().getName() + i); } }, "Thread02"); thread2.start(); thread1.join(); thread2.join(); System.out.println(list.size()); // 输出不一定是2000,例如1850 } 如果增删操作比较多的话,可以使用 LinkedList ,LinkedList 增删操作速度比较快。 如果需要线程安全的话,可以使用 JDK 集合中的工具类 Collections 提供一个方法 synchronizedList 可以将线程不安全的 List 集合变成线程安全的集合对象,如下所示。 public static void main(String[] args) throws InterruptedException { LinkedList<String> list = new LinkedList<>(); // 封装成线程安全的集合 List<String> synchronizedList = Collections.synchronizedList(list); Thread thread1 = new Thread(() -> { for (int i = 0; i < 1000; i++) { synchronizedList.add(Thread.currentThread().getName() + i); } }, "Thread01"); thread1.start(); Thread thread2 = new Thread(() -> { for (int i = 0; i < 1000; i++) { synchronizedList.add(Thread.currentThread().getName() + i); } }, "Thread02"); thread2.start(); thread1.join(); thread2.join(); System.out.println(synchronizedList.size()); } 3.2 LinkedList 优缺点 优点:增删操作速度快,不仅有头部和尾部双指针,可以根据要操作的下标靠近哪边,从而决定从哪一边开始遍历找到指定的下标。找到位置后,删除和插入操作的时间复杂度为 O(1) 。 缺点:不支持快速随机访问,相对 ArrayList 比较慢,但也不是决定的,取决于列表的长度,以及访问的下标位置。 3.3 使用迭代器 Iterator 过程中,可以增删元素吗? 通过源码分析,在获取集合的迭代器方法中,返回的是 AbstractList 抽象类中定义的 ListItr 迭代器对象,在他的父类 Itr 中持有变量 expectedModCount ,在初始化迭代器对象时这个变量的值被赋予此时链表中的操作次数 modCount 。在迭代获取元素时,会检查这两变量是否相等,不相等则抛出并发修改异常。所以不支持在使用迭代器的过程中,对原链表进行增删改操作。但是可以调用迭代器的增删操作。 private class ListItr extends Itr implements ListIterator<E> { ListItr(int index) { cursor = index; } public boolean hasPrevious() { return cursor != 0; } public E previous() { checkForComodification(); try { int i = cursor - 1; E previous = get(i); lastRet = cursor = i; return previous; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } public int nextIndex() { return cursor; } public int previousIndex() { return cursor-1; } public void set(E e) { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { AbstractList.this.set(lastRet, e); expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } public void add(E e) { checkForComodification(); try { int i = cursor; AbstractList.this.add(i, e); lastRet = -1; cursor = i + 1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } } private class Itr implements Iterator<E> { /** * Index of element to be returned by subsequent call to next. */ int cursor = 0; /** * Index of element returned by most recent call to next or * previous. Reset to -1 if this element is deleted by a call * to remove. */ int lastRet = -1; /** * The modCount value that the iterator believes that the backing * List should have. If this expectation is violated, the iterator * has detected concurrent modification. */ int expectedModCount = modCount; public boolean hasNext() { return cursor != size(); } public E next() { checkForComodification(); try { int i = cursor; E next = get(i); lastRet = i; cursor = i + 1; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { AbstractList.this.remove(lastRet); if (lastRet < cursor) cursor--; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } } 3.4 LinkedList 可以存储 null 值吗?元素可以重复吗? LinkedList 底层是由双向链表实现的,并且在添加元素的时候,没有对元素进行值校验,所以可以存储 null 值,并且存储的元素是可以重复的。 public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; } 3.5 如何边遍历 ArrayList 元素,边删除指定元素? 不支持在遍历的同时对原链表进行操作,会抛出 ConcurrentModificationException 并发修改异常,前面我们提到使用迭代器 Iterator 遍历集合时,不能对集合进行增删操作(会导致 modCount 值变化)。应该使用 Iterator 类的 remove 方法。 package com.chenpi; import java.util.Iterator; import java.util.LinkedList; /** * @author 陈皮 * @version 1.0 * @description * @date 2022/3/1 */ public class ChenPi { public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.add("Java"); list.add("C++"); list.add("Python"); list.add("Lua"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String next = iterator.next(); if ("C++".equals(next)) { iterator.remove(); continue; } System.out.println(next); } } } // 输出结果如下 Java Python Lua 点击关注,第一时间了解华为云新鲜技术~

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

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

Sublime Text

Sublime Text

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册