首页 文章 精选 留言 我的

精选列表

搜索[声音定制],共10001篇文章
优秀的个人博客,低调大师

【实战】再见Excel,我能自由定制表格

很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速。 下面我来举几个例子。 1. 删除重复行和空行 我们直接用dict.fromkeys的方法把当前的数据转为字典,默认的值为None因为用不到,也就无所谓了。然后我们再用list直接对结果进行类型转换,转换为list。 In [135]: for row in rows4: print(row) ('name', 'address') ('tom li', 'beijing') ('tom li', 'beijing') ('',) ('mary wang', 'shandong') ('mary wang', 'shandong') ('',) ('de8ug', 'guangzhou') In [148]: dict.fromkeys(rows4) Out[148]: {('name', 'address'): None, ('tom li', 'beijing'): None, ('',): None, ('mary wang', 'shandong'): None, ('de8ug', 'guangzhou'): None} In [137]: list(dict.fromkeys(rows4)) Out[137]: [('name', 'address'), ('tom li', 'beijing'), ('',), ('mary wang', 'shandong'), ('de8ug', 'guangzhou')] 这时候,重复数据直接去掉了,注意我们这里的dict是python3新版本的,所以顺序没有影响,如果你还在用python2或者python3.5以下,建议升级一下python版本。 接下来,就是空数据的处理了。观察('',)是个元组,第一个位置的数据为空字符串,那么整体长度为1,可以直接通过循环来去掉。这里的循环我们可以用Python中的语法糖写法,直接一行搞定,最后加个判断只留下长度大于1,最后用list转换为列表。 In [179]: list(x for x in dict.fromkeys(rows4) if len(x[0])>1) Out[179]: [('name', 'address'), ('tom li', 'beijing'), ('mary wang', 'shandong'), ('de8ug', 'guangzhou')] 上面的研究搞定了,直接把研究结果放到函数中解决重复行和空行的问题。 注意这时候我们处理的行数据,所以就不再按列循环了。而且,当前的sheet中处理之后,每一行的内容都会修改位置或删除。所以我们先用old_rows = [x for x in sheet.values]取到旧的每一行的数据,注意这里的sheet后直接用values取到数据,而不是cell对象。这里的old_rows是个列表,就可以用刚才的研究直接转为删除重复和空行的数据了。 接下来,用sheet.delete_rows(1, sheet.max_row)删除所有行,第一个参数表示从第一行开始,第二个参数为最大行数。最后,用循环新的行数据的方式,把新数据写入当前的sheet。 In [189]: def handle_duplicate(wb, sheetname): """ 去除重复行,空行 先取出每一行,清空sheet,处理后写回 """ print(f'开始处理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] old_rows = [x for x in sheet.values] print('修改前:', old_rows) new_rows = list(x for x in dict.fromkeys(old_rows) if len(x[0])>1) print('修改后-》》', new_rows) # 删除所有行 sheet.delete_rows(1, sheet.max_row) # 写入新数据 for row in new_rows: sheet.append(row) 运行测试,查看结果。再说一次,一定记得测试啊!如果有错误就根据错误提示,查看代码,反复调试,去除bugs。 In [190]: wb = load_data() handle_duplicate(wb, '重复行') save_as(wb) 2.删除空格 删除空格也需要用到字符串的函数,所以这里还是简单研究一下。如果我们想去除字符串中间的空格,可以用split默认进行分割,然后把分割的结果用’’.join方法连接起来就可以了。注意join前是空的字符串。这里也用不到strip去除两端的空格了,因为split分割后只有几个最后的字符串组成的列表。 In [192]: a="a b c " In [194]: a.strip() Out[194]: 'a b c' In [195]: a.split() Out[195]: ['a', 'b', 'c'] In [196]: ''.join(a.split()) Out[196]: 'abc' In [ ]: 研究成功后,写入函数。这次命名为handle_blank。 In [197]: def handle_blank(wb, sheetname): """ 按列循环, 通过参数确认目标 """ print(f'开始处理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] for col in sheet.iter_cols(): # 不加参数,循环所有列 for cell in col: print('修改前:', cell.value, end='') cell.value = ''.join(cell.value.split()) print('修改后-》》',cell.value) In [198]: handle_blank(wb, '空格') 3.修改日期和时间格式 有时候,我们需要对表格中时间相关的单元格进行格式修改,这里需要用到Python中时间模块datetime,将需要的格式进行拼接后,用strftime进行转换。 假设这里我们想把之前简单的1/11月日格式,更改为年月日的样式,中间加上分隔符/或-,就需要用"%x"或"%Y-%m-%d"来进行操作了。注意这里的%加字母都是官方定义好的格式而已,我们用到时候进行拼接,传给函数就可以了。 具体更多的拼接格式如下: In [199]: import datetime In [209]: d=datetime.datetime(2019,1,11) In [203]: d.strftime("%x") Out[203]: '01/11/19' In [205]: d.strftime("%Y-%m-%d") Out[205]: '2019-01-11' 研究完成后,我们编写函数。 首先需要用m, d = cell.value.split('/')把之前简单的日期进行分割,得到m,代表月份和日期,然后用datetime进行转换,生成时间相关的对象day,注意里面的参数是数字,所以用int转换,最后把day进行格式化输出。编写函数后,一定记得测试。 In [218]: def handle_time(wb, sheetname): """ 按列循环, 通过参数确认目标 """ print(f'开始处理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] for col in sheet.iter_cols(max_col=1, min_row=2): # 找到时间的列, 第一列,从第二行开始 for cell in col: print('修改前:', cell.value, end='') m, d = cell.value.split('/') day = datetime.datetime(2019, int(m), int(d)) cell.value = day.strftime("%Y-%m-%d") print('修改后-》》',cell.value) In [220]: wb = load_data() handle_time(wb, '时间') save_as(wb) 4.修复数字和符号 接下来,处理数字和符号相关的操作。加入我们之前的价格,很多是有小数点的,这时候还想保存两位小数,并加上人民币符号为前缀。就需要新的一波研究了。 有小数点,一是要保证位数,我们这里要求2位,二是要对多余的位数四舍五入。可以有以下俩个方式完成,一个用Decimal一个用round,两个的区别是Decimal("0.00")指定位数后,会自动补0,而round遇到0就自动舍掉了。而且round在四舍五入的计算中,还有点特殊。具体可查看官方文档。 我们这里用Decimal来完成函数内相关操作。记得测试啊! In [227]: from decimal import Decimal In [240]: a = 3.1 b=Decimal(a).quantize(Decimal("0.00")) print(b) 3.10 In [244]: round(a,2) # 位数自动省略0 Out[244]: 3.1 In [247]: def handle_num(wb, sheetname): """ 按列循环, 通过参数确认目标 """ print(f'开始处理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] for col in sheet.iter_cols(min_col=3, max_col=3, min_row=2): # 找到时间的列, 第一列,从第二行开始 for cell in col: print('修改前:', cell.value, end='') # cell.value = round(float(cell.value), 3) cell.value = '¥' + str(Decimal(cell.value).quantize(Decimal("0.00"))) print('修改后-》》',cell.value) In [249]: wb = load_data() handle_num(wb, '数字符号') save_as(wb) 9元微专栏,带你《用Python玩转excel》 还有群答疑服务哦↓

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

定制linux内核+Busybox+dropbear实现远程登录

简单介绍下各阶段工作流程: POST:开机后,加载BIOS信息(里面包含各硬件的相关信息) BIOS(boot sequence):选择(设备)启动项,然后读取MBR信息 Boot Loader:初始化硬件、建立内存空间映射,读取grub配置文件 Initrd:加载内核(硬件检测及初始化、挂载根文件系统)0→启动第一个进程init→该程序读出/etc/inittab、/etc/rc.d/rc.sysinit、/etc/rc.d/rc.local文件 Shell:启动/bin/login程序,进入登录界面 进入实验部分: 一、环境搭建 1、虚拟机(server1)上添加一个硬盘 2、在系统中给该磁盘进行分区 [root@localhost~]#fdisk/dev/sdb 3、格式化 [root@localhost~]#mke2fs-text4/dev/sdb1 [root@localhost~]#mke2fs-text4/dev/sdb2 [root@localhost~]#mkswap/dev/sdb3 4、挂载 [root@localhost~]#mkdir/mnt/{sysroot,boot}#创建挂载目录 [root@localhost~]#mount/dev/sdb1/mnt/boot/ [root@localhost~]#mount/dev/sdb2/mnt/sysroot/ 5、安装grub [root@localhost~]#grub-install--root-directory=/mnt/dev/sdb 6、创建linux各目录 [root@localhost~]#cd/mnt/sysroot/ [root@localhost~]#mkdir-pvetc/rc.dvar/logrootprocsyssrvbootmnttmphomedevliblib64 二、编译内核 [root@localhost~]#tarxflinux-3.13.6.tar.xz-C/usr/src/#解压 [root@localhost~]#cd/usr/src/ [root@localhostsrc]#ln-slinux-3.13.6linux#创建软链接 [root@localhostsrc]#cdlinux [root@localhostlinux]#yumgroupinstall"DevelopmentTools"-y#安装开发包组 [root@localhostlinux]#makeallnoconfig#重置配置选项 [root@localhostlinux]#makemenuconfig 如果make menuconfig时报错: 提示:缺少ncurses-devel库文件 [root@localhostlinux]#yum-yinstallncurses-devel [root@localhostlinux]#makemenuconfig#再次进行 [*]64bitkernel#64位支持 [*]gerernalsetup ()localversion-appendtokernelrelease#版本号 [*]Enableloadablemodualsupport#允许模块加载 ->Progressortypeandfeatures ProcessorFamily(Core2/newerXeon)#自行选择处理器类型 [*]Symmetricmulti-processingsupport#支持多核 ->BusOptions(PCIetc.) [*]PCIsupport#支持PCI总线 ->Filesystem [*]TheExtended4(ext)filesystem#支持ext4文件系统 ->Executablefileformats/Emulations#可执行文件系统 [*]KernelsupportforELFbinaries#支持ELF二进制程序 [*]Kernelsupportforscriptsstartingwith#!#支持脚本 [*]Networkingsupport ->Networkingoptions [*]Unixdomainsockets [*]UNIX:socketmonitoringinterface [*]TCP/IPnetworking [*]IP:multicasting#ip多播协议 [*]IP:advancedrouter#高级路由协议 [*]IP:kernellevelautoconfiguration#内核级别配置 [*]IP:DHCPsupport#DHCP服务 [*]IP:BOOTPsupport [*]IP:RARPSupport#RARP协议 [*]IP:TCPsyncookiesupport#tcp同步状态 ->DeviceDrivers ->GernalDriverOptions [*]Maintainadevtmpfsfilesystemtomountat/dev#使用devtmpfs机制挂载设备文件 [*]Automountdevtmpfsat/dev,afterthekernelmountedtherootfs#自动挂载 ->SCSIdevicesupport [*]SCSIdeveicesupport [*]SCSIdisksupport [*]FusionMPTdevicesupport#支持虚拟磁盘 [*]FusionMPTScsiHostdriversforSPI#虚拟磁盘 [*]FusionMPTmiscdevice(ioctl)driver#磁盘初始化 [*]Networkdevicesupport [*]Networkcoredriversupport#网络核心驱动 [*]Ethernetdriversupport#以太网卡驱动 [*]Inteldevices(NEW) [*]Intel(R)PRO/1000GigabitEthernetsupport [*]Intel(R)PRO/1000PCI-ExpressGigabitEthernetsupport ->InputDevicesupport [*]Mouseinterface [*]Keyboards#键盘 [*]Mice#ps/2 [*]USBsupport [*]SupportforHost-sideUSB [*]xHCIHCD(USB2.0)support [*]EHCIHCD(USB3.0)support [*]OHCIHCD(USB1.1)support [root@localhostlinux]#makebzImage-j3#只编译内核,并且使用3个线程 [root@localhostlinux]#cparch/x86_64/boot/bzImage/mnt/boot/#拷贝内核 三、安装busybox 安装busybox需要依赖glibc-static 安装glibc-static 包在DVD2中,如何没有DVD2比如我..,自己搭建网络yum源安装 root@localhost~]#wgethttp://mirrors.163.com/.help/CentOS6-Base-163.repo这是网易yum源的配置文件 [root@localhost~]#yumcleanall/#生效刚刚加载的yum仓库 [root@localhost~]#yum-yinstallglibc-static [root@localhost~]#tarxfbusybox-1.22.1.tar.bz2 [root@localhost~]#cdbusybox-1.22.1 [root@localhostbusybox-1.22.1]#makemenuconfig ->BusyboxSettings ->BuildOptions [*]BuildBusyBoxasastaticbinary(nosharedlibs) [root@localhostbusybox-1.22.1]#make&&makeinstall [root@localhostbusybox-1.22.1]#cp-a_install/*/mnt/sysroot/ 提供grub.conf文件: [root@localhost~]#vim/mnt/boot/grub/grub.conf default=0 timeout=5 titleLinux(3.13.6) root(hd0,0) kernel/bzImageroroot=/dev/sda2init=/sbin/init [root@localhost~]#sync#把内存缓冲区的数据立即写入磁盘中 测试: 添加新的虚拟机(server2) 注意选择磁盘时要选择之前创建的磁盘 添加完成后,把server1挂起或关机,然后server2开机 启动正常,但提示没有初始化文件 四、提供初始化文件(etc/fstab etc/inittabetc/rc.d/rc.sysinit) [root@localhostsysroot]#vimetc/fstab /dev/sdb1/bootext4defaults00 /dev/sdb2/ext4defaults00 /dev/sdb3swapswapdefaults00 proc/procprocdefaults00 sysfs/syssysfsdefaults00 [root@localhostsysroot]#vimetc/inittab ::sysinit:/etc/rc.d/rc.sysinit ::respawn:/sbin/getty19200tty1 ::respawn:/sbin/getty19200tty2 ::respawn:/sbin/getty19200tty3 ::respawn:/sbin/getty19200tty4 ::respawn:/sbin/getty19200tty5 ::respawn:/sbin/getty19200tty6 ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount-a-r [root@localhostsysroot]#vimetc/rc.d/rc.sysinit #!/bin/sh # echo-e"\tWelcometo\033[36mLinux\033[0m" [-r/etc/sysconfig/network]&&./etc/sysconfig/network [-z"$HOSTNAME"-o"$HOSTNAME"=="(none)"]&&HOSTNAME=localhost /bin/hostname$HOSTNAME mount-a#基于/etc/fstab文件挂载设备 mdev-s#挂载内核所需设备文件 mount-oremount-rw/#把根挂载成可读写 ifconfiglo127.0.0.1#配置网卡信息 ifconfigeth0192.168.199.222#配置网卡信息 exportPS1="[\u@\h\w]$"#导出PS1路径 exportPATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"#修改环境变量 [root@localhostsysroot]#chmod+xetc/rc.d/rc.sysinit 提供账号和密码文件: [root@localhostsysroot]#head-1/etc/passwd>etc/passwd [root@localhostsysroot]#vimetc/passwd [root@localhostsysroot]#head-1/etc/group>etc/group [root@localhostsysroot]#head-1/etc/shadow>etc/shadow [root@localhostsysroot]#chmod400etc/shadow 提供认证库文件: [root@localhost~]#cp-d/lib64/libnss_files*/mnt/sysroot/lib64/ [root@localhost~]#cp-d/usr/lib64/libnss3.so/mnt/sysroot/usr/lib64/ [root@localhost~]#mkdir/mnt/sysroot/usr/lib64 [root@localhost~]#cp-d/usr/lib64/libnss3.so/mnt/sysroot/usr/lib64/ [root@localhost~]#cp-d/usr/lib64/libnss_files.so/mnt/sysroot/usr/lib64/ [root@localhost~]#cp/etc/nsswitch.conf/mnt/sysroot/etc/ [root@localhost~]#cp/etc/shells/mnt/sysroot/etc/ 提供主机名: [root@localhostsysroot]#mkdiretc/sysconfig [root@localhostsysroot]#vimetc/sysconfig/network HOSTNAME=biao.com [root@localhostsysroot]#sync 测试: 本地登陆成功! 五、提供ssh服务 [root@localhost~]#tarxfdropbear-2016.73.tar.bz2 [root@localhost~]#cddropbear-2016.73 [root@localhostdropbear-2016.73]#./configure 预编译时如果报如下错误: #yum-yinstallzlib-devel#安装缺少的库 #./configure#再次预编译 [root@localhostdropbear-2016.73]#makePROGRAMS="dropbeardbclientdropbearkeyscp" [root@localhostdropbear-2016.73]#makePROGRAMS="dropbeardbclientdropbearkeydropbearconvertscp"install 命令移植脚本: #!/bin/bash aimDir=/mnt/sysroot cmdInput(){ ifwhich$cmd&>/dev/null;then cmdPath=`which--skip-alias$cmd` else echo"Nosuchcommand." return5 fi } cpCmd(){ cmdDir=`dirname$cmdPath` [-d${aimDir}${cmdDir}]||mkdir-p${aimDir}${cmdDir} [-f$cmdPath]&&cp$cmdPath${aimDir}${cmdDir} } cpLib(){ forlibPathin`ldd$cmdPath|grep-o"/[^[:space:]]\{1,\}"`;do libDir=`dirname$libPath` [-d${aimDir}${libDir}]||mkdir-p${aimDir}${libDir} [-f$libPath]&&cp$libPath${aimDir}${libDir} done } echo"Youcaninput[q|Q]quit." whiletrue;do read-p"Enteracommand:"cmd if[["$cmd"=~\(|q|Q|\)]];then echo"Youchoosequit." exit0 fi cmdInput [$?-eq5]&&continue cpCmd cpLib [$?-eq0]&&echo-e"\033[36mCopysuccessful.\033[0m" Done 移植所需的命令: [root@localhost~]#bashcp.sh Youcaninput[q|Q]quit. Enteracommand:dropbear Copysuccessful. Enteracommand:dropbearkey Copysuccessful. Enteracommand:q Youchoosequit. 生成密钥: [root@localhost~]#mkdir/mnt/sysroot/etc/dropbear [root@localhost~]#dropbearkey-trsa-f/mnt/sysroot/etc/dropbear/dropbear_rsa_host_key-s2048 [root@localhost~]#dropbearkey-tdss-f/mnt/sysroot/etc/dropbear/dropbear_dss_host_key 创建pid文件存放目录: [root@localhost~]#mkdir/mnt/sysroot/var/run 挂载pts: [root@localhostsysroot]#mkdirdev/pts [root@localhostsysroot]#vimetc/fstab ........#上面省略 devpts/dev/ptsdevptsdefaults00 提供服务脚本: [root@localhostsysroot]#mkdiretc/rc.d/init.d [root@localhostsysroot]#vimetc/rc.d/init.d/dropbear #!/bin/bash # #description:dropbearsshdaemon #chkconfig:23456633 # dsskey=/etc/dropbear/dropbear_dss_host_key rsakey=/etc/dropbear/dropbear_rsa_host_key lockfile=/var/lock/subsys/dropbear pidfile=/var/run/dropbear.pid dropbear=/usr/local/sbin/dropbear dropbearkey=/usr/local/bin/dropbearkey [-r/etc/rc.d/init.d/functions]&&./etc/rc.d/init.d/functions [-r/etc/sysconfig/dropbear]&&./etc/sysconfig/dropbear keysize=1024 port=22 gendsskey(){ [-d/etc/dropbear]||mkdir/etc/dropbear echo-n"Startinggeneratethedsskey:" $dropbearkey-tdss-f$dsskey&>/dev/null RETVAL=$? if[$RETVAL-eq0];then success echo return0 else failure echo return1 fi } genrsakey(){ [-d/etc/dropbear]||mkdir/etc/dropbear echo-n"Startinggeneratethersakey:" $dropbearkey-trsa-s$keysize-f$rsakey&>/dev/null RETVAL=$? if[$RETVAL-eq0];then success echo return0 else failure echo return1 fi } start(){ [-e$dsskey]||gendsskey [-e$rsakey]||genrsakey if[-e$lockfile];then echo-n"dropbeardaemonisalreadyrunning:" success echo exit0 fi echo-n"Startingdropbear:" daemon--pidfile="$pidfile"$dropbear-p$port-d$dsskey-r$rsakey RETVAL=$? echo if[$RETVAL-eq0];then touch$lockfile return0 else rm-f$lockfile$pidfile return1 fi } stop(){ if[!-e$lockfile];then echo-n"dropbearserviceisstopped:" success echo exit1 fi echo-n"Stoppingdropbeardaemon:" killprocdropbear RETVAL=$? echo if[$RETVAL-eq0];then rm-f$lockfile$pidfile return0 else return1 fi } status(){ if[-e$lockfile];then echo"dropbearisrunning..." else echo"dropbearisstopped..." fi } usage(){ echo"Usage:dropbear{start|stop|restart|status|gendsskey|genrsakey}" } case$1in start) start;; stop) stop;; restart) stop start ;; status) status ;; gendsskey) gendsskey ;; genrsakey) genrsakey ;; *) usage ;; esac [root@localhostsysroot]#chmod+xetc/rc.d/init.d/dropbear [root@localhostsysroot]#cp/etc/rc.d/init.d/functionsetc/rc.d/init.d/ [root@localhostsysroot]#cdetc/rc.d/ [root@localhostrc.d]#ln-sinit.d/dropbeardropbear.start [root@localhostrc.d]#ln-sinit.d/dropbeardropbear.stop [root@localhostrc.d]#echo"/etc/rc.d/*.startstart">>rc.sysinit 关机脚本 [root@localhostrc.d]#vimrc.sysdown #!/bin/sh # sync#把内存缓冲区的数据立即写入磁盘中 sleep3#给系统3秒的写入时间 /etc/rc.d/*.stopstop umount-a-r Poweroff [root@localhostrc.d]vim/mnt/sysroot/etc/inittab ::shutdown:/etc/rc.d/rc.sysdown#最后一行修改成这样 测试: 服务开机启动 ssh远程登录成功: 以上实验全部完成!!!!!!!!!

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

前Facebook AI翻译主管加盟阿里达摩院,致力图片、视频、声音“秒翻”

日前,前Facebook(脸书)应用机器学习部AI翻译团队主管黄非博士入职阿里巴巴达摩院。 入职后,他将在达摩院机器智能技术实验室,和同事推动AI翻译在新零售、跨境电商、视频等领域的实时翻译应用。 “语言”是跨境交易头号拦路虎。在阿里巴巴国际站,7成买家以英语沟通,还有30%为小语种。而卖家端的调研数据显示,大约96%的卖家对小语种无能为力。 阿里目前需要翻译的商品总量超过4亿。 5月18日,阿里巴巴在跨境电商中正式上线对话实时翻译功能,破解买卖家语言不通难题。据悉,这是全球首个电商领域的实时翻译AI(人工智能)产品。 目前,阿里AI实时翻译日均翻译次数达7.5亿,每年翻译次数超3000亿。公开资料显示,这是全球电商领域AI翻译之最。伴随电商全球化的步伐,阿里AI翻译发展壮大,其AI实时翻译工具目前提供21种热门语言,包括43个语言方向翻

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

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部分的功能。

用户登录
用户注册