March 21, 2016
koa中生成器函数generator执行顺序详解
"\u003cp\u003e\u003cstrong\u003eES6的generator\u003c/strong\u003e \u003ca href=\"http://book.apebook.org/minghe/koa-action/co/start.html\"\u003ehttp://book.apebook.org/minghe/koa-action/co/start.html\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\nfunction* gen() {\n var a = yield \u0026#39;start\u0026#39;;\n console.log(a);\n var b = yield \u0026#39;end\u0026#39;;\n console.log(b);\n return \u0026#39;over\u0026#39;;\n}\nvar it = gen();\nconsole.log(it.next()); // {value: \u0026#39;start\u0026#39;, done: false}\nconsole.log(it.next(22)); // 22 {value: \u0026#39;end\u0026#39;, done: false}\nconsole.log(it.next(333)); // 333 {value: \u0026#39;over\u0026#39;, done: true}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e带有 \u003ccode\u003e*\u003c/code\u003e 的函数声明表示是一个 generator 函数,当执行 \u003ccode\u003egen()\u003c/code\u003e 时,函数体内的代码并没有执行, …\u003c/p\u003e"
March 15, 2016
给一个正在运行的Docker容器动态添加Volume(转)
"\u003cp\u003e之前有人问我Docker容器启动之后还能否再挂载卷,考虑mnt命名空间的工作原理,我一开始认为这很难实现。不过现在我认为是它实现的。\u003c/p\u003e\n\u003cp\u003e简单来说,要想将磁盘卷挂载到正在运行的容器上,我们需要:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用\u003ca href=\"https://github.com/jpetazzo/nsenter\"\u003ensenter\u003c/a\u003e将包含这个磁盘卷的整个文件系统mount到临时挂载点上;\u003c/li\u003e\n\u003cli\u003e从我们想当作磁盘卷使用的特定文件夹中创建绑定挂载(bind mount)到这个磁盘卷的位置;\u003c/li\u003e\n\u003cli\u003eumount第一步创建的临时挂载点。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"注意事项\"\u003e\u003cstrong\u003e注意事项\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e在下面的示例中,我故意包含了$符号来表示这是Shell命令行提示符,以帮助大家区分哪些是你需要输入的,哪些是机器回复的。有一些多行命令,我也继续用\u0026gt;。我知道这样使得例子里的命令无法轻易得被拷贝粘贴。如果你想要拷贝粘贴代码,请查看文章最后的示例脚本。\u003c/p\u003e\n\u003ch4 id=\"详细步骤\"\u003e\u003cstrong\u003e详细步骤\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e下面示例的前提是你已经使用如下命令启动了一个简单的名为charlie的容器:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker run --name charlie -ti ubuntu bash\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我们需要做的是将宿主文件夹 \u003ccode\u003e/home/jpetazzo/Work/DOCKER/docker\u003c/code\u003e 挂载到容器里的 \u003ccode\u003e/src\u003c/code\u003e 目录。好了,让我们开始吧。 …\u003c/p\u003e"
March 12, 2016
node出现“dyld: bad external relocation length”的解决办法
"\u003cp\u003emac下有时候在执行 npm的过程中,我们强制中止了操作或者一些命令出现问题会提示“dyld: bad external relocation length”这个错误,这个时候只要将未下载完的文件删除即可,我这里使用 n 4.4.3下载的时候,网络出现异常,提示这个错误,只要删除 /usr/local/n/versions/node/4.4.3 这个目录即可。\u003c/p\u003e\n\u003cp\u003e如果还是不行的话,可以试着执行一下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew doctor\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e命令,根据提示操作就可以了。\u003c/p\u003e\n\u003cp\u003e我遇到的情况是使用node版本控制n安装新版本号的时候,好像安装包下载的不完整,但提示安装成功了,在最后提示这个错误。试了好多方法卸载重装也不行,最后根据 brew doctor 的提示,执行了\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebrew link --overwrite node\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e彻底解决了。\u003c/p\u003e"
March 12, 2016
nodejs中package.json文件说明
"\u003cp\u003e推荐: \u003ca href=\"http://jingpin.jikexueyuan.com/article/34254.html\"\u003ehttp://jingpin.jikexueyuan.com/article/34254.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003epackage.json 中包含各种所需模块以及项目的配置信息(名称、版本、许可证等)meta 信息。\u003c/p\u003e\n\u003cp\u003epackage.json文件可以通过npm init 来创建\u003c/p\u003e\n\u003ch4 id=\"包含可配置项\"\u003e包含可配置项\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003ename 名称\u003c/li\u003e\n\u003cli\u003e应用描述 description\u003c/li\u003e\n\u003cli\u003e版本号 version\u003c/li\u003e\n\u003cli\u003e应用的配置项 config\u003c/li\u003e\n\u003cli\u003e作者 author\u003c/li\u003e\n\u003cli\u003e资源仓库地址 respository\u003c/li\u003e\n\u003cli\u003e授权方式 licenses\u003c/li\u003e\n\u003cli\u003e目录 directories\u003c/li\u003e\n\u003cli\u003e应用入口文件 main\u003c/li\u003e\n\u003cli\u003e命令行文件 bin\u003c/li\u003e\n\u003cli\u003e项目应用运行依赖模块 dependencies\u003c/li\u003e\n\u003cli\u003e项目应用开发环境依赖 devDependencies\u003c/li\u003e\n\u003cli\u003e运行引擎 engines\u003c/li\u003e\n\u003cli\u003e脚本 script\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e简单模式\u003c/p\u003e\n\u003cp\u003e==========================\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{\n\n name: \u0026#34;myApp\u0026#34;,\n\n version :\u0026#34;0.0.1\u0026#34;\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e完整模式\u003c/p\u003e\n\u003cp\u003e===========================\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{\n\n \u0026#34;name\u0026#34;: …\u003c/code\u003e\u003c/pre\u003e"
March 12, 2016
windows平台下的PHP的线程安全版本与非线程安全版本的区别
"\u003cp\u003eWindows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分(Linux/Unit平台没有这个概念的东西的),这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。\u003c/p\u003e\n\u003cp\u003ePHP有2中运行方式:\u003cstrong\u003eISAPI\u003c/strong\u003e和\u003cstrong\u003eFastCGI\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003eISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;\u003c/p\u003e\n\u003cp\u003e而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。\u003c/p\u003e\n\u003cp\u003e对于apache服务器来说一般选择isapi方式,而对于nginx服务器则选择FastCGI方式。\u003c/p\u003e\n\u003cp\u003e1.\u003cstrong\u003eNon Thread Safe\u003c/strong\u003e版本php适用在使用CGI以及fastCGI的web服务器上,如nginx,lighttpd以及IIS的CGI模式下\u003c/p\u003e\n\u003cp\u003e2. …\u003c/p\u003e"
March 12, 2016
PHP底层工作原理
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/03/51de416caaddc.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2016/03/51de416caaddc.png\" alt=\"51de416caaddc\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从图上可以看出,php从下到上是一个4层体系\u003c/p\u003e\n\u003cp\u003e①Zend引擎\u003c/p\u003e\n\u003cp\u003eZend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、 实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend 实现。\u003c/p\u003e\n\u003cp\u003e②Extensions\u003c/p\u003e\n\u003cp\u003e围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过 extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析 就是extension的典型应用)。\u003c/p\u003e\n\u003cp\u003e③Sapi\u003c/p\u003e\n\u003cp\u003eSapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过 sapi成功的将php本身和上层应用解耦隔离,php可以不 …\u003c/p\u003e"
March 10, 2016
NPM 命令介绍(转)
"\u003cp\u003eNPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e允许用户从NPM服务器下载别人编写的第三方包到本地使用。\u003c/li\u003e\n\u003cli\u003e允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。\u003c/li\u003e\n\u003cli\u003e允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 **“npm -v” **来测试是否成功安装。命令如下,出现版本提示表示安装成功:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ npm -v\n2.3.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo npm install npm -g\n/usr/local/bin/npm -\u0026gt; /usr/local/lib/node_modules/npm/bin/npm-cli.js\[email protected] /usr/local/lib/node_modules/npm\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果是 Window 系统使用以下命令即可:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install npm -g\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"使用-npm-命令安装模块\"\u003e使用 npm 命令安装模块\u003c/h2\u003e\n\u003cp\u003enpm …\u003c/p\u003e"
March 10, 2016
nodejs学习资料
"\u003cp\u003e修改npm包管理器的registry( \u003ca href=\"http://registry.npmjs.org/\"\u003eregistry.npmjs.org\u003c/a\u003e)为淘宝镜像( \u003ca href=\"http://npm.taobao.org\"\u003enpm.taobao.org\u003c/a\u003e),参考nam config -h 相关命令\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm config set registry “https://registry.npm.taobao.org“\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"http://npm.taobao.org\"\u003ehttp://npm.taobao.org\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e七天学会NodeJS \u003ca href=\"http://nqdeng.github.io/7-days-nodejs/\"\u003ehttp://nqdeng.github.io/7-days-nodejs/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNode.js Style Guide \u003ca href=\"https://github.com/dead-horse/node-style-guide\"\u003ehttps://github.com/dead-horse/node-style-guide\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e深入Node.js的模块机制 \u003ca href=\"http://www.infoq.com/cn/articles/nodejs-module-mechanism/\"\u003ehttp://www.infoq.com/cn/articles/nodejs-module-mechanism/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e学习ES6生成器(Generator) \u003ca href=\"http://www.toobug.net/article/learning_es6_generator.html\"\u003ehttp://www.toobug.net/article/learning_es6_generator.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003erequire() 源码解读 \u003ca href=\"http://www.ruanyifeng.com/blog/2015/05/require.html\"\u003ehttp://www.ruanyifeng.com/blog/2015/05/require.html …\u003c/a\u003e\u003c/p\u003e"
March 10, 2016
nodejs中exports与module.exports的区别
"\u003cp\u003e对于两者的理解只要记住一句话:“\u003cstrong\u003eexports就是module.exports****的引用\u003c/strong\u003e”即可。\u003c/p\u003e\n\u003cp\u003e推荐易理解的文档: \u003ca href=\"http://cnodejs.org/topic/5231a630101e574521e45ef8\"\u003ehttp://cnodejs.org/topic/5231a630101e574521e45ef8\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原文:\u003c/p\u003e\n\u003cp\u003e你肯定非常熟悉nodejs模块中的\u003cstrong\u003eexports\u003c/strong\u003e对象,你可以用它创建你的模块。例如:(假设这是rocker.js文件)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexports.name = function() {\n console.log(\u0026#39;My name is Lemmy Kilmister\u0026#39;);\n};\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在另一个文件中你这样引用\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evar rocker = require(\u0026#39;./rocker.js\u0026#39;);\nrocker.name(); // \u0026#39;My name is Lemmy Kilmister\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e那到底\u003cstrong\u003eModule.exports\u003c/strong\u003e是什么呢?它是否合法呢?\u003c/p\u003e\n\u003cp\u003e其实,\u003cstrong\u003e\u003ccode\u003eModule.exports\u003c/code\u003e\u003cstrong\u003e才是真正的接口,\u003cstrong\u003eexports\u003c/strong\u003e只不过是它的一个辅助工具。 最终返回给调用的是\u003c/strong\u003e\u003ccode\u003eModule.exports\u003c/code\u003e\u003cstrong\u003e而不是\u003c/strong\u003eexports。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e所有的\u003cstrong\u003eexports\u003c/strong\u003e收集到的属 …\u003c/p\u003e"
March 7, 2016
Node.js框架比较: Express vs. Koa vs. Hapi
"\u003cp\u003e\u003ca href=\"http://www.nodejs.net/a/20141223/191626.html\"\u003ehttp://www.nodejs.net/a/20141223/191626.html\u003c/a\u003e \u003ca href=\"http://www.zhihu.com/question/25388201\"\u003ehttp://www.zhihu.com/question/25388201\u003c/a\u003e \u003ca href=\"https://cnodejs.org/topic/56936889c2289f51658f0926\"\u003ehttps://cnodejs.org/topic/56936889c2289f51658f0926\u003c/a\u003e\u003c/p\u003e"
February 23, 2016
jQuery.extend和jQuery.fn.extend的区别-转
"\u003cp\u003ejQuery.extend和jQuery.fn.extend的区别,其实从这两个办法本身也就可以看出来。很多地方说的也不详细。这里详细说说之间的区别.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e我们先把jQuery看成了一个类,这样好理解一些。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ejQuery.extend(),是扩展的jQuery这个类。\u003c/p\u003e\n\u003cp\u003e假设我们把jQuery这个类看成是人类,能吃饭能喝水能跑能跳,现在我们用jQuery.extend这个方法给这个类拓展一个能唱歌的技能。这样的话,不论是男人,女人,xx人…..等能继承这个技能(方法)了。\u003c/p\u003e\n\u003cp\u003e可以如下图这样写着:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/jquery-1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jquery-1.png\" alt=\"jquery-1\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e然后:$.liu();这样就能打印出来”liu“这个字符串\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代码在下面:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2016/02/jquery-2.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jquery-2.png\" alt=\"jquery-2\"\u003e\u003c/a\u003e 3. 这说明啥啊,这说明.liu()变成了jQuery这个类本身的方法(object)嘛。他现在能”唱歌“了。但是吧,这个能力啊,只有代表全人类的 jQuery 这个类本身,才能用啊。你个人想用,你张三李四王五麻六,你个小草民能代表全人类嘛?\u003c/p\u003e\n\u003cp\u003e所以啊,这个扩展也就是所谓的静态方法。只跟这个 类 本身有关。跟你具体的实例化对象是没关系滴。\u003c/p\u003e\n\u003cp\u003e我们再看看jQuery.fn.extend()这个方法。\u003c/p\u003e\n\u003cp\u003e从字面理解嘛,这个拓展 …\u003c/p\u003e"
February 23, 2016
Git-svn命令对比表,svn用户必看
"\u003cp\u003e提供给从svn转git的开发人员参考\u003c/p\u003e\n\u003cp\u003eGit与Subversion的命令对比表\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003e操作\u003c/strong\u003e\u003c/th\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003eGIT\u003c/strong\u003e\u003c/th\u003e\n \u003cth style=\"text-align: left\"\u003e\u003cstrong\u003eSUBVERSION\u003c/strong\u003e\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e复制数据仓库\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit clone\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn checkout\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e提交\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit commit\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn commit\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e查看提交的详细记录\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit show\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn cat\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认状态\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit status\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn status\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认差异\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit diff\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003esvn diff\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e确认记录\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003egit …\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
February 15, 2016
深入解析php中的foreach问题
"\u003cp\u003e篇文章是对php中的foreach问题进行了详细的分析介绍,需要的朋友参考下\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e前言:\u003c/strong\u003e php4中引入了foreach结构,这是一种遍历数组的简单方式。相比传统的for循环,foreach能够更加便捷的获取键值对。在php5之前,foreach仅能用于数组;php5之后,利用foreach还能遍历对象(详见:遍历对象)。本文中仅讨论遍历数组的情况。foreach虽然简单,不过它可能会出现一些意外的行为,特别是代码涉及引用的情况下。\u003c/p\u003e\n\u003cp\u003e下面列举了几种case,有助于我们进一步认清foreach的本质。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e问题1:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$arr = array(1,2,3);\nforeach($arr as $k =\u0026gt; \u0026amp;$v) {\n$v = $v * 2;\n}\n// now $arr is array(2, 4, 6)\nforeach($arr as $k =\u0026gt; $v) {\necho \u0026#34;$k\u0026#34;, \u0026#34; =\u0026gt; \u0026#34;, \u0026#34;$v\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e先从简单的开始,如果我们尝试运行上述代码,就会发现最后输出为0=\u0026gt;2 1=\u0026gt;4 2=\u0026gt;4 。 …\u003c/p\u003e"
February 15, 2016
JavaScript垃圾回收机制
"\u003cp\u003e\u003cstrong\u003e一、垃圾回收的必要性\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下面这段话引自《JavaScript权威指南(第四版)》\u003c/p\u003e\n\u003cp\u003e_ 由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。_\u003c/p\u003e\n\u003cp\u003e这段话解释了为什么需要系统需要垃圾回收,JS不像C/C++,他有自己的一套垃圾回收机制(Garbage Collection)。JavaScript的解释器可以检测到何时程序不再使用一个对象了,当他确定了一个对象是无用的时候,他就知道不再需要这个对象,可以把它所占用的内存释放掉了。例如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evar a = \u0026#34;before\u0026#34;;\nvar b = \u0026#34;override a\u0026#34;;\nvar a = b; //重写a\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这段代码运行之后,“before”这个字符串失去了引用(之前是被a引用),系统检测到这个事实之后,就会释放该字符串的存储空间以便这些空间可以被再利 …\u003c/p\u003e"
February 2, 2016
利用 Dockerfile 来创建镜像
"\u003cp\u003e使用 \u003ccode\u003edocker commit\u003c/code\u003e 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 \u003ccode\u003edocker build\u003c/code\u003e 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。\u003c/p\u003e\n\u003cp\u003e新建一个目录和一个 Dockerfile\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ mkdir sinatra\n $ cd sinatra\n $ touch Dockerfile\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDockerfile 中每一条指令都创建镜像的一层,例如:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e # This is a comment\n FROM ubuntu:14.04\n MAINTAINER Docker Newbee\n RUN apt-get -qq update\n RUN apt-get -qqy install ruby ruby-dev\n RUN gem install sinatra\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDockerfile 基本的语法是\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用\u003ccode\u003e#\u003c/code\u003e来注释\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eFROM\u003c/code\u003e 指令告诉 Docker 使用哪个镜像作为基础\u003c/li\u003e\n\u003cli\u003e接着是维护者 \u003ccode\u003eMAINTAINER\u003c/code\u003e 的信息\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eRUN\u003c/code\u003e开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get …\u003c/li\u003e\u003c/ul\u003e"