WebSocket的性能与压力测试

相对于短连接应用,长连接应用的测试要麻烦得多——尤其是性能和压力测试。此前,甚至从来没有给任何一个上线的 WebSocket 应用做过这方面的测试,前两天,看到有人在 SegmentFault 上问这方面的问题,刚好又有空,于是想着,还是来查查这方面的资料吧。在 Github 上一搜,还真有现成的工具,名字很简单,直接就叫websocket-bench

websocket-bench 是个用 Node.js 编写的命令行工具,可以对使用 Socket.io、fayePrimusWAMP 编写的长连接应用进行性能和压力测试,用法和参数与 ab 差不多,多了一个指定连接成功后进行的操作的定义。

Angular2路由模块简介

Angular2虽然还没有正式发布,但全新设计的路由模块已经提前面世,它从AngularJS 1.4开始支持。相对于老的ngRoute,使用更方便,配置更简单,更加注重约定。新的路由模块被命名为Angualar New Router,以前的ui-view被新的ng-viewport取而代之,另外引入了component的概念。我们用一个例子来对它做一个简单的了解。

先放代码DEMO

AngularJS常用插件与指令收集

使用AngularJS有差不多一年时间了,前前后后也用了不少库和指令,整理了一下,分成四大类列出。有demo地址的,就直接连接到demo地址,其它的直接链到github托管库中。

图片视频类

输入控件类

界面类

  • ui-bootstrap 官方扩展,在AngularJS中方便的以指令的方式使用Bootstrap
  • ui-map 用于在页面中集成Google Maps
  • NG-Grid 官方提供的表格插件,支持表格的主题、排序、直接编辑、多行选择等操作,而且使用非常简单,只需要一行HTML代码,但是,比较难看,适合于不讲究外观但要求功能强大的场合,像后台工具、管理系统之类
  • angular-table 第三方表格工具,适合于需要对表格进行高度定制的场合
  • ng-table 在易用性和外观上对上面两个进行折衷的解决方案
  • AngularUI 上面的ui-bootstrap、ui-map就是它的一部分,官方提供的常用扩展集,除了这两个,还有ui-router、ui-select等,注意,它使用的是Bootstrap 2.x
  • Adapt-Strap 第三方Bootstrap插件,而且是基于扁平化的Bootstrap 3,更美观
  • ng-polymer-elements Polymer风格的AngularJS指令,Material Design设计,值得尝试
  • Angular Loading Bar 可用于在页面顶部增加一个漂亮的进度条
  • angular-busy 与Angular Loading Bar有点类似,主要用于处理$http通信时候的动画
  • ngInfiniteScroll 从名字可以看出来,它是一个用于组织瀑布流和时间线的扩展
  • ngScrollTo 页内滚动工具,可以将页面滚动到指定id的元素位置
  • ngDialog 比Bootstrap更简单,更好用,更漂亮的网页对话框
  • Angular Treeview 树状目录组织扩展,使用相当方便,而且不依赖于jQuery
  • angular-growl 用于在页面上显示警告框,可以设置显示时间,还可以直接显示$http中收到的警告
  • angular-truncate 当文字过多过长时,显示部分文字的插件,可以按文字总长度来控制,也可以按单词数量来控制

其它工具类

  • angular-translate AngularJS的i18n扩展
  • Satellizer 可以方便的在AngularJS中集成第三方账号登陆,支持国际主流社交网站账号,支持协议有OAuth 1.0/2.0
  • ngStorage 本在存储插件,用于处理localStorage和sessionStorage
  • ng-csv 导出csv的扩展

怎样以后台Demon方式启动关闭MongoDB和Redis

不知道是多少次看到人问怎样以后台方式启动MongoDB,网上搜索了一下,其实写这个的文章还是挺多的。不过看完发现大家都只写了怎么启动,却没写如何关闭。而且我又想凑个数刷个关键字,于是记下这篇。

update @ 2015-5-26 增加Redis的启动与关闭

一种权重算法及其实现

一大早在V2EX上看到有人讨论一个关于权重的算法,源于题主的面试,他还发了博文,果然,面试他的人夸奖了他的态度。这的确是难得的。

面试官给出的题目如下:

每首歌曲都是一个评分,现在有2000首歌曲,要求实现一个随机播放器,每首歌曲播放的概率应该正比于它的评分,例如评分9.1的歌曲,和评分7.9的歌曲,播放的次数应该是91:79

面试官给出了如下的解决方案:

把评分从小到大排序,之后把根据每首歌的评分,生成一个半闭开区间,然后生成一个随机数,看随机数落在哪个区间,就是选择的那首歌。例如,有三首歌,评分是[1,2,3] 那么应该是生成三个区间 [0-1,1-3,3-6],之后生成一个0-6之间的随机数,随机数落在哪个区间,就选择对应的歌曲。

被面试的人后来给出的解决方案是:

假定每个评分只到小数点后一位,那么其实,利用空间换取时间的思路,只需要把每首歌按照他的评分多少相应的复制多少重复的歌曲,并且把所有的歌曲都扔到一个池子里面,之后从池子里面等概率的选取一首歌就行了。在最坏的情况下,2000首歌曲的评分都是9.9,那么每首歌需要复制99首。

不过其实细想来,这无非就是一个简单的权重问题。权重算法有大量的解决思路,前不久在实现一个小的广告系统时,正好也有权重设置。在这里分享了下我的解决方案吧。

分为三步:

  • 遍历所有项,得到所有项的总权重
  • 再次遍历所有项,给每一项,加一个0到总权重之间的随机值,得到新权重。注意,每项加的都是即时生成的随机数
  • 在第二步遍历的同时,取出新权重最大那一项

那些援助到底可以折算成多少吨黄金?

在微博上看到一个如下的微博:

49年蒋介石把40吨黄金运抵台湾,很多学者认为是台湾经济起飞的原因。毛向阿尔巴尼亚援助100亿,折合黄金1200吨。毛援助越南200亿美金,折合黄金4400吨。仅此两项外援,共计黄金5600吨,那么问题来了:阿尔巴尼亚和越南经济为什么没有起飞呢?顺便说一下:同期中国三千多万农民惨遭饿死。

看到这个吨数,还是很震惊的,对于我等普遍用克来计算黄金价值的人来讲,用吨必然是不习惯的。后面的评论大多也是调侃和漫骂,当然是没有人真的去计算的。

利用Ajax无刷新上传文件到Node.js服务器

最近做一个垂直社区项目,图片上传是现如今社区的标配,何况面向的还是女性用户。后端使用Node.js,图片上传必然是要不刷新不用iframe了。顺便,也测试了一下Coding.net的“演示”功能,的确是方便免费够用,代码传上去基本零配置就可以跑起来了。这篇文章涉及的代码托管在Coding上,最终的例子也是运行在Coding的免费服务器上。

协议与结构

整个上传采用RFC1867协议,即基于HTML表单的文件上传协议。借助这个协议,为表单增加enctype="multipart/form-data",再使用typefileinput控制来选择文件,然后便可用POST方法上传文件。

文件上传时会分段提交,借助Connect的connect-multiparty模块,即可接收各段组合整理为文件,并将文件存到临时目录,我们可再编写其它代码来处理文件。本例中,我们会把文件复制到public目录,以提供web访问。

整个示例程序包括以下几部分:

  • HTML表单,负责文件的选择
  • JavaScript组织表单数据,执行上传
  • Node.js接受上传的文件,并负责文件的移动和组织

示例程序的代码托管在Coding上的Node.js-Ajax-Upload-File,在线演示地址为node-js-ajax-upload-file.codingapp.com

JavaScript奇技淫巧45招

本文是一篇翻译文章,原文信息如下:

JavaScript是一个绝冠全球的编程语言,可用于Web开发、移动应用开发(PhoneGapAppcelerator)、服务器端开发(Node.jsWakanda)等等。JavaScript还是很多新手踏入编程世界的第一个语言。既可以用来显示浏览器中的简单提示框,也可以通过nodebotnodruino来控制机器人。能够编写结构清晰、性能高效的JavaScript代码的开发人员,现如今已成了招聘市场最受追捧的人。

在这篇文章里,我将分享一些JavaScript的技巧、秘诀和最佳实践,除了少数几个外,不管是浏览器的JavaScript引擎,还是服务器端JavaScript解释器,均适用。

本文中的示例代码,通过了在Google Chrome 30最新版(V8 3.20.17.15)上的测试。

上海昆虫博物馆

远离人群,无论是思想还是身体。这话是没错的,尤其是年轻的人。于是2015年第一天,去上海昆虫博物馆!

这昆虫博物馆,还是非常有来头的。法国神父韩伯禄1868年来到中国,脚跟没稳都开始着手建立博物馆,忙活了十多年,终于在1883年建成了自然博物馆,想想那时开埠也不过几十年,他却想着建立自然博物馆。只可惜,上世纪五十年代这博物馆被拆分,昆虫馆便成了中科院的资产。