Garey's Blog–FreeBSD/PHP/GoLang

本人碰到的问题是这样的,原来机器上只有一块硬盘da0,所以当时安装系统的时候,选择的Standard Install a standard MBR(no boot manager)的引导方式。但后来机器需要增加一块ad0的硬盘,因为现在这块硬盘是第一块硬盘了,所以standard的引导方式默认会从ad0启动,在系统启动的时候会报错:

FreeBSD/i386 BOOT

Default: 0:ad(0,a)/boot/kernel/kernel

boot:

解决方法就是重新安装BootMgr这个引导程序,具体操作:

先将IDE硬盘卸载,将系统正常启动;

执行sysctl kern.geom.debugflags=16,解除主引导记录保护限制;

再执行sysinstall–>configure–>fdisk,找到FreeBSD 的分区,按s设置可启动,再按w键写入,q退出后选择boot manager引导方式,选择BootMgr Install the FreeBSD Boot Manager;

然后重启系统,并将IDE硬盘接上使用即可。

六月 22nd, 2010

canvas的drawImage函数

No Comments, HTML5, by garey, 13,606 views.

HTML5中引入新的元素canvas,其drawImage 方法允许在 canvas 中插入其他图像( img 和 canvas 元素) 。drawImage函数有三种函数原型:

drawImage(image, dx, dy)
drawImage(image, dx, dy, dw, dh)
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)

第一个参数image可以用HTMLImageElement,HTMLCanvasElement或者HTMLVideoElement作为参数。dx和dy是image在canvas中定位的坐标值;dw和dh是image在canvas中即将绘制区域(相对dx和dy坐标的偏移量)的宽度和高度值;sx和sy是image所要绘制的起始位置,sw和sh是image所要绘制区域(相对image的sx和sy坐标的偏移量)的宽度和高度值。

drawImage

测试代码:

<canvas id="canvas" width="300" height="300">this browser does not support canvas…</canvas>
<script type="text/javascript">
window.onload=function(){
    var ctx=document.getElementById(‘canvas’).getContext(’2d’);
    var img=new Image();
    img.src=’kaixin.jpg’;
    img.onload=function(){
        ctx.drawImage(img,0,0);
    }
}
</script>

六月 20th, 2010

[转]websocket通信协议

1 Comment, HTML5, by garey, 9,186 views.

websocket通信协议实现的是基于浏览器的原生socket,在客户端用JS即可轻松完成,前些天都在学习websocket 协议(但实际上websocket 协议甚为简约),并且粗略的思考过websocket的对于下一代web应用会产生怎样的影响,我想最大的巨变应该是就是实时性上吧!另外诸如上传大文件之类的优于http的应用。但问题也随之而来,服务端怎么办?前些天我弄了个websocket 聊天室的demo,现在还得在服务器上专门开个进程来跑呢,也许到时候不再是简单架设个web server就能跑应用的了。也许过不了多久,会出不同的服务端方案吧!先期待一下。

websocket的协议是很简单的,这里我把它分成客户端和服务端来讲。在客户端,new WebSocket即可实例化一个新的websocket对象,但其参数略微有一点不一样,参数格式是这样的ws://yourdomain:port/path ,这个从我的聊天室demo里面就可以轻松看出(ws = new WebSocket( “ws://www.zendstudio.net:9108/chat” ); ),WebSocket对象会自动解析这段字符串,发送到指定服务器端口,首先执行的是双方握手(handshake),客户端发送数据格式类似这样:

GET /chat HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: www.zendstudio.net:9108
Origin: http://www.zendstudio.net
Cookie: somenterCookie
这很是有些类似于http的头信息,同样每行都是以”rn”结尾的,上面这段格式无需我们去构造,WebSocket对象会自动发送,对客户端这是透明的。此时服务端应该返回的信息是:

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://www.zendstudio.net
WebSocket-Location: ws://www.zendstudio.net:9108/chat
从这里我们太容易看出来,websocket协议的握手部分根本就是个类http的协议,所不同的是http每次都会有这样子的头信息交互,这在某些时候不得不显得很糟糕。而websocket只会执行一次这个过程,之后的传输信息就变得异常简洁了。

客户端在握手成功后,会触发WebSocket对象的onopen事件,告诉客户端连接已经成功建立了。客户端的WebSocket对象一共绑定了四个事件:1、onopen:连接建立时触发;2、onmessage:收到服务端消息时触发;3、onerror:连接出错时触发;4、onclose:连接关闭时触发;有了这4个事件,我们就可以很容易很轻松的驾驭websocket,并且需要说明的是websocket支持二进制数据的传输,因此,它远不止聊天室应用这么简单。

服务端呢?服务端也是非常简单的,但是仍然需要注意的问题是,作为服务器,安全和性能是不可忽略的,除此之外,只管往socket里面写数据就可以了,websocket的通信数据全部是以”x00″开头以”xFF”结尾的,无论是服务端发出的数据还是客户端发送的数据都遵从这个格式,唯一不同的是客户端的WebSocket对象能够自动将头尾去除,获得主体数据,这就省却了我们在客户端处理原始数据的必要,真是个体贴周到的对象啊!顺便说一句,WebSocket通信数据的编码总是UTF-8格式的。

好了,websocket协议就是这么简单。到这里,写一个服务端应该不是什么困难的事情了吧?这仅仅需要一点点socket编程知识,任何语言都可以轻松实现。另外,我想说下源码的事情,有童鞋给我留言希望看看我的服务端源码,我想想还是算了,当我公布的源码徒增自己一堆麻烦,因为一部分人把我当成写应用的了,他们总是会说:“这代码怎么不能用?”,或者说“你能再修改下源代码,以便实现下我们公司当前需要用到的XXX功能吗?”我本为技术交流,之前公布飞信php源代码的时候,就遇到太多这样的情况,我并没有为飞信php建立项目,我不可能花很多时间去跟踪飞信协议变化,不断维护我的代码。同样的,这次的websocket php服务端源代码我也不打算献丑了,还是不了。非常感谢大家持久以来的支持,希望我们能继续讨论技术本身。

原文: http://www.zendstudio.net/archives/websocket-protocol/

六月 3rd, 2010

[转]MySQL主从数据库配置实战

No Comments, MySQL, by garey, 6,034 views.

1.说明
    在做web应用系统中,如果数据库出现了性能瓶颈,而你又是使用的MySQL数据库,那么就可以考虑采用数据库集群的方式来实现查询负载了。因为一般来讲任何一个系统中数据库的查询操作比更新操作要多的多,因此通过多台查询服务器将数据库的查询分担到不同的查询数据库从而提高数据库的查询效率。

    MySQL数据库支持数据库的主从复制功能,使用主数据库进行数据的插入、删除与更新操作,而从数据库则专门用来进行数据库查询,这样就可以将更新操作与查询操作分离到不同的数据库上,从而提高查询的效率。

2.主数据库配置
    MySQL任何一台数据库服务器都可以作为主数据库服务器,我们只需要简单的修改配置文件就可以使之成为主数据库服务器。我们打开MySQL的配置文件(对于windows就是MySQL安装目录下的my.ini文件,对于linux通常就是/etc/my.cnf文件),我们在配置文件中加入如下两行:
server-id = 1
log-bin=mysql-bin
    注意,MySQL进行主从复制是通过二进制的日志文件来进行,所以我们必须开启MySQL的日志功能,即我们上面的log-bin,同时每一台数据库服务器都需要指定一个唯一的server-id,通常主数据库服务器我们指定为1。主数据库服务器的配置就是如此了,然后我们还需要给主数据库授予一个可以进行复制的用户,命令如下:
grant replication slave on *.* to ‘repuser’@'%’ identified by ’123456′;
    replication slave是MySQL数据库中表示复制的权限名称,repuser则是表示从数据库服务器登陆到主数据库服务器时用到的用户名称,123456表示登陆密码。这样,我们就在主数据库服务器上创建了一个可以进行复制的用户账号了。然后我们启动主数据库服务器就可以了。

3.从数据库配置
从数据库服务器的配置稍微多一点,主要也是修改MySQL的配置文件,加入如下行:
server-id=2
log-bin=mysql-bin     –在从服务器上启动日志记录,不是必须,但是官方建议
master-host=主机      –主数据库服务器的IP地址
master-user=用户名    –执行复制的用户名称,就是grant的用户
master-password=密码  –复制用户的密码,就是grant的用户密码
master-port=端口      –主数据库服务器的端口,默认是3306
    相关的配置参数意义已做了说明,主要就是多了配置主数据库服务器上的复制账号的信息。然后我们启动从数据库服务器,注意启动从数据库服务器后,并没有启动复制线程,我们需要在命令行中执行如下命令来启动复制功能:
slave start
启动后,我们就可以通过如下命令来查看复制的状态了:
show slave status;
    然后我们就可以看到系统的输出,第一个就是Slave_IO_State,它的值通常就是Waiting for master to send event,然后我们也还可以看到我们刚才配置的主数据库服务器的IP地址、复制账号等信息。
我们还可以在从数据库服务器上动态的改变对主数据库的配置信息,通过如下命令来进行:
CHANGE MASTER TO MASTER_HOST=’主数据库服务器的IP地址’, MASTER_PORT=3306,MASTER_USER=’主数据库上的复制帐号’, MASTER_PASSWORD=’密码’;

4.启动与监控
1)监控主数据库服务器的状态
我们可以通过showmaster status来查看主数据库服务器的状态,它的输出如下:
+——————+———-+————–+——————+
| File            | Position    | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 |   370558 |              |                  |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
    其中File是表示日志记录的文件,而Position则是表示当前日志在文件中的位置,这个也是从数据库服务器上执行复制操作必须的标识,后面的两个字段分别表示要记录的数据库名称和不需要记录的数据库名称,我们也可以在配置文件中进行配置。

2)监控从数据库服务器的状态
我们可以通过show slave status来查看从数据库服务器的状态,它的基本输出如下:
+———————————-+—————+————-+————-+—————+——————+———————+———————–+—————+———————–+——————+——————-+—————–+———————+——————–+————————+————————-+—————————–+————+————+————–+———————+—————–+—————–+—————-+—————+——————–+——————–+——————–+—————–+——————-+—————-+———————–+
| Slave_IO_State                   | Master_Host   | Master_User | Master_Port | Connect_Retry | Master_Log_File  | Read_Master_Log_Pos | Relay_Log_File        | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+———————————-+—————+————-+————-+—————+——————+———————+———————–+—————+———————–+——————+——————-+—————–+———————+——————–+————————+————————-+—————————–+————+————+————–+———————+—————–+—————–+—————-+—————+——————–+——————–+——————–+—————–+——————-+—————-+———————–+
| Waiting for master to send event | 172.16.11.221 | repuser     |        3306 |            60 |mysql-bin.000003 |              370558 | WEB2-relay-bin.000206 |         12251 | mysql-bin.000003      | Yes              | Yes               |                 |                     |                    |                        |                         |                             |          0 |            |            0 |              370558 |           12251 | None            |                |             0 | No                 |                    |                    |                 |                   |                |                     0 |
+———————————-+—————+————-+————-+—————+——————+———————+———————–+—————+———————–+——————+——————-+—————–+———————+——————–+————————+————————-+—————————–+————+————+————–+———————+—————–+—————–+—————-+—————+——————–+——————–+——————–+—————–+——————-+—————-+———————–+
1 row in set (0.00 sec)
    我们看到红色的部分,分别表示的是Master_Log_File和Read_Master_Log_Pos,即主数据库服务器上的日志文件和要读取的主数据库服务器上的日志的位置,通常这个Read_Master_Log_Pos是和主数据库服务器上的Position是一致的,当然这个是指同步以后的,如果从数据库服务器还没有同步完毕,那么这个值通常比主数据库服务器上的要小。
    如果从数据库服务器在同步的过程中出现了问题,那么我们可以通过reset slave来重置从数据库服务器的复制线程,从数据库服务器上的通常操作命令有:
Slave start; –启动复制线程
Slave stop; –停止复制线程
Reset slave; –重置复制线程
Show slave status; –显示复制线程的状态
Change master to; –动态改变到主数据库的配置

原文:http://j2ee.blog.sohu.com/77139250.html

在网关实现了之后,现在又需要把内网的机器某些端口映射到网关上,来实现从外网连接内部服务器的需求。

具体网关的实现,请参考:http://garey.bsdart.org/2010/03/freebsd-8-0的网关实现手册ipfwnatd/

在网关实现了之后,只需要作如下调整,即可实现端口重定向。

一、增加映射规则

vi /etc/rc.conf

natd_flags="-f /etc/natd.conf"

vi /etc/natd.conf

log yes

redirect_port tcp 192.168.0.100:21 21

redirect_port tcp 192.168.0.101:80 80

二、修改防火墙规则

vi /etc/ipfw.rules

#!/bin/sh

oif="tun0"
iif="em1"
fwcmd="/sbin/ipfw -q add"

valid_tcpport="21, 22, 80"

/sbin/ipfw -q -f flush

$fwcmd 0100 allow all from any to any via $iif
$fwcmd 0110 allow all from any to any via lo0

$fwcmd 0120 divert natd ip from any to any via $oif

$fwcmd 0200 check-state

$fwcmd 1000 allow all from any to any out via $oif keep-state

$fwcmd 1100 allow tcp from any to me $valid_tcpport in via $oif setup keep-state

三、重启服务器

这样,端口重定向就实现了。

周鸿祎:因为我在这个行业做了很久,其实成功的经验谈不上,失败的教训倒是非常的多。所以我想讲的第一个问题就是关于大学生创业,我个人比较反对大学生一 毕业就创业。虽然现在为了解决大学生就业问题,所以大家都在说要忽悠他们去创业,忽悠他们去办公司。其实我的一个观点是看你怎么去定义创业,有的人如果把 创业定义成我去注册一个公司,我当CEO,我女朋友当CFO,我再找个同学当CTO,公司不大什么都有,我们过把瘾。我觉得这种创业更多是为创业而创业, 实际上它是一个形式。但是我觉得有一个广义的创业,我理解你希望去追求最后干成一件事情,你希望能够创造出来一些与众不同的东西。如果你怀着这样一种创业 的心态,我觉得你从一毕业开始你确实就在创业。但是你在人生的不同阶段根据你掌握的资源不一样,你创业的具体形式可能是不一样的。

比如说举个例子,你刚毕业以后可能要找一份工作,很多人都说这是打工,既然是打工就是为老板干,为老板干当然是能混则混。其实坦率的说很多打工人都有这样 的想法,你在别的公司有一个很好的平台都干不成事情,怎么可能你从公司出来突然就能做好事情呢?所以我觉得如果抱着这样一种打工的心态打工的人他一辈子都 是打工者,他一辈子生活在社会食物链的底层,他创业不太可能成功。创业不是一种形式,而是一种心态,你把这个过程是你学习如何创业的过程。我觉得如果你怀 着这样的心态,你无论去任何一个公司,你可能不会特别挑剔这个公司短期的待遇怎么样,你更多的看到你在这个公司学到什么东西,你是不是可以加强自己的实 力。如果大家很看重头衔,头衔就是一张纸,你花钱印名片就可以了,在今天这种CPI的情况下,我估计在北京也买不到一套房子。
但是只有你在公司通过实践,你学到了能力,我认为他是别人剥夺不走的,他属于你的财富。所以我觉得在你什么资源都不具备的情况下,你一定要学习如何创业。 而且这种学习创业,不要把他看成是打工的过程,看成是老板发工资。

我们过去这一年投资了很多公司,我发现很多年轻人就是两个极端,一方面是创业我想当老板。实际上他的能力找工作的时候,非常向往我要去 Google,我要 去微软,我要去大的外企和国企,这些想法非常好,你创业你要到成长期的创业企业学习,你才能真正的学到创业的能力,我说话容易得罪人。

我可以举个例子,你们看看世界500强企业在中国的掌门人和所谓外企的高管,有没有出来单身创业成功的例子,基本上举不出来。为什么呢?因为他们都是很优 秀的职业经理人,当他们到外企之后,很多大的外企,他本身已经创业成功了,他本身已经进入到稳定的状态,这时候他需要是一颗的螺丝钉,你不需要创造力,你 更多的是执行美国总部定好的策略。在这种情况下,你所依赖的平台不是你建立的,你所拥有的很多资源都是前面人给你搭建好的。所以当你成为一个,比如说雅虎 中国的员工,你成为一个Google的员工,你拿着名片出去,所有人不是尊重你,他是尊重公司,你做很多事很省力,因为这个公司前面有很多人引导创办出来 了。如果你要自己创业,你发现一夜之间所有人看你的眼光不一样了,你发现你自己建立体系的时候不知道怎么建立。所以很多人进入到这个领域之后,他就走上职 业发展的道路,比如说我在很多方面,我肯定不如职业经理人,当我的企业到1000人和2000人的时候,这时候我会请职业经理人帮我管理公司。如果说你想 从零无中生有创造一些新的事情,你想真正的创业,因为我自己的企业,我建议最好的学习阶段,不要怕吃苦,不要太在意一些短期优厚的条件或者是待遇,你能够 加入到一些民营企业,你能够加入到一些创业企业中间,我觉得你才能真正的学到创业的真谛。

第二个阶段,我觉得对于很多年轻的创业者来讲,当你完成了第一个阶段学习的过程之后。我觉得第二个阶段很重要的心态,是要学会合作。因为我觉得今天的中关 村,过去我也在中关村混,一个人写一个软件就可以包打天下,这种永远是传奇了。现在随着行业竞争的激烈,还有整个社会的分工,整个商业环境的复杂。其实一 个人你可以是天才,但不可能是全才,更不可能是通才。所以你一定要学会利用别人的资源,你一定要学会合作。这里面我觉得要分两个阶段,比如说有些人他可能 觉得自己有能力,但是你会发现当你不具备资金,不具备市场资源,可能很多创业者刚开始都是具备技术能力或者是产品能力的时候,其实你可以考虑跟一些公司合 作,跟一些行业的公司或者跟一些孵化器合作。像李开复他试图想搞一个孵化器,像中关村在国外也有很多类似的开发区或者是类似的孵化项目,包括像盛大有一个 18计划,包括我们今年和国外的几家VC搞一个起飞计划,我们希望能够不光是提供启动的资金,而且我们能够提供商业运营的经验,提供市场运营的资源,提供 用户的资源,来帮助一些有想法,但是缺资源的年轻创业者去成功。
我发现说服人越来越难,为什么呢?很多年轻的创业者,他们老是觉得我要创业,我一定要把握,我一定要拥有这个企业。我还是要讲这个观念,你在不同的时间, 当你没有足够的资源的时候你要学习别人的分享,你要接受VC的投入,你要接受一些大的公司的战略投资,在这种情况下,这时候可能不一定你在主导这个事情。
我举一个例子,我有一个朋友做了一个公司,这个公司做了大概八年,他做网络游戏,一直没有做起来,实际上你们也知道网络游戏今天你们看到的都是成功者。十 个成功者背后可能有一千个不成功的网游公司没有人知道,网游竞争非常激烈,后来这家公司为了避免做广告的嫌疑,他们最后接受了行业一家非常著名的互联网公 司的战略投资,完了之后这家公司基本上被并入了给创业者保留一部分股份。然后这家互联网公司给他们带来了很多不仅仅是资金上的问题,最重要的是给他带来了 非常多的用户资源,使得这个公司在没有能力市场推广下,借助这家公司的推广下获得了巨大的用户,现在这家公司的收入从原来濒临倒闭到现在的收入是一亿美 金,我问他们你们被别的公司控制了,他说如果这个公司不给我们提供不具备的资源,那我们这家公司就不存在了。

我再给大家举一个例子,就是Google推出的手机操作系统,当年是摩托罗拉和诺基亚的公司出来的人,他们要做互联网时代的手机操作系统。如果他们采用授 权金的方式,他们是没有能力跟诺基亚和微软竞争的,如果他们决定非常革命的做,免费的方式一个小公司没有收入,免费一定是做不下去的。所以这个团队整个把 这个项目,他们意识到自己缺少资源,他们把这个项目加入了Google,后来这个故事你们都知道了,由于有了Google的团队,他把自己优秀的互联网服 务放进来,Google对这个团队不要求他们挣钱,不仅仅采用免费,而且采用开源的模式,使大家认为可以跟诺基亚相匹敌的操作系统。
从我的角度来看,我认为这些创业者,他们想干一件大事,但是他们知道自己的资源不足。但是他们学会跟一些有资源的公司合作,无论你拥有这个公司的百分之 百,当这件事情做成,多大的比例乘以零最后都是零,而且你浪费很多时间和精力,很多创业者一旦摔跤,有的人因此不一定爬起来。但是当他们借助一些成熟公司 的资源,当他们最后能把这些公司做成,这些事情能成为改变世界的事情,我想对于开发者来讲,不仅仅是实现他们人生的梦想,他们自己也会得到丰厚的回报。所 以我觉得有了创业者,你资源不是很多,你可以考虑用合作的方式。有的人在行业里历练,其实你们都很年轻,未来一生中不可能只创业一次,可能当你真的拥有更 丰富的市场经验产品经验和团队经验的时候,在这种情况下,你出去自己再成立公司,然后找VC融资,再组建团队,我觉得这是创业的最后一种形式,也是最高阶 段。
但是这种情况下我认为你要有丰富的经验,所以很多大学生创业,往往是刚出小门一步要跳到最高级阶段,要自己成立公司,要自己掌控一切,我觉得这种失败率都 不是概率,基本上是百分之百。如果大家能够放下一些成见或者不要被公关宣传忽悠,你仔细想想我今天处在什么样的阶段,我缺少什么样的资源,我怎么样通过学 习积累经验,我怎么样跟别人合作我们可以借船出海、借鸡下蛋,如果不是这样我觉得创业很难成功,有的时候你可以不拘泥于操作的形式,最后的目的是我只要能 把这件事情做成。因为我也告诉很多人,今天很多人说为什么你老周就能忽悠VC,我连VC就见不着,为什么你做点事情别人会响应。其实很简单,我觉得你现在 没有成过事情,大家都在说自己很能干的事情,作为投资人很难判断,当你的第一个创业不能狭义的等同于自己的第一个公司,最后你把一件事情做成了,我相信你 的团队就建立了。

比如说今天有很多员工从Google或者从百度退出,他们出来很骄傲的说百度的贴吧和搜索是我做的,我相信不用说更多的话,他做过更多话,他有这个能力, 一定会有很多的VC愿意投资。也可能你没有挣到太多钱,比如说你在百度挣了一百万,你想挣一个亿,但是你可能只是解决了温饱问题,你的无形资产增加了,你 出来之后VC愿意投资你,我觉得你的身价已经提高了。

所以我讲我是一个理想主义者,但是我是在现实中不断碰壁之后,我希望大家继续有自己的理想,但是要有实用主义的操作想法,使得你在未来的人生中一步一步逼 近自己的目标,这是我第一个跟我们年轻创业者的建议。无论你今天是打工,还是决定创办公司,我觉得这都不重要,重要的是你无论遇到什么困难,你永远不要把 创业的梦想丢掉,你创业也不是为了短期内挣钱,而是要做出与众不同的东西,什么样的形式都可以帮助你,你不妨可以更灵活一些。

我讲这个问题也是我们在做起飞计划中,我们碰到过很多有些人才,但是他们自己实在是不足以把一个事情从小做到大。你需要把它变成一个商品,你需要市场营 销,你需要找商业模式,你需要挣钱。最后你的员工多了需要管理,你需要融资和管理投资人,最后你发现有七八个环节都需要你做得很好,这里面只要有一个环节 出问题。就像航天飞机上天一样,只要有一个小毛病这个飞机立马追回。很难说服一些年轻的创业者,他们放弃一些更大不切实际的目标,而能够脚踏实地踏踏实实 的积累一些经验,这是我个人的感受。现在我们有一个起飞计划,我觉得我们最大的价值不是资金,而是我们很希望扶持中国很多的个人免费软件,来帮助他们找到 行业模式,帮助他们推广给中国几亿用户群中,我们希望通过这样一种合作方式,让中国的互联网中有更多的类似像360这样的软件成长起来。

_____________________

第二个主题我简单讲一下,这个可能是针对创业企业来讲的。我要讲一个颠覆式创新,因为我老是做颠覆,所以很多人很恨我,我总是被妖魔化,今天大家总是见到 不是像妖怪的人,大家心里放心一点了。其实我一直有一个观点,如果你今天决定创业的话,我个人的感觉是一定要做创新,而这种创新我觉得从成功率来讲,我觉 得一定要做颠覆式的创新,而不是做改良式的创新,什么是改良式的创新,你把别人的产品做的更好一点,或者更便宜一点,这些都是渐进式的改良,我觉得这种模 式很难成功。很简单,当你跟行业里的大公司竞争的时候,他们比你更有钱,他们比你更有资源和用户,如果你按照他们的游戏规则来玩,即使你做一些改良,大公 司马上会做出反应,他们马上会把他们的产品迎头赶上,特别是在中国互联网巨头中成长起来,我觉得一定要干别人今天想不到的事情。
举一个最简单的例子,可能很多人都知道原来有一个校内网,校内网的创始人我也认识,当年他创办校内网。所以这件事就成了,任何一件事情成功都有很多偶然, 但是很多人就得出一个结论。就是说抄袭是最好的,后来他抄袭了别的,问题是新浪也开始抄袭、QQ也开始抄袭,全中国的门户都抄袭的时候你发现问题出来了, 你作为抄袭没有任何不一样的东西,没有任何颠覆的东西,你就跟大公司没有办法竞争了。所以我们讲颠覆式创新,我有一本书向大家推荐,这本书叫《创新者的困 境》,它其实举了很多的例子。我觉得你一定要做出一个东西,这个东西它解决了一个问题,而过去在你的方案出来之前,别人可能要非常复杂的才能解决这个问题 或者代价要很高。我觉得360做免费杀毒,它本身实际上并没有在产品上创新,并没有说杀毒是我们发明的,坦率地说杀毒这个行业已经20年。但是颠覆式的创 新不仅仅是技术上的创新,或者不单纯是技术的创新,也不单纯是产品的创新,很多时候是商业模式的创新。

举个例子来说,过去大家都要花钱买杀毒软件,在我们出来之前杀毒软件很贵一套大概3、4百块钱,所以导致我们很多人用盗版。我们看到了这样一个机会,就是 说这件事情很有价值。但是大家要为它付出很大的代价,当我们要进来的时候,大家想想瑞星、金山在这行业里做了很多年,他们有很多积累和沉淀,也有优势。如 果我们模仿他们,我们的杀毒软件比他们查杀率更高一点,做的更便宜一点,他卖300,我卖250,这些都是不可能成功的,你一定会被他们摁掉。我讲什么叫 颠覆式创新,我彻底免费,我用跟他完全不一样的商业模式,我通过做免费的安全,我让用户喜欢我,我让用户认知我,当然我在谋求极大的互联网模式,这种模式 实际上就是颠覆,这种颠覆使得在市场上非常有优势的大公司突然变的很尴尬,就像练葵花宝典一样,要想成功必先自宫,他们全部免费的时候,他们杀入互联网的 时候,他们全是卖软件,大家想想过去的软件公司,杀毒公司一年出几个版本,他们实际上就一套代码,当年花点钱做点界面,一旦东西卖给你,他的任务就完成 了,这东西高不好用就单说了。但是你让卖惯了软件的公司,他做互联网,探索在互联网上有没有新的增值服务,我能不能把软件基于云和服务端的模型这个确实很 难,这样的话他们跟360是在同一个起跑线上。

如果你出来创业,你千万不要觉得自己是世界上最聪明的人,也不要你觉得的想法很好,而且中国互联网现在有一个很怪的现象,大公司长大以后他们一方面是互相 进入,都没有什么创新意识。比如说谁看着谁好,他们互相抄一抄,神仙打架小鬼遭殃,完了之后他们最喜欢抄袭创业公司,你们先做吧,当你们开发差不多,我们 宣布我们进入这个领域。所以中国的创业环境其实比硅谷恶劣多了,你要做一个小公司,你要考虑怎么跟大公司竞争,这是很多创业者面临的问题。我带来的建议是 你一定要想大公司不注意的领域,如果大公司也注意这个领域,你想想有没有什么方法,中国古代的哲学是讲阴和阳,我最近在想这个,还不成熟跟大家分享一下。 很多时候一个东西阳到极点可能要到反面,大家知道FaceBook,它是让好友联系,你再做一个类似的东西怎么打败它呢?所以出来一个逆向操作,大家再想 一想它对传统的博客是什么样的颠覆,过去的博客只能写140字,还不让你放图片,你看它有很多缺点,但是这种缺点都是不重要的,最重要的是它突出了一个简 单,任何人只要会发手机短信你都可以在上面无病呻吟一下。到新浪上写博客,都是我口述我的秘书记录下来,谁有时间写那么多长篇大论,所以它变的非常简单。

你仔细体会行业里成功的东西,而是讲怎么从产品和技术,还有商业模式上怎么做跟别人反着来的东西,你卖钱我就免费。有的东西可能你免费,也许我做收费的服 务,或者说你这个产品主打功能大而全,我而且会做非常窄的东西。就像股市里面有的人,巴非特说别人贪婪时你恐惧,别人恐惧时你贪婪。今天有一个团购网站据 说在美国火了,我猜今天这么多人肯定有几个人想干这个事情,我告诉你已经晚了。所以说因为今天时间有限颠覆式创新,强力的推荐大家看看我那本书,你怎么样 不怕做出一个粗糙的东西,但是你一定要在核心价值上给用户提供一个非常方便可以得到一个服务,而且跟现在行业里面的巨头,我觉得会形成一个非常大的反差。

从颠覆再往前推一点,其实我想补充的是这个点一定要足够小,足够专注。怎么说呢?我们很多人在融资的过程中,老是把自己的想法说的不够大,因为说的越宏 大,他觉得才能引起投资人的注意。但是说的大跟做的大是两个概念,所以从我的经验来看,我投资这么多创业公司,我觉得所有成功的公司都是从一个很小的点做 起来,千万不要从行业的高度和产业的高度做创业,那是政府官员、研究家和思想家做的事情,你做一个创业者,你不要说老周3G时代来临了,我们应该做一个 Web3.0,我说很简单,你说这些东西都是你自说自话,你永远要回答一个问题,你做了一个什么产品,你解决了什么问题,你面对什么样的用户,你给用户创 造了什么价值。所以再伟大的想法,Google今天很大,他最早说我在互联网海量的内容上帮助用户找到需要的信息,QQ是今天中国最牛的互联网公司,他们 的想法就是做一个聊天工具,大家在聊天时候可以泡妞,因为中国很多青少年,他们没有正常社交的窗口,他们很渴望跟外面的窗口交流,QQ跟他们提供一种能 力,大家觉得很无聊的东西,所聊的内容,但是它成为了中国最成功的互联网公司。你一定要把创业的点想到足够小,凡是自认为有经验想做平台的公司一定做不 成,因为我自己就是这个概念的受害者。我第一次创业的时候做3721希望在地址栏,这个想法今天看来很好,当时还没有搜索引擎,不用去任何网站,因为很多 老百姓记不住,直接在地址栏里面打一个中文就可以让他找到网站,我出来做奇虎的时候我们很容易拿到几千万的资金,那时候我们不自觉的把自己放到云端,我们 站在云端往下看,我说服了很多VC,我跟他们讲PPT,我忽悠他们太容易了。实际上我把自己给忽悠了,当你把自己放的很高,你在争论产业的发展,你在争论 技术的方向都没错。我们忽略了一点,我们没有脚踏实地的到用户中间去,没有好好想想用户究竟需要什么,所以我们做的东西都是觉得我们有这个技术做给你用, 但是没有想想你到底需要什么。我们奇虎头两年,应该说我很有远见,我很早就看到了社区,但是我们最热门的搜索放在一起,你说还有什么比这更激动人心的,所 以我们什么也没有干成。
但是360得成功也有很多偶然的因素,我们刚刚做360的时候想法很简单。如果我们具有今天的知识,我估计360也做不成了,我们太懂这个行业了,我们一 定会高瞻远瞩看到未来的发展方向,我们会规划一套安全体系,到今天我们的东西可能还没有开发完,可能我们还在实验室里面。实际上我们当时做360的时候我 们不懂安全和杀毒,我们的想法简单,中国当时有那么多的恶意软件和流氓软件,我们的想法特别简单,做一个免费、有效的,管你是谁的,我一律通杀谁都不认。 我们怀着这样一个点的想法,而且我们把这件事情打通了用户的需求,而且这件事情做的非常专注,我们通过做这一件事情迅速在一年时间里面,360就有了上亿 的用户,你有了用户和口碑,没有杀毒我们可以推免费杀毒,我们也可以推防火墙,我们今天做的时候,问题当你创业的时候,你总不能看到别人做了四年以后的事 情你再来做。很遗憾我们行业里面有很多成功人士,他们都不真实,他们成功以后就说我们当年多么高瞻远瞩和运筹帷幄,其实成功都很简单。今天我拿自己失败的 例子,给大家讲一下,你什么时候把自己的想法更加聚焦瞄准用户,什么时候你的创业就真正的脚踏实地。

___________________________

最后还有一个问题,关于创业其实除了聚焦,除了专注,还有一个建议就是要学会利用一些武器。很多人见我老是问你怎么挣钱,大家特别替我操心。其实我觉得免 费是在互联网中非常有利的武器,而且免费也是互联网的精髓,也是互联网的哲学。我相信在座的各位和很多人第一次上互联网,跟我15年前第一次上互联网的感 觉是一样的,一上去这么多好东西还能免费,现在网上什么东西都有。你看我投资迅雷,大家免费下载电影,酷狗免费给大家下载MP3。我简单解释一下,其实免 费不仅仅是一种手段,它其实可以成为一种商业模式。但是它要有几个前提,我觉得在互联网里,如果你做的事情,它是每个人都需要用到的服务,我觉得它应该一 定是免费的。就像搜索、邮件、通讯一样,如果今天没有免费的,今天的互联网大家都去买微软的,那互联网肯定发展不起来,所以免费是互联网的基石。
在互联网上只有真免费才可以的,我在现实世界里如果听到吃饭不要钱,我脑子里也会敲警钟,最起码有一个物流的成本,也就是说我送人越多,我的成本越高,使 得在现实世界里,你长期永久性的做免费是不可能的,因为你的投入产出不成正比。但是在互联网上所有的产品都是数字化的,都是虚拟的。你下载一个软件,软件 的研发成本是固定的,每个人下载成本几乎为零。比如说杀毒软件我们一年的研发成本是两千万,你给两个人用,每个人的成本是一千万,如果你给两亿人用,每个 人的成本是一毛钱。我不会随着用户的增多而增高,而是随着用户的增多我的边际成本在下降。所以我跟大家解释一下,过去杀毒厂商有一个谣言,他说他们每年做 一个杀毒软件需要多少钱,杀毒软件是暴利。我们每年的成本是固定的,但是我不是为了追求年卖几百万套软件挣几个亿,我让中国几亿网民用到,因此我的成本并 没有增加,我的成本基本上是固定的。所以这种固定的模式,才可能成为一种真正免费的模式。

再比如说像网上视频,为什么有时候很难做呢?当看的越多带宽消耗的越多,所以网络视频很难成为免费的。但是360提供的软件,这种模式刚才我讲了,大家一 定要放心,这种互联网免费模式实际上是真正存在的。在互联网上免费之后怎么挣钱,我来解答这个问题。实际上很简单,在传统世界里,由于地域的限制和时空的 限制,使得我们经常讨论一个交易只有买方和卖方,如果我不挣钱或者如果说我挣了它的钱,一定会有人吃亏,大家得出这样一个结论。互联网把很多人连在一起, 使得第三方补贴成为可能。现在大家去新浪看新闻不需要钱,新浪靠什么挣钱呢?新浪有足够的眼球,他会有广告来付钱,这个市场里消费者、厂商和广告主构成了 三方的市场,这里面不是两方的博弈,是广告主为每个消费者买单,其实全球最大的互联网公司,在你免费用搜索引擎的时候是广告主为你买单的。

但是对于360和很多软件来说,这种广告模式我个人不是很喜欢。如果你本身变成一个网络媒体做广告,我觉得无可厚非。但是我们是安全卫士,所以我觉得我们 应该探索一种更好的模式,就是免费加增值,叫做免费增值服务。我的理解当我用免费服务,当我积累大量的用户群以后我可以推出增值服务,这个增值服务是直接 向用户收费的。怎么来界定什么东西该做增值服务,这里面有几个特点。一个是增值服务属于微支付,它属于特别便宜,他可能是一个月三块钱、五块钱,其实这个 模式不是我的发明,它的发明最早是腾讯,我有很多同事都是用免费服务。腾讯有很多QQ秀、QQ空间和很多增值服务,这就是这个模式最精妙的地方,它创造出 来很多增值服务,每个增值服务的价值都不高,三五块钱,你很容易拍板说我买这个。如果一个增值服务只有1%的人买,大家觉得这个购买率够低了,如果你有3 亿用户,1%是300万,如果一个月三到五块钱,那就是1500万左右,那一年就是两个亿,这只是一个服务。

也就是说免费是变成推广增值服务最有利的营销手段,同时免费也是建立用户忠诚度最好的手段。所以有人经常讲一句话免费没好货,这句话错了,在互联网上免费 的质量往往比收费的质量高。但是今天如果有免费的软件给你用,如果不好用你三分钟就卸下来了,所以很多竞争为什么这么激烈,所有网站基本上都是免费的。但 是只要你感觉这个网站搜索不好,用户马上转移。

我举一个最典型的例子,360杀毒软件是最好的,也就是说免费的东西比收费的还要好,这是互联网给我们的压力。有些公司理解为增值服务和免费服务变成同类 服务,这是失败的。你为了卖更多的增值服务,你就得降低免费服务的品质,如果你把免费服务的品质做的更高,你的增值服务就卖不出去。所以当你设计增值服务 的时候,它的免费服务是不同性质的。你们做免费杀毒,是不是查毒免费,杀毒收费,我们都是免费的。如果我们决定做网络安全,那在网络安全上无论杀大病毒、 小病毒、流氓软件我们都是免费到底,我的增值服务肯定跟这个杀毒没有关系。它可能是安全存储或者其他的,比如说在线备份相关的服务。所以在互联网上判断真 假免费服务很简单,免费服务和增值服务一定不是硬性捆绑的。你不买增值服务,你一样可以享用高品质的免费服务,这才是真免费。如果说你只有买了我的东西才 能免费,这是假免费,我今天就讲到这里。

原文:http://www.oschina.net/news/9196

五月 7th, 2010

FreeBSD下SubVersion的安装

No Comments, FreeBSD, by garey, 7,738 views.

一、安装apache
cd /usr/ports/www/apache22
make install clean
BDB

echo mysql_enable="YES" >> /etc/rc.conf

二、安装subversion
cd /usr/ports/devel/subversion
make install clean
MOD_DAV_SVN,APACHE2_APR,MOD_DONTDOTHAT

三、配置apache虚拟主机
vi httpd.conf
# Virtual hosts
Include etc/apache22/extra/httpd-vhosts.conf

vi extra/httpd-vhosts.conf
<VirtualHost *:80>
        DocumentRoot "/home/garey/htdocs"
        ServerName garey.bsdart.org

        <Directory "/home/garey/htdocs">
               Options +Indexes +Multiviews
               order allow,deny
               allow from all
        </Directory>

        # Subversion Settings
        <Location /svn>
                DAV svn
                SVNParentPath /home/garey/svnroot/repos
                AuthType Basic
                AuthName "Svn Repository"
                AuthUserFile /home/garey/etc/svn-passwd
                AuthzSVNAccessFile /home/garey/etc/svn-access
                Require valid-user
        </Location>
</VirtualHost>

cd /home/garey/svnroot/repos
svnadmin create Project1
chmod -R 777 Project1
cp Project1/hooks/pre-revprop-change.tmpl Project1/hooks/pre-revprop-change
chmod +x Project1/hooks/pre-revprop-change

cd /home/garey/etc
vi svn-access
[/]
garey = rw

htpasswd -c svn-passwd garey
输入两次密码

启动apache
/usr/local/etc/rc.d/apache22 start

之后就是客户端的设置了。

Arseblog 2010年4月15日 评论文章

每个像今天这样的早晨,都很难下笔。你得想象有个杀手宣读着最后通牒,然后允许你写下这篇可能很垄长的博客。你喝着咖啡,想啊,想啊,一个词语都组织不起来。最终,你想到第一个词,剩下的就水到渠成了:

胡说!

从数学角度来看阿森纳的冠军机会并不多,但我一直讨厌数学,而且现实总会击败那些数字。1999年以来,热刺头一次在联赛里打败阿森纳。我觉得,这样的事儿发生是必然的。但你不得不坐在那里想,现在这个阶段,是我们最糟糕的阶段。我不愿告诉你我们失去了哪些队员。你我都知道谁受伤了;如果谁谁能来,将带来怎样的变化。我只想谈谈昨晚现场队员的表现。

比赛第9分钟,热刺领先。热刺队里最年轻的队员丹尼.罗斯以主场进球的方式展开了自己的职业生涯。是的,我知道他职业生涯刚刚起步,但是他已经不可能打进更棒的进球了。当然,他也不能再对阿穆尼亚这么干了(希望如此),而在我看来见(这只是为说明我仅代表我个人意见)门将应该做的更好。一个更好的门将不会把球打掉,而会把球抱住。当时他是在毫无压力下,可以有足够的时间足够的信心,但他却只是把球打出去。

不过,为了辩证起见,我们可以认为更好的门将也会把球击走。但我敢肯定,他不会在哪里傻愣着观察球的飞行轨迹,直到球又从自己的头顶飞回来才有所反应。让罗斯得分——没有问题。问题是让可怜的阿穆尼亚守门——即使我们在这样一个伤了又伤的赛季,我也不禁要想,如果我们有个更像样的球员,我们能拿回多少分。

上半场的时候阿森纳控球率更高,但他们没有利用好着宝贵的机会。我们唯一命中目标的射门是坎贝尔利用戈麦斯防守角球的失误,但是补门队员把球挡出了球门线。我们的传球很好,但是几乎没有什么渗透力。鲜有的一次,我们发现一条能穿透防线的传球路线,埃布埃磕磕绊绊把球传给罗西基,但是禁区里的本特纳却将罗西基喂给他的球打偏。热刺队的机会更好。帕夫柳琴科射门被费尔马伦挡出(我觉得此球便是造成失球的那个角球)。不久莫得里奇的单刀被阿穆挡下。

第19分钟费尔马伦因为小腿伤势被换下,我们不得不派上西尔维斯特。比利时人可能要缺席2-3周。我们失去了最佳的中后卫组合。无论如何,上半场0-1落后与热刺。你不得不期盼教练在休息室里为自己的队伍打气,让大伙儿想起这可是北伦敦德比。你需要一个反应,快点进个球让他们闭嘴!

而我们确实很快取得了进球,可惜不是在对面的大门里。热刺进攻,萨尼亚拖在其他后卫身后有4码的距离。而西尔维斯特像个傻蛋一样让球传到了没有越位的贝尔脚下。威尔士最著名的黑猩猩把比分变成了2-0。阿森纳的反应几乎是立竿见影。萨尼亚被撤下,埃布埃回撤右后卫,小老虎上。阿森纳因此富有攻击性了?没有!

温格赛后说,我们的一些球员需要学习坎贝尔。如果我是经理,今天上午我会让球员坐下来,看看比赛重播。后防线上,35岁的坎贝尔真是难以置信的棒。他争下了每一个头球,赢得每一次对抗,从没让那些明显比他速度快的球员过掉他。他是如何做到这点的?答案很简单:他的精神,他充满求胜欲。我知道北伦敦德比对他来说是特殊的比赛,但是他对待他的每一场比赛都会像这场一样。他讨厌失败,他总是要赢,不管对手是热刺或任何其他球队。这种精神在昨晚穿红色球衣的人里头少的可怜。

范佩西只上场22分钟。但是效果显著,我们的进攻威胁大了许多。尽管他缺席了5个月,但是他上场的最后15分钟,阿森纳机会很多。一次美妙的胸部停球,一次禁区内的凌空扫射,这正是我们所期待的范佩西。可惜戈麦斯没有让球射进球网。随后戈麦斯又扑掉了他的任意球和坎贝尔的头球。罗西基射门偏了很多。然后阿森纳进球了,沃尔科特从右边突破,本特纳打进了过去11场比赛里第9个进球。这个关头,热刺动摇了。他们试图控住球,但我们总是够快。

最后到了补时。91分钟时西尔维斯特成功地抢断贝尔,他应该把球传给阿穆尼亚。他犹犹豫豫,而此时阿森纳需要的是一个大脚,看看能不能蒙进一个。相反,他错误地把球踢给了热刺队员。而后,我们输了。我们没有很好的控住皮球也没有取得进球,而我们本应该顶住压力早点把比分扳平。作为一个球员,他的经验还是不够丰富。我不是在说这些导致阿森纳的输球。但是如果你在这点压力下不能做好简单的传球,那你留在这个水平的联赛里踢球是不会成功的。

我并不想针对个人指手画脚,但我想说会之前谈到坎贝尔的问题,球队缺乏赢球的渴望和落后时的紧迫感,这是令人担忧的。如果你问一个不懂球的人,场上哪支球队在周日踢了120分钟的比赛?他一定会选阿森纳。我知道我们少了很多球员,但是迪亚比、德尼尔森、罗西基并不是无名小辈。他们只是没有好好表现。很明显他们就是增援部队,但在此阶段,他们没有站出来承担起主力队员受伤留下的空缺。我觉得纳斯里总是尝试要球,把球控制住,但是缺乏将球向前带动的能力。一些球员顺利踢完了比赛。我不会特地指出谁谁谁踢得有些保留,但很明显他们中有人不情愿冒险。

本场比赛中的纯爷们儿是35岁的坎贝尔,第二好的球员的是已经5个月没踢球的前锋。这已经能说明很多问题了。它也能让教授看清很多。余下还有四场比赛要打,我觉得现在不是球队重组的好时机。但是等赛季结束,我们最后期望:现在那些明显折磨我们的队员同时也折磨着教授。在这里我不想引用温格谈论昨天比赛表现的话。但有一段是说坎贝尔的:

索尔是我们最好的球员之一。他给一些球员做了表率。他是赢家。他表现告诉别人,如果你想赢得冠军,你必须做什么。他的表现值得人们给他更多才赞扬。

直到最后15分钟以前,不穿白色球衣的人里头好像只有一个人想赢下比赛。教授得做出一个很大的决定——今夏是否留下坎贝尔;一年,还是两年。基于昨晚的表现,你禁不住会认为最好留下他。教授需要给费尔马伦找一个长期稳定的搭档,所以即便留下,坎贝尔也可能不会经常出场。但是他能教育那些阿森纳队员,当你遇上像昨晚一样的比赛,你究竟该做些什么。你不百分百投入,你是不可能赢下他们的。如果场上只有一个队员这么做,那么想夺得冠军只是痴人说梦。足球会惩罚你。

不过,作为作为昨晚痛苦的失败者我们不应该忽视这样一个事实:在联赛里我们已经取得了进步。我们球队现在有些支离破碎,现在只是用胶带才勉强把球队粘合起来。但这不是没有意义的。老板说:这赛季我们一定能赢得一些东西,但我们没有。他说,如果我们没有赢得任何一个奖杯就就说明我们补充新鲜血液。他将在夏天看看情况,并考察现在队里的人能不能留下。

我必须承认,我并没有期待我们能在争冠集团待这么久。我甚至没有奢望能夺得冠军。哪怕昨晚我们拿到三分,最后结局也很可能是我们在别的地方迎来痛苦。还有一些比赛没打完,赢得第二的位置不是不可能的,虽然没有人会记得亚军,但我们必须继续前进,去取得我们能取得的最高名次。说为荣耀而战似乎有点陈词滥调,但本周末,成千上万的阿森纳球迷将前往维冈,他们付出了自己的血汗钱去支持球队- 没有时间留给这些球员打滚了。

冠军?完了。本赛季完了?还没呢。阿森纳完了?永远不会!

四月 6th, 2010

[转]Python中安装MySQLdb模块

No Comments, MySQL, Python, by garey, 6,821 views.

Python程序连接数据库时,需要导入 MySQLdb 这个module。
以下是安装步骤:
下载MySQLdb,展开之后,运行
python setup.py build
进行编译
这一步可能出现许多问题,常见的有
fatal: library -lmysqlclient_r: not found
这是因为当前平台上没有thread-safe library造成的。
解决办法是,在site.cfg文件中设置:
threadsafe = False
mysql.h: No such file or directory
这是因为找不到mysql.h这个文件,一般来说,文件都存放在mysql安装目录的include目录下。
解决办法是,在site.cfg中指定mysql的路径。
另外需要注意的是,在编译时,一定要保证mysql安装目录中/bin目录下的文件都在PATH中,否则无法编译通过。
接下来执行
python setup.py install
安装完成。
比较诡异的是,有时即使安装完成,在python中执行
import MySQLdb
仍然可能出错:
libmysqlclient.so.12: cannot open shared object file: No such file or directory
遇到这种问题,需要在/usr/lib/下为libmysqlclient.so.12设置一个符号链接(这里假设mysql安装在/usr/local /mysql下)
ln -s /usr/lib/mysql/lib/libmysqlclient.so /usr/lib/libmysqlclient.so.12
再次执行
import MySQLdb
成功。

原文:http://hi.baidu.com/iamacnhero/blog/item/bba34e13cae16525dd5401aa.html/cmtid/cde0371173fb6472cb80c46c

随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付 web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:
1、High performance – 对数据库高并发读写的需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的 BBS网站,往往也存在对高并发写请求的需求,例如像JavaEye网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。
2、Huge Storage – 对海量数据的高效率存储和访问的需求
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。
3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?
在上面提到的“三高”需求面前,关系数据库遇到了难以克服的障碍,而对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地,例如:
1、数据库事务一致性需求
很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。
2、数据库的写实时性和读实时性需求
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比方说我(JavaEye的robbin)发一条消息之后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。
3、对复杂的SQL查询,特别是多表关联查询的需求
任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
因此,关系数据库在这些越来越多的应用场景下显得不那么合适了,为了解决这类问题的非关系数据库应运而生,现在这两年,各种各样非关系数据库,特别是键值数据库(Key-Value Store DB)风起云涌,多得让人眼花缭乱。前不久国外刚刚举办了NoSQL Conference,各路NoSQL数据库纷纷亮相,加上未亮相但是名声在外的,起码有超过10 个开源的NoSQLDB,例如:
Redis,Tokyo Cabinet,Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable, Riak,Tin, Flare, Lightcloud, KiokuDB,Scalaris, Kai, ThruDB,  ……
这些NoSQL数据库,有的是用C/C++编写的,有的是用Java编写的,还有的是用Erlang编写的,每个都有自己的独到之处,看都看不过来了,我(robbin)也只能从中挑选一些比较有特色,看起来更有前景的产品学习和了解一下。这些NoSQL数据库大致可以分为以下的三类:
一、满足极高读写性能需求的Kye-Value数据库:Redis,Tokyo Cabinet, Flare
高性能Key-Value数据库的主要特点就是具有极高的并发读写性能,Redis,Tokyo Cabinet, Flare,这3个Key-Value DB都是用C编写的,他们的性能都相当出色,但出了出色的性能,他们还有自己独特的功能:
1、Redis
Redis是一个很新的项目,刚刚发布了1.0版本。Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是我知道的性能最快的Key-Value DB。
Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存List链表和Set集合的数据结构,而且还支持对List进行各种操作,例如从List两端push和pop数据,取List区间,排序等等,对Set支持各种集合的并集交集操作,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一个功能加强版的memcached来用。
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,并且它没有原生的可扩展机制,不具有scale(可扩展)能力,要依赖客户端来实现分布式读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。目前使用Redis的网站有 github,Engine Yard。
2、Tokyo Cabinet和Tokoy Tyrant
TC和TT的开发者是日本人Mikio Hirabayashi,主要被用在日本最大的SNS网站mixi.jp上,TC发展的时间最早,现在已经是一个非常成熟的项目,也是Kye-Value 数据库领域最大的热点,现在被广泛的应用在很多很多网站上。TC是一个高性能的存储引擎,而TT提供了多线程高并发服务器,性能也非常出色,每秒可以处理 4-5万次读写操作。
TC除了支持Key-Value存储之外,还支持保存Hashtable数据类型,因此很像一个简单的数据库表,并且还支持基于column的条件查询,分页查询和排序功能,基本上相当于支持单表的基础查询功能了,所以可以简单的替代关系数据库的很多操作,这也是TC受到大家欢迎的主要原因之一,有一个Ruby的项目miyazakiresistance将TT的hashtable的操作封装成和ActiveRecord一样的操作,用起来非常爽。
TC/TT在mixi的实际应用当中,存储了2000万条以上的数据,同时支撑了上万个并发连接,是一个久经考验的项目。TC在保证了极高的并发读写性能的同时,具有可靠的数据持久化机制,同时还支持类似关系数据库表结构的hashtable以及简单的条件,分页和排序操作,是一个很棒的 NoSQL数据库。
TC的主要缺点是在数据量达到上亿级别以后,并发写数据性能会大幅度下降,NoSQL: If Only It Was That Easy提到,他们发现在TC里面插入1.6亿条 2-20KB数据的时候,写入性能开始急剧下降。看来是当数据量上亿条的时候,TC性能开始大幅度下降,从TC作者自己提供的mixi数据来看,至少上千万条数据量的时候还没有遇到这么明显的写入性能瓶颈。
这个是Tim Yang做的一个Memcached,Redis和Tokyo Tyrant的简单的性能评测,仅供参考
3、Flare
TC是日本第一大SNS网站mixi开发的,而Flare是日本第二大SNS网站green.jp开发的,有意思吧。Flare简单的说就是给 TC添加了scale功能。他替换掉了TT部分,自己另外给TC写了网络服务器,Flare的主要特点就是支持scale能力,他在网络服务端之前添加了一个node server,来管理后端的多个服务器节点,因此可以动态添加数据库服务节点,删除服务器节点,也支持failover。如果你的使用场景必须要让TC可以scale,那么可以考虑flare。
flare唯一的缺点就是他只支持memcached协议,因此当你使用flare的时候,就不能使用TC的table数据结构了,只能使用TC 的key-value数据结构存储。
二、满足海量存储需求和访问的面向文档的数据库:MongoDB,CouchDB
面向文档的非关系数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能。MongoDB是用C++开发的,而CouchDB则是Erlang开发的:
1、MongoDB
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
Mongo主要解决的是海量数据的访问效率问题,根据官方的文档,当数据量达到50GB以上的时候,Mongo的数据库访问速度是MySQL的 10倍以上。Mongo的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万-1.5次读写请求。对于Mongo的并发读写性能,我(robbin)也打算有空的时候好好测试一下。
因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储,但我也看到有些评论认为GridFS性能不佳,这一点还是有待亲自做点测试来验证了。
最后由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎,很多项目都考虑用MongoDB来替代MySQL来实现不是特别复杂的Web应用,比方说why we migrated from MySQL to MongoDB就是一个真实的从MySQL迁移到MongoDB的案例,由于数据量实在太大,所以迁移到了Mongo上面,数据查询的速度得到了非常显著的提升。
MongoDB也有一个ruby的项目MongoMapper,是模仿Merb的DataMapper编写的MongoDB的接口,使用起来非常简单,几乎和DataMapper一模一样,功能非常强大易用。
2、CouchDB
CouchDB现在是一个非常有名气的项目,似乎不用多介绍了。但是我却对CouchDB没有什么兴趣,主要是因为CouchDB仅仅提供了基于 HTTP REST的接口,因此CouchDB单纯从并发读写性能来说,是非常糟糕的,这让我立刻抛弃了对CouchDB的兴趣。
三、满足高可扩展性和可用性的面向分布式计算的数据库:Cassandra,Voldemort
面向scale能力的数据库其实主要解决的问题领域和上述两类数据库还不太一样,它首先必须是一个分布式的数据库系统,由分布在不同节点上面的数据库共同构成一个数据库服务系统,并且根据这种分布式架构来提供online的,具有弹性的可扩展能力,例如可以不停机的添加更多数据节点,删除数据节点等等。因此像Cassandra常常被看成是一个开源版本的Google BigTable的替代品。Cassandra和Voldemort都是用Java开发的:
1、Cassandra
Cassandra项目是Facebook在2008年开源出来的,随后Facebook自己使用Cassandra的另外一个不开源的分支,而开源出来的Cassandra主要被Amazon的Dynamite团队来维护,并且Cassandra被认为是Dynamite2.0版本。目前除了 Facebook之外,twitter和digg.com都在使用Cassandra。
Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。我看到有文章说Facebook的Cassandra群集有超过100台服务器构成的数据库群集。
Cassandra也支持比较丰富的数据结构和功能强大的查询语言,和MongoDB比较类似,查询功能比MongoDB稍弱一些,twitter的平台架构部门领导Evan Weaver写了一篇文章介绍Cassandra:http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/,有非常详细的介绍。
Cassandra以单个节点来衡量,其节点的并发读写性能不是特别好,有文章说评测下来Cassandra每秒大约不到1万次读写请求,我也看到一些对这个问题进行质疑的评论,但是评价Cassandra单个节点的性能是没有意义的,真实的分布式数据库访问系统必然是n多个节点构成的系统,其并发性能取决于整个系统的节点数量,路由效率,而不仅仅是单节点的并发负载能力。
2、Voldemort
Voldemort是个和Cassandra类似的面向解决scale问题的分布式数据库系统,Cassandra来自于Facebook这个 SNS网站,而Voldemort则来自于Linkedin这个SNS网站。说起来SNS网站为我们贡献了n多的NoSQL数据库,例如 Cassandar,Voldemort,Tokyo Cabinet,Flare等等。Voldemort的资料不是很多,因此我没有特别仔细去钻研,Voldemort官方给出Voldemort的并发读写性能也很不错,每秒超过了1.5万次读写。
从Facebook开发Cassandra,Linkedin开发Voldemort,我们也可以大致看出国外大型SNS网站对于分布式数据库,特别是对数据库的scale能力方面的需求是多么殷切。前面我(robbin)提到,web应用的架构当中,web层和app层相对来说都很容易横向扩展,唯有数据库是单点的,极难scale,现在Facebook和Linkedin在非关系型数据库的分布式方面探索了一条很好的方向,这也是为什么现在 Cassandra这么热门的主要原因。
如今,NoSQL数据库是个令人很兴奋的领域,总是不断有新的技术新的产品冒出来,改变我们已经形成的固有的技术观念,我自己(robbin)稍微了解了一些,就感觉自己深深的沉迷进去了,可以说NoSQL数据库领域也是博大精深的,我(robbin)也只能浅尝辄止,我(robbin)写这篇文章既是自己一点点钻研心得,也是抛砖引玉,希望吸引对这个领域有经验的朋友来讨论和交流。
从我(robbin)个人的兴趣来说,分布式数据库系统不是我能实际用到的技术,因此不打算花时间深入,而其他两个数据领域(高性能 NoSQLDB和海量存储NoSQLDB)都是我很感兴趣的,特别是Redis,TT/TC和MongoDB这3个NoSQL数据库,因此我接下来将写三篇文章分别详细介绍这3个数据库。

原文: http://robbin.javaeye.com/blog/524977