[转]别为大公司拼命(译文)

作者: 阮一峰
日期: 2010年8月26日
经过漫长的拖延,《黑客与画家》一书总算接近尾声。
我估计,再过两三个星期,全书就能翻译完成。然后,快的话,年底就可以上市。
今天,继续选登书中的精彩片段,都是令人耳目一新的言论。
==================================
别为大公司拼命
作者:Paul Graham
译者:阮一峰
本文为 How to Make Wealth 的节选

1.
大公司最大的困扰,就是无法准确测量每个员工的贡献。它会把所有人的贡献平均化。
在大公司中,你只要一般性地努力工作,就能得到意料之中的薪水。你不能明显的无能或懒惰,但是谁也没觉得你会把全部精力投入工作。
你不能对老板说,我打算十倍努力地工作,请你把我的薪水也增加十倍吧!因为公司已经假定你在全力工作了,而且更重要的是,实际上,公司无法测量你的贡献。
2.
假设有一家公司制造某种消费品,工程师为它做出各种功能,设计师为它设计一个漂亮的外壳,营销人员让顾客相信这是值得拥有的商品。请问如何评价每个人对这个商品销售额的贡献?
还有,上一代产品的工作人员,为这个公司树立了质量可靠的形象,请问最新产品的销售额有多少应该归功于他们?
根本没有办法把所有人的贡献一一分解清楚。
你想更努力地工作,但是你的工作与其他许多人的工作混杂在一起,这就产生了问题。在大公司中,个人的表现无法单独测量,公司里其他人会拖累你。
3.
销售员是一个例外。他们产生的收入,很容易测量,他们的薪水往往是销售额的一个百分比。如果一个销售员想更努力地工作,他马上就可以这样做,并且自动按比例得到更多的报酬。
此外,还有一个职位是可以测量的,那就是高级的管理职位,他们对整家公司的表现负责。高级经理就像销售员一样,不得不用数字证明自己。一个表现糟糕的CEO,是不能推托说自己已经尽了全力。如果公司的表现不好,就是他的表现不好。
不幸的是,公司不可能对每个人都像销售员那样付薪。销售员是单独工作的,大多数雇员则是集体工作。
4.
但是,就算无法测量每个员工的贡献,却有办法得到近似值,那就是测量小团队的贡献。
整家公司产生的收入是可以测量的,如果公司只有一个员工,那么就可以准确知道他的贡献了。所以,公司越小,你就越能准确估计每个人的贡献。
一家创业公司,可能只有10个员工,那么影响收入的人员因子,最多也只有10。这意味着,你最好找出色的人合作,因为他们的工作和你的一起平均计算。
5.
大公司就像巨型的古罗马战舰,一千个划船手共同划桨,推动它前进。但是,两个因素使得它快不起来。一个因素是,每个划船手看不到自己更努力划桨有何不同,另一个因素是,一千人的团队使得任何个人的努力都被大大地平均化了。
如果你从一千人中,随便挑出10个人,把他们放在一条小船上,他们很可能会划得更快。身强力壮的划船手,看到他个人对船的前进速度有显著影响,就会受到激励。如果有人偷懒,其他人也很容易发现,并会对他提出抱怨。
如果你从大船上挑选出10个最优秀的划船手,把他们组成一个团队,这时,十人小船的优势才会真正显示出来。小团队带来的各种额外激励,会在他们身上发挥得淋漓尽致。
这里最重要的是,你挑选出了最优秀的划船手,每个人都是一千人中排在最前面1%的顶尖高手。对他们来说,将自己的工作与其他高手的工作平均化,要比与平庸之辈的工作平均化,简直是太让人满意了。
6.
这就是创业公司的真正意义。
理想情况下,你与其他愿意拼命工作的人,一起组成一个团队,共同谋取更高的回报(相比为大公司工作的情况)。创业公司不仅仅是十个人的团队,而是十个同类人的团队。
Steve Jobs曾经说过,创业的成败取决于最早加入公司的那十个人。我基本同意这个观点,虽然我觉得,真正决定成败的,其实只是前五人。
小团队的优势,不在于它本身的小,而在于你可以选择成员。我们不需要小村庄的那种”小”,而需要全明星第一阵容的那种”小”。
7.
团队越大,每个人的贡献就越接近于整体的平均值。
所以,在不考虑其他因素的情况下,一个非常能干的人待在大公司里,可能对他本人是一件很糟的事情,因为他的表现被其他不能干的人拖累了。当然,许多因素都会产生影响,比如这个人可能不太在乎回报,或者他更喜欢大公司的稳定。
但是,一个非常能干而且在乎回报的人,通常在同类人组成的小团队中,会有更出色的表现,自己也会感到更满意。
(完)
文档信息
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
原文网址:http://www.ruanyifeng.com/blog/2010/08/not_working_hard_for_a_big_company.html
最后修改时间:2010年8月26日 14:11

Posted in develop | 1 Comment

贴个使用iptables和tc进行QoS管理的脚本

首先说明下我这里的网络情况:3至4台电脑,1台ADSL猫,1台无线路由,1台atom准系统。对于2M ADSL窄带来说,这个使用人数相当多了。到了晚上上网的人多了,特别是有人在使用p2p软件的时候,网络卡到不行,网页几乎打不开。由于我的atom准系统上装的是debian,所以就想到能否使用它作为路由器,作一些QoS管理。经过linuxfire的网友们启发,并经过长期的搜索后,终于总结出一套可行方案,在这里共享给可能有同样需要的兄弟。

traditional_home_net传统家庭局域网拓扑图

在传统的家庭局域网的接入方式中,路由器需要提供NAT的功能,因此需要消耗与连接数相当的内存去记录NAT信息。而许多家用路由器的内存是比较小的,比如我的 DI-624+ 只有4MB内存(我承认我买错了-_-)。当前连接数增加到一定的数量,路由器可能会出现随机的掉线、超时。我甚至经常遇到路由器失去响应该,只能通过重启解决。

下面通过不同的连接方式,把NAT这一重担转交给ATOM准系统,而路由器只需要提供简单的数据链路层的功能,极大地减轻了负担。其中debian系统的ppp0接口通过eth0接口进行拨号,而eth0接口和猫同时连接到路由器的LAN口,数据链路层是相通的,因此一样可以拨号。这边还有两个需要注意的地方是:1、需要给debian开启路由转发功能;2,为了让其它普通PC在连接后自动把这台debian设为网关,需要关闭路由器的dhcp功能,改由debian提供dhcp服务,并把dhcp服务器设置里的默认网关设为debian的内网IP。

improved_home_net改进后的家庭局域网拓扑图

修改拓扑结构后,解决了掉线和超时的问题,但在网络使用高峰期(比如18:00到23:00),依然存在网页打开较慢,网游ping值超高的问题。简单分析,这里有两个主要因素:1、p2p软件使用超量的数据包抢占带宽,造成其它用户的可用带宽大大减少;2、adsl的上传带宽和下载带宽会相互影响,在上传带宽满负荷占用的情况下,下载带宽约下降50%左右。

为了解决这两个问题,我引入iptables和tc进行QoS管理,并安装了layer7和ipp2p扩展。一方便,可以根据协议类型区分数据库,以便有效地抑制p2p的带宽占用;另一方面,将总上传带宽的使用限制在90%以内,以便取得尽量大的下载带宽。以下是最终成型的脚本。

#!/bin/bash 

TC="/sbin/tc"
IPTABLES="/usr/sbin/iptables"

# Changes these to customize.
# ppp0 与modem成功拨号后,实际上作为对外的出口存在;eth0则为内网提供服务。
WAN_DEV="ppp0"
LAN_DEV="eth0"
MAX_UPLOAD=300
MAX_DOWNLOAD=1800 

# 将此变量设为1可开启下载限速。一般而言ADSL不需要限制下载,所以这里是关闭的。
RESTRICT_DOWNLOAD=0

# 优先级的排序: critical > high > medium > low
# 除此之外,在critical之上还有一层优先级和low之下p2p专用优先级
# 所有未被匹配的流量,默认设为low,在开启layer7或ipp2p的情况下,
# p2p流量的优先级会被设为比low更低的p2p专用优先级。

# 以ip地址分配优先级
CRITICAL_PEIORITY_HOSTS="192.168.0.99"
HIGH_PEIORITY_HOSTS=""
MEDIUM_PEIORITY_HOSTS=""
LOW_PEIORITY_HOSTS=""

# 以端口分配优先级, 由于使用了layer7,所以这里端口用得不多。
CRITICAL_PEIORITY_TCP_PORTS="53 873"
HIGH_PEIORITY_TCP_PORTS=""
MEDIUM_PEIORITY_TCP_PORTS=""
LOW_PEIORITY_TCP_PORTS=""

CRITICAL_PEIORITY_UDP_PORTS="53"
HIGH_PEIORITY_UDP_PORTS=""
MEDIUM_PEIORITY_UDP_PORTS=""
LOW_PEIORITY_UDP_PORTS=""

USE_LAYER7=1

# 以layer7分析出的协议来分配优先级,
CRITICAL_PEIORITY_PROTOS=""
HIGH_PEIORITY_PROTOS="http ssl"
MEDIUM_PEIORITY_PROTOS="ftp"
LOW_PEIORITY_PROTOS=""

# 以下以layer7中的组名,将会交由 get_group 函数进行搜索得出组内包括的所有协议。
CRITICAL_PEIORITY_PROTO_GROUPS="game voip remote_access"
HIGH_PEIORITY_PROTO_GROUPS="chat"
MEDIUM_PEIORITY_PROTO_GROUPS="mail printer"
LOW_PEIORITY_PROTO_GROUPS=""

USE_IPP2P=1

group="Argument for get_group()"

# 以组名搜索协议,由于进行了文件遍历搜索,所以耗时比较长
get_group()
{
  protos=`grep "^# Protocol groups.*$group" -R /etc/l7-protocols/|awk 'BEGIN { FS="[/.]" } { print $5 }'`
}

start() {
  echo "Creating tc qdisc's and classes..."
  $TC qdisc add dev $WAN_DEV root handle 1: htb default 23
  $TC class add dev $WAN_DEV parent 1: classid 1:0 htb rate $[$MAX_UPLOAD]kbit ceil $[$MAX_UPLOAD]kbit prio 0
  $TC class add dev $WAN_DEV parent 1:0 classid 1:1 htb rate $[$MAX_UPLOAD*50]kbit ceil $[$MAX_UPLOAD]kbit prio 0
  # class 1:11 is used for small package.
  $TC class add dev $WAN_DEV parent 1:1 classid 1:11 htb rate $[$MAX_UPLOAD*30]kbit ceil $[$MAX_UPLOAD]kbit prio 1
  # class 1:12 is used for critical priority data.
  $TC class add dev $WAN_DEV parent 1:1 classid 1:12 htb rate $[$MAX_UPLOAD*20/100]kbit ceil $[$MAX_UPLOAD]kbit prio 2
  $TC class add dev $WAN_DEV parent 1:0 classid 1:2 htb rate $[$MAX_UPLOAD*50/100]kbit ceil $[$MAX_UPLOAD] prio 3
  # class 1:21 is used for high priority data.
  $TC class add dev $WAN_DEV parent 1:2 classid 1:21 htb rate $[$MAX_UPLOAD*20/100]kbit ceil $[$MAX_UPLOAD]kbit prio 4
  # class 1:22 is used for medium priority data.
  $TC class add dev $WAN_DEV parent 1:2 classid 1:22 htb rate $[$MAX_UPLOAD*15/100]kbit ceil $[$MAX_UPLOAD]kbit prio 5
  # class 1:23 is used for low priority data.
  $TC class add dev $WAN_DEV parent 1:2 classid 1:23 htb rate $[$MAX_UPLOAD*10/100]kbit ceil $[$MAX_UPLOAD]kbit prio 6
  # class 1:24 is used for p2p, make p2p flood not to affect other users.
  $TC class add dev $WAN_DEV parent 1:2 classid 1:24 htb rate $[$MAX_UPLOAD*5/100]kbit ceil $[$MAX_UPLOAD]kbit prio 7 

  $TC qdisc add dev $WAN_DEV parent 1:11 handle 111: sfq perturb 5
  $TC qdisc add dev $WAN_DEV parent 1:12 handle 112: sfq perturb 5
  $TC qdisc add dev $WAN_DEV parent 1:21 handle 121: sfq perturb 10
  $TC qdisc add dev $WAN_DEV parent 1:22 handle 122: sfq perturb 10
  $TC qdisc add dev $WAN_DEV parent 1:23 handle 133: sfq perturb 10
  $TC qdisc add dev $WAN_DEV parent 1:24 handle 124: sfq perturb 10 

  $TC filter add dev $WAN_DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
  $TC filter add dev $WAN_DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
  $TC filter add dev $WAN_DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
  $TC filter add dev $WAN_DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22
  $TC filter add dev $WAN_DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23
  $TC filter add dev $WAN_DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24 

  if [ $RESTRICT_DOWNLOAD -ne 0 ]
  then
    $TC qdisc add dev $WAN_DEV handle ffff: ingress
    $TC filter add dev $WAN_DEV parent ffff: protocol ip prio 50 handle 8 fw police rate ${MAX_DOWNLOAD}kbit burst 10k drop flowid :8
  fi

  # layer7 need to see all the packages.
  if [ $USE_LAYER7 -ne 0 ]
  then
    for proto in $CRITICAL_PEIORITY_PROTOS
    do
      $IPTABLES -t mangle -A PREROUTING -m layer7 --l7proto $proto
    done
    for proto in $HIGH_PEIORITY_PROTOS
    do
      $IPTABLES -t mangle -A PREROUTING -m layer7 --l7proto $proto
    done
    for proto in $MEDIUM_PEIORITY_PROTOS
    do
      $IPTABLES -t mangle -A PREROUTING -m layer7 --l7proto $proto
    done
    for proto in $LOW_PEIORITY_PROTOS
    do
      $IPTABLES -t mangle -A PREROUTING -m layer7 --l7proto $proto
    done

    for group in $CRITICAL_PEIORITY_PROTO_GROUPS
    do
      get_group
      for proto in $protos
      do
        $IPTABLES -t mangle -A PREROUTING -m layer7 --l7proto $proto
      done
    done
    for group in $HIGH_PEIORITY_PROTO_GROUPS
    do
      get_group
      for proto in $protos
      do
        $IPTABLES -t mangle -A PREROUTING -m layer7 --l7proto $proto
      done
    done
    for group in $MEDIUM_PEIORITY_PROTO_GROUPS
    do
      get_group
      for proto in $protos
      do
        $IPTABLES -t mangle -A PREROUTING -m layer7 --l7proto $proto
      done
    done
    for group in $LOW_PEIORITY_PROTO_GROUPS
    do
      get_group
      for proto in $protos
      do
        $IPTABLES -t mangle -A PREROUTING -m layer7 --l7proto $proto
      done
    done
  fi

  if [ $USE_IPP2P -ne 0 ]
  then
    $IPTABLES -t mangle -A PREROUTING -m ipp2p --edk --kazaa --gnu --bit --apple --winmx --soul --ares
  fi

  echo "Starting small package rules..."
  # make small package fast
  $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
  $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN
  $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p icmp -j MARK --set-mark 1
  $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p icmp -j RETURN
  $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m length --length :64 -j MARK --set-mark 1
  $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m length --length :64 -j RETURN

  echo "Starting host rules..."
  for ip in $CRITICAL_PEIORITY_HOSTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -s $ip -j MARK --set-mark 2
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -s $ip -j RETURN
  done

  for ip in $HIGH_PEIORITY_HOSTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -s $ip -j MARK --set-mark 3
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -s $ip -j RETURN
  done

  for ip in $MEDIUM_PEIORITY_HOSTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -s $ip -j MARK --set-mark 4
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -s $ip -j RETURN
  done

  for ip in $LOW_PEIORITY_HOSTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -s $ip -j MARK --set-mark 5
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -s $ip -j RETURN
  done

  echo "Starting port rules..."
  for port in $CRITICAL_PEIORITY_TCP_PORTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --dport $port -j MARK --set-mark 2
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --dport $port -j RETURN
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --sport $port -j MARK --set-mark 2
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --sport $port -j RETURN
  done

  for port in $CRITICAL_PEIORITY_UDP_PORTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --dport $port -j MARK --set-mark 2
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --dport $port -j RETURN
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --sport $port -j MARK --set-mark 2
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --sport $port -j RETURN
  done

  for port in $HIGH_PEIORITY_TCP_PORTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --dport $port -j MARK --set-mark 3
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --dport $port -j RETURN
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --sport $port -j MARK --set-mark 3
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --sport $port -j RETURN
  done

  for port in $HIGH_PEIORITY_UDP_PORTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --dport $port -j MARK --set-mark 3
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --dport $port -j RETURN
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --sport $port -j MARK --set-mark 3
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --sport $port -j RETURN
  done

  for port in $MEDIUM_PEIORITY_TCP_PORTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --dport $port -j MARK --set-mark 4
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --dport $port -j RETURN
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --sport $port -j MARK --set-mark 4
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --sport $port -j RETURN
  done

  for port in $MEDIUM_PEIORITY_UDP_PORTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --dport $port -j MARK --set-mark 4
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --dport $port -j RETURN
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --sport $port -j MARK --set-mark 4
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --sport $port -j RETURN
  done

  for port in $LOW_PEIORITY_TCP_PORTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --dport $port -j MARK --set-mark 5
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --dport $port -j RETURN
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --sport $port -j MARK --set-mark 5
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p tcp -m tcp --sport $port -j RETURN
  done

  for port in $LOW_PEIORITY_UDP_PORTS
  do
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --dport $port -j MARK --set-mark 5
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --dport $port -j RETURN
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --sport $port -j MARK --set-mark 5
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -p udp -m udp --sport $port -j RETURN
  done

  if [ $USE_LAYER7 -ne 0 ]
  then
    echo "Starting layer7 rules..."
    for proto in $CRITICAL_PEIORITY_PROTOS
    do
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 2
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
    done

    for group in $CRITICAL_PEIORITY_PROTO_GROUPS
    do
      get_group
      for proto in $protos
      do
        $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 2
        $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
      done
    done

    for proto in $HIGH_PEIORITY_PROTOS
    do
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 3
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
    done

    for group in $HIGH_PEIORITY_PROTO_GROUPS
    do
      get_group
      for proto in $protos
      do
        $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 3
        $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
      done
    done

    for proto in $MEDIUM_PEIORITY_PROTOS
    do
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 4
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
    done

    for group in $MEDIUM_PEIORITY_PROTO_GROUPS
    do
      get_group
      for proto in $protos
      do
        $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 4
        $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
      done
    done

    for proto in $LOW_PEIORITY_PROTOS
    do
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 5
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
    done

    for group in $LOW_PEIORITY_PROTO_GROUPS
    do
      get_group
      for proto in $protos
      do
        $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 5
        $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
      done
    done

    echo "Starting layer7 p2p rules..."
    group="p2p"
    get_group
    for proto in $protos
    do
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j MARK --set-mark 6
      $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m layer7 --l7proto $proto -j RETURN
    done
  fi

  if [ $USE_IPP2P -ne 0 ]
  then
    echo "Starting ipp2p rules..."
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m ipp2p --edk --kazaa --gnu --bit --apple --winmx --soul --ares -j MARK --set-mark 6
    $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m ipp2p --edk --kazaa --gnu --bit --apple --winmx --soul --ares -j RETURN
  fi

  $IPTABLES -t mangle -A POSTROUTING -o $WAN_DEV -m mark --mark 0 -j MARK --set-mark 5 

  if [ $RESTRICT_DOWNLOAD -ne 0 ]
  then
    $IPTABLES -t mangle -A PREROUTING -i $WAN_DEV -j MARK --set-mark 8
  fi
} 

stop() {
  echo "Clearing iptables mangle table chains... "
  $IPTABLES -t mangle -F

  echo "Clearing tc qdisc's..."
  $TC qdisc del dev $WAN_DEV root &&
  $TC qdisc del dev $WAN_DEV ingress
} 

status() {
  echo "tc -s qdisc show dev $WAN_DEV:"
  $TC -s qdisc show dev $WAN_DEV
  echo "tc class show dev $WAN_DEV:"
  $TC class show dev $WAN_DEV
  echo "tc -s class show dev $WAN_DEV:"
  $TC -s class show dev $WAN_DEV
} 

usage() {
  echo "Usage): `basename $0` [start | stop | restart | status | mangle ]"
  echo ""
  echo "Commands:"
  echo "start\t\tStart QoS rules"
  echo "stop\t\tStop QoS rules"
  echo "restart\t\tRestart QoS rules"
  echo "status\t\tShow QoS status"
  echo "mangle\t\tShow mangle chains"
} 

# handling arguments.
case "$1" in
start)
  start &&
    echo "QoS rules started." && exit 0 ||
    (echo "Error in starting QoS rules!" && exit 1)
  ;; 

stop)
  stop &&
    echo "QoS rules stopped." && exit 0 ||
    (echo "Error in stopping QoS rules!" && exit 1)
  ;;
restart)
  stop &&
    echo "QoS rules stopped." ||
    (echo "Error in stopping QoS rules!" && exit 1)
  start &&
    echo "QoS rules started." && exit 0 ||
    (echo "Error in starting QoS rules!" && exit 1)
  ;;
status)
  status
  exit 0
  ;; 

mangle)
  echo "iptables -t mangle -nL\n"
  iptables -t mangle -nL
  exit 0
  ;; 

*)
  usage
  exit 1
  ;;
esac

Posted in Linux | Tagged , , , , , | 1 Comment

[转]十个让你变成糟糕的程序员的行为

原链接
之前本站发表过《优秀程序员的十个习惯》以及《程序员需要具备的基本技能》,那是我们需要去学习和培养的。这里,我们主要讨论十个糟糕程序员的特征,主要是需要让我们去避免和小心的。

1) 情绪化的思维

如果你开始使用不同颜色的眼光来看待这个世界的话,那么你可能会成为一个很糟糕的程序员。情绪化的思维或态度很有可能会把自己变成一个怪物。相信你经常可以看到很多很糟糕的程序会使用下面的这些语句:

我的程序不可能有这种问题。
Java就是shit。
我最恨的就是使用UML做设计。
需求怎么老在变,没办干了。
受不了这些人,他们到底懂不懂啊。
…… ……
这些带着情绪化的思维和态度,不但可以让你成为一个很糟糕的程序员,甚至可以影响你的前途。因为,情绪化通常都是魔鬼,会让你做出错误的判断和决定,错误码率的判断和决定直接决定了你的人生。

2) 怀疑别人

糟糕的程序总是说:“我的代码一定是正确的,我怀疑编译器有问题”,“我这应该没有问题吧,STL库怎么这么难用啊”。我曾经见过有程序员这样使用STL类:map,当他发现这样放入字符串后却取不出来,觉得那是STL库的BUG,然后自己写了一个map!我的天啊!

某些时候,过早的下结论是一个很不好的习惯,任何事情都有其原因,只有知道了原因,你才能知道是谁的问题。一般来说,总是自己出的问题。

3) 过多关注实现,陷入问题细节

有些时候,当我们面对一个问题或是一个需求的时候,糟糕的程序员总是会马上去找一个解决方案或是实现,这是一个很不好的习惯。设计模式告诉我们,“喜欢接口,而不是实现”就是告诉我们,认清问题的本质和特性要比如何实现更重要。

对于一个客户的问题来说,首先应该想到的是如何先让用户正常工作,如何恢复正在“流血”的系统,而不是把用户放在一边而去分析问题的原因和解决方案。
对于解决一个bug来说,重现bug,了解原来程序的意图是首先重要的事,而不是马上去修改代码,否则必然会引入更多的BUG。
对于一个需求来说,我们需要了解的需求后面的商业背景,use case和真实意图,而不是去讨论如何实现。只有了解了用户的真实意图,实际使用的方式和案例,你才能真正如果去做设计。
糟糕的程序总是容易陷入细节,争论于如何实现和实现难题,以及问题的根本原因,而忽略了比这些更重要的东西。只有看懂了整个地图,我们才知道要怎么去走。

4) 使用并不熟悉的代码

糟糕的程序员最好的朋友是 Ctrl-C 和 Ctrl-V ,有些时候,他们并不知道代码的确切含义,就开始使用它,有证据表明,由拷贝粘贴引发的bug占了绝大多数。因为,代码总是只能在特定的环境下才能正常地工作,如果代码的上下文改变了,很有可能使得代码产生很多你不知道的行为,当你连代码都控制不住了,你还能编出什么好的程序呢?

5) 拼命工作而不是聪明的工作

对于糟糕的程序员,我们总是能看到他们拼命地修正他们的bug,总是花非常多时间并重复地完成某一工作。而好的程序可能会花双倍的时间来准备一个有效的开发环境,工具,以及在开发的时候花双倍甚至10倍的时间来避免一些错误。好的程序员总是会利用一切工具或手段来让自己的工作变得更有效率,总是为在开发的时候尽可能得不出错。后期出错的成本将会是巨大的,而且那时改正错误的压力也是巨大的。所以,糟糕的程序通常会让自己进入一种恶性循环,他们看上去总是疲惫的,总是很辛苦的,所以更没有时间来改善,越没有时间来改善,就有越多的问题。所以,拼命工作有些时候可能表明你不是一个好的程序员。

6) 总是在等待、找借口以及抱怨

当需求不明确的时候,当环境不是很满意的时候,他们总是在等待别人的改善。出现问题的时候,总是在找借口,或是抱怨这也不好,那也不好,所以自己当然就没有做好。糟糕的程序员总是希望自己的所处的环境是最好的,有明确的需求,有非常不错的开发环境,有足够的时间,有不错的QA,还有很强的team leader,以及体贴自己的经理,有足够的培训,有良好的讨论,有别人强有力的支持……,这是一种“饭来张口,衣来伸手”的态度,这个世界本来就不完美,一个团队需要所有人去奋斗,况且,如果什么都变得完美了,那么,你的价值何在吗?driving instead of waiting, leading instead of following.

7) 滋生办公室政治

有句话叫“丑女多作怪”,意思是说如果一个自己没有真实的能力的话,那么他一定会在其它方面作文章。糟糕的程序员也是这样,如果他们程序编不好的话,比不过别人的话,他们通常会去靠指责别人,推脱责任,或是排挤有能力的人,等等不正常的手段来保全自己。所以,糟糕的程序通常伴随着办公室政治。

8 ) 说得多做得少

糟糕的程序员总是觉得自己什么都懂,他们并不会觉得自己的认识和知识都是有限的。这就是所谓的夸夸其谈,是的,什么都做不好的程序员能靠什么混日子呢?就是吹啊吹啊。

另一个表现方式是他们在评论起别人的程序或是设计,总是能挑出一堆毛病,但自己的程序写得也很烂。总是批评抱怨,而没有任何有建设性的意见,或是提出可行的解决方案。

这些糟糕的程序员,总是喜欢以批评别人的程序而达到显示自己的优秀。

9) 顽固

当你给出一打证据说明那里有一个更好的方案,那里有一个更好的方向的时候,他们总是会倔强的认为他们自己的做法才是最好的。一个我亲身经历的事例就是,当我看到一个新来的程序员在解决一个问题的时候走到了错误的方向上时,我提醒他,你可能走错了,应该是另外那边,并且我证明了给他看还有一个更为简单的方法,有。然而,这位程序员却告诉我,“那是我的方法,我一定要把之走下去,不然我会非常难受”,于是,在三天后的代码评审中,在经过顽固地解释以及一片质疑声中,他不得不采用了我最先告诉他的那个方法。

这些程序员,从来不会去想,也不会去找人讨论还有没有更好的方法,而是坚持自己的想法,那怕是条死路都一往直前,不撞南墙永不回头。

10) 写“聪明”的代码

他们写出来的代码需要别的同事查看程序语言参考手册,或是其程序的逻辑或是风格看上去相当时髦,但却非常难读。代码本应该简洁和易读,而他们喜欢在代码中表现自己,并尝试另类的东西,以显示自己的才气。是的,只有能力有问题的程序员才需要借助这样的显示。

记得以前的一个经历,一位英语很不错的程序员加入公司,本来对我们这些英语二把刀来说,我们喜欢看到的是简单和易读的英文文档,然后,那位老兄为了展示他的英语如何牛,使用了很多GRE中比较生僻的短语和词汇。让大家阅读得很艰苦。最有讽刺意味的是,有一位native的美国人后来在其邮件中询问他某个单词的意思。呵呵。

你是一个糟糕的程序员吗?欢迎你分享你的经历。

(全文完)

Posted in Uncategorized | 1 Comment

trac+git,开发服务器终于有了雏形

哈哈,不容易啊。
以前听人说工作了都没有多少时间搞自己兴趣的东西,不相信;现在终于明白了,除去上班,还有这个那个的事,剩下的时间实在没多少…
服务器建在一台atom准系统上。这台atom的操作系统是debian,已经装了mldonkey, ssh, apache, postgresql, trac, vsftpd, samba 等等服务,哈哈,真是辛苦了。

Posted in develop | 1 Comment

在trac上使用ldap后端的尝试失败,挫折啊…

在trac上折腾ldap,折腾了快一个月,最后发现ldap支持实在不够完善。
本想试试看能不能凑合着用,结果在这关头误删了trac.ini,泪奔啊…放弃了…

Posted in Uncategorized | Leave a comment

有铁锈的自来水不能喝啊…悲剧

现在住的房子,自来水经常有铁锈的颜色,在网上查了下,喝这种水的害处不小,特别是对肝和肠胃…
悲剧,前段时间一直感到肚子不舒服,看来找到原因了…

Posted in life | 1 Comment

当你拿起它时,你不会感觉你拿着手机,而是个艺术品

HERO or Legend?矛盾中…

Posted in life | 1 Comment

atom准系统到手

今天刚收到的,折腾系统中…

Posted in Uncategorized | 2 Comments

httpd.conf里<Directory>,<Files>和<Location>三种配置选项的差别

关于这三个配置项的差别,apache的文档里都有,但讲得不是那么明确,特别对英文水平不好的人来说,容易搞混(好吧,我承认我搞混了 囧rz)。

是对apache在访问本地文件时在目录级上上进行限制,除了本身的服务目录(比如/var/www/localhost/htdocs)外,都要另外设置。要不,apaceh会说,配置不允许。当然,你也可以设定成允许对 / 访问,那么只要apache进程的所属用户ID能访问的,apache都会乖乖地取出来给你,但从安全上来说,这个不推荐。
比如你把 www.example.com/downloads 映射到 htdocs 外的 /var/downloads,那么,除了设置映射的语句外,还要加上


<Directory /var/downloads>
Options None
Order deny,allow
Allow from all
</Directory>

也是对本地的文件访问进行限制,不过是从文件名上进行匹配。这个主要用于防止特定文件被用户下载,比如类似.htpasswd的密码文件。来个例子,不允许访问index.html配置项:

<Files index.html>
Options None
Order deny,allow
Deny from all
</Files>
则是从url的路径部分进行匹配。啥叫路径部分?比如 http://example.com/abc/def 这个url的路径部分就是 /abc/def 。要允许对 /abc/def 的访问,则配置项如下:

<Location /abc/def>
Options None
Order deny,allow
Allow from all
</Location>

当然,httpd.conf的访问控制不只有这么简单,这些访问控制会组成类似于防火墙的规则链,以更进行更深层次的控制,要了解更多就去看apache的文档吧。

Posted in web | 2 Comments

EVE播放器

EVE_mp3_player

Posted in game | 1 Comment