Ubuntu中安装NodeJS

得益于Debian系强大的应用仓库,在Ubuntu中安装NodeJS非常简单: # npm — NodeJS Package Manager,非常重要且好用的NodeJS包管理工具,非装不可! sudo apt-get install nodejs npm 装好后,我们可以通过以下命令确定NodeJS的版本: node -v # 我的结果是:v0.10.15 什么?运行不了,提示: bash: node: command not found 这是咋回事呢?! 别急,Google一下,就有答案:原来,已经有其他软件包(Amateur Packet Radio Node Program)含有名为“node”的程序了,这样,一旦同时安装NodeJS和Amateur Packet Radio Node Program,就会出现覆盖,导致其中一个无法运行。于是大家商量了一下,决定将NodeJS的node程序改名为nodejs,彻底杜绝冲突。但是这样改又会带来兼容性问题:npm以及其他使用名称“node”来调用NodeJS的程序,就都失效了。何况,很多人都不会安装Amateur Packet Radio Node Program这个包,凭什么要做这么大改动啊?于是乎,我们又迎来了曙光: sudo apt-get install nodejs-legacy 安装这个包后,我们总算迎回了熟悉的“node”!好吧,最后告诉大家,其实nodejs-legacy这个包啥也没做,就只是建了一个软链接: ls -l /usr/bin/node # 结果是:lrwxrwxrwx 1 root root […]


计算二进制整数中含有的1的个数的奇偶性

Table of Contents 问题描述 解决方案 问题描述 遇到过一个问题:判断一个数的二进制表示中含有的1的个数是偶数的还是奇数的。按照之前的做法,我会写一个循环,然后挨个判断这个数中每个位,记录下其中值为“1”的位的个数,最后给出结果。这种方法简单、直接,效率嘛,一般般,也没什么不好的。这两天在看《深入理解计算机系统》,其中有一道习题就是这个问题,而且还限制了不能用条件语句和循环语句来实现。这下,我就傻眼了。 解决方案 自己想了半天还是没有想到解决方案,不得以只能向Google求救,功夫不负有心人,总算让我找到解决方案了: /* Return 1 when x contains an odd number of 1s; 0 otherwise. Assume w=32. */ int odd_ones(unsigned x) { /* assume type unsigned take place 4 bytes */ x = (x >> 16) ^ x; x = (x >> 8) […]


OSX中使用ld -static链接时提示找不到-lcrt0.o

这两天在学习链接的相关知识,刚好看到静态链接,于是照着书中示例写了个程序,满心欢喜等着运行结果时,却在编译链接阶段没通过!终端上最后的输出为: “/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld” -static -arch i386 -macosx_version_min 10.9.0 -o p2 -lcrt0.o main2.o libvector.a ld: library not found for -lcrt0.o clang: error: linker command failed with exit code 1 (use -v to see invocation) 刚开始以为是因为在64位系统上编译32位程序(gcc -m32)导致了,于是去掉了这个参数,重新编译链接,还是不行! 没办法了,只能google,找了一番,发现还是有些人遇到类似的情况的,尝试了安装Xcode的命令行工具(Command Line Tools for Xcode),发现还是不行,进一步查找,找到了Apple的这个QA页面:https://developer.apple.com/library/mac/qa/qa1118/_index.html 。。。好吧,要么跟着自己做,要么放弃。。。我不玩了,直接把-static参数去掉,编译通过,完事! Author: Rex Shen Created: 2014-07-17 Thu 14:49 Emacs 24.3.1 (Org […]


NodeJS中使用单元测试

Table of Contents 主流测试框架 Nodeunit Mocha QUnit Jasmine Vows 怎样抉择 我的尝试 Nodeunit Mocha 因为下了决心要实践TDD,所以无论使用什么语言,首先总是要确定一个单元测试框架。NodeJS,或者说Javascript,并不像Python、Smalltalk等一开始就有比较成熟的测试框架,因此Javascript中的测试框架选择可谓是百花齐放、百家争鸣,看得我是眼花缭乱。竞争是好事,一则让大家都有动力不断完善自己,二则也给不同口味的人提供了各自喜欢的菜色。对于刚接触的人来说,选择太多,反而是一种困扰。这个Wiki页提供了一个Javascript测试框架的较详细列表。 主流测试框架 “测试框架”这个词在Javascript这边,似乎又是一个让人疑惑的名词。根据NodeJS的这个页面,排名前几的几个模块分别是:nodeunit、chai、vows和jasmine-node,全然没有Mocha的身影。而到网上查询NodeJS的单元测试框架,则基本都会提到Mocha。渐渐深入后才发现,chai、should等都是提供基本的断言(Assertion)工具,而Mocha能提高更高层次的功能。 下面列举几个在我搜索过程中出镜率计较高的测试框架: Nodeunit 看名字就比较官方,支持异步调用和同步调用,直接浏览器和命令行两种调用方式。使用简单,文档也比较简单。 Mocha 官网上说是用于NodeJS的,同样支持异步和同步调用,直接浏览器和命令行调用方式;自己不带断言库,可以使用多种第三方断言库(如chai、should等)。直接多种风格的用例写法,包括TDD、BDD、QUnit等。 QUnit 没研究。 Jasmine BDD风格的测试框架。分客户端和服务端两种,没怎么研究。 Vows 没研究。 怎样抉择 很多人都有这样的疑问,但不是每个人都会到论坛上问,而且问了也不一定有认真的回答。万幸,这篇帖子里,人家精确地问了问题,又有好心人详细地回答了:How do I decide what testing framework to use? 这篇帖子中推荐的是QUnit,我没去尝试,因为我已经有选择了。帖子中提到的几点都是很好的考虑因素,但我觉得还不是很详细,下面补充几点我自己具化的理解: 是否支持命令行和浏览器两种测试载体。有很多代码都是不依赖浏览器的(对于NodeJS尤其如此),这种情况下使用命令行运行测试更方便。但如果只支持命令行方式,则意味着还必须为前端代码另外找一个测试框架 支持什么样风格的测试用例。比如Nodeunit只支持TDD风格的,而Mocha支持TDD、BDD、QUnit等许多风格。 支持的报告格式。刚开始时报告是给人看的,所以格式上有些差异没有什么影响,毕竟人能接受就可以了;过了一段时间,测试需要自动化,这时报告更多是给代码看的,那就完全不是一回事了。所以,如果不是想自己写报告解析器的话,挑选一个有自己想要的报告格式(如xUnit格式的)的测试框架吧 我的尝试 我在开始写测试用例的时候,并没有做好预习功课,只是看了有个叫Nodeunit的东西,看名字觉得比较官方(可见产品名称在小白用户的推广中,起到了非常重要的作用啊!),就使用了。写好几个测试用例后,才回过头来仔细调研了一番,发现大家还是比较推荐Mocha(产品口碑的重要性!),所以又改用Mocha了。从Nodeunit转到Mocha比较简单,毕竟测试代码基本是一致的,就是写法上有所差别。 Nodeunit Nodeunit没有单独的官网,项目托管在GitHub中,地址是:https://github.com/caolan/nodeunit。除了README.md外,就没有其他详细文档了。源码中examples目录提供了少量的示例代码可以参考。 安装 有了npm,安装都非常简单: npm install -g […]


NodeJS监听80端口时运行出错的解决方法

高高兴兴写了个测试程序来跑NodeJS应用,满心欢喜以为一定没有问题,在终端输入命令: node server.js 结果出错退出,一下子傻眼了: events.js:72 throw er; // Unhandled ‘error’ event ^ Error: listen EACCES at errnoException (net.js:904:11) at Server._listen2 (net.js:1023:19) at listen (net.js:1064:10) at Server.listen (net.js:1138:5) 奇了怪了,之前运行示例程序都能正常的,自己的这个程序也没改什么,怎么就跑不了了呢?! 仔细检查修改后的代码,发现因为我机器上没有其他Web Server,所以我把端口从8080改成了默认的80了,难道是这个导致的?我试着把端口改回了8080–果然就正常了! 原因是找到了,但我们不能就此止步,凡事要有点刨根问底的精神不是?^_^ 皇天不负有心人,Google一番后,总算找到原因:原来,在Linux(我认为是Unix系都会,因为我测试的机器是一台Mac OSX)系统中默认要求只有root权限的程序才能访问1024以下的端口,我用普通权限想要访问80端口,所以因为权限不够被拒绝了。解决方法也很简单,要么换个端口(如8080),要么,就用超级权限(用root账户或者sudo)跑node。 Author: Rex Shen Created: 2014-07-17 Thu 14:41 Emacs 24.3.1 (Org mode 8.2.7b) Validate


解决国内访问Google服务慢的问题

长久以来,GMail的访问速度就跟蜗牛似的,好吧,人在屋檐下,不得不低头。。。 最近使用Google Drive做文件备份,功能到是挺好的,就是每天起床第一件事,是提心吊胆地看看能不能连上;同步个几KB的文件要半个小时!丫的,是可忍,孰不可忍!哥怒了!!! 好在Google了一下,惊喜地发现一神器:smarthosts。 使用方法很简单,到它的googlecode官网首页上,就可以下载到各个版本的hosts文件了,并且,它还提供了更简单的方法:各个平台上的软件和脚本(ios上需要越狱才能使用,android版本直接在Google Play上就能搜到了)。工作原理也很简单,就是针对特定域名,找了一个国内能访问,并且访问速度还可以的IP,通过hosts文件做静态绑定。 googlecode连不上?– 试试这个吧: # 修改你的hosts文件,加入以下这行 203.208.46.222 smarthosts.googlecode.com 什么?不知道怎么修改hosts文件? 。。。 。。。 。。。 亲,Google吧。。。我只能帮你到这了。。。 后记:smarthosts中提供了很多的域名与IP的静态绑定,但是有不小一部分都失效了,导致仍然无法访问(比如Facebook等)。对我来说暂时够用了,因为我暂时主要是使用Google Drive。 Author: Rex Shen Created: 2014-07-17 Thu 14:37 Emacs 24.3.1 (Org mode 8.2.7b) Validate


配置Emacs为C/C++开发环境:安装配置cedet

Table of Contents 犯罪动机 源代码下载 编译cedet 配置 替换内置的cedet 其他的配置 安装配置ecb 使用过程中遇到的问题 鼠标,又见鼠标 犯罪动机 刚开始使用Emacs时,也有找过cedet的相关资料,只是当时还不怎么用Emacs来写C/C++代码,所以只是浅尝辄止,也可以说几乎就没弄。渐渐熟悉了Emacs,在上面写代码的频率也高了,于是又重新拾起cedet。 由于使用的是Emacs24,里面已经自带了cedet,起初认为自带了更好,不用折腾。等到真正查资料要配置时,才发现根本不是那么回事。比如网上配置cedet的帖子中,常常会提到semantic-load-enable-minimum-features等设置函数,可是无论我怎么搞(加require ‘cedet,加semantic/canned-configs等),就是不行,一直出错。实在不行了,就跑到/usr/local/share/emacs/(我是用brew装的Emacs)下用find命令去抓semantic-load-enable-minimum-features这个串,结果还是没抓着,于是确定是Emacs内置的cedet并不包含这部分实现。起初还以为是OSX下的Emacs的问题,后来跑到Ubuntu下试,一样一样的!于是找啊找啊,总算找到为什么:semantic-load-enable-minimum-features这种设置方式,不符合minor-mode的规范,因此去掉了。邮件中还提到其他的几点改动,包括部分去除调试功能,使用的cedet版本较老等。 考虑了一下,还是觉得内置的版本不爽,于是决定折腾折腾自己,到官网上下载来编译安装。 源代码下载 这个很简单,Google一下,马上知道。到cedet的官网源码下载页上找到下载地址,使用bzr或者git下载即可: bzr checkout bzr://cedet.bzr.sourceforge.net/bzrroot/cedet/code/trunk cedet 为了方便,我在.emacs.d中建了一个3rd-party的文件夹,将cedet的源码直接下载到了这个目录下。 编译cedet 编译过程相对简单,也很顺利: # cd cedet make EMACS=/usr/local/bin/emacs-24.3 # optional to compile cedet/contrib: cd contirb make EMACS=/usr/local/bin/emacs-24.3 上面脚本首先进入cedet目录中编译cedet的标准模块,而后(可选)进入contrib子目录,编译其他不符合FSF协议的模块。 配置 替换内置的cedet 由于Emacs24内置了cedet,因此要尽早载入外部的版本(比如在.emacs的开头),避免由于Emacs已载入内置的eieio(cedet中的基础模块)而导致我们的cedet无法载入的问题。 ;; load cedet. It is very […]


配置Emacs为C/C++开发环境:识别不同文件夹中的头文件

作为一个不折不扣的码农,Emacs最重要的功能就是要能够帮助我提升写代码的效率,其中我认为很重要的功能有两个,一个是代码补全,另一个则是语法检查。对于代码补全,我使用的是auto-complete配合auto-complete-clang-async;而语法检查使用的是flycheck配合clang,用起来很爽。刚开始写一些小的C/C++程序,头文件和源文件都是放在同一级目录下的,这种情况下auto-complete-clang-async和flycheck工作得都很好。但是好景不长,项目一旦稍微复杂起来,就会分不同的目录,而包含的头文件总不可避免地会在不同目录下,结果由于找不到头文件,导致auto-complete-clang-async和flycheck双双失效了:由于头文件都是放在文件最开始的,由于没有指定头文件所在的路径,clang解析include指令时会因找不到文件而出错,停止解析。这样,后续源码中如果出现其他错误,或者需要自动补全时,就不会有任何提示了,Emacs几乎退化成了一个普通的代码编辑器了! Google了好长时间,刚开始还寄希望于cedet和ede之类的,始终没有结论,没法解决这个问题。后来,极度郁闷中时,峰回路转,脑子终于开了点窍:我在意的压根不在于项目管理,而在于补全和语法检查功能。而且Emacs中各个扩展大都是各自为战的,即便搞定了项目管理的配置,也极有可能搞不定这两个核心功能! 于是屁颠屁颠回到原点,重新查找auto-complete-clang-async和flycheck中关于头文件的配置。明确了目标和方向,很快就有了眉目: 在flycheck中,可以通过flycheck-clang-include-path来添加/指定要搜索的头文件路径 在auto-complete-clang-async中,可以通过设置ac-clang-cflags来添加头文件路径 思路有了,那么具体的设置方法呢?别急,我一一道来(假设头文件路径为./include): 直接设置法:打开要编辑的源文件,然后执行M-x eval-expression,之后在mini-buffer中输入(add-to-list ‘flycheck-clang-include-path “include”),然后再执行一次eval-expression,执行(add-to-list ‘ac-clang-cflags “-Iinclude”)。如果还有其他的路径,则重复以上操作,一个一个添加进去。另外,由于这两个变量都是局部于文件的(即仅对当前buffer有效),因此当打开一个新文件时,还得重新设置。 上面的方法实在是太烦了,是地球人都受不了。为了偷懒,我决定写一点程序,在打开一个C文件时,自动判断是否存在./include,../include,./inc或者../inc目录,如果存在,就将他们添加到ac-clang-cflags和flycheck-clang-include-path中。这种实现简单粗犷,但基本满足我的需求: ;; detect and add headers path, to make flycheck and clang-complete work ; make sure flycheck-mode is enabled (global-flycheck-mode) (defun check-and-add-header-path (checkpath) “Check if CHECKPATH exists and it’s a directory, if it is a directory, then and […]


C语言中整型的减法

在C语言中,我们常常会用到加减等基本算术运算。我们知道,计算机在计算时,首先需要把数值转换成二进制,而后对二进制数进行运算。由于绝大多数机器都是使用二进制补码方式来存放整型的,因此下面讨论假设整型是以二进制补码方式表示的。二进制加法相当容易理解,简单的将各位相加,并处理好进位就可以了;对于二进制减法(为了方便叙述,这里设定整型字长为4位),则并不是那么直观了:\(0010_{2} – 0101_{2}\)(即十进制的\(2_{10} – 5_{10}\))的计算过程是怎样的呢? 实际上,在计算机中,当遇到诸如x-y这样的表达式时,并不是直接进行减法运算的,而是将其转换成形如x+(-y)这样的加法算式,而后再进行加法运算。拿上面的\(0010_{2} – 0101_{2}\)说,首先需要将\(0101_{2}\)转成其负数(-y),即转成\(1011_{2}\),然后再进行加运算,得到结果为\(1101_{2}\),即十进制数-3。 上面举的例子是有符号整数的,那么对于无符号整数,是否遵循同样的规则呢?下面我们举例来说明: int x = 5; int y = -1; unsigned z = (unsigned)x – (unsigned)y; printf(“z=%u, (int)z=%d\n”, z, (int)z); 不实际运行,自己计算一下z的值吧。 正确的答案是:z=6,你算对了吗?想知道为什么?OK,那就继续往下看吧! 首先,我们约定:对于任意整数a,ua表示a的无符号值。根据这个定义,我们可以得到:当a>=0时,ua=a;当a<0时,ua=\(a_{w-1}2^w + a\),其中w指a的字长。 对于上面代码片段中的表达式“(unsigned)x – (unsigned)y”,我们可以写成“ux – uy”,进一步的,当计算机要计算这个表达式的值时,会将其转换成“ux + (-uy)”。根据上面a与ua的关系,我们可以得到:\(ux + (-uy) = ux + (-(y_{w-1}2^w + y)) = ux + […]


HTML中实现段落首行缩进

中文习惯中,段落的首行总是要缩进两个字的,于是我天真的认为无论是英文还是中文,默认就应该这样做的。后来查看了几个国内外网站,发现原来大家都是没有首行缩进的,于是发现原来首行缩进也是中国人的“发明”。无论如何,既然查了,就要记录下来,虽然现在用不到,以后说不定能用到呢。 废话不多说,下面讲讲具体的方法。 最原始的方法,很简单,也很直接,就是在首行前加上空格: <p>&nbsp;&nbsp;This is a paragraph.</p> 太山寨了?每个段落都要写,太麻烦了?–没事,条条大路通北京,我们还有其他方法(参考CSS text-indent 属性): p { text-indent: 50px; } 通过上述的CSS代码,我们设置了段落首行缩进50px,你可以根据实际情况设置不同的缩进值,还可以将单位“px”换成“cm”等其他长度单位。乍一眼看,似乎这样做就可以实现我们的目标了,但仔细一想,还是不对:中文中段落首行一般是缩进两个字,如果用长度单位,不还得根据字体大小来调整缩进?万一字体变了,那缩进的效果不就不同了? 放心,早有前人想到并且解决了这个问题了。我们可以这样做: p { text-indent: 2em; } 更多关于CSS中可用的单位,请移步CSS单位。 Author: Rex Shen Created: 2014-07-17 Thu 14:11 Emacs 24.3.1 (Org mode 8.2.7b) Validate