老纪博客: 软件开发、设计,互联网应用、服务

被人为割裂的中国互联网

看看这篇文章能不能给你带来些感悟

中国没有一个所谓“全民的互联网”,中国的互联网是人为割裂的。它既存在于精英的Think笔记本上,也存在于草根的MTK山寨机中。我们的精英也许和美国同步,草根却与越南同步。

我有两个朋友。

L的公司在上海,大半时间跑广东。他是华南某所不太知名的大学毕业的,小眼睛质朴男,多年以前还是个文学青年。哥们做手机网游的,我见他使过好几款手机,但最贵的一个也不过1千多块钱。比起什么Web2.0、移动互联网的概念,他更关心珠三角的几千万农民工和城市边缘的大学生“蚁族”,怎么关心?在东莞的夜宵摊上跟他们拼啤酒,在富士康厂区外网吧里刷夜,跟靠做他们生意开上宝马的便利店老板扯淡……

W猫在北京中关村。他从小就是个脑袋很大眼睛发亮的天才少年,数理化成绩很好,逻辑思维超强,英文和中文一般流利。在首都某著名大学毕业后,W 直接去美国名校拿了硕士,接着回国创业。我一直觉得,他是硅谷Geek们的中国版。诸如iPad之类的新技术玩意,我总能第一时间从他那儿找到。他也是国内把玩Facebook、Twitter、Groupon、Foursqure的人。啥叫互联网的未来,W做的网站就代表互联网的未来。

More »

y460-vmware上成功安装mac os x snow

没在y460本机上安装mac os x snow,但是在其上的vmware上成功安装了,并且能够实现完美升级,且速度也蛮快的,待老纪整理之后发出操作说明,呵呵,先上班….

沉痛悼念我的奶奶

奶奶由于患急性心肌梗,于2010年6月9日逝世,终年81岁,她走的很快,没有什么痛苦,也应了她说的那句话,不给子孙们拖累。奶奶生前身体一直很好,能吸烟喝酒,我们也常劝她少抽点烟,但是她属于那种管不住的人。

奶奶是个苦命人,30岁丧夫,一手把5个子女拉扯大,中间吃的苦自然不是一句两句话就能说的清的,老来丧子,二叔于20多年前患脑瘤病逝,所以她抽烟喝酒我们是很理解的。值得欣慰的是她的子女孙子孙女外孙外孙女对她都很好,这样也让老人能好笑而去

有奶奶在的时候,儿孙们时不时都会聚在她身边,聊聊这个聊聊那个,有她大家就有了个核心,现在奶奶去了,去了一个永远快乐的地方

奶奶永远在我们的心中

iphone4最新试用记录

向来都是万众瞩目的焦点,于是第四代iPhone的华丽登场自然不需要任何夸张的语言来进行赞美,无数苹果粉丝的喝彩以及无与伦比的关注度都让这款苹果最新发布的iPhone 4手机在亮相伊始便注定成为了超人气的偶像。尽管之前的外泄事件让苹果iPhone 4少了许多神秘感,但该机超豪华的高规格配置已经相比上代产品多达百余项的改进,还是让iPhone拥趸们为之倾倒。接下来,就让通过我们现场试用的苹果iPhone 4真机,一起来看看这款苹果新一代手机到底有着怎样的不同凡响之处吧。

尽管是万众期待的新一代苹果iPhone,但由于之前在网络上的频繁曝光,最新发布的iPhone 4客观的说,在外形上已经让人不再新鲜。不过,这并意味该机在设计上没有任何创新之处。从以往的曝光的真机图片或是我们会认为iPhone 4相比过去在整体风格会有显着的变化,但至少从两代iPhone正面对比来看,其实还是基本上延续了过去苹果iPhone的风格特色,包括经典home键及流畅的机身曲线等等。

More »

中国实现世界上最远距离量子态隐形传输

老纪老大不小了,但是对于这些只有在科幻小说里出现的东西尤其感兴趣,可惜老纪只是一介凡人,只有跟着别人高兴了,呵呵
由中国科大和清华大学组成的联合小组成功实现了世界上最远距离的量子态隐形传输,16公里的传输距离比原世界纪录提高了20多倍。实验结果首次证实了在自由空间进行远距离量子态隐形传输的可行性,为全球化量子通信网络最终实现奠定了重要基础。

  据联合小组研究成员彭承志教授介绍,量子态隐形传输是一种全新通信方式,它传输的不再是经典信息而是量子态携带的量子信息,是未来量子通信网络的核心要素。利用量子纠缠技术,需要传输的量子态如同科幻小说中描绘的“超时空穿越”,在一个地方神秘消失,不需要任何载体的携带,又在另一个地方瞬间神秘出现。这一奇特的现象引起了学术界广泛兴趣。1997年,奥地利蔡林格小组在室内首次完成了量子态隐形传输的原理性实验验证。2004年,这个小组利用多瑙河底的光纤信道,成功地将量子态隐形传输距离提高到600米。但由于光纤信道中的损耗和环境的干扰,量子态隐形传输的距离难以大幅度提高。

  2004年,中国科大潘建伟、彭承志等研究人员开始探索在自由空间实现更远距离的量子通信。在自由空间,环境对光量子态的干扰效应极小,而光子一旦穿透大气层进入外层空间,其损耗更是接近于零,这使得自由空间信道比光纤信道在远距离传输方面更具优势。这个小组2005年在合肥创造了13公里的自由空间双向量子纠缠分发世界纪录,同时验证了在外层空间与地球之间分发纠缠光子的可行性。2007年开始,中国科大——清华大学联合小组在北京八达岭与河北怀来之间架设长达16公里的自由空间量子信道,并取得了一系列关键技术突破,最终在2009年成功实现了世界上最远距离的量子态隐形传输,证实了量子态隐形传输穿越大气层的可行性。

  联合小组在自由空间量子通信领域的一系列工作,得到了科技部重大科学研究计划、中科院知识创新工程重大项目和国家自然科学基金项目等支持,并引起了国际学术界的广泛关注,6月1日出版的英国《自然》杂志子刊《自然·光子学》以封面论文形式发表了这一研究成果。英国的《新科学家》、美国的《今日物理》、美国物理学会新闻网站均及时报道了这个研究成果。

看来scala 2.8.0就要正式发布了

scala这个语言被很多大佬所看好,有java的性能、又有ruby的灵活,但是对于初学者又是如此的让人不敢深入,因为它里面涉及的不仅仅是语言语法的层面而却有编程语言原理的东西,要学好它不容易,但是scala又能在保持性能的前提下大大减少代码量,如果可能还是要涉猎一下的

最近scala发布了2.8.0的第三个候选版,而其此版主要是为测试而发,预计最终版发布还有2个星期,scala 2.8.0较之2.7最大的改动就是对集合库进行重写,运行速度会有更大提升

C++右值引用-好东西

解决C++中临时变量的好方法-右值引用,可在visual studio 2010中试试

右值引用和移动语义(rvalue references, move semantics)

该特性比较晦涩,但用途很明确。

* 移动语义
 
考虑swap函数
template <class T> swap(T& a, T& b)
{
T tmp(a); // now we have two copies of a
a = b; // now we have two copies of b
b = tmp; // now we have two copies of tmp (aka a)
}
用C++0x 的rvalue references特性,代码可以这样写了
template <class T> swap(T& a, T& b)
{
T tmp(std::move(a)); // 移动构造:移动临时变量a的值来构造tmp
a = std::move(b); // 移动赋值:将变量b的值移动到a
b = std::move(tmp); // 移动赋值:将临时变量tmp的值移动到b
}
这里就增了一个新的构造/赋值语义,首先温习一下C++的拷贝构造和拷贝赋值:
A(const A& a);
A& operator=(const A& a);
按照C++标准,临时变量如上面的foo返回的变量可以作为拷贝语义的变量,但只能以const&类型传递进。由于这个限制,想要为vector创造移动的语义(将内部的指针转移到另外一个变量而不产生额外的销毁操作)就不可能了。因为你没法修改 a 的变量,也就没法让临时变量在析构的时候不销毁其拥有的数据。
所以有了rvalue refs, 这个新增的构造语义就是移动语义,分别是移动构造和移动赋值
A(A&& a);
A& operator=(A&& a);
对于vector,实现这两个操作的可能逻辑就是:对于移动构造,取得a的内部指针,并将其清0;对于移动赋值,交换对象和a的内部指针。
这样以来,最初的问题就解决了。

标准库提供了 std::move 通用模板函数为变量或函数创建这种语义环境,比如:

vector<t> v1,v2;
v2 = v1; // 调用拷贝赋值
v2 = std::move(v1); //调用移动赋值

注意,如果t是不可拷贝类型,比如臭名昭著的smart_ptr<t>,那么这里的拷贝赋值则根本没法使用,因为vector的每个变量都无法被拷贝,而移动构造赋值则可以正确被调用。这也就是smart_ptr臭名昭著的原因所在,他根本没法和 stl 库配合使用,当然值得庆幸的是,C++0x已经收录了全能的 shared_ptr 了。

* 参数转移

还有一个功能是参数转移,以及新的 std::forward 通用模板函数。

所谓参数转移就是一个模板函数将其参数转移给另一个函数,听上去很容易,但目前C++里有个很麻烦的问题。还是因为临时变量,为了能够同时传递临时变量和左值变量,必须为每个参数提供两个版本的重载,比如:
template <class T>
void foo(const T& t)
{
goo(t);
}

template <class T>
void foo(T& t)
{
goo(t);
}

如果有两个参数,就有4个版本,如果有三个参数,就有8个版本。有了右值引用事情就简单多了:
template <class T>
void foo(T&& t)
{
goo(std::forward(t));
}

另外配合另外一个C++0x特性“变长函数模板”,就可以完美的实现函数代理了。比如将所有foo(a, b …)函数转移到调用goo(somevar, a, b, …)。

所以总的来说,右值引用的出现是作为语言的一个重要的完备性补充:以前作为右值的临时变量传递给函数时只能拷贝或者转换为常左值引用(const lvalue reference),现在则可以使用右值引用来捕获传递临时变量了。 其直接的作用就是产生了新的构造/复制语义,和新的参数转移方法。

More »

nginx目前所有版本存在的高危漏洞

这个漏洞是国内的安全组织80sec发现的,经过测试老纪博客也存在这个问题,这个漏洞适合现在所有nginx+php服务器,有使用的朋友赶快进行修改

漏洞介绍及补救方式

漏洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。

漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以

	location ~ \.php$ {
	  	root           html;
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
		include        fastcgi_params;
	}

的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。

那么假设存在一个http://www.80sec.com/80sec.jpg,我们以如下的方式去访问http://www.80sec.com/80sec.jpg/80sec.php将会得到一个URI /80sec.jpg/80sec.php,
经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为 /scripts/80sec.jpg/80sec.php
而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为
/scripts/80sec.jpg
所以不存在此问题。
后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为/scripts/80sec.jpg和80sec.php
最后,以/scripts/80sec.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。

POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:

访问http://www.80sec.com/robots.txt

	HTTP/1.1 200 OK
	Server: nginx/0.6.32
	Date: Thu, 20 May 2010 10:05:30 GMT
	Content-Type: text/plain
	Content-Length: 18
	Last-Modified: Thu, 20 May 2010 06:26:34 GMT 
	Connection: keep-alive
	Keep-Alive: timeout=20
	Accept-Ranges: bytes

访问访问http://www.80sec.com/robots.txt/80sec.php

	HTTP/1.1 200 OK
	Server: nginx/0.6.32
	Date: Thu, 20 May 2010 10:06:49 GMT 
	Content-Type: text/html
	Transfer-Encoding: chunked 
	Connection: keep-alive
	Keep-Alive: timeout=20 
	X-Powered-By: PHP/5.2.6

其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

漏洞厂商:http://www.nginx.org

解决方案:

我们已经尝试联系官方,但是此前你可以通过以下的方式来减少损失

	关闭cgi.fix_pathinfo为0

或者

	if  ( $fastcgi_script_name ~ \..*\/.*php )  {
                 return 403;
        }

More »

linode中文文档系列-linode新手之我怎么在linode部署我的网站

有好多想用linode vps的朋友问老纪,我对linux不怎么熟悉,我能够在linode做网站吗?老纪的回答就是如果你知道一些基本的linux命令,就可以参照教程完成网站的部署和维护,其实linode官方已经出了很多文档,老纪前期翻译了不少,看来还是不够,还得继续翻译,以满足初次接触linode vps的朋友的需要,今天就是关于linode新手如何在linode上部署网站

假如对于linux系统管理或者linode你相对来说是个新手,这个只能能够解决我们收到的最常见问题,假如你刚刚创建了第一个linode账号,请先阅读 入门手册,一旦你的linode部署完后再回到这里

下面的这些指令都能运行于linode平台,如果你还没有linode,就请注册一个linode vps吧

我怎么登陆我的linode

缺省的,所有已经部署的linode都开启了ssh,这就可以通过shell用命令行来访问,你可以在入门手册里学到更多关于连接到linode的知识

有事,未完待续…

Linode VPS社区文档中文系列-在debian 5中安装CouchDB

还长时间没有看linode的在线文档了,今天一看又多了N篇,老纪重新开始翻译其文档,对大家使用linode会有所帮助

CouchDB是一个基于文档的非关系型数据库系统,CouchDB试图提供一种更为灵活的数据库存储系统用于定制应用的开发,CouchDB用erlang写成,erlang支持一种创新的并行模型,CouchDB不用sql接口,而选用http接口和json作为数据格式,这样易于应用的开发

在安装CouchDB之前,我假设你已经阅读了入门手册

这些命令能用在linode平台,如果你还没有linode,请注册一个linode vps

安装CouchDB

在安装CouchDB之前,请先确认你的安装包库和已经安装的程序更新到最新版本,使用下面的命令

apt-get update
apt-get upgrade --show-upgraded

安装CouchDB及其依赖库

apt-get install couchdb

CouchDB
一完全安装后就会启动,你可以用位于/etc/init.d/couchdb这个init脚本对其控制,执行下面的命令就可以启动、重启、停止CouchDB

/etc/init.d/couchdb start
/etc/init.d/couchdb restart
/etc/init.d/couchdb stop

恭喜你、在大多数时候你不需要更改CouchDb的配置文件,但是,假如你需要更改任何设置,你可以设置/etc/couchdb/couch.ini中的任何选项

使用CouchDB

你和CouchDB的绝大部分交互都是通过系统的http和json接口完成的,CouchDB有一个基于web的管理界面叫做Futon,因为缺省的CouchDB仅能通过本地接口进行访问,为了访问CouchDB和Futon,你要建立一个安全的ssh隧道以避免发送明文数据。

一旦ssh隧道建立,你就可以通过请求http://localhost:5984对CouchDB进行访问,一个简单的命令行客户端curl 可以通过下面的指令来安装

apt-get install curl

现在执行下面命令

curl http://localhost:5984

CouchDB将返回

{"couchdb":"Welcome","version":"0.8.0-incubating"}

在ssh隧道激活状态下,你可以通过http://localhost:5984/_utils/访问Futon,假如你喜欢直接和CouchDB交互,CouchDB还提供了一个javascript接口,通过couchjs访问解释器

couchjs duck-team-check.js

More »