选好图,会对意

关于沟通,一幅好图总是能胜过千言万语:

(From: http://extremepresentation.typepad.com/blog/2006/09/choosing_a_good.html)

相关的一本书:《用图表说话

使用trash代替rm

在/usr/bin/目录创建一个trash文件:

#! /bin/sh

DATE=`date +%Y%m%d`
TRASH="$HOME/.trash"

# Make sure the dest directionry is exists.
if [ ! -d $TRASH ]; then
    mkdir $TRASH
    if [ ! -z $SUDO_USER ]; then
        chown $SUDO_USER $TRASH
        chgrp $SUDO_GID $TRASH
    fi
fi

if [ ! -d $TRASH/$DATE ]; then
    mkdir $TRASH/$DATE
    if [ ! -z $SUDO_USER ]; then
        chown $SUDO_USER $TRASH/$DATE
        chgrp $SUDO_GID $TRASH/$DATE
    fi
fi

while [ $# -gt 0 ]
do
    if [ `expr substr $1 1 1` = "-" ]; then
        if [ $1 = "--" ]; then
            sift
            break
        fi
        shift
    else
        break
    fi
done
mv $* $TRASH/$DATE

iptables应用实例

本机端口转发

将本机80端口的请求转发到8080端口:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

Read the rest of this entry »

关于Unix静态库和动态库的分析

基本概念

库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。 例如:libhello.so libhello.a

为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。

ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

Read the rest of this entry »

tar: Removing leading `/’ from member names

首先应该明确:*nix系统中,使用tar对文件打包时,一般不建议使用绝对路径。

通常是在两台环境相似的机器上进行同步复制的时候,才有需要使用绝对路径进行打包。使用绝对路径打包时如果不指定相应的参数,tar会产生一句警告信息:”tar: Removing leading `/’ from member names”,并且实际产生的压缩包会将绝对路径转化为相对路径。 Read the rest of this entry »

CSS sprites两三事

首先,先介绍一款CSS sprites工具:SpriteMe(http://spriteme.org/),这是由《High Performance Websites》的作者史蒂夫·桑德斯(Steve Souders),开发的一款CSS Sprites产生工具。

SpriteMe的安装十分之简单,只要把这个链接拖动到你的浏览器收藏夹就可以:SpriteMe – 当然你也可以马上点击一下试用一下。 Read the rest of this entry »

FriendFeed释出私家Web服务器框架:Tornado

令人振奋的消息:一个月前被Facebook收购的FriendFeed,在昨天放出了他们的私家Web服务器:名为Tornado的Web服务器框架。Facebook的开源产品阵营再添一员大将,此前这家位于硅谷的全球最大社交网站相继开放了他们的跨语言RPC框架(Thrift)、FBML引擎(Facebook Open Platform)、PHP调试工具(XHProf)等,每一个都是重量级产品。

Tornado由Python编写,是一款轻量级的Web服务器,同时又是一个开发框架。采用非阻塞I/O模型(epoll),主要是为了应对高并发 访问量而被开发出来,尤其适用于comet应用。Python社区原本也有很多优秀的开源Web服务器和框架,但是FriendFeed出于对性能和一些 特性的需要,尤其是其业务上对实时性要求非常之高,主流的Web服务器和框架很难兼顾到这些业务特点,所以FriendFeed决定自己开发。

确 实,Tornado在性能上卓而不凡,有图为证:

Tornado benchmark

Tornado有点像web.py 和 Google的 webapp,但是附加了很多工具,同时针对FriendFeed的业务特点,进行了一些优化从而带来非阻塞式Web服务器的优点,归纳起来Tornado有如下特性:

  • 集成网站常用的基本组件:Tornado内建了很多组件,来使Web开发中复杂事情简单化,减少重复 劳动。这些组件包括:模板引擎、Cookies用户登录、认证、L10N、静态文件缓存、CSRF攻击防护、第三方登录(像Facebook Connect)。Tornado组件非常易用,同时即便你在Tornado Web服务器来运行其它的框架,也可以使用这些组件。
  • 能够支撑实时应用:Tornado能够支撑大量的并发连接,用Tornado很容易开发需要长轮询(long polling)和HTTP流的应用。在FriendFeed,每一个活动用户与服务器之间甚至用长连接的方式居然也能承受。
  • 高性能:与大多数Python框架相比,Tornado非常的快。FriendFeed拿Tornado和其它的一些主流框架做过压力测试,Tornado的吞吐量高出其它框架4倍之巨。

在Facebook的支持下,有理由相信Tornado会成为web.py、Django的有力竞争者。

招行“99积分抢兑”攻略

昨天第一次参加招行信用卡的“99积分兑换”活动就顺利的抢了一套Lock&Lock。前后在网上搜了一下,看到很多网友在骂招行,质疑活动存在暗箱操作。

是不是真的存在暗箱操作我不得而知。不过我昨天从早上就开始做功课,发现这个活动是有技巧的,只是大多数非IT从业人员不大会借助工具,所以觉得别人能在1分钟之内填信用卡信息提交表单觉得是一件难以想象的事。实际上,只要你掌握了本文所讲的技巧,相信你也可以做到“秒杀”。

好了,来,开始吧: Read the rest of this entry »

基于位运算的权限控制

原理

在Linux文件系统中,一个用户对文件或目录所拥有的权限分为三种:”可读”、”可写”和”可执行”,分别用 1 、2 和 4 来表示,它们之间可以任意组合:有“可读”、“可写”权限就用 3 来表示(1 + 2 = 3);有”可读“、”可执行“权限就用5来表示(1 + 4 = 5),三种权限全部拥有就用 7 表示(1 + 2 + 4 = 7)。

实际上,这种运算是基于二进制的。 Read the rest of this entry »

Mysql复合主键自增长

Google Analytics的ID一般形如:UA-18xxxxx-1,UA-18xxxxx-4,我们可以将它分成两段来看:字段1:UA-18XXXXX是指帐户的ID;字段2:字段1后附加的1、4,刚分别是指该帐户名下的两个网站。不过我一直不知道这种ID怎么产生的。

最近查阅到Mysql手册才发现,原来Mysql原生就很好的支持了这种含自动增长字段的复合主键,所以字段2是存储引擎自动计算出来的。计算方式:MAX(auto_increment_column) + 1 WHERE prefix=given-prefix [1]Read the rest of this entry »