首页 文章 精选 留言 我的

精选列表

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

git 入门教程之 git 私服搭建教程

git 私服搭建教程 前几节我们的远程仓库使用的是 github 网站,托管项目大多是公开的,如果不想让任何人都能看到就需要收费,而且 github 网站毕竟在国外,访问速度太慢,基于上述两点原因,我们有必要搭建自己的 git 服务器. 虽然我们能搭建基本的 git 服务器,但是想要做到 github 网站那种规模还不是目前能够探讨的,本节的主要目标是使用我们私有服务器对我提供类似于github的远程仓库托管服务,以下示例以centos 服务器为例说明: 安装 git 服务 运行以下命令安装 git 服务 # 安装 git 相关依赖 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel # 安装 git yum install git # 查看 git 版本 git --version 详情请参考安装 git 配置 git 用户 创建 git 用户组和 git 用户,以便对外提供 git 服务 # 新增 git 用户组 groupadd git # 新增 git 用户并归属于 git 用户组 useradd git -g git 收集 git 公钥 回忆一下,在我们使用 github 网站时,我们是不是曾经将本地电脑生成的公钥~/.ssh/id_rsa.pub 复制到 Account -> Settings -> SSH and GPG keys -> New SSH key,而我们现在搭建的git 服务还是简单,但是这步骤必不可少,因此只能手动收集素有需要访问我们服务器的公钥文件. 我们知道需要登录我们服务器的用户公钥一般是存放在~/.ssh/id_rsa.pub ,那当前服务器作为远程服务器将这些公钥存放到哪里呢?还记得上一步我们创建了 git 用户吗? 因为 linux 系统支持多用户操作,而 git 用户就用于专门运行 git 服务,负责所有和 git 有关的事宜.因此,导入公钥文件的目录就是/home/git/.ssh/authorized_keys文件.一个用户公钥占用一行,几个用户就有几行. # 切换到 git 用户主目录 cd /home/git/ # 创建.ssh 目录 mkdir .ssh # 赋予标准目录权限 chmod 755 .ssh # 创建authorized_keys文件 touch .ssh/authorized_keys # 赋予标签文件权限 chmod 744 .ssh/authorized_keys 初始化 git 仓库 同样我们和github 网站类比,在 github 创建仓库时都会在当前账号下创建项目,完整的访问路径大概是这样的: git@github.com:snowdreams1006/git-demo.git,从中我们可以看出项目仓库都有一个前缀即命名空间,这和上一步操作是不是很类似,上一步收集 git 公钥时我们也有统一的目录,这次也不例外. 假设 git 仓库存放目录在 /home/git/repos/,同样的先创建该目录并赋予响应权限. # 切换到 git 用户主目录 cd /home/git/ # 创建 repos 目录 mkdir repos # 更改 repos 目录属主 chown git:git repos/ # 切换到 repos 目录 cd repos # 初始化 git 仓库 git init --bare git-demo.git # 更改 git-demo.git 仓库属主 chown -R git:git git-demo.git 经过上述操作,我们成功在远程服务器部署了 git 服务,并且创建了 git-demo 测试项目,实际访问路径大概是这样的 git@snowdreams1006.cn:/home/git/repos/git-demo.git 本地克隆远程仓库 身份回到本地电脑,假设本地已搭建好 git 环境,并且生成的ssh 公钥上传到远程服务器,那么我们接下来就可以和之前远程服务器是 github 网站那样的方式开发我们的项目了,唯一不同的是,接下来我们推送的远程服务器均是我们刚搭建好的主机. 需要做好心里准备,我们搭建的服务器还很简单,没有 github 网站那样可以直观操作远程仓库,但是这并不影响我们的 pull push merge 等操作哟! git clone git@snowdreams1006.cn:/home/git/repos/git-demo.git git-指的是 git 用户,snowdreams1006.cn-指的是远程主机域名或ip,/home/git/repos-指的是 git 仓库的目录,git-demo.git-指的是项目名称 现在我们已经成功搭建好自己的 git私服了,是不是很简单呢?有没有对 git 和 github 进一步理解?欢迎大家一起探讨!

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

一份详细的asyncio入门教程

asyncio模块提供了使用协程构建并发应用的工具。它使用一种单线程单进程的的方式实现并发,应用的各个部分彼此合作, 可以显示的切换任务,一般会在程序阻塞I/O操作的时候发生上下文切换如等待读写文件,或者请求网络。同时asyncio也支持调度代码在将来的某个特定事件运行,从而支持一个协程等待另一个协程完成,以处理系统信号和识别其他一些事件。 异步并发的概念 对于其他的并发模型大多数采取的都是线性的方式编写。并且依赖于语言运行时系统或操作系统的底层线程或进程来适当地改变上下文,而基于asyncio的应用要求应用代码显示的处理上下文切换。asyncio提供的框架以事件循环(event loop)为中心,程序开启一个无限的循环,程序会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 事件循环 事件循环是一种处理多并发量的有

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

为什么说python适合做入门语言?

前言 对于基于0的人来说,直接学习Python编程合适吗? Python是最抽象的编程语言,最接近自然语言,并且非常容易使用。Python可以帮助您更好地理解编程。 因此,我支持Python作为一种介绍性语言,原因如下: 一、语法简单明了 第一语言,其实就是语法+流控制,而Python的语法简单,代码可读性高,容易上手。 第二,我们可以调节自己 Python的哲学是“做一件事应该只有一种最好的方法”。它对初学者标准化自己的学习非常有帮助,但也有助于初学者理解其他人的代码(与Perl的代码相比,这几乎是不可能阅读的)。 3.养成良好的习惯 Python严格的代码要求,特别是缩进,有助于初学者养成良好的代码习惯。 4. 优秀的语法设计 Python的语法设计非常棒(PHP,相反的例子),它的思想更加现代,这可以帮助我们更快地理解现代编程语言的一些思想。 五、人口比较 Python仍然是传统的基于C lass的OO(与基于Javascript原型的OO相比),与Java、c#、Ruby一样流行。从Python中学习设计模式也很合适。 6. 清除内置数据结构 Python内置的数据结构清晰易用(C语言提供的稍微少一点,PHP稍微凌乱一点),同时,还有更多的库,很多优秀的代码。 7. 更多的学习资料 Python有很多免费的书,你可以找到很多信息啃。同时(国外)社会比较集中,如果你有问题,可以请教专家。 8. 适合作为工具使用 Python在科学计算、人工智能等领域有着广泛的应用。Python适合作为一种工具来学习一门语言。前言对于基于0的人来说,直接学习Python编程合适吗? Python是最抽象的编程语言,最接近自然语言,并且非常容易使用。Python可以帮助您更好地理解编程。 因此,我支持Python作为一种介绍性语言,原因如下: 一、语法简单明了 第一语言,其实就是语法+流控制,而Python的语法简单,代码可读性高,容易上手。 第二,我们可以调节自己 Python的哲学是“做一件事应该只有一种最好的方法”。它对初学者标准化自己的学习非常有帮助,但也有助于初学者理解其他人的代码(与Perl的代码相比,这几乎是不可能阅读的)。 3.养成良好的习惯 Python严格的代码要求,特别是缩进,有助于初学者养成良好的代码习惯。 4. 优秀的语法设计 Python的语法设计非常棒(PHP,相反的例子),它的思想更加现代,这可以帮助我们更快地理解现代编程语言的一些思想。 五、人口比较 Python仍然是传统的基于C lass的OO(与基于Javascript原型的OO相比),与Java、c#、Ruby一样流行。从Python中学习设计模式也很合适。 6. 清除内置数据结构 Python内置的数据结构清晰易用(C语言提供的稍微少一点,PHP稍微凌乱一点),同时,还有更多的库,很多优秀的代码。 7. 更多的学习资料 Python有很多免费的书,你可以找到很多信息啃。同时(国外)社会比较集中,如果你有问题,可以请教专家。 8. 适合作为工具使用 Python在科学计算、人工智能等领域有着广泛的应用。Python适合作为一种工具来学习一门语言。 谁适合学习Python? 那么,谁是学习Python的合适人选呢? 第一类:新手程序员:刚从大学或其他行业毕业,想从事编程开发工作,目前认为Python比较热门,想进入这个行业; 第二类:Linux运维人员:Linux运维以其复杂性和对人事系统掌握知识能力的高要求而著称。然后需要一种编程语言来解决自动化问题。Python操作和维护开发是首选。Python运维人员的工资一般高于Linux运维人员的工资。 第三类:数据分析或人工智能:无论是普通的大数据分析还是一般的财务分析或科学分析,数据分析都得到了很大的应用。人工智能的一些常见应用程序也使用Python的一些技术。 第四,在职程序员转向Python开发:通常只关注div + CSS页面技术,很多时候实际需要与后端开发人员交互,现在很多Java程序都在转向Python语言,他们被Python代码的优美和开发效率所折服。 第五类:其他:有的工程师以前做过很多SEO优化,苦于没有编程,有的程序上的问题,无法解决,只能做简单的页面优化。现在学习Python之后,可以编写一些查询、排名、自动生成网络地图的程序,来解决SEO的难题。

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

shiro的入门实例-shiro于spring的整合

shiro是一款java安全框架、简单而且可以满足实际的工作需要 第一步、导入maven依赖 <!--shiro--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${org.apache.shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>${org.apache.shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${org.apache.shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>${org.apache.shiro.version}</version> </dependency> 第二步、在项目中定义shiro的过滤器(shiro的实现主要是通过filter实现) <!--ShiroSecurityfilter--> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> 第三步、创建一个Realm publicclassUserRealmextendsAuthorizingRealm{ @Autowired privateUserBizbiz; //验证用户信息,认证的实现 @Override protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokenauthenticationToken)throwsAuthenticationException{ Stringuserno=(String)authenticationToken.getPrincipal(); Stringpassword=newString((char[])authenticationToken.getCredentials()); Result<RcUser>result=biz.login(userno,password); if(result.isStatus()){ Sessionsession=SecurityUtils.getSubject().getSession(); session.setAttribute(Constants.Token.RONCOO,userno); RcUseruser=result.getResultData(); returnnewSimpleAuthenticationInfo(user.getUserNo(),user.getPassword(),getName()); } returnnull; } //验证用户的权限,实现认证 @Override protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ SimpleAuthorizationInfoauthorizationInfo=newSimpleAuthorizationInfo(); Stringuserno=(String)principals.getPrimaryPrincipal(); Result<RcUser>result=biz.queryByUserNo(userno); if(result.isStatus()){ Result<List<RcRole>>resultRole=biz.queryRoles(result.getResultData().getId()); if(resultRole.isStatus()){ //获取角色 HashSet<String>roles=newHashSet<String>(); for(RcRolercRole:resultRole.getResultData()){ roles.add(rcRole.getRoleValue()); } System.out.println("角色:"+roles); authorizationInfo.setRoles(roles); //获取权限 Result<List<RcPermission>>resultPermission=biz.queryPermissions(resultRole.getResultData()); if(resultPermission.isStatus()){ HashSet<String>permissions=newHashSet<String>(); for(RcPermissionrcPermission:resultPermission.getResultData()){ permissions.add(rcPermission.getPermissionsValue()); } System.out.println("权限:"+permissions); authorizationInfo.setStringPermissions(permissions); } } } returnauthorizationInfo; } } 第四步、添加shiro配置 1、shiro缓存 <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPExml> <ehcacheupdateCheck="false"name="shiroCache"> <!--http://ehcache.org/ehcache.xml--> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" /> </ehcache> 2、在spring的core配置文件中配置shiro <description>Shiro安全配置</description> <beanid="userRealm"class="com.roncoo.adminlte.controller.realm.UserRealm"/> <beanid="securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <propertyname="realm"ref="userRealm"/> <propertyname="cacheManager"ref="shiroEhcacheManager"/> </bean> <!--Shiro过滤器--> <beanid="shiroFilter"class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!--Shiro的核心安全接口,这个属性是必须的--> <propertyname="securityManager"ref="securityManager"/> <!--身份认证失败,则跳转到登录页面的配置--> <propertyname="loginUrl"value="/login"/> <propertyname="successUrl"value="/certification"/> <propertyname="unauthorizedUrl"value="/error"/> <!--Shiro连接约束配置,即过滤链的定义--> <propertyname="filterChainDefinitions"> <value> /login=authc /exit=anon /admin/security/list=authcBasic,perms[admin:read] /admin/security/save=authcBasic,perms[admin:insert] /admin/security/update=authcBasic,perms[admin:update] /admin/security/delete=authcBasic,perms[admin:delete] </value> </property> </bean> <!--用户授权信息Cache,采用EhCache--> <beanid="shiroEhcacheManager"class="org.apache.shiro.cache.ehcache.EhCacheManager"> <propertyname="cacheManagerConfigFile"value="classpath:ehcache/ehcache-shiro.xml"/> </bean> <!--保证实现了Shiro内部lifecycle函数的bean执行--> <beanid="lifecycleBeanPostProcessor"class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!--AOP式方法级权限检查--> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"> <propertyname="proxyTargetClass"value="true"/> </bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <propertyname="securityManager"ref="securityManager"/> </bean> 第五步、shiro退出登录的实现 第一种方式 /** *退出登陆操作 */ @RequestMapping(value="/exit",method=RequestMethod.GET) publicStringexit(RedirectAttributesredirectAttributes,HttpSessionsession){ session.removeAttribute(Constants.Token.RONCOO); SecurityUtils.getSubject().logout(); redirectAttributes.addFlashAttribute("msg","您已经安全退出"); returnredirect("/login"); } 第二种方式:在shiroFilter的约束配置中配置 <!--Shiro连接约束配置,即过滤链的定义--> <propertyname="filterChainDefinitions"> <value> /exit=logout </value> </property>

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

Java入门系列-24-实现网络通信

互联网上那么多设备,java 是如何与其他设备通信的呢?这次的内容是网络通信的基础,有了它咱们才能上网页、玩游戏、视频聊天。 Socket 客户端套接字 Socket 客户端套接字,用于连接互联网提供服务的设备。 Socket 构造方法 构造方法 说明 Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号 常用方法 方法名称 说明 getOutputStream() 返回此套接字的输出流 getInputStream() 返回此套接字的输入流 下面示例模拟了一个 HTTP 请求 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class TestSocket { public static void main(String[] args) { //创建套接字 try(Socket s=new Socket("www.baidu.com", 80);){ //创建向服务器发送数据的输出流 OutputStream os=s.getOutputStream(); StringBuffer sb=new StringBuffer(); //HTTP协议 请求报文 sb.append("GET / HTTP/1.1\r\n"); sb.append("Host: www.baidu.com:80\r\n"); sb.append("Connection: Keep-Alive\r\n"); //这里一定要一个回车换行,表示消息头完,不然服务器会等待 sb.append("\r\n"); //发送 os.write(sb.toString().getBytes()); //获取服务器相应内容 InputStream is=s.getInputStream(); //通过输入流创建扫描器,并指定编码为utf-8防止中文乱码 Scanner scanner=new Scanner(is,"utf-8"); while(scanner.hasNextLine()) { String line=scanner.nextLine(); System.out.println(line); } } catch (UnknownHostException e) { e.printStackTrace(); System.out.println("未知主机"); } catch (IOException e) { e.printStackTrace(); System.out.println("IO异常"); } } } ServerSocket ServerSocket:实现服务器套接字,服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TestServerSocket { public static void main(String[] args) { //创建 ServerSocket 监听1666端口 try(ServerSocket server=new ServerSocket(1666)){ //阻塞方法,当有客户端连入,获取客户端Socket try(Socket client=server.accept()){ //获取客户端发送的数据 InputStream is=client.getInputStream(); //获取向客户端发送数据的流 OutputStream os=client.getOutputStream(); //通过输入流创建扫描器 try(Scanner scanner=new Scanner(is)){ PrintWriter pw=new PrintWriter(os,true/*自动刷新*/); //向客户端发送消息 pw.println("Hello,enter bye to exit."); boolean done=false; //客户端有输入数据并且没有发送 bye while(!done&&scanner.hasNextLine()) { //接收客户端发送的数据 String line=scanner.nextLine(); //将客户端发送的数据发回客户端 pw.println("Echo:"+line); //如果客户端输入bye 结束通信 if(line.trim().equalsIgnoreCase("bye")) {done=true;} } } } } catch (IOException e) { e.printStackTrace(); } } } 测试方式:在DOS 中输入命令:telnet 127.0.0.1 1666 telnet 不是内部或外部命令的读者,需要在 Windows 功能中启用 Telnet 客户端。 上面的代码如果有多个客户端连入就不行了,如果希望服务能被多个客户端连接,可以使用线程。 多线程服务器 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TestMultiServerSocket { public static void main(String[] args) { //创建 ServerSocket 监听 1666端口 try(ServerSocket server=new ServerSocket(1666)){ while(true) { //accept() 是一个阻塞方法 Socket client=server.accept(); InputStream is=client.getInputStream(); OutputStream os=client.getOutputStream(); //开启新的线程处理,传入当前客户端 Thread t=new Thread(new ThreadEchoHandler(client)); t.start(); } } catch (IOException e) { e.printStackTrace(); } } } class ThreadEchoHandler implements Runnable{ private Socket socket=null; public ThreadEchoHandler(Socket socket) { this.socket=socket; } @Override public void run() { try { InputStream is=socket.getInputStream(); OutputStream os=socket.getOutputStream(); try(Scanner scanner=new Scanner(is)){ PrintWriter pw=new PrintWriter(os,true); pw.println("Hello,enter bye to exit."); boolean done=false; while(!done&&scanner.hasNextLine()) { String line=scanner.nextLine(); pw.println("Echo:"+line); if(line.trim().equalsIgnoreCase("bye")) {done=true;} } } socket.close(); } catch (IOException e) { e.printStackTrace(); } } } URLConnection 抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。 Socket 可以默认任意类型的网络通信,URLConnection 更适合 HTTP 请求,使用 URLConnection 进行HTTP操作更方便,模拟请求报文,获取响应报文和内容。 URLConnection 常用方法 方法 说明 connect() 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接) getContentEncoding() 返回 content-encoding 头字段的值 getContentType() 返回 content-type 头字段的值 getHeaderFields() 返回头字段的不可修改的 Map getInputStream() 返回从此打开的连接读取的输入流 setRequestProperty(String key, String value) 设置一般请求属性 获取 URLConnection 需要先创建 URL 对象:URL url=new URL(host); 使用 URLConnection 获取网页的内容 import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; public class TestURLConnection { public static void main(String[] args) { try { //创建URL对象 URL url=new URL("http://www.baidu.com"); //创建 URLConnection对象 URLConnection connection=url.openConnection(); //设置请求属性 //connection.setRequestProperty("", ""); //连接 connection.connect(); //获取输入流 InputStream is=connection.getInputStream(); //通过输入流构建一个扫描器 Scanner scanner=new Scanner(is,"utf-8"); while(scanner.hasNextLine()) { String line=scanner.nextLine(); System.out.println(line); } System.out.println("===响应头==="); Map<String,List<String>> headers=connection.getHeaderFields(); for (Entry<String, List<String>> entry: headers.entrySet()) { String key=entry.getKey(); System.out.print(key+":"); for (String string : entry.getValue()) { System.out.print(string); } System.out.println(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

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

(Tensorflow)手把手CNN入门:手写数字识别

深度学习最令人兴奋的领域之一就是计算机视觉。通过卷积神经网络,我们已经能够创建自动驾驶汽车系统、面部检测系统和自动医学图像分析等等。在本文中,我将向你展示卷积神经网络的基本原理以及如何自己创建一个对手写数字进行分类的系统。 卷积神经网络的功能似乎是人类大脑中生物功能的复制,早在1959年,David Hubel和Torsten Wiesel对猫和猴进行了研究,这些研究揭示了动物视觉皮层的功能。他们发现的是,许多神经元具有小的局部接受性,即仅对整个视野的一小块有限区域起反应。他们发现某些神经元会对某些特定模式做出反应,例如水平线、垂直线和其他圆形。他们还发现其他神经元具有更大的感受野并且被更复杂的模式刺激,这些模式是由较低水平神经元收集的信息组合。这些发现奠定了我们现在称之为卷积神经网络的基础。接下来,我们逐一介绍卷积神经网络的组成。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Spring

Spring

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

WebStorm

WebStorm

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

用户登录
用户注册