实习小结

实习两个月了,该做一些总结了。

自说自话的地方,欢迎拍砖斧正。

两个月我就做了一件事,开发了一个高性能干净的高扩展的网络IO框架。

网络框架大概是程序员造的最多的轮子之一,部门需要,让我造了这么个轮子。造完之后我觉得无论是从接口设计,还是框架内部模块之间的设计,我做个这个框架是不输给任何一个框架的(用户协议栈的那种不敢比)。

整个框架是基于libuv进行的开发,做的事情和nodejs类似,逻辑层有nodejs的开发效率,能得到多线程非阻塞异步的并发效率。

我这层网络框架之上就是逻辑层

所谓高性能,就是字面意思,性能非常好,不过网络IO高性能也就是使用非阻塞异步收发,我开发的这一套是多线程非阻塞异步的框架。每个线程上通过事件触发运行各种网络IO的任务,逻辑层可以在不感知线程数/连接数的情况下,专注于数据和逻辑本身。

自说自话:在这一部分,我所做的很多的工作是提取了一个container的概念,每个container对应着一个实际运行的线程,但是一个container上可以跑非常多的任务,从而出现了一个用户级线程(任务)的概念,提供了一些用户级线程API,维护起来方便一些,后期扩展也方便一些。
逻辑层的主要代码就放在收到数据的回调函数里,可以让用户在不感知运行多线程运行的情况下,同时多个线程并行收发和逻辑运算(!回调函数不能阻塞)

所谓干净,就是接口非常的简单,对逻辑层屏蔽了很多本就不该属于逻辑层的概念。

自说自话:干净主要在于,逻辑层不关心任务运行的线程,不关心有多少个连接,不关心协议。只关注数据和逻辑。
逻辑层只可见服务,不可见连接,逻辑层只与服务通信,服务支持断线自动重连过载保护
逻辑层的回调函数运行的时候,保证了一定收到了一个完整的报文。
并且考虑到长连接,框架会自动处理粘包的问题。
其次,提供了发送超时的机制:发送数据之后k ms没收到对应回包,会执行超时回调函数,若之后网络恢复,收到了对应回包,逻辑层不会感知。

所谓高扩展,就是考虑到网络的其他多应用场景,开发了较完备的对外和对内接口,切换场景时框架改动量小甚至不用改动。

自说自话:虽然框架在设计时希望逻辑层可以不用关心很多信息,只关心数据,但如果逻辑层想要获得连接/线程相关的信息(比如逻辑层会为每个线程使用队列,或者其他可能的需求),框架都会提供相应的接口。
框架模块化做的很细,提供了很多可以被继承的类,如果有新的特殊需求,继承实现新需求即可。

大部分特性都在上面三个自说自话里面写完了,等实习结束,自己写一个HTTP协议的类,就可以用C++开发网站啦~~啦啦啦

高效,高并发。
开发高效,非常简单的接口;并发极高,不会启动新的进程(apache+cgi),不需要使用反向代理(nginx+cgi),一个很普通的机器也可以提供十万级别的QPS。
(好吧,这里有说大话,数据库和文件访问肯定慢成翔,文件io的异步API还没做,系统的API会阻塞,所以…)。

关键是逻辑层,开发效率高,很少的代码,做很多的事儿。

整个框架是基于libuv进行的开发,做的事情和nodejs类似,逻辑层有nodejs的开发效率,能得到多线程非阻塞异步的并发效率。

你要不要来试试?

我也不知道能不能开源,哈哈哈,讲道理我是想直接merge进nodejs的。

【源码阅读系列】memcached

想读一些代码,但不知道从哪里开始,那就随便选一个吧。

前言

为什么要写这个系列。

1、就是想变厉害一点:

学习更多数据结构和算法学习被广泛应用的软件/库的源码的实现原理学习别人的编码习惯和技巧

那开源项目那么多,从哪一个开始读呢,Nginx?Linux?还是什么,于是就谷歌,找到这个网页:
https://www.zhihu.com/question/20201738
介绍了很多开源项目,于是乎决定写这个系列,先把系列的开头放在这篇文章,如果坚持读代码并且写日志分析了三个开源项目,就把给这个系列做一个新的页面。

2、博客总要写一点有用的东西

一直想写博客,可是不知道些什么好。

读书笔记实在没意思,读过再多别人读了也能懂,而且网上随手一搜那么多reference,凭什么会看你的。

设计分析倒是不错的选择,但是比如最近在公司设计的网络模型,放在外面不知道算不算侵犯公司的知识产权,就算不算,可我也不是天天都会设计模型啊,毕竟设计好了一个,实现之后维护的时间更多。

想来想去,正好想学更多东西,那就用源码阅读的笔记来填满我空虚的博客吧,于是决定尝试写这个系列。

一、memcached

之前选择了SQLite,但后来发现架构非常大,代码量也非常大,最主要的原因是…

作为将来要做后台的人,根本用不上SQLite,还是决定读一些我能用上的东西,顺便做一些有意思的东西出来,顺便通过我的这个服务器开发一些东西,做一些测试~

那么就开始吧…

……未完待续

SSL/TLS协议的理解

之前读过好几次,总是没完全理解SSL/TLS协议。

今天终于完全理解了,赶快记一下,倒不是怕之后忘,记一下现在加深印象。

另外,本文完全不涉及加密的数学原理,直接拿现成的结论来用。

非对称加密(如:RSA)

有一种神奇的算法,能够生成一对神奇的钥匙,一把是私钥一把是公钥。

两把钥匙都能加密,但都需要另一把钥匙来解密,也就是公私钥都能用来加密!!!

(上面那句非常重要,公私钥都能用来加密!

公钥加密之后用私钥解密,私钥加密之后用公钥解密。

具体为什么,这个是非对称加密的数学远离了,不深究。

然后来聊一下数字签名。

数字签名

数字签名一般是用于服务器端,将要发送的信息计算一次HASH值,然后在用私钥加密一次。然后将要发送的信息和数字签名一起发送给客户端。

在客户端用将要发送的信息计算一次HASH值,然后用公钥解密数字签名,如果两个值相等,那么这个信息一定是……不一定可信的,但加密它的一定是手上这把公钥锁对应的私钥。

那如何知道对面的身份到底是不是真正想与之沟通的服务器呢?

这里就要聊到数字证书

数字证书

说数字证书首先要说,有几家机构是全球都认为可信的机构,每个机构自己会有一批私钥一批公钥。他们的公钥会放在每一台计算机里面,从系统被安装就在系统里面

上面的信息非常重要,只要你装的是正版的系统,那么这个公钥就是可信的

蠢狗(你装的盗版怪我咯~~~)

然后如果一台服务器想做SSL/TLS,首先就要在可信机构里申请证书,那些机构会用生成一个数字证书,会有证书的有效期,公司的公钥,网址,公司名等信息,然后用一个指纹算法计算出一个HASH值,用可信机构的私钥生成一个数字签名。那这些信息和这个数字签名加在一起就是数字证书了,这样黑客只要没有证书的私钥,黑客就无法修改证书的内容。

SSL/TLS的连接过程

1、客户端发起通信请求。

2、服务器向客户端发送数字证书,证书中有服务器的公钥,证书办法机构和证书颁发机构的数字签名。

3.1、客户端在系统里寻找证书中的证书办法机构,如果没找到,发出警告;如果找到了,计算证书的指纹(数字签名),然后用公钥解密证书的签名,两者相等,则对方是认证过的服务器。

此时对方可能并没有私钥,只发送了一个证书,有没有需要下一步认证。

3.2、客户端发送一个用公钥加密的随机生成的字符串。

4、服务端用私钥加密该字符串发送给客户端。

5、客户用公钥解密之后发现与原字符串相同,说明对面拥有认证的服务器的私钥,是通信的对象。客户端生成一个对称加密算法和密钥,用公钥加密。

6、服务器与客户用这个对称加密的公钥进行通信……

……

……

 

 

 

 

参考:

http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

借用RAII思想妙用smartptr做异步程序内存自动回收

标题好奇怪啊,我的风格,啊哈哈哈哈哈,本着不写读书笔记,只记事件经验的想法写博客,刚刚度深入理解C指针忽然想到我在腾讯实习期间想到的一个对smatrptr的妙用,可以节省代码量以及后期维护产生内存泄露的可能。

RAII

RAII,在我的理解,就是一种让内存生命周期和其作用于的生命周期同步的一种自动释放机制,下面举一个例子:

class Resource{};  

class RAII{  

public:  

    RAII(Resource* aResource):r_(aResource){} //获取资源  

    ~RAII() {delete r_;} //释放资源  

    Resource* get()    {return r_ ;} //访问资源  

private:  

    Resource* r_;  

};

 

然后代码就这样写:

int func(void)

{

   Resource *t = new Resource;

   RAII(t);

.....

}

 

在这之后代码就会不用显式的delete就能delete申请的内存了。

但是显然,要针对多个类型写多个RAII类或者模板写一个。

总之,很麻烦,于是出现了智能指针,铛铛铛铛~~

boost::scoped_ptr

boost是一个非常强大的C++库,本文提到的只是它的smartptr。

简单来说smartptr是智能指针,本身就是用来解决内存泄漏的问题的,大概原理是smartptr指向一个内存,内部对这个内存的计数器就会+1,当计数器为0时,最后一个指针的析构函数会自动调用delete。

boost中有几种具体的智能指针,使用最广泛的应该是shared_ptr

我在做一个高性能异步的服务器框架,正常情况下不会使用智能指针,任何时候用shared_ptr装入句柄指针,函数结束就会释放异步句柄,这是不可取的,我只是在最后需要释放句柄事件的时候需要引入RAII帮我释放句柄的堆内存。

因为纯粹是为了RAII释放,而不会有几个指针共享一个内存,所以我使用的是实现比shared_ptr更简单的scoped_ptr

使用场景

终于说到我的使用场景了,说了那么多,其实使用场景非常简单,就是在函数结束时无论如何都要释放掉一段内存的时候,异常分支很多,之后如果添加其他分支,也可能会忘记delete这段内存导致内存泄漏。

用代码举例子吧:

void event_close(handler *handle, int status, int event)

{

    if(nullptr == handle){

        return;

    }

    scoped_ptr<handler> RAII(handle);

    if(status < 0){

        return;

    }

    use handle do something.....1

    if(xxxx){

        return;

    }

    ....

    if(xxxxx){

        THROW_EX("Err");

    }

    ....done with handle

    return;

}

在上面这个函数被调用之前handle已经内申请好内存了,这个函数是异步程序的关闭回掉函数,需要释放内存,但中间异常分支会很多(虽然多半不会被执行到),此函数退出之后要保证所有内存都被释放,是使用智能指针来实现RAII自动释放内存的一个合适的场景。

其实也没什么特别的知识,就是实践中发现一个小的实用的省事的方法。

 

PS:智能指针还是要慎重使用的,不然当内存被自动释放了你还不知道。

 

引用:

http://blog.csdn.net/hunter8777/article/details/6327704

有些事儿,开个头,世界就变了。

很久没更新了,现在在腾讯实习,机器学习啊,机器视觉的事儿暂时都放下了,在做网络方面的编程,从7.16入职到现在,还是真的学会了不少东西。

有些事儿,开个头,世界就变了。

不是以前不会Linux网络编程,只是没有在这里实践这么深刻,听那些员工讨论之后对网络的认识,对架构的认识真的非常的不相同。

世界变了之一:

之前自己对一个项目的认知就是,在变成过程中,遇到某些边界条件要想清楚。

现在对一个项目好坏的认知是,当你这个依赖的其他服务挂掉,你这个程序要能撑住;当集群中某一台机器挂掉,不会引起雪崩效应;要能够容易扩容…之类之类的。

评价从项目中的代码到了项目与项目之间的联系,对未来的扩容能够简单高效,对服务器的边界条件能够自动化适应。

这是一个收获。

世界变了之二:

开始使用开源代码,开始开发开源框架,然后就发现…那些开源代码,真的不是编码厉害,用的函数都是一样的函数,你顺着函数一层一层跟着走,函数做的功能跟你想的顺序是差不多的。

那开源世界的代码厉害在哪里?

愚见:

其一,边界条件处理的很好,不会因为一些异常忽然挂掉,这是自己造轮子容易遇到的问题。

其二,虽然顺着函数走功能和想象之中是一样的,但是哪段代码该放在一个函数,函数与函数的调用,函数与数据结构的依赖,才是每个项目最核心的。

感触好多,但用文字总结起来都是一些很虚的话,今天先到这。

 

PS:今天看网站才发现挂掉了,大概是因为内存的原因,然后开启了swap在使用,重启了一下 nginx,php-fpm和mariadb。

PSPS:话说mariadb真的很坑爹啊,挂掉了你倒是在日志里写一下内存不足啊,一大堆无关紧要的日志。

PSPSPS:今天记住了一个很厉害的命令,sysctl,可以直接修改/proc/sys里面的变量值。

想认真学一下/proc/sys里面的各个文件的意义~先成为一个Linux大师。

四轴飞行器——Robotics: Aerial Robotics笔记

1、基本原理:

电机与力的关系

转子(rotor)产生的升力和转速的平方成正比,转子在旋转时自身需要克服阻力力矩与转速的平方成正比(如图中过原点的两条曲线)

电机(motor)大小决定后,就会产生扭矩来克服转子的阻力力矩,产生的扭矩和转速的关系如上图第三条曲线。

悬停的基本原理。

悬停的基本原理。

如上图所示,可以通过飞行器的重量确定转子的转速,通过转子的转速来确定电机会产生的扭矩。

(我个人的理解大概是转子本身产生的就是向上的力,用于控制加速度,而转动一定会产生扭矩,扭矩作用在飞行器上就会让飞行器旋转。)

2、控制方式:

(这一部分注意力将只在垂直方向,来控制高度。)

控制方式

控制方式

PID和PD的介绍,因为做过飞行器,早就对这些有一些自己的理解 ~ 就不做什么笔记了。
不过记一下,PD是一个二次系统,PID是一个三次系统。

岭回归(对岭迹图的理解)

《机器学习实践》是一本好书!在你了解原理的情况下,看作者的Python实现真的是一件很享受的事情,原理性的东西被这样简洁的实现出来,看着心里很舒服。

但是如果你不懂原理,就比如岭回归,比如SVM,忽然冒出来一个公式(岭回归的参数求解公式),就很难知道为何这样编程

岭回归的求解公式:

网上搜来搜去,发现就是Andrew视频教程里提到的正则化:
(书中是用线性代数求解的,Andrew是用迭代求解,并无太多差异。)

图1

公式是对代价函数求导,令倒数为0,这样求出的。

但是有一个问题是如何确定λ,或者是用哪一个λ比较合适呢?

Andrew说正则化是用于避免过拟合,见上图的代价函数J,因为加入了最后和λ相关的约束项,系数的大小会进入代价函数,所以求解出来的系数过大会被惩罚,因此可以减小系数,达到防止过拟合的目的。

但是Andrew并未(也许是我忘了)提到岭这个词,也没提到岭迹,岭迹就是从小到大枚举λ,对每个λ求解参数向量θ,常用的处理是画出θ-λ的图像,如下图所示:

图2

见图2中代价函数J的公式,当λ为0时就是线性回归;当λ非常大时,最后系数的惩罚特别大,远大于对数据拟合的代价函数,因此会让所有系数为0,以上是我对岭迹图的理解。

至于如何选择,这又是另外一门学问,在下面的PPT中有一些介绍:
http://yyhgfx.jpk.ccut.edu.cn/u_newsfiles/1363574289/20130325/20130325092274807480.ppt

通过岭迹不仅可以选择合适的λ,还能删除,合并一些的数据。

 

附上几篇回归的文章:

线性回归建模–变量选择和正则化:
http://site.douban.com/182577/widget/notes/10567212/note/288551448/

统计学习那些事:
http://cos.name/2011/12/stories-about-statistical-learning/

局部加权线性回归(locally weighted linear regression)

转自:http://blog.csdn.net/allenalex/article/details/16370245

在线性回归中,对于给定的训练集,用一个线性表达式来拟合所有数据,当训练集中输入变量和目标变量之间的确存在线性关系时,通常拟合的很好。但是如果没有明显的线性关系的话,可能就拟合不到好的效果了。比如下面坐标表示的情形,用一条直线来拟合图上的点显然不是很合适。

欠拟合

这种情况叫做欠拟合(underfitting)。
通常来说,对待这种情况,特征的选择可能会非常的重要,比如,对于上面的图,如果加特征:x的平方,或者其他比如sin(x)可能能够实现很好的拟合这些点。我们这里要介绍的局部加权(线性)回归(locally weighted linear regression),在保证有足够训练数据的前提下,能够使得特征的选择没有那么关键。
线性回归算法中,给定一个查询点x,要预测其对应的y(也就是h(i)),处理方法如下:

1.选择合适的参数向量最小化
2.输出
局部加权回归的处理方式如下:
1.选择合适的参数向量最小化
2.输出
与线性回归的区别显然是在第一步中多了一个权值w(i)。这个权值也就是改方法为什么叫做“加权“,同时从后面的解释,你会发现它也是能够说明为了该方法又包含”局部“的原因。
这个权值怎么定义?又有什么用呢?
显然,在线性回归中,给定某个值,预测其对应的输出时,是通盘考虑所有的训练数据集。从上面的图我们看到,与其使用所有的点,可能还不如使用要预测的值的局部的几个训练数据点好。这是局部加权回归的思想,那要如何实现只考虑,或者更准确的说主要考虑局部的训练数据呢?这就是w(i)的任务了。下面给出w(i)的一种数学定义方式,读者可以提供其他的形式,只要能够实现相应的功能就行:

其中x是要预测的值,x(i)是第i个训练数据。分母中的符号’t‘控制训练点随着距离查询点x衰减的速率。越大,衰减的越慢,反之则越快。
从上式可以很明显的看到随着x(i)里x越远,权值w(i)越小。
我们的标题中局部加权(线性)回归。从上面我们已经知道”局部“,”加权“的来源,那这个线性体现在哪呢?我们想一想,从上面的局部加权回归的两步的第1部我们能够看出,在预测x对应的输出时,我们采用的是什么呢?从假设可以看出,采用的仍然是线性回归的方式,只是不像初始的线性回归,局部加权线性回归是在”局部“采用线性回归。从下图可能看到更仔细。

对上图的说明:假如给定x=10,要预测对应的y值,如果又线性拟合的方法的会,拟合得到的是图中的绿线,那么对应的点将在该直线上,但如果是局部加权,也就是只考虑(主要)两条虚线之间,也就是圆圈之内的四个点来线性拟合,那么得到的是那条红线,对应的点在这条红线上相对的y值就是预测值,从直观上来看就可以认为这种预测会更准确。

LWR算法是non-parametric(非参数)学习算法,而线性回归则是一个parametric(参数)学习算法。所谓参数学习算法它有固定的明确的参数,参数一旦确定,就不会改变了,我们不需要在保留训练集中的训练样本。而非参数学习算法,每进行一次预测,就需要重新学习一组是变化的,所以需要一直保留训练样本。也就是说,当训练集的容量较大时,非参数学习算法需要占用更多的存储空间,计算速度也较慢。有得必有失,效果好当然要牺牲一些其他的东西。人不一定什么都擅长,只要有自己的特点就可以了!!

Training Haar Cascades in OpenCV

http://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html

从这里开始,尝试了一下,但缺失细节,因为只是工具,所以不想全部自己摸索,遂参考下面的网站:

http://www.memememememememe.me/training-haar-cascades/
http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
http://note.sonots.com/SciSoftware/haartraining.html

然后正在自己尝试做一个分类器,等会更新。

[转]为什么选择archlinux?

一、为什么选择archlinux?

   从06年接触linux开始,我一路使用过:Ubuntu、Ferdoa、Archlinux、Debian、CentOS、DeLi、Puppy、 CDlinux、SliTaz、damnsmall、zenwalk、gentoo。这些不同的发行版各有特点,其中给我留下了深刻印象的有以下几个:

1、Ferdoa
    我从Ferdoa的名字还叫fedora core 6的时候就用这个东西,一直用到fedora14。个人感觉fedora core 6、fedora 8与fedora 12非常经典。这也验证了一个说法,即,在开源软件的领域,偶数版本的总比奇数版的功能更强并更稳定。fedora 7与fedora 9根本就是恶梦,所以吸取教训fedora 13我根本就没用,直接从12跳到了14。应该说,学用fedora,是我走进linux操作系统的第一步,虽然现在不再使用这个系统(因为其个儿头实在 太庞大了些),但我依然对这个系统有好感,因为它敢于坚持一些自己的东西,不像Ubuntu那样“俗媚”。正是因为使用这个系统,让我对linux产生了 兴趣,并开始有计划地一步一步进行学习。

2、DeLi、Puppy与SliTaz
   Ubuntu、Ferdoa、Debian、CentOS这几个系统都太大。Ubuntu过于迁就用户,而且商业化的气息浓厚(与现在国内的“雨林木风” 系统一样),我是浅尝辄止。Debian不错,用于服务器环境有其独到的稳定优势,我也一度将其用作单位的服务器系统,但后来嫌其有些臃肿,而且个别后台 程序不够“透明”,终于还是放弃了使用。弃大系统不用,我的眼光就转向了“小系统”,于是DeLi、Puppy与SliTaz进入了我的眼界。这三个系统 中,Puppy与SliTaz到现在为止,仍然是我的U盘操作系统。其中,Puppy4,以整个系统100MB的大小,一直是我急救U盘的主要操作系统。 比较可惜的是,这两个系统都更接进于“玩具”,不可能用于服务器环境。我个人对DeLi非常有好感,一则,是因为其小,二则,是因为其可以用做服务器!但 非常不幸的是,开发与维护这个系统的团队突然宣布了停止运维,虽然后来好像有人接手,为这个系统另取了一个名字重新开始运维,但我当时已经接触到了 LFS、gentoo与archlinux,对自己手工构建系统产生了兴趣,所以也就不再关注这个系统了。

3、zenwalk
   zenwalk给我留下的印象也很不错。小巧,美观,而且对老硬件的支持非常好。我在学用linux的时候,练手的主要工具,是家里那台赛扬366,内存 64MB的老爷台式机,所以对系统是否支持老硬件非常在意。现在才知道,zenwalk原来也是archlinux的一个分枝。怪不得当初我对区区 400MB左右,却几乎能流畅完成我们日常所想要完成的所有工作的zenwalk有好感!如果不是因为后来知道了archlinux的话,我可能会一直使 用这个操作系统。

4、gentoo
   gentoo令我印象深刻!原因,不在于它多么的好用或者多么的了不起,而在于—-这个系统,是我遇到过的,史上最折磨人的操作系统之一(另外一个折 磨人的,当然是LFS啦!)。我在奔四1.2G、内存256MB的机子上,用了一天两夜(没睡觉!),才将基本系统编译完!换言之,一天两夜,才将这个系 统安装到可以进入命令行的程度!要说安装图型界面,那我只有疯掉!完全没有了动力。安好之后,放置了差不多一个半月,才又下定决心,又用了一天两夜,编译 装上了图型界面与xfce桌面,但从此之后就再也不想用它了—-耗光了我对这个系统的所有激情与热情。但客观地说,这个系统所体现出的理念,可能是所 有操作系统中最为领先的。两个原因:a、一切都对最终用户透明,让人明明白白自己到底在做什么;b、由于可针对硬件进行特殊优化,所以用在服务器环境,估 计没谁会比这个操作系统更强悍!也正是因为这个原因,所以,国内外大型互联网企业都拿gentoo当服务器也就不难理解。

   以上文字中“一路使用过”名单里,我没有写入LFS。这是实话,因为把LFS作为自己的工作环境,我确实没用过,但练手的时候也安装过LFS。要说安装之 后的结论,我只能说,如果不是专业学linux或者不是专业学“嵌入式操作系统”的朋友,那么有两句话一定要放在心上,这两句话就是:珍爱生命,远离 gentoo;珍爱生命,远离LFS。LFS,不是“人”用的系统,如果你想成为操作系统之“神”,那么,不懂LFS,你就永远也只是个凡人。总而言之一 句话,LFS不能用于桌面办公或者服务器环境,虽然上述的操作系统中有好几个都是基于LFS构建而成的,但这个系统确实不是“人”能用的,要命的人,就不 要碰这个系统—-它,会把你的精力耗干!

   如果要打个比方的话,我们不妨可以这样比喻:Ubuntu与Ferdoa是150坪的超豪华精装套房,Ubuntu装修风格媚俗、甜腻;而Ferdoa装 修风格过于现代与超前;Debian与CentOS为实用的大型客房,装修得功能齐备而且适用性广;DeLi与zenwalk为中小型适用房,虽不豪华但 很实用;Puppy、CDlinux、SliTaz、damnsmall这几个,则是外出旅游或者家里房子坏了的时候,偶尔可以暂住一下的小客房。以上几 类都有个特点,那就是房子是现成的,而gentoo,是只有房屋设计图与一大堆水泥、砖块、钢筋之类的东西,你想要房子吗?好的,请你自己按设计图自己修 建!所以gentoo会耗死人!而LFS更离谱,是连房屋设计图也没有,水泥、砖块、钢筋等等也没有,而是给了你一张“房屋建造说明书”,这说明书告诉你 水泥、砖块、钢筋等等建房必需品可以在哪些地方买到,你得自己去找!当然,说明书也简单地告诉了你,房屋的设计图大概框架有哪些,你得自己画!所以LFS 不是普通的“人”能用的东东。至于Archlinux,可以这样看,那就是系统预先提供给用户一套清水房的框架,至于这套房子什么地方是客厅什么地方是卧 室,完全由用户决定,系统提供了各种“屋子”,用户所需要做的事情,就是根据自己的需要,像搭集木一样,用这些“屋子”给拼装成自己需要的套房。而套房的 豪华程度与实用性,则完全由用户自己决定。以上比喻还可以再进一步,例如,我们可以把自己机器的硬件条件,看成是自己兜里的钱—-超豪华套房,不是所 有人都能负担得起的,而且,这套房里不管是否是自己需要的功能,都统统用最好的或者最先进的,这对于兜里钱本来就不多的用户来说,完全就是一种浪费。至于 LFS,如果个是流浪汉,那完全可以按LFS给出的说明书,自己搭一个烂草棚,那也完全足够“容身”之用了。

   本来这部分内容要写的是个人工作站为什么选择archlinux作为操作系统的原因,但上文的写法,其实是对常见linux操作系统的优劣进行了比较。虽 然有些文不对题,但写到这儿,其实为什么我要选用archlinux的原因已经很清楚了。那就是:这个系统,既不像Ubuntu、Ferdoa、 Debian、CentOS等硬把一些不需要的功能塞给你,也不像DeLi、Puppy、SliTaz等个别自己需要的功能又没有;既有gentoo与 LFS那样的“透明”,又不会像gentoo与LFS那样光是安装个系统就会把人给累死—-总之,这个系统在很多问题上,恰恰处于“折中”的地位。权 衡利弊,选用archlinux几乎是必然。

二、个人工作站的功能如何定位?

   在archlinux操作系统下讨论个人工作站的功能,实际意义可能并不大。因为,这个环境下,自己要将自己的系统安装成什么样子,要安装哪些功能,基本 都是自己说了算。每一种功能都有N种软件可实现,或者每一种软件,都有N个大大小小的可替代品。正因为选择的余地大,所以要对个人工作站的功能进行定位, 确实没啥太大意义。反过来,在win系统中,个人工作站所对应的win版本,应该就是windows professional,也就是常说的windows“专业版”。这“专业版”其它的问题不想多说,只说一点:比如,本机上开IIS服务或FTP服务甚 至是共享文件夹,外部客户端联接到本机的个数超过十个,后面的就不再能联上。这并不是系统的问题,而是微软有意对“专业版”作的限制。这种限制当然有道 理:如果“专业版”能联100个外部地址而不断开,可能很多用户在安装服务器的时候也会选用“专业版”了,那显然就是在威胁windows server的地位。正因如此,所以,微软的个人工作站,或曰“专业版”,其实是有很多可见不可见的人为限制的。所以,在win系统下讨论个人工作站,确 实存在功能“定位”的问题,而在linux下,说实话,只要最终用户自己愿意,他想把这机子安成什么样,那确实是他自己的事。

   话虽这么说,但我们还是要对个人工作站的功能定个位,不过我们可以稍定简单一点,那就是:凡是win专业版能实现的所有功能,linux下的个人工作站, 都应该能实现,而且还要功能更强、软件更小巧、系统更轻捷!正因为是如此定义的,所以我在考虑用archlinux建立个人工作站的时候,是尽量避免使用 现成的、成套的所谓套件,所有东西都自己定义,尽量做到美观、小巧而功能完善。

转自:http://blog.sina.com.cn/s/blog_69e5d8400101bqlj.html