- 博客(78)
- 资源 (14)
- 收藏
- 关注
原创 async 异步流程控制
async是一个强大的异步流程控制库,其语义类似于js对数组的操作。它提供了一系列非常强大而便捷的方法,有助于我们在javascript单线程模型背景下写出优雅的逻辑控制代码。 牛刀小试先从文件操作开始初步了解async函数库的作用: 使用filter过滤出磁盘中存在的文件 const fs = require('fs'); const async = require('async')
2016-05-29 16:24:59
925
原创 如何设计一个数据字典
数据字典在Javascript语言里面随处可见,对象本身就可以看成一个数据字典,通过给对象设置属性与方法,达到一个字典的目的。 var dict = new Dict();obj.pro1 = "hello world!!!";obj.pro2 = function () { console.log("I'am pro2");};先来看一个常见的数据字典的设计: function
2016-05-28 22:03:04
7913
原创 nodejs 模块加载机制
Nodejs拥有一套简单的模块加载系统,在Nodejs里面文件和模块是一一对应的关系。例如:foo.js加载了同一个目录下的circle.js文件。 circle.js文件内容: const PI = Math.PI; exports.area = (r) => PI*r*r; exports.circumference = (r) => 2*PI*r; foo.js文件内容: co
2016-05-27 23:12:54
7562
原创 npm 的工作原理
包(Package)和模块(Module)如何定义一个Package满足如下条件都可以称为一个包: 一个文件夹包含应用程序,使用package.json来描述它(a) 一个用gzip压缩的文件夹,满足(a)定义(b) 一个url可以获取(b)描述的压缩包(c) 一个@描述的一个包已经被发布到npm仓库 (d) 一个@描述的包同(e) 一个描述的包,并且具有latest
2016-05-06 16:46:41
13576
原创 修复npm安装全局模块权限问题
相信我们曾经可能都遇到过全局安装某个模块包的过程中提示EACCESS的错误问题。这是由于npm全局安装模块的默认路径没有权限导致的。有三个方式可以解决该问题: 修改全局安装路径的权限 修改默认安装路径 借助第三方工具安装node 修改安装路径的权限查看默认全局安装路径 npm config get prefix 对于大多数系统显示目录为:/usr/local 警告:如
2016-04-29 09:54:40
25990
2
原创 electron 研究笔记
使用electron有一阵子了,随着项目推进,需要研究的东西也逐渐多起来。总结了以下,问题主要出现在: - 跨平台兼容性 - 新的功能需求 electron 渲染进程模拟浏览器环境electron渲染进程默认为nodejs环境,在里面你可以调用require引入第三方模块,但有时候我们想要的是一个真实的浏览器环境。electron需要做的配置如下: var mainWindow =
2016-04-12 18:23:10
14064
1
原创 electron 打包web应用
时下流行的web app打包工具主要有两个,一个是国内开发者主导的nw.js,另一个是国外大厂支撑的electron。对比了nw.js以及electron之后还是选择了electron,原因主要有以下几点:1、基于该工具已有广泛被使用的产品,如:atom、vs code等。2、在开发者中口碑比较好,有大公司参与进来,遇到问题,提个issue能很快得到响应。下载基于electron打包的Hola
2016-04-09 23:05:36
11950
3
原创 关于express下session的几个注意事项
使用nodejs开发web应用之所以快,其中一个重要原因是非常齐全的第三方模块,你几乎可以找到任何想要的module。express-session是expressWEB框架常用的session管理包。其主要有如下几个配置选项: cookie : 用于设置sessionID cookie选项,如过期时间,cookie适用的路径等。 name : sessionID 对应的cookie名。
2016-03-13 23:47:27
4378
原创 iptables配置
1、Iptables介绍Centos系统内建了一个强大的防火墙,通常又被称为iptables。准确的说应该叫iptables/netfilter。iptables工作于用户层,用户通过命令行给防火墙预定规则表。netfilter是一个内核模块,完成实际的过滤工作。有许多GUI软件方便用户来设置防火墙规则,但都缺乏一定的灵活性,并且限制用户了解其中真正发生了什么。在开始配置Iptables之前,我们需
2016-02-24 16:25:06
956
原创 使用passport管理第三方授权认证
passport是一个为Nodejs设计的,兼容Express的认证中间件。通过第三方插件的形式(以下称为strategy),可以应对各式各样的认证请求。passport具有高度的灵活性,并不依赖于任何一个路由,或者指定的数据存储,这样给上层开发者提供的极大的便利性。passport提供的接口也相对简单,只需要给它一个认证请求,passport会提供一个钩子函数(hook)告诉你请求失败了或者成功了
2016-01-10 16:28:27
8063
1
原创 Blob
Blob(Binary Large Object)术语最初来自数据库,早期数据库因为要存储声音、图片、以及可执行程序等二进制数据对象所以给该类对象取名为Blob。 在Web领域,Blob被定义为包含只读数据的类文件对象。Blob中的数据不一定是js原生数据形式。常见的File接口就继承自Blob,并扩展它用于支持用户系统的本地文件。 构建一个Blob对象通常有三种方式:1、通过Blo
2016-01-01 15:00:28
15349
1
原创 URL编解码
URI(统一资源定为标志),用于指定想要访问的资源,URI可以有各种形式,如:日常在用的URL、每本书背面的ISBN码都是URI的一种形式, 日常过程中,如果不加区分,一般说的URI都指的是URL。拿我们熟悉的URL来说:一个普通的URL: https://www.baidu.com/fuck.php?action=run#hash=1URL一般包括以下几个部分:Scheme 指定URL协
2015-12-20 13:22:21
1074
原创 Base64编码及其运用
说到Base64相信大家都不陌生,在web开发过程中经常可以见到它的身影。Base64是一种编码方式,常用于表示、传输、与存储二进制数据。用64个可打印字符来表示二进制数据,从而解决一些二进制数据无法使用的场景。Base64最初主要用户多用途互联网邮件扩展(MIME Email), MIME规定了用于表示各式各样数据(非英文符号数据)的符号化方法,而Base64编码就作为内容传输编码方式之一(cha
2015-12-19 18:10:46
722
原创 Session
web网站基于HTTP协议来做业务交互,HTTP协议本身是一个无状态的协议,但实际情况是日常很多业务逻辑都需要记录用户的行为信息。举个例子: 一个购物网站,顾客会在商品浏览页面选取需要的各类商品,放置到虚拟的购物车内。下单的时候需要跳转到结算页面,在这一串连续的用户行为中,至关重要的一点是记录当前的购物车信息,而session机制可以恰当的处理此类问题。 网站通常会在用户第一次登录的时候
2015-12-18 12:44:29
701
原创 关于Javascript函数的一些思考(一)
对于我这类从传统C/C++语言开发转到`javascript语言的开发者。一定会对其灵活程度、易用性质感到惊叹。javascript里万物皆对象,而函数又是其中重中之重。这里总结下最近对函数的一些思考。1 获取函数名 javascript 是一门支持函数式编程的语言,函数可以作为参数传递,也可以作为返回值返回给调用者。每个函数对象都有一个name属性得到当前函数的名称,如果是匿名函数则返回空字符
2015-11-24 21:14:59
475
原创 Promise
相信有一定前端或nodejs编程经验都会遇到回调函数嵌套的问题,就是大量的回调函数慢慢向右侧屏幕延伸的一种状态。解决此类问题一般有三种做法:1、用事件函数的订阅/通知机制, 把每一层嵌套拆分成多个事件监听。2、利用一些现成的异步函数库来解决这个问题,例如:async, step都属于这类函数库。3、拥抱promise。传送门: promise-spec。promise概念已经被提出很久了,前端工程
2015-10-25 15:35:50
870
1
原创 组合模式
组合模式大概是设计模式里面使用最为广泛的模式之一了,模式本身理解起来也比较简单,以至于可以毫不费力的写出一个能用的组合模式伪代码。该模式解决了什么问题? 组合模式统一对待复合对象与单个对象。抽象出统一的命令执行接口,这种多态性使得客户端在编写代码的时候可以不加区分当前要操作的是复合对象还是单个对象。 组合模式基本实现function inherits(child, sup) { chi
2015-10-18 19:56:31
711
原创 centos服务器搭建svn
前段时间给团队内部搭建了一个gitlab服务器,结果很多策划大牛觉得用不习惯,不想改变已有的使用习惯,对Git更是嗤之以鼻,作为小小码农的我不想跟他们争辩什么,顺着他们的需求给整了一套svn系统。庆幸的是配置的过程比较顺利,只花了不到一个小时的时间。写篇博客记录以下吧!1.安装svn比较简单一句话搞定.sudo yum install -y svn安装完毕之后可以看到如下几个工具:[root@l
2015-09-10 11:42:53
657
原创 正则表达式炼级攻略
曾记得几年前刚接触到VIM编辑器的时候,对这玩意儿敬而远之。觉得这东西好复杂,我要写个程序得花费这么多时间来搞定编辑器,好累,非常不适合我这种急功近利型的程序员。几番折腾后看到了耗子叔叔的这篇vim练级攻略。跟着练习了几个星期,加上反复的实战。现在VIM成为了我唯一的编辑器。受这篇文章的启发决定来整个正则表达式的练级攻略。同样这里更加关注的是正则的实战部分,即利用它来解决你手头的问题,所见即所得。因
2015-09-05 18:09:42
874
原创 GitLab服务器搭建
应团队要求,要为项目组搭建一个私有版本控制系统,上司给推荐了gitlab这款工具。花了几天时间算是把系统搭建好了,用了几天发现其功能确实强大。这里主要记录在配置环境过程中可能遇到的一些问题以及一些解决方案。 GitLab是一个开源的项目,项目路径:gitlabhq官方安装指南:install.md。这类开源项目的安装最好按照官方提供的文档来操作。安装过程中出现的问题基本可以在issue里面
2015-08-27 19:01:21
1238
6
原创 Polyfill
javascript由于各种历史原因以及前端界典型的激进的特点,导致一些好的设计和模块不能够在各种平台上运行,(这里各种平台主要指的是各巨头的浏览器加上进年火的不行的Nodejs。)但是程序员需要为其埋单,程序员需要去了解各种模块的polyfill,小到一些函数如:Object.sign,extend,clone等。大的模块有,Seajs、Requirejs这类文件模块加载模块,Promise这类担
2015-08-27 10:26:35
2176
原创 路径动画
上周末上司找到我提出要实现几个常见的路径动画算法,人家soya动画引擎已经有了类似的功能,而我们的cantk暂时还没有对应的功能。加入路径动画的最终效果要达到物体能够沿着一定的轨迹运动,配合各种差值算法,使得物体更加生动。原理说起来很简单,就是要去实现canvas内置的几个API,如lineTo. arcTo. bezierCurveTo. quadraticCurveTo等, 物体运动除了要给出某
2015-08-23 23:16:12
1346
原创 Javascript-BinarySearchTree
基本结构常用接口查找元素计算节点个树插入更新节点最大节点与最小节点查找排名为n的节点查找键值为k的节点排名近似节点查找指定范围内的键值删除最大最小节点删除指定节点 二叉搜索树融合了二分查找的高效简洁以及链式数据结构删除元素的优雅。这样一个优秀的数据结构,使用的频率很高。如常见的LRU缓存淘汰算法等, 几乎任何可以想到的查找算法都可以用它来替换。日常工程代码中一般对效率不高,
2015-08-14 15:54:28
816
原创 NodeJS服务端重构计划
不知不觉做node开发已经半年时间了,这期间写尝试着去解决了一些问题,实现了一下想法,也遇到过一些坑。是时候来梳理一下代码,规划一下接下来的工作。现阶段我们的node服务器端代码结构是这样的: 乍一看好像没有什么问题,其实这其中充斥着一些重复代码,以及一些没有测试的模块,代码组织也不够合理。这些问题都是需要处理的。先来说说几个常用的术语router 路由模块负责请求的分发,把请求转给具
2015-08-13 08:22:34
1506
原创 微信JSSDK使用指南
这篇文章主要来说说微信JSSDK的一些配置和微信分享的使用,包括从前端sdk文件引入到服务器端和微信服务器的交互。另外Tangide已经把一些工作做好了,我会简要说一说怎么把它用起来。在开发的过程中主要参考了微信官方开发文档,由于微信提供的功能略多,我会定期更新文档,如果你已经熟悉了微信JSSDK的开发流程可以直接跳过前面的步骤,直接跳转到Tangide与微信JSSDK的使用结合 :)。1. 首先得
2015-06-23 20:09:51
4591
原创 javascript装饰器模式
众所周知装饰器模式用于给对象在运行期间动态的增加某个功能,职责等。相较通过继承的方式来扩充对象的功能,装饰器显得更加灵活,首先,我们可以动态给对象选定某个装饰器,而不用hardcore继承对象来实现某个功能点。其次:继承的方式可能会导致子类繁多,仅仅为了增加某一个单一的功能点,显得有些多余了。装饰器经典实现首先来看看传统的decorator的实现吧!假设现有一类叫Person 的对象,该对象有个sp
2015-06-19 09:42:21
2275
1
原创 pomelo研究笔记-RPC客户端
1. mailbox数据收发模块一个RPC客户端可能同时需要调用多个远端(server)提供的服务,在pomelo里每个server抽象为一个mailbox。先来看看mailbox的实现:var MailBox = function(server, opts) { EventEmitter.call(this); this.curId = 1; this.id = server
2015-06-09 15:46:24
2315
原创 pomelo研究笔记-RPC服务端
POMELO 采用多进程的架构可以很好的实现游戏服务器(进程)的扩展性,达到支撑较多在线用户、降低服务器压力等要求。进程间通信采用RPC的形式来完成,pomelo的RPC实现的相当精巧。采用类似如下的方式就可以调用remote服务器提供的服务:proxies.user.test.service.echo(routeParam, 'hello', function(err, resp) { i
2015-06-09 11:49:11
3612
原创 javascript 的bind/apply/call函数
javascript有三个使用频率非常高的内建函数:bind/apply/call。许多高级点的技巧都是基于这几个函数来实现的。这三个函数都用于改变函数的执行环境.从而达到代码复用的目的。 先来所说bind函数, bind,函数通常有两个用途: 1. 创建新函数,指定函数的this指针。name = 'global';var obj1 = {name: 'foo'};var showNam
2015-06-06 11:39:36
1260
原创 理解Nodejs的Buffer
上周同事用我们的工具写了一个关于全国比较出名的景点介绍的APP,地址在这里。整个APP中文字符比较多,文件也比较大,计算了下整个APP描述文件大小在4M左右。整个描述文件要放到第三方CDN。在这中间,我们的服务器主要负责获取前端传上来的数据,做一些加工处理并压缩后抛给第三方CDN服务器。 Node接受POST数据通常的写法:var load = function(stream, o
2015-05-03 20:30:12
1559
原创 javascript那些事(1)
最近看到winter(寒冬)老师的一篇博文,说的是js这类基于原型的继承与普通的基于类继承方式的差异。文章最后抛出几个有意思的小练习尝试的解决了下。一般来说,创建一个对象有如下三个步骤: 1. 构建一个新对象 2. 把新对象的__proto__指向函数对象的共有对象属性:prototype 3. 以新对象为this执行构造函数Function.prototyp
2015-05-02 22:02:09
754
原创 cordova 社交张号插件设计
近来接触到cordova这个好东西,才知道原来web app可以这样用。用HTML5 APP开发神器 设计好了app之后,为了增加用户粘度想着把社交登陆加进去,刚好cordova支持第三方插件云编译功能。 如果是本地APP集成SNS登陆功能,都有相应的文档可以参考,QQ有客服人员,微信开放平台功能也比较单一,微博还有开发者QQ群可以互相交流学习。网上找了下SNS第三方登陆的插件还是比较欠
2015-04-19 23:27:49
1304
原创 微信网页授权登陆的一次查错误经历
最近一直在研究围绕微信平台的相关开发,其中踩到了不少坑,特来此记录一番,也方便交流。真想吐槽为什么微信弄个开放平台还要加一个公众平台呢?两边文档还不一样。类似的功能还得写两次。上网查了下,果然有人在喷微信文档多次误导第三方sdk写错了:) 上次接到一个任务,PC网站要支持微信第三方登陆功能。一直以为是在服务号那边做相应的配置和处理,看的是这边的文档 。尝试了多次都是提示scope没有相
2015-04-19 22:43:16
11231
原创 常用跨域资源请求分析
WEB开发过程中最常使用 Ajax技术来完成客户端与服务器的通信。而实现Ajax通信的XmlHttpRequest对象会带来跨域安全策略问题。简单来说,默认情况下,XHR对象只能访问与包含它的页面位于同一个域下的资源。 那么问题来了,何为跨域呢?通常,Ajax指向的地址中,二级域名/端口号/协议/必须与包含它的页面相同。举个栗子: www.tangide.com 访问 www
2015-03-08 22:07:19
1172
原创 HTML5APP实战(2): 赛车游戏
先Show一下最终的运行效果: http://gamebuilder.duapp.com/apprun.html?appid=genius-441422599398441 在线编辑界面: http://gamebuilder.duapp.com/gamebuilder.php?appid=genius-441422599398441 1.新建项目,删除篮球和草地。
2015-03-02 10:02:29
1923
原创 HTML5APP实战(1): 围住神经猫(二)
之前的文章分析了围住神经猫游戏的"偶然性",这篇文章主要介绍通过Gamebuilder + CanTk来完成整个游戏的设计开发。 1.新建项目删除场景中的球和草地,并放置背景图片,和猫移动的方块: 这里场景的背景图和猫移动的圆圈均是简单的Label图片。 2.放置一个帧动画来表示猫 猫从蹲下到站立一共有16个状态,点击选择图片
2015-03-01 20:46:24
1292
原创 HTML5APP实战(1): 围住神经猫(一)
2014年7月小伙伴们的朋友圈被一款名为“围住神经病猫”的小游戏刷屏。这只露着屁股、腰身细长的白猫,在手机屏幕中贱贱地扭动腰肢,一副欠扁的模样。之前学习到了一款WebAPP开发神器:Gamebuilder + Cantk 具有非常高效流畅的webapp开发体验,开发速度无出其右。这里主要介绍通过它来开发神经猫游戏。 通过有关媒体介绍,神经猫这款游戏的开发团队有美术一人,程序员一人,用时1
2015-03-01 19:59:34
1515
原创 Linux下SSH操作解析
1.查看SSH状态:service sshd status查看ssh是否已经启动以及一些状态信息 2.启动SSH服务:systemctl restart sshd.serviceps:fedora下的一些基本服务都是通过systemctl restart/stop xxx.service操作来控制的,例如apache的服务器:httpd.service、防火墙服务fi
2015-01-13 23:19:34
952
原创 PHP下ORM的基本实现
服务端编程经常需要和数据库打交道,CRUD是基本的操作。数据对象是整个操作的中心,数据库的一条记录对应着一个数据对象的信息,ORM(对象关系映射)讲的就是如何优雅的把数据对象和CRUD结合起来。这里主要实现一个通用的ORM模块。首先看系统框图: 数据库记录到对象的转换中间有一个映射器,一方面映射器对数据库执行指令,另一方面抽象出一套接口供应用程序使用。在这里所有的数据对象都继承自
2015-01-12 23:29:17
4196
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人