首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Win10配置人工智能学习平台Tensorflow的正确姿势

目录: Tensorflow在Windows10的安装 Tensorflow,那么什么是Tensor? 为什么Tensorflow那么受欢迎? CNTK分析。 Reference Tensorflow在Windows10的安装 在Windows玩了很久的Tensorflow,但由于某些不可抗因素,硬是格式化了Windows。格式化完毕后立马装上Anaconda3,结果就在一个大坑里默默流眼泪——Tensorflow不支持最新的Python3.6。pip的效率是真的不算高,于是在下载都能失败好几次的情况下,我硬是被卡了半个多月。这篇教程算是给整个Tensorflow的Win平台填上最新的坑。(近乎所有的教程都是在Python3.6发布之前写的) 首先下载Anaconda3 注意,Tensorflow在Win环境下只支持Python3 同时,Anacon

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

Python-OpenCV学习(十)用GrabCUt算法进行图片前景的提取

用GrabCUt算法进行图片前景的提取(这个是之前解决词云图片问题的一种方法):grabCut算法的实现步骤为: 在图片中定义含有(一个或多个)物体的矩形。 矩形外的区域被自动认为是背景 对于用户定义的矩形区域,可用背景中数据来区分是前景还是背景 用高斯混合模型(GMM)来对被禁和前景见面,并将未定义的像素标记为可能的前景或背景 图像中的每一个像素都被看作通过通过虚拟变与周围像素连接,而每条边都有一个属于前景或背景的概率这基于它和周围像素颜色上的相似性 每一个像素(即算法中的节点)会与前一各前景或背景节点连接,与下图类似: -在节点连接完成后,用图论中最大流最小割的方法来分割: 例子: import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('statue_small.jpg') mask = np.zeros(img.shape[:2],np.uint8) bgdModel = np.zeros((1,65),np.float64) fgdModel = np.zeros((1,65),np.float64) rect = (100,1,421,378) cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT) mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') img = img*mask2[:,:,np.newaxis] plt.subplot(121), plt.imshow(img) plt.title("grabcut"), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(cv2.cvtColor(cv2.imread('statue_small.jpg'), cv2.COLOR_BGR2RGB)) plt.title("original"), plt.xticks([]), plt.yticks([]) plt.show() 结果:例程先创建一个与加载图像相同形状的mask: import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('statue_small.jpg') mask = np.zeros(img.shape[:2],np.uint8) 创建以0填充的前景和背景模型: bgdModel = np.zeros((1,65),np.float64) fgdModel = np.zeros((1,65),np.float64) 可以用数据填充这些模型,要准备一个标识出想要各类的对象的矩形框来初始化GrabCut算法。背景和前景要基于这个矩形框来决定:这边用下面一行代码来决定: rect = (100,1,421,378) 其实可以用opencv提供的窗口函数自己写一个取前景;使用致敬的空模型来运行GrabCUt算法,实际上是用一个矩形框来初始化这个操作: cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT) fgbModel后面是一个算法的迭代次数 之后mask编程0~3之间的值,值中0~2转换为01和3转为1 保存在mask2中, mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') img = img*mask2[:,:,np.newaxis]

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

DC学院学习笔记(九):利用Python进行数据库操作

用python进行数据库操作,感觉蛮酷的。 PyMySQL 安装 OK,最新的安装已经支持pip。 pip install pymysql 创建名为user的表格以备后续操作 CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(255) COLLATE utf8_bin NOT NULL, `password` varchar(255) COLLATE utf8_bin NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ; 利用Python进行数据库操作 连接MySQL数据库 创建新的数据 数据的调用 连接MySQL数据库 import pymysql.cursors #使用pymysql指令来连接数据库 connection=pymysql.connect(host='',user='',password='',db='',charset='',cursorclass=pymysql.cursors.DictCursor ) host:要连接的数据库的IP地址 user:登录的账户名,如果登录的是最高权限账户则为root password:对应的密码 db:要连接的数据库,如需要访问上节课存储的IRIS数据库,则输入'IRIS' charset:设置编码格式,如utf8mb4就是一个编码格式 cursorclass:返回到Python的结果,以什么方式存储,如Dict.Cursor是以字典的方式存储 创建新的数据 try: #从数据库链接中得到cursor的数据结构 with connection.cursor() as cursor: #在之前建立的user表格基础上,插入新数据,这里使用了一个预编译的小技巧,避免每次都要重复写sql的语句 sql="INSERT INTO `USERS`(`email`,`password`) VALUES (%s,%s)" cursor.execute(sql,('webmaster@python.org','very_secret')) #执行到这一行指令时才是真正改变了数据库,之前只是缓存在内存中 connection.commit() 调用数据 with connection.cursor() as cursor: sql = "SELECT `id`,`password` FROM `user` WHERE `email`=%s" cursor.execute(sql,('webmaster@python.org',)) #只取出一条结果 result=cursor.fetchone() print(result) #最后别忘了关闭连接 finally: connection.close() 结果 {'password': 'very-secret', 'id': 1}

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

Spark学习[一] Spark IntelliJ IDEA 开发环境搭建(Scala项目)- Hello World

1.工具版本说明 Intellij IDE 官网下载安装,此处省略...JDK Version: 1.8.0_151 (提前安装好)Intellij IDE Version: 以下3个无需单独下载安装,在intellij中以插件形式安装:Scala Version: 2.11.0 Spark Version: 2.1.1SBT Version: 0.13.17 2. Scala插件安装 IntelliJ IDEA-> Perferences -> Plugins -> 搜索 Scala安装后如图: 3. 创建Scala项目(SBT) 注意:SBT版本号选择0.13.x版本,不用选择1.0+版本(会报一个idle_shell找不到的异常) 4.SBT资源库配置为国内 默认SBT访问国外资源网站下载资源是超级慢的,将其改为国内镜像在目录(mac电脑) :/Users/lewis.lht/.sbt目录下新建文件repositories,添加内容为(以下内容[]部分不用修改): local alibaba:http://maven.aliyun.com/nexus/content/groups/public/ alibaba-ivy:http://maven.aliyun.com/nexus/content/groups/public/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] repo2:http://repo2.maven.org/maven2/ ivy-typesafe:http://dl.bintray.com/typesafe/ivy-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] ivy-sbt-plugin:http://dl.bintray.com/sbt/sbt-plugin-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] typesafe-releases: http://repo.typesafe.com/typesafe/releases typesafe-ivy-releasez: http://repo.typesafe.com/typesafe/ivy-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] 5.修改src和test目录分别为sources root 不知何原因,我新建的scala项目的src/main/scala和src/test/scala默认非sources root,将其修改为sources root。否则无法新建scala class文件和packagesa) 选中/src/main/scala目录后,右键Make Directory as->Sources Rootb) 选中/src/test/scala目录后,右键Make Directory as->Test Sources Root 6.在sbt配置文件build.sbt中,添加Spark依赖 build.sbt name := "sparkexcercise" version := "0.1" scalaVersion := "2.11.0" libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.1.1" 如图示: 7.sbt执行编译 打开SBT Projects面板,选择刷新按钮(Refresh all SBT Projects)或者打开SBT SHELL窗口,执行compile命令,完成依赖包下载和项目编译编译成功后如下图: 8.新建Spark Hello Word Object,并复制下面代码: package org.lewis import org.apache.spark.sql.SparkSession object HelloWorld { def main(args: Array[String]): Unit = { if (args.size == 0) { println("input file path !") System.exit(1) } val fpath = args(0) val spark = SparkSession .builder .appName("HdfsHelloWorld") .getOrCreate() val file = spark.read.textFile(fpath).rdd //flatMap将一个输入元素rdd,转为多个元素rdd val m = file.flatMap(line => line.split(" ")) //为每个word,赋值其个数为1,转为pair rdd val g = m.map((_, 1)) //val g = m.map(word=>(word,1)) // 等价于这种写法,_代表当前元素 //按照word为key进行reduce,并对其value累加,(x,y)分别为上一个元素value和当前元素的value val r = g.reduceByKey(_ + _) //val r = g.reduceByKey((x,y)=>x+y) // 等价于这种写法,_代表当前元素 r.collect().foreach(println) //上面也可以全部简写为: //file.flatMap(line=>line.split(" ")).map((_,1)).reduceByKey(_+_).collect().foreach(println) } } 9.配置Run Config //采用local本地模式执行,确保你的SparkOverview.txt文件存在 VM options: -Dspark.master=local Program arguments: /Users/lewis.lht/Downloads/SparkOverview.txt 9.执行 仅演示了local模式运行,故不需要spark集群环境

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

通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同。不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve 或 reject Promise 中申明 resolve 或 reject 后应该做什么(回调) 在 jQuery 中 var deferred = $.Deferred(); var promise = deferred.promise(); 在 ES6 中 var deferred = Promise.defer(); var promise= defered.promise; MDN 宣布 Deferred 在 Gecko 30 中被申明为过期,不应该再使用,而应该用 new Promise() 来代替。关于 new Promise() 将在后面说明。 jQuery 的 Deferred/Promise jQuery 中最常用的 Promise 对象是 $.ajax() 返回的,最常用的方法不是 then,而是 done、fail 和 always。除了 $.ajax() 外,jQuery 也提供了 $.get()、$.post() 和 $.getJSON() 等简化 Ajax 调用,它们返回的和 $.ajax() 的返回值一样,是个 Promise 对象。 实际上 $.ajax() 返回的是一个 jqXHR 对象。但 jqXHR 实现了 jQuery 的 Promise 接口,所以也是一个 Promise 对象。 done()、fail() 和 always() done() 添加 deferred.resolve() 的回调,fail() 添加 deferred.reject() 的回调。所以在 Ajax 调用成功的情况下执行 done() 添加的回调,调用失败时执行 fail() 添加的回调。但不管成功与否,都会执行 always() 添加的回调。 这里 done()、fail() 和 always() 都是以类似事件的方式添加回调,也就意味着,不管执行多次次 done()、fail() 或 always(),它们添加的若干回调都会在符合的条件下依次执行。 一般情况下会这样执行 Ajax // 禁用按钮以避免重复提交 $("#theButton").prop({ disabled: true }); // 调用 Ajax 提交数据,假设返回的是 JSON 数据 var jqxhr = $.ajax("do/example", { type: "post", dataType: "json", data: getFormData() }); jqxhr.done(function(jsonObject) { // Ajax 调用成功 console.log("success with data", jsonObject); }).fail(function() { // Ajax 调用失败 console.log("failed") }).always(function() { // 不管成功与否,都会执行,取消按钮的禁用状态 $("#theButton").prop({ disabled: false }); }); 上面是最普通最常用的用法,但是在一个项目中总是这么写 Ajax,有点累,稍微约定一下再封装一下就使用起来就会便捷得多。首先,假设我们定义返回的 JSON 是这样的格式: { "code": "int, 0 表示成功,其它值表示出错", "message": "string, 附加的消息,可选", "data": "object,附加的数据,可选 } 然后为项目公共类 app 定义一个 ajax 方法 app.ajax = function(button, url, data) { if (button) { button.prop("disabled", true); } return $.ajax(url, { type: "post", dataType: "json", data: data }).done(function(json) [ if (json.code !== 0) { showError(json.message || "操作发生错误"); } }).fail(function() { showError("服务器错误,请稍后再试"); }).always(function() { if (button) { button.prop("disabled", false); } }); }; // 调用 app.ajax("do/example", getFormData()).done(function(json) { if (json.code === 0) { // 只需要处理正确的情况啦 } }); 不过还是有点不爽,如果不需要判断 json.code === 0 就更好了。这个……可以自己用一个 Deferred 来处理: app.ajax = function(button, url, data) { if (button) { button.prop("disabled", true); } var deferred = $.Deferred(); $.ajax(url, { type: "post", dataType: "json", data: data }).done(function(json) [ if (json.code !== 0) { showError(json.message || "操作发生错误"); deferred.reject(); } else { deferred.resolve(json); } }).fail(function() { showError("服务器错误,请稍后再试"); deferred.reject(); }).always(function() { if (button) { button.prop("disabled", false); } }); return deferred.promise(); }; // 调用 app.ajax("do/example", getFormData()).done(function(json) { // json.code === 0 总是成立 // 正常处理 json.data 就好 }); 注意,这里已经不是直接返回 $.ajax() 的结果 jqXHR 对象了,返回的是新建 Deferred 对象的 promise 对象。 复习了 Ajax,现在需要切入正题,找到 jQuery Promise 和 ES6 Promise 接近的地方——then()。 jQuery deferred.then() 在 jQuery 1.8 以前(不含 1.8,比如 jQuery 1.7.2),deferred.then() 就是一个把 done() 和 fail() 放在一起的语法糖。jQuery 在 1.8 版本的时候修改了 deferred.then() 的行为,使 then() 的行为与 Promise 的 then() 相似。从 jQuery 的文档可以看到 1.8 版本的变化——干掉了 callback,换成了 filter: // version added: 1.5, removed: 1.8 deferred.then( doneCallbacks, failCallbacks ) // version added: 1.7, removed: 1.8 deferred.then( doneCallbacks, failCallbacks [, progressCallbacks ] ) // version added: 1.8 deferred.then( doneFilter [, failFilter ] [, progressFilter ] ) 可以简单的把 callback 当作一个事件处理,值用于 callback 之后一般不会改变;而 filter 不同,一个值传入 filter 再从 filter 返回出来,可能已经变了。还是举个例子来说明 var deferred = $.Deferred(); var promise = deferred.promise(); promise.then(function(v) { console.log(`then with ${v}`); }).done(function(v) { console.log(`done with ${v}`); }); deferred.resolve("resolveData"); 在 jQuery 1.7.2 中的结果 then with resolveData done with resolveData 在 jQuery 1.8.0 中的结果 then with resolveData done with undefined 从上面来看,jQuery 的 deferred.then() 语义和 ES6 Promise.then() 语义基本一致。如果把上面的 app.ajax 换成 then() 实现会有助于对 ES6 Promise 的理解。 app.ajax = function(button, url, data) { if (button) { button.prop("disabled", true); } return $.ajax(url, { type: "post", dataType: "json", data: data }).then(function(json) { if (json.code !== 0) { showError(json.message || "操作发生错误"); return $.Deferred().reject().promise(); } else { return $.Deferred().resolve(json).promise(); } }, function() { showError("服务器错误,请稍后再试"); deferred.reject(); }).always(function() { if (button) { button.prop("disabled", false); } }); }; // 调用方式没变,用 done,也可以用 then app.ajax("do/example", getFormData()).done(function(json) { // json.code === 0 总是成立 // 正常处理 json.data 就好 }); 从 jQuery Promise 到 ES6 Promise 上面的代码太长,提炼一下关键部分(示意,不能运行) var promise = $.ajax(); promise.then(function(data) { // resolve return data.code ? new Promise().reject() : new Promise().resolve(data); // 如果没有错,就返回一个新的 promise,并使用 data 来 resolve, // 也可以直接返回 data, // 这样后面 then 的 resolve 部分才能收到数据 }, function() { // rejected }); // 调用阶段 promise.then(function(data) { // 处理 data }); 也许你没注意到,其实上面的代码基本上就是 ES6 的 Promise 了。下面正式用 ES6 Promise 改写上面的示意代码 var promise = new Promise(function(resolve, reject) { $.ajax().then(resolve, reject); // 上面这句没看懂?那换成这样你一定会懂 // $.ajax().then(function(data) { // resolve(data); // }, function() { // reject(); // }); }).then(function(data) { return data.code ? Promise.reject() : Promise.resolve(data); // 这里 Promise.resolve(data) 同样可以直接替换为 data }); // 调用没变 promise.then(function(data) { // 处理 data }); 怎么样,差别不大吧。不知不觉就会 ES6 Promise 了! ES6 的 Promise 上面已经把 ES6 的 Promise 带出来了,现在只需要把常用方法列出来作为参考即可 注意,小写的 promise 表示 Promise 对象 new Promise(executor),产生一个新的 Promise 对象 executor(resolve, reject)executor、resolve 和 reject 均为函数,在 executor 中,正确处理调用 resolve() 返回数据,异常处理直接 throw new Error(...) 或调 reject() 返回数据。 Promise.resolve(data),产生 Promise 对象并 resolve Promise.reject(),产生 Promise 对象并 reject promise.then(onResolve, onReject),然后……继续处理 promise.catch(onReject),project.then(null, onReject) 的语法糖,和 jQuery 的 promise.fail() 差不多(但不同)。 参考 ECMAScript 2015 Language Specification - ECMA-262 6th Edition Deferred - Mozilla | MDN Promise - Mozilla | MDN Deferred Object | jQuery Documentation

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

C++学习笔记第三天:类、虚函数、双冒号

类 class Box { public: double length; // 盒子的长度 double breadth; // 盒子的宽度 double height; // 盒子的高度 }; 类成员的作用域: public:公共成员。访问权限:外部、子类、本身 protected:受保护成员。访问权限:子类、本身 private:私有成员。访问权限:本身 构造函数 跟其他语言一样,使用类名作为函数名,无返回值,可以有参数。 #include <iostream> using namespace std; class Line { public: void setLength( double len ); double getLength( void ); Line(); // 这是构造函数 private: double length; }; // 成员函数定义,包括构造函数 Line::Line(void) { cout << "Object is being created" << endl; } void Line::setLength( double len ) { length = len; } double Line::getLength( void ) { return length; } // 程序的主函数 int main( ) { Line line; // 设置长度 line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl; return 0; } 如果是带参数的构造函数,可以使用初始化列表: Line::Line( double len): length(len) { cout << "Object is being created, length = " << len << endl; } 上面的语法等同于如下语法: Line::Line( double len) { cout << "Object is being created, length = " << len << endl; length = len; } 如果有多个参数,中间用逗号隔开: Line::Line( double len): length(len), para02(var02) { cout << "Object is being created, length = " << len << endl; } 另外,初始化列表并不是构造函数专用的,类的普通成员函数也可以使用。 析构函数 这个挺新鲜的,作用跟构造函数正好相反,在对象被销毁的时候执行。 无返回值,无参数,所以无法重载,一个类只能有一个析构函数 函数名也是与类同名,只需要在前面加一个波浪线前桌:~ 在析构函数中,主要用来销毁在构造函数或成员方法里 new 出来的对象或指针,最常用的就是:delete obj #include <stdio.h> #include <iostream> #include <vector> using namespace std; struct CP { int a; int b; }; class TEST { public: CP* compound; int num; TEST(){ compound = new CP(); cout << "create a new TEST obj" << endl; }; ~TEST(){ cout << "delete TEST obj" << endl; delete compound; }; }; 类的继承 跟JAVA不同,C++中允许一个类继承多个父类: #include <iostream> using namespace std; // 基类 Shape class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 基类 PaintCost class PaintCost { public: int getCost(int area) { return area * 70; } }; // 派生类 class Rectangle: public Shape, public PaintCost { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // 输出对象的面积 cout << "Total area: " << Rect.getArea() << endl; // 输出总花费 cout << "Total paint cost: $" << Rect.getCost(area) << endl; return 0; } 输出: Total area: 35Total paint cost: $2450 虚函数 这个不太好理解,只能按照别人的描述硬性记忆:在类的成员函数前面加 virtual 表示该成员函数为虚函数。 虚函数在C++中的作用不低,很多官方的源码中都存在大量的虚函数 目前位置能理解的作用包括: 1、允许用基类的指针来调用子类的这个函数: class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class B : public A { public: void foo() { cout<<"B::foo() is called"<<endl; } }; int main(void) { A *a = new B(); a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! return 0; } 2、通过“纯虚函数”实现抽象类 虚函数: virtual ReturnType funtion1(params...); 虚函数在基类中可以有默认实现,派生类也可以覆盖; 但如果在基类中没有默认实现,那么派生类必须具体实现。 纯虚函数: virtual ReturnType funtion1(params...)=0; 在虚函数声明的后面加“=0”就表示这是一个纯虚函数,含有纯虚函数的类成为抽象类。 纯虚函数用来规范派生类的行为,即接口。派生类中必须对这个纯虚函数进行具体实现。 抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。 对虚函数的理解,有一个很好的比方: 比如你有个游戏,里面有个含有纯虚函数 [攻击] 的抽象类 [怪物],然后有三个派生子类 [狼]、[蜘蛛]、[蛇] 都继承了 [怪物],并且都各自实现了自己独特的 [攻击] 函数。 那在出现怪物的时候就可以定义一个 虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接:怪物[i]->攻击() 攻击玩家就行了 Monster *pMonster[3]; pMonster[0] = new Wolf(); //初始化一匹狼 pMonster[1] = new Spider(); //初始化一只蜘蛛 pMonster[2] = new Snake(); //初始化一条蛇 for(int i=0; i<3; i++){ pMonster[i] -> attack(); //攻击 } 双冒号(::) 1、调用 namespace 中的成员时,需要用 :: 2、在类的外部定义成员函数时,需要用:: 3、区别两个类中同名的成员变量或者函数时,需要用:: 4、在成员函数内部调用同名的全局变量时,需要用:: 5、调用类的静态成员函数时,可以用:: 宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒

资源下载

更多资源
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部分的功能。

用户登录
用户注册