nodejs开发解决方案
1.2. 统一环境
开发环境
- nvm
- nrm
- nodejs 0.10.38
- node-inspector
部署环境
- nvm
- nrm
- iojs 2.x
- pm2
- nginx
异步流程控制:Promise是唯一选择,而且从一开始就要强制使用,绝不可忽略,这关系到设计思维的巨大差异,甚至关系到我们是否真正能够在 node.js方向坚持下来。我们用Q.js,和前端Angular.js使用的微缩版Q.js保持一致,减少学习周期。
1.4. 启动开发模式
因为我们在开发过程中总是希望修改后立即看到效果,而不是每次都要终止进程并重启。
supervisor 可以帮助你实现这个功能,它会监视你对代码的改动,并自动重启 Node.js
开发模式我推荐 supervisor
安装
npm install --save supervisor
启动
supervisor app.js or supervisor www/bin
我的实践是把package.json里的start
"scripts": {
"d": "node-debug app.js",
"start": "./node_modules/.bin/supervisor app.js"
}
然后
npm start
还有一个库也不错,叫nodemon
see http://nodemon.io/
1.5. 调试模式
推荐node-inspector
安装
npm install --save node-inspector
启动
node-inspector app.js or node-debug www/bin
我的实践是把package.json里的d里
"scripts": {
"d": "node-debug app.js",
"start": "./node_modules/.bin/supervisor app.js"
}
然后执行
npm run d
npm run命令详解,见https://github.com/i5ting/npm-run-test
1.6. 启动产品上线模式
产品模式我们推荐使用pm2
pm2是非常优秀工具,它提供对基于node.js的项目运行托管服务。它基于命令行界面,提供很多特性:
- 内置的负载均衡器(使用nodecluster module)
- 以守护进程运行
- 0s(不间断)重启
- 为ubuntu/ CentOS 提供启动脚本
- 关闭不稳定的进程(避免无限死循环)
- 基于控制台监控
- HTTP API
- 远程控制以及实时监控接口
pm2使用nodecluster构建一个内置的负载均衡器。部署多个app的实例来达到分流的目的以减轻单app处理的压力。
安装pm2
sudo npm install -g pm2
查看基本帮助文档
Basic Examples: Start an app using all CPUs available + set a name :
$ pm2 start app.js -i 0 --name "api" Restart the previous app launched, by name :
$ pm2 restart api Stop the app :
$ pm2 stop api Restart the app that is stopped :
$ pm2 restart api Remove the app from the process list :
$ pm2 delete api Kill daemon pm2 :
$ pm2 kill Update pm2 :
$ npm install pm2@latest -g ; pm2 updatePM2 More examples in https://github.com/Unitech/pm2#usagefeatures Deployment help: $ pm2 deploy help
上面基本是我们比较常用的
1.7. pm2的最佳实践
把启动写到json配置文件中
// 20150531071243
// https://raw.githubusercontent.com/RocketChat/Rocket.Chat/master/pm2.production.json {
"apps": [
{
"name": "rocket.chat.0",
"max_memory_restart": "1024M",
"log_date_format": "YYYY-MM-DD HH:mm:ss SSS",
"script": "/var/www/rocket.chat/bundle/main.js",
"out_file": "/var/log/rocket.chat/app.log",
"error_file": "/var/log/rocket.chat/err.log",
"port": "8080",
"env": {
"CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net",
"MONGO_URL": "mongodb://localhost:27017/rocketchat",
"MONGO_OPLOG_URL": "mongodb://localhost:27017/local",
"ROOT_URL": "http://rocket.chat",
"PORT": "8080"
}
},
{
"name": "rocket.chat.1",
"max_memory_restart": "1024M",
"log_date_format": "YYYY-MM-DD HH:mm:ss SSS",
"script": "/var/www/rocket.chat/bundle/main.js",
"out_file": "/var/log/rocket.chat/app.log",
"error_file": "/var/log/rocket.chat/err.log",
"port": "8081",
"env": {
"CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net",
"MONGO_URL": "mongodb://localhost:27017/rocketchat",
"MONGO_OPLOG_URL": "mongodb://localhost:27017/local",
"ROOT_URL": "http://rocket.chat",
"PORT": "8081"
}
},
{
"name": "rocket.chat.2",
"max_memory_restart": "1024M",
"log_date_format": "YYYY-MM-DD HH:mm:ss SSS",
"script": "/var/www/rocket.chat/bundle/main.js",
"out_file": "/var/log/rocket.chat/app.log",
"error_file": "/var/log/rocket.chat/err.log",
"port": "8082",
"env": {
"CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net",
"MONGO_URL": "mongodb://localhost:27017/rocketchat",
"MONGO_OPLOG_URL": "mongodb://localhost:27017/local",
"ROOT_URL": "http://rocket.chat",
"PORT": "8082"
}
},
{
"name": "rocket.chat.3",
"max_memory_restart": "1024M",
"log_date_format": "YYYY-MM-DD HH:mm:ss SSS",
"script": "/var/www/rocket.chat/bundle/main.js",
"out_file": "/var/log/rocket.chat/app.log",
"error_file": "/var/log/rocket.chat/err.log",
"port": "8083",
"env": {
"CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net",
"MONGO_URL": "mongodb://localhost:27017/rocketchat",
"MONGO_OPLOG_URL": "mongodb://localhost:27017/local",
"ROOT_URL": "http://rocket.chat",
"PORT": "8083"
}
}
]
}
部署
pm2 deploy ecosystem.json production setup
第一个傻瓜原则,你的机器有几核,你就几个实例
Start an app using all CPUs available + set a name :
$ pm2 start app.js -i 0 --name "api"
上面的配置文件了配置了4个,你应该能自己估算出点什么
第二个傻瓜原则,想机器瘫痪么?最简单的办法是内存不足,怎么样能防止内存被吃尽呢?
很简单,和lru cache一样,设置最大可用内存,防止内存用爆
参数里
--max-memory-restart <memory> specify max memory amount used to autorestart (in megaoctets)
配置文件了也一样
"max_memory_restart": "1024M",
4个实例,每个可占用内存为1G,那么你应该能自己估算出点什么
第三个傻瓜原则,敏感信息咋办?有2种办法
- 使用config/default.example.json。部署的时候拷贝一份,然后按需修改
- 使用pm2的env,在环境变量里配置,pm2的json是在服务器上生成的,每个服务器都要生成一次的
推荐pm2的env这种方式,相对更简单点
第四个傻瓜原则,集群状态下的应用应该是stateless的(无状态),不能依赖代码去做一些事儿的,比如自己写队列处理cache
因为每个实例都是独立的,你读写不是全局的,一定会有各种问题,尽量使用第三方独立的服务,比如配置文件(非实例下面),比如redis等缓存,db等
1.8. pm2高级用法
1.8.1. reload
启动的时候会指定一个名字,以后根据该名字,进行特定操作
pm2 reload some-app
它的好处是0秒延时,可以和nginx -s reload
媲美
1.8.2. monit
pm2 monit
更多内容 https://github.com/Unitech/PM2#monitoring
1.8.3. 日志
更多内容 https://github.com/Unitech/PM2#log-facilities
$ pm2 logs
$ pm2 logs big-api
$ pm2 flush # Clear all the logs
1.8.4. web
npm run web
访问 http://127.0.0.1:9615
1.8.5. 开机启动
pm2 startup centos
注意:示例的package.json里给出的是centos里增加开机启动项,如果是其他操作系统,请自己更改
更多内容 https://github.com/Unitech/PM2#startup-script-generation
$ pm2 startup <ubuntu|centos|gentoo|systemd>
开机启动,还要注意的一点是要保存一次pm2运行数据的
pm2 save
1.9. 要不要nginx 或者 haproxy ?
nginx
- 主要做反向代理和静态资源处理(如果没有cdn,就把public下的内容放到nginx里)
- 负载
- 阻止了很多常见的攻击和慢客户端
nginx负载对应多台机器,每台机器里起多个(cpu个数)实例,单机负载使用pm2管理。
nginx和haproxy都是针对多台机器的负载,功能差不过,使用和插件方面,nginx稍强一点,知名度更高一点
1.10. 另外一种部署方式
passenger是rails部署时常用的服务器,不过庆幸的是这帮货出了node版本,而且性能不错
有兴趣的可以去研究一下 nginx + passenger
1.11. mongodb的部署
- 安全 https://cnodejs.org/topic/54cdd026ef1b48510c27e07a
- 集群 http://www.linuxidc.com/Linux/2015-02/113296.htm
1.12. redis部署
http://www.linuxidc.com/Linux/2014-07/104306.htm
1.13. 简单压测
- apache ab
- wrk
1.14. node cluster和nginx负载性能比较
todo
别人测试的node的性能稍高,不过我还是想自己测测
1.15. 性能调优
todo
1.16. keeplive
- http://www.bubuko.com/infodetail-260176.html
1.17. 监控
- newrelic https://cnodejs.org/topic/53fde58d7c1e2284785cd39e
1.18. 资源
- http://promotion.pm2.io/
- https://github.com/Unitech/PM2
- https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
如果你正在找Node.js的学习资料及指南,那么请继续(阅读),我们的教程将会覆盖即时聊天应用、API服务编写、投票问卷应用、人物投票APP、社交授权、 Node.js on Raspberry Pi等等。
以下是Node.js入门的简单介绍,如果你对Node.js略有了解可以直接跳过此部分。
那什么是Node.js呢?
Node.js是迄今运用最多的服务端JavaScript运行时环境,使用JavaScript开发跨平台的实时WEB应用。
Node.js基于Google的V8 JavaScript引擎。基于事件驱动,非阻塞的输入输出模型,这也使得其高效而轻量。
Node.js的强大之处在于其能力支持数据密级性的交互应用,因为这类应用的函数围绕着用户事件,数据I/O和数据流的处理。对于JSON的API,Node.js同样显得很神奇,它是单页WEB应用的心脏和灵魂。
Node.js的流行程度可以感觉得到,像eBay、target、City Group、Sony、Uber、LinkedIn、Medium、Netflix等等的大公司都有在他们的web项目中应用。
怎样学习Node.js呢?
Node.js的开发者来自全球,他们用Node.js开发复杂交互的,数据密集型的WEB Apps和网站。同时网上有着大量的资源和教程教你怎样构建自己的Node.js应用。
我们不防看看Node.js大神针对Web Apps写的Node.js最佳指南。
我们所覆盖的指南将包括针对初学者的Node.js、中级指南,同时还有教你怎样构建复杂的Node.js项目。
对于完全的Node.js初学者, 在深入挖掘本文章后续提到的学习项目之前,一步步按照airpair.com上面入门指南的要点 或 Node.js入门指南 之类的文章学习是不错的选择。Nodeschool.io是另一个比较好的网站,上面有着非常多的资料,可以学习基本的node.js及相关的技术。
通过Express框架和Socket.io构建即时通讯APP
将一个新技术学到一定高度的最好方式就是通过功能性的应用了。在这个指南中,你将学习使用Express框架和Socket.io构建即时通讯应用,这些技术可以使用基于事件的双向通信。在这个指南中,你还将使用JavaScript模板引擎Jade。
我们要介绍的指南由Krasimir Tsonev所撰写,发布在tutsplus.com上面,从node.js的环境搭建,使用Express框架的后端服务,到最后使用Jade模板引擎的前端UI开发,覆盖了所有前端到后端的方方面面。
你可以在后面这个链接中找到这篇指南: 即时通讯(Node.js Tutorial – Real Time Chat) .
使用Swagger创建Restful API
这个精心设计的教程解释了如何使用Swagger来创建Rest API,并且包括了Rest API应该支持的所有操作(CRUD,创建,查询,更新,删除)。这个例子是由来自scotch.io的Samuela Zara提供的,它实现了管理电影集合的Rest API。
Swagger是一个非常强大的框架来描述REST APIs,它提供了交互式的API文档编辑,客户端sdk生成以及发现服务。通过使用Swagger,你所书写的API将更容易被大家所理解并且使用。
在这个教程中,Samuela一开始先教会大家如何安装node.js的Swagger模块,然后介绍了Swagger提供的模拟模式。通过这个模式,API开发者可以先集中精神进行API本身的设计,而不用写一行的代码。当这个API结构被设计完成之后,教程开始带领大家具体实现获取电影,增加/修改电影以及删除电影的操作。
你可以通过Restful API in Node.js using Swagger这个链接来访问该教程。
在 Node.js 中使用 Nodal 建立 API Services
在大多数模块和框架之上,你就不会需要再建立任何简陋的 JavaScript/Node.js 项目。为了多平台(移动端,web,IOT)产品开发,面向服务的架构是关键的,而本教程就将带你更进一步。
在本教程中,Keith Horwood 利用 Nodal 框架在 Node.js 中来创建 API services,并让这一切看起来极其简单。Nodal 是一个可扩展的,以意见为依据的全服务框架,它帮助数据中心加快在 Node.js 基础上的API创建。
在本教程中,你将会在开发 MVC (模型,控制器和视图)之前安装 node.js 环境,安装 Nodal 和 postgreSQL。
你可以在这里找到本教程:在 Node.js 中使用 Nodal 建立API Services.
Node.js Apps - 使用通行证进行社交认证
社交认证几乎随处可见,因为我们绝大多数人在Facebook 、Twitter和Google这样的某个社交网络上都有自己的账号。社交网络认证的工作过程是使用已有的社交网络证书进行单点登录,同时可以登录到其它的程序。
在本教程中,你会构建一个简单的Node.js程序,通过使用通行证作为中间件使用社交认证进行登录。本教程由Agraj Mangal编写,发表在tutsplus.com网站上。
要获得本教程可访问链接Node.js Apps - Social Authentication with Passport.
使用Rethink DB和Node.js开发投票App
本教程主要针对的是对Node.js有基本理解的初学者。在本教程中,你能通过开发一个简单的投票app学习Node.js,该程序给用户提供投票的三个选项,并提供投票人数的实时更新。
Angular和angural素材设计库用于程序的前端设计,Node.js用于服务器端,rethink DB用来存储投票数据和相关联的用户数据。
通过编写完成这样一个简单的程序,你就可以掌握创建整个程序的方方面面。
要获得本教程可访问- Polling App using Rethink DB and Node.js.
角色投票系统 – Node.js, React, MongoDB and Socket.io
这个教程是为有一定基础的nodejs开发人员量身定做的,如果你是一个nodejs的初学者,那么这个教程并不适合阅读。这是一篇由Sahat Yalkabov编写的经过精心组织的教程,目的是为多人在线游戏(Eve Online)开发一个角色投票应用,这是一个功能完整的项目。Eve Online是一个多人在线游戏,每个玩家都有一个3D形象来代表他们的角色。
这篇教程覆盖了一下这些内容:使用Node.js Express 框架创建REST API, 使用MongoDB进行数据的存储,使用Socket.IO实时跟踪在线的访问者,使用React(和Flux)进行服务器端的页面绘制,并且最终将这个引用部署到云端。通过这个教程,你不仅能建成一个对Eve Online进行角色头像投票的系统,而且还可以通过充满乐趣的方式学习到许多的知识。
你可以通过下面的链接访问这个教程 - Character Voting App – Node.js, React, MongoDB and Socket.io
使用 Node.js 和 Reactive.js 的 WI-FI 仪表板
这个教程是由 Marcello La Rocca 在 Sitepoint.com 上编写的,适合中级的 Node.js 编程者。Marcello 的引领来自之前的系列教程,它还引导建立了一个仪表板添加更多关于周围可连接 Wi-Fi 的信息。
在这个教程中,你实现的服务器运行在Ubuntu上,做一点小修改也可以运行在windows和mac上。服务器实现的扩展来自于 Marcello 之前的教程 - 使用 Node.js创建电池。实现服务器搭建之后,你编写客户端和用户接口并使用HTML模板给当前的 Wi-Fi 列表。
你可以找到这个教程 使用 Node.js 和 Reactive.js 编写WI-FI 仪表板。
测试驱动的开发 - Node.js 和 Mocha
这篇由Semaphoreci.com提供的教程将交会你如何使用Mocha来进行单元测试和集成测试。
Mocha是一个JavaScript测试框架,它既可以运行在浏览器中,也可以运行在Nodejs环境中。Mocha将按照顺序执行所有的测试,并将出现的未捕获异常映射到相应的测试用例上。
你可以通过使用npm来引入mocha模块。这个教程中的例子实现了一个颜色转换程序,这个程序将RGB转换成16进制形式。这个教程还创建了一个web服务器来测试异步代码。
你可以通过下面的链接Test Driven Development – Node.js and Mocha找到这个教程。
在树莓派上使用Node.js
这篇Node.js教程是"在创造中学习"(learning through making)系列的一部分,该系列由Dave Johnson编写,发表在thisdavej.com网站上。通过本教程,你能学会在树莓派2和树莓派3上安装Node.js。本教程自始至终主要关注的是在树莓派上安装Node.js。 学完本教程后,你可以进一步学习本系列中的其它教程,以便学会在树莓派上使用Node.js,教程包括“探索使用Node.js在树莓派上创建因特网web服务器”和“不用编码而只使用node.js创建web服务器”。
要获得本教程和其它相关的教程可访问Node.js on Raspberry Pi。
Node.js教程:开发情绪分析应用
这是另一篇优秀的教程,由Scott Rich编写,发表在IBM developerWorks上。本教程使用Node.js, Express框架, Sentiment模块和ntwitter模块开发了一个基于推特进行情绪分析的小型程序。 在本教程中,你将学习设置express框架,运行并测试hello Node.js程序,以确保框架工作正常,为程序添加情绪分析功能,并将程序连接到twitter,最后将它们整合在一起,以形成一个功能完整的程序。
在Twitter Sentiment Analysis App in Node.js上可以找到这篇教程。
贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2
当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤其是每当我修改很小东西的时候需要control+c
幸运的是我发现了一个非常棒的工具Nodemon
。 你可以利用以下的命令来安装
1
|
npm install -g nodemon
|
Nodemon 是一个令人惊叹的工具, 当你全局安装它以后, 可以通过 nodemon [file].js 来启动你的node.js scripts,它会告诉nodemon来监视你的script和scripts的所有变化, 这样的Node.js开发方式非常震撼以及让大大提高开发速度。
那么,生产环境又如何, 除非你用了heroku
,Nodejitsu
或者其它一些好的 Node.js 平台(也许它们有类似的功能), 但是碰巧你用了EC2 或者一些其它的云平台来运行你的Node.js app, 你如何能然保证这是一个始终运行的Node.js app
案就是PM2, PM2 是一个类似于Nodemon的工具,不同之处在于它用于生产环境, 和Nodemon相似的地方在于它会监控你的app的任何修改或者重新部署,但是有更好的一面, PM2 在遭遇到崩溃的时候,它会正确重启你的app。
PM2的优胜之处在于当你要将app需要多核处理的时候,PM2内部集成的负载均衡可以让你很容易的去指定运行多少个实例。
1
|
pm2 start app.js -i max
|
-i
参数目的是指定运行多少个实例,在这个例子中 PM2 使用了一个常量max
来扩展你的app运转到你最大的核数,不要忘记Node 平时只会运行在单核!
贴士 3: 轻松调试 Node.js apps
如果你从一个IDE重度集成的语言比如java 或者C# 转来调试Node.js, 你一定会感到很困扰, 大部分新加入node的开发者采用了’flow’的调试模式,从这一刻开始你最好的朋友就是console.log
但是依然有更常见的调试方式来代替, Node.js 内置了一个调试器你可以称为 node debug, 不过我更喜欢的 node-inspector
它们的github说 “Node Inspector 是一个使用Blink Developer Tools (以前称为WebKit Web Inspector)node.js调试器的界面,”
简而言之,node-inspector 可以让你用任何你想用的编辑器和chrome web tools来调试你的应用,这是多么的性感。
Node-inspector 可以让你做一些非常酷的事情,比如实时修改,单步调试,注入以及一堆其它非常酷的东西。
让我们来根据指示一步一步安装
https://github.com/node-inspector/node-inspector
贴士 4: Nodefly
一旦你有你的应用程序正常运行,你可能会问自己,你怎么可以监视它的性能和配置文件,以确保您的应用程序运行在最佳的速度。最简单的答案是一个卓越的服务,我称为Nodefly。
用简单的一行代码Nodefly开始监视你的应用程序内存泄漏,测量redis用了多久,mongo查询和一堆其它很酷的东西。
nodejs开发解决方案的更多相关文章
- 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)
1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...
- nodejs 开发服务端 部署到 iis 服务器环境 -- iisnode 安装问题解决记录
开发环境 nodejs: v10.15.3 windows: 10 iis: 10 需求: 用Nodejs开发了服务端,要部署到IIS 需要在IIS服务器上安装iisnode,结果遇到问题:安装不上 ...
- NodeJs 开发微信公众号(四)微信网页授权
微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...
- iOS关于模块化开发解决方案(纯干货)
关于iOS模块化开发解决方案网上也有一些介绍,但真正落实在在具体的实例却很少看到,计划编写系统文章来介绍关于我对模块化解决方案的理解,里面会有包含到一些关于解耦.路由.封装.私有Pod管理等内容:并编 ...
- Win7搭建NodeJs开发环境以及HelloWorld展示—图解
Windows 7系统下搭建NodeJs开发环境(NodeJs+WebStrom)以及Hello World!展示,大体思路如下:第一步:安装NodeJs运行环境.第二步:安装WebStrom开发工具 ...
- ionic+nodejs开发遇到的跨域和post请求数据问题
最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 开发环境搭建 项目地址 https://github.com/ytudt/nodejsApp 代码和问题都会在之后的学习 ...
- SharePoint 2013 本地开发解决方案以及远程调试
转自:http://www.cnblogs.com/jianyus/p/3523387.html 在SharePoint开发中,我们需要在部署有SharePoint环境的服务器中开发,这是一件让人很苦 ...
- nodejs开发指南读后感
nodejs开发指南读后感 阅读目录 使用nodejs创建http服务器; supervisor的使用及nodejs常见的调式代码命令了解; 了解Node核心模块; ejs模板引擎 Express 理 ...
- CentOS 7快速搭建Nodejs开发环境
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好.学习Nodejs首先需要会安装环境.这里我介绍如 ...
随机推荐
- [原创]JAVA号码工具类:实现手机固话号码判断与区号截取
工具类说明 该工具类主要是用于判断号码的类型,如果是手机类型,则返回号码前7位,便于后面继续判断号码归属地:如果是固话类型,则截取固话的区号,同样也是为了后面判断号码的归属地. 在获取到这些信息之后, ...
- http加密原理
HTTPS原理 客户端向服务器发送请求 服务器向客户端发送自己的证书 客户端验证证书的有效性(是否是可信用机构CA颁发的证书,如果不是则提出警告)并对比里面信息是否正确,不通过则立刻断开连接 向服务器 ...
- android学习十四(android的接收短信)
收发短信是每一个手机主要的操作,android手机当然也能够接收短信了. android系统提供了一系列的API,使得我们能够在自己的应用程序里接收和发送短信. 事实上接收短信主要是利用我们前面学过的 ...
- linux系统下crontab 配置启动定时任务
1 crontab -e 配置启动定时任务 */1 * * * * sh /home/admin/application/wd/core-python/getMemPositionFromAnaual ...
- priority_queue优先队列/C++
priority_queue优先队列/C++ 概述 priority_queue是一个拥有权值观念的queue,只允许在底端加入元素,并从顶端取出元素. priority_queue带有权值观念,权值 ...
- uasy-datetimebox的使用
最近整理Easyui控件的时候,对Easyui的DateBox控件和DateTimeBox控件进行了梳理,而我之所以将EasyUI的DateBox控件和DateTimeBox控件放在一起,归为一类,是 ...
- TP中单字母快捷函数总结
ThinkPHP中有许多使用简便的单字母函数,可以很方便开发者快速的调用,但是字母函数却不方便记忆,本文将所有的字母函数总结一下,以方便以后查找.1.U() URL组装 支持不同URL模式 U($ur ...
- RL for Robots
1.Robot gains Social Intelligence through Multimodal Deep Reinforcement Learning 这篇文章使用DQN去训练一个机器人,使 ...
- 如何给Eclipse添加一个JDK或JRE
第一: 第二: 第三: 第四:
- 可以将化学结构NMR图谱这样导入Word
在化学各个领域中,大家常常会用到ChemDraw化学绘图软件来绘制各种图形,ChemDraw因其出色的功能在全球范围内深受欢迎,但是一些用户朋友对于一些功能还不是很了解,需要通过一些教程来了解如何操作 ...