分类 开发语言 下的文章

NodeJS在Windows下的简单安装及使用

NodeJS流行有段时间了,本着折腾的目的,试着在windows下用了用,的确是方便。

安装

其实安装异常简单,当然,最省事的方法就是下载安装包安装,但我希望能绿色一点,就直接下载zip包来使用,效果是一样的。

安装包的下载链接是:http://nodejs.org/download/>,zip包的下载链接是

下载node

直接下载最新版的链接是:http://nodejs.org/dist/latest/node.exe,把下载的node.exe放在d:developnodejs目录下。

下载npm

npm是nodejs的模块管理工具,下载链接是http://nodejs.org/dist/npm/>,注意,如果使用安装包安装已带npm,无须再自己安装npm了。目前的最新版是。下载后直接解压到d:developnodejs目录下。

可以看到d:developnodejs目录下的文件目录应该如下:

node_modules
node.exe
npm.cmd

安装nrm

nrm用来查看和切换当前使用的registry,国内的网络情况大家都懂,一般来说使用国内的nodejs库镜像是明智的。

开启一个cmd窗口,设置环境目录:

set path=d:\develop\nodejs;%path%

安装nrm

npm install -g nrm --registry=http://registry.npm.taobao.org

然后查看一下nrm所支持的镜像的位置:

nrm ls

可以看到:

* npm ---- https://registry.npmjs.org/
  cnpm --- http://r.cnpmjs.org/
  taobao - http://registry.npm.taobao.org/
  eu ----- http://registry.npmjs.eu/
  au ----- http://registry.npmjs.org.au/
  sl ----- http://npm.strongloop.com/
  nj ----- https://registry.nodejitsu.com/

缺省是使用官方的模块库,在国内我们应该选择cnpm或taobao

nrm use taobao
Registry has been set to: http://registry.npm.taobao.org/

再看一下:


nrm ls

  npm ---- https://registry.npmjs.org/
  cnpm --- http://r.cnpmjs.org/
* taobao - http://registry.npm.taobao.org/
  eu ----- http://registry.npmjs.eu/
  au ----- http://registry.npmjs.org.au/
  sl ----- http://npm.strongloop.com/
  nj ----- https://registry.nodejitsu.com/

好了,这样就可以用npm快速安装所需要的模块了。

nodejs的安装就算是完成了。

安装常用模块

如果想了解nodejs有哪些比较流行的模块,可以查看:
https://www.npmjs.org/browse/star

https://nodejsmodules.org/

一般来说,使用比较多的有:

  • express
  • grunt
  • socket.io
  • socket.io-client
  • mocha
  • underscore
  • connect
  • commander
  • coffee-script
  • uglify-js
  • mkdirp
  • forever

等等,对于常用的模块,可以安装成全局模块,这样,可以避免每个工程都下载安装一次。

gethostbyname已被getaddrinfo替换

需要从域名解析地址,临时查了一下msdn 和man 手册,这才发现,原来用了N年的gethostbyname 已经是obsolete 的函数了,都标记成DEPRECATED 了,无论是windows 下还是linux 下都建议使用getaddrinfo 来替代它。

gethostbyname函数的原型如下:

struct hostent* FAR gethostbyname(
  _In_  const char *name
);

之前使用gethostbyname 很简单,类似这样:

struct hostent *remoteHost;
struct in_addr addr;

if ( ( remoteHost = gethostbyname( hostname ) ) == NULL ){
    xxxx;
}
else{
    if (remoteHost->h_addrtype == AF_INET)
    {
        while (remoteHost->h_addr_list[i] != 0) {
            addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];
            printf("\tIP Address #%d: %s\n", i, inet_ntoa(addr));
        }
    }
}

现在得用getaddrinfo,其原型如下:

int WSAAPI getaddrinfo(
  _In_opt_  PCSTR pNodeName,
  _In_opt_  PCSTR pServiceName,
  _In_opt_  const ADDRINFOA *pHints,
  _Out_     PADDRINFOA *ppResult
);

得这么用:

struct addrinfo *result = NULL;
struct addrinfo *ptr = NULL;
struct addrinfo hints;

ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

dwRetval = getaddrinfo(hostname, 0, &hints, &result);
if ( dwRetval != 0 ) {
    xxxx;
}
else{
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

    printf("getaddrinfo response %d\n", i++);
    printf("\tFlags: 0x%x\n", ptr->ai_flags);
    printf("\tFamily: ");
    switch (ptr->ai_family) {
        case AF_UNSPEC:
            printf("Unspecified\n");
            break;
        case AF_INET:
            printf("AF_INET (IPv4)\n");
            sockaddr_ipv4 = (struct sockaddr_in *) ptr->ai_addr;
            printf("\tIPv4 address %s\n",
                inet_ntoa(sockaddr_ipv4->sin_addr) );
            break;
        case AF_INET6:
            printf("AF_INET6 (IPv6)\n");
            // the InetNtop function is available on Windows Vista and later
            // sockaddr_ipv6 = (struct sockaddr_in6 *) ptr->ai_addr;
            // printf("\tIPv6 address %s\n",
            //    InetNtop(AF_INET6, &sockaddr_ipv6->sin6_addr, ipstringbuffer, 46) );

            // We use WSAAddressToString since it is supported on Windows XP and later
            sockaddr_ip = (LPSOCKADDR) ptr->ai_addr;
            // The buffer length is changed by each call to WSAAddresstoString
            // So we need to set it for each iteration through the loop for safety
            ipbufferlength = 46;
            iRetval = WSAAddressToString(sockaddr_ip, (DWORD) ptr->ai_addrlen, NULL, 
                ipstringbuffer, &ipbufferlength );
            if (iRetval)
                printf("WSAAddressToString failed with %u\n", WSAGetLastError() );
            else    
                printf("\tIPv6 address %s\n", ipstringbuffer);
            break;
        case AF_NETBIOS:
            printf("AF_NETBIOS (NetBIOS)\n");
            break;
        default:
            printf("Other %ld\n", ptr->ai_family);
            break;
    }
}

看起来更复杂了,不过的确更灵活了。

开发人员应该知道的一些数字小节

之前在“程序员应该了解的一些延迟时间”中总结了根据github的片断收集的一些数字,现在,更多需要了解的数字出来了;-)

OSChina上翻译了一篇“每个开发者都必须知道的 14 个数字”,里面主要小节了开发者需要了解的常用算法的复杂度问题,很值得熟记。

此外,该文还提到了由Jeff Dean 小节的开发人员应该知道的数字列表,这份小节可以说是结合GAE及之前所提到的数字的综合。

通过这些数字,我们可以更好的了解一个系统应该如何才能更好更快的工作。

最佳软件开发实践指导zz

来源:http://www.oschina.net/news/38154/best-best-practices-ever

任何指导其实都不是绝对的,但这份最佳指导很有现实指导意义

每过一段时间,我都能读到一些好东西,它是如此的深刻见解,写的如此的清晰,如此的条理,我必须把它收录进我的个人“史上最佳”圣物集里。最近,我新收录了一篇,非常棒的一篇叫做《Best Practices for Scientific Computing》的文章,我希望每个来读本文的读者都找个时间读读它。我在这里列出它的要点,是要鼓励你去阅读完整的全文。写的真是非常好。

  1. 给人写程序,而不是给计算机。
  • 一个程序,对于阅读它的人来说,不应该要求读者一次性的在大脑里加载过多的背景/相关知识。
  • 命名需要一贯、明确、有意义
  • 代码风格和格式要统一一致
  • 软件开发中的各种工作都要分割成1小时左右的任务
  1. 重复性的工作自动化。
  • 让计算机去做重复性的工作
  • 把最近使用过的命令存到一个文件里,以备复用
  • 使用编译工具来自动化系统流程
  1. 用计算机做历史记录
  • 用软件工具来自动跟踪计算机的工作
  1. 逐步改进。
  • 每次做一小步,及时获得反馈,及时纠正
  1. 使用版本控制。
  • 使用一个版本控制系统
  • 所有由手工创建的东西都要放到版本控制系统里
  1. 不要重复自己(或他人)。
  • 系统中的每一段数据都要有一个权威的单一的存在
  • 代码应该模块化复用,而不是考来粘去
  • 复用代码,而不是重写代码
  1. 准备好对付错误的方法
  • 在程序中增加断言,检查它们的各种操作
  • 使用现成的单元测试框架
  • 测试程序时借鉴所有的可用的经验
  • 把bug做成测试用例
  • 使用一个有代码指令的调试工具
  1. 只在软件能正确的工作后才可优化。

* 使用监控工具找到瓶颈
* 尽可能的用高级语言写程序

  1. 文档里描述的应该是设计思路和目的,而不是技术细节。
  • 描述接口和原因,而不是实现
  • 重构代码,而不是注释解释运行原理
  • 引用其它程序时嵌入其它程序的文档
  1. 协作
  • 代码合并前进行代码审查
  • 当帮带新成员或解决特别诡异的问题时使用结对编程

我要额外提到的是这个:

维新旧代码

如果你还在犹豫不决是否去看那篇文章,那你先去看看它里面列出的引用67部关于计算机的著作和文章。正如我说的,这篇文章是“史上最佳”。

PyQT中ui界面转换python脚本pyuic4的参数小结

在使用PyQT做用户界面时, 我们可以先用QT Designer来创建UI框架,然后用pyuic4脚本来将.ui文件转换成.py文件,这样可以节省大量配置用户界面的繁琐工作。

一般大家都只会记住一条命令,就是:

pyuic4 -x project.ui -o project.py

这就是把用XML描述的.ui文件,转换成.py文件,我们就可以直接

python project.py

来得到用户界面了,然后再加些其它代码即可。

下面就是pyuic4所支持的所有参数。

-p, --preview

预览用户界面。

-o, --output

输出产生的代码到指定文件,而不是console终端上。

-x, --execute

产生额外的代码来测试和显示类。

-d, --debug

显示调试信息。

-i, --indent N

设置缩进的空格数N,N为0时表示使用tab,缺省N为4,即4个空格。

-w, --pyqt3-wrapper

产生PyQt v3 风格的代码格式。

--from-imports

控制生成的python代码的一个选项,让产生代码中的导入文件是相对于当前目录。