executables_list:
agrep 3.37
ansi2knr
basename 1.9.4
bash 2.03
bc 1.05
bison 1.28
bunzip2 1.0.1
bzip2 1.0.1
bzip2recover 1.0
cat 2.0
chgrp 3.16
chmod 3.16
chown 3.16
cksum 2.0
cmp 2.7
comm 2.0
compress 2.0
cp 3.16
csplit 2.0
curl 7.15.0
cut 2.0
cvs 2.0.41a
dc 1.2
dd 3.16
df 3.16
diff 2.7
diff3 2.7
dircolors 3.16
dirname 1.13
dos2unix
du 3.16
egrep 2.4.2
env 1.9.4
expand 5.1.2600.0
expr 1.9.4
factor 1.13
fgrep 2.4.2
flex 2.5.4
fmt 2.0
fold 2.0
fsplit
gawk 3.1.0
gclip 1.0
gow
gplay
grep 2.4.2
gsar 1.12
gunzip 1.2.4
gzip 1.2.4
head 2.0
id 1.9.4
indent 2.2.6
install 3.16
join 2.0
jwhois 2.4.1
less 340
lesskey 340
ln 3.16
logname 1.9.4
ls 3.16
m4 1.4
make 3.78.1
md5sum 2.0
mkdir
mkfifo
mknod 3.16
mv 3.16
mvdir 3.16
ncftp 3.1.8
nl 2.0
od 2.0
pageant 0.60
paste 2.5
patch 2.0
pathchk 1.9.4
pclip 1.0
plink 0.60
pr 2.0
printenv 1.9.4
printf 1.9.4
pscp 0.60
psftp 0.60
putty 0.60
puttygen 0.57
pwd
recode 3.6
rm 3.16
rman 3.0.7
rmdir
rsync 2.6.3
scp
sdiff 2.7
sed 3.02
seq 1.13
sftp
sh
shar 4.1
sleep 1.9.4
sort 2.0
split 2.0
stego
su 1.9.4
sum 2.0
sync 3.16
tac 2.0
tail 2.0
tar 1.12
tee 1.9.4
test 1.9.4
touch 3.16
tr 2.0
type
uname 1.9.4
unexpand 2.0
uniq 2.0
unix2dos
unrar 3.4.3
unshar 4.1
unzip 2.3
uudecode 4.1
vim 6.3
wc 2.0
wget 1.8.1
whereis
which 2.4
whoami 1.9.4
xargs 4.1
yes 1.9.4
zcat 1.2.4
zip 3.0
如果你是 Linux 及 Windows 的双料用户,而且是深度 CLI 控的话,可能会像我一样在用 Win 的时候会不知不觉间输入一些 Linux 的命令, 当然这肯定无法执行的。现在,有一个名为 Gow 的工具包就可以发挥作用了。
Gow 是一个相当于 Cygwin 的轻量级替代品,里面封装了130 多个的开源工具及 Linux 命令,其中包括:
Shell : bash , zsh
压缩工具: gzip, zip, bzip2, compress
SSH: putty, psftp, pscp, pageant, plink
下载工具 : cURL, wget
FTP: NcFTP
编辑器 :vim
字处理 : grep, agrep, less, cat, tail, head
文件工具: mv, cp, du, ls, pwd, rmdir, whereis
开发工具: make, diff, diff3, sleep, cvs, dos2unix, unix2dos
用户下载一个 Win 安装程序并安装后,它会自动设置好相应的环境变量,这样无论在哪个目录下都能使用这些命令了。
主页:http://wiki.github.com/bmatzelle/gow/
安装程序下载:http://github.com/bmatzelle/gow/downloads
在我的代码旅程和编程经历中,已经遭遇很多奇特的对手,还有更为奇特的盟友。我至少发现有5种代码勇士,有些是出色的战友,其他则似乎都在搅黄我的每个计划。不过他们都在软件开发的万神殿上都有一席之地。如果没有不同编程风格的良好组合,你可能会发现你的项目要不就是耗时过长,要不就是太不稳定或太过完美而无人去做。
不过他们都在软件开发的万神殿上都有一席之地。如果没有不同编程风格的良好组合,你可能会发现你的项目要不就是耗时过长,要不就是太不稳定或太过完美而无人去做。
1. The duct tape programmer 喉咙贴了胶带的程序员
The code may not be pretty, but damnit, it works! 代码或许不漂亮,但能用!
这种家伙是公司的基石。代码有问题的时候,他能快速补漏,下不再犯。当然他并不关注代码看起来怎么样,是否容易使用,以及其他琐碎的问题,但是他能搞定,没有一堆废话或不会唧唧歪歪。用这种程序员的最佳方式是,你指出问题后走开就可以了。
phone4 ios5不完美越狱后,cydia在中文状态下,点搜索或添加源秒退。只能用其他语言才行。使用很不方便。今天网上搜了一下,有解决的办法,测试可行,给大家试试。
方法很简单:
1.首先安装iFlie;
2.复制/User/Librery/下的Keyboard文件夹到/var/root/Librery/;
3.点/var/root/Librery/Keyboard文件夹右边的那个右箭头。
4.所有权改为:
所有者:root
组:wheel
并选择“应用到所有层级”。
IPHONE虽然很好酷,但是有几个地方很恶心,其中之一是默认不支持GPRS连接,只能手动配置了。
打开,设置-通用-网络-蜂窝数据网
蜂窝数据:
APN:cmnet
用户名:(不用填)
密码:(不用填)
彩信:
APN:cmwap
用户名:(不用填)
密码:(不用填)
MMSC:mmsc.monternet.com
彩信代理:10.0.0.172:80
彩信的最大信息容量:50000
这样就好了!设置好重启,看看在左上角信号条旁边有没有一个小E!这样就是连接成功了
注册破解步骤
第一步:如果已经安装过Zend Studio 9.0的,请打开Zend Studio 9.0,在菜单中“help>Unregister”,如果显示是灰的跳过此步退出Zend Studio。如果显示可以点击的请点击,这时Zend Studio会重启,重启到要求你填注册码时点“QUIT”按钮
第二步:下载com.zend.php.core_9.0.0.201111081531.jar文件,下载成功后复制到你安装Zend Studio 9.0的plugins目录下,覆盖同名文件。
每一个创新背后都有一个蛋疼的需求。
好吧,先说说我们的需求,再详细解说实现方法。假设你用ThinkPHP开发的某站点后台地址为http://www.example.com/Admin,突然有一天你老大跟你说这个路径有被扫描的风险,要你把后台路径改为http://www.example.com/MyAdmin。
这个需求影响的地方包括:
有没有更简单的方法?在不改Action和Tpl的情况下如何实现呢?这个时候应该有人马上想到了ThinkPHP的路由。
array('/^MyMdmin(?:\/?(\w+)?\/?(\w+)?)/i', 'Empty/_empty', 'm,a', 'g=Admin'),
这个时候访问:
http://www.example.com/MyAdmin/News/add
实际访问到的是:
http://www.example.com/Admin/News/add
这个时候有人会问,如果我想只让别名能访问,而原来的路径失效,可以吗?应该怎么办?
答案是可以,在路由配置里增加多一条:
array('/^Admin/i', 'Empty/_empty'),
相当于把Admin开头的访问全部重定向了空模块和空操作。
下课了,同学们再见!
CentOS 6.0已经正式发布一段时间了,做为一个大版本的第一个版本肯定有很多问题。而RHEL 6.1的发布则修补了很多问题,当然还增强(或增加)了一些功能,所以真正重要的用于生产服务器的RHEL分支还是期待CentOS 6.1吧。(毕竟RHEL不是所有人承受的起的,但是Fedora 16也是不错的选择)
按照计划官方先推出CentOS 6,然后再进行CentOS 6.1的工作。Karanbir今年早些时候曾表示CentOS 6将在未来的数个星期内发布,而之后的CentOS 6.1则紧跟,不过目前情况不好。
官方进度在此:http://qaweb.dev.centos.org/qa/blog
不过,在CentOS 6.1发布之前,CentOS官方临时发布了CentOS 6.0 CR Repo,有需要的可以下载用于CentOS 6.0上。同时这也说明CentOS 6.1会再次跳票(大家都习惯了吧!):
yum install centos-release-cr yum update
然后会有大量更新,更新即可。
之前在网上看到关于Twitter、Sina以及腾讯微薄的一些实现技术,这个简单做个摘要。
1、读扩散还是写扩散?
inbox: 收件箱,你收到的消息,即你所关注的人发布的消息。
outbox: 发件箱,你发布的消息。
写扩散(Push)
该方式为每个用户维护一个订阅列表,记录该用户订阅的消息索引(一般为消息ID、类型、发表时间等一些元数据)。每当用户发布消息时,都会去更新其follower的订阅列表。
优点:读很轻。初始化时仅需要读取自己的inbox即可。
缺点:写很重。每发布一个消息,会导致大量的写操作。
注:一般来说,用户发布消息,并不会更新所有followers的订阅列表,仅更新在线followers即可。
读扩散(Pull)
该方式为每个用户维护一个发送列表,记录该用户所有发表过的消息索引。
优点:写很轻,节省空间。用户每发布一条消息,仅需更新自己的outbox。
缺点:读操作很重,计算量大。假设你收听了1k用户,则初始化时,需要从1k个用户的outbox拉取消息,然后计算获得最新的n条消息。
混合模式(Push+Pull)
该方式既为读写扩散的结合,根据用户followers的数量来决定是读扩散还是写扩散。例如followers大于1k的,则使用读扩散,否则使用写扩散。
从目前现在网上的一些资料来看,Twitter是写扩散,腾讯微薄是读扩散,新浪微薄则是二者结合。
2、关于Cache
对于一个千万级甚至亿级用户的大型网站来说,合理使用Cache至关重要。
一个用户的核心数据由如下几个部分组成:inbox,outbox,关系链,消息内容。
inbox:主要缓存消息索引,仅为在线用户缓存,从Timyang的PPT来看,新浪微薄估计是使用redis的list或set实现。
outbox:缓存一定数量(例如200)条最近发表的消息。
关系链:following相对于followers来说,缓存容易些,follower加载开销比较大,例如刘翔在腾讯微薄的听众超过1600万。
消息内容:按内容年龄缓存;一般需要多份支持容灾;需要缓存xml,json,rss,atom等多种格式的缓存以供API使用。
以Twitter为例,其将Cache分为四类:Vector Cache,Row Cache,Page Cache,Fragment Cache,均使用memcached实现。其中:
Vector Cache主要缓存用户的inbox以及outbox索引,其命中率高达99%;
Row Cache主要缓存用户关系链数据,以及Tweets内容,命中率为95%;
Fragment Cache缓存Tweet的xml,json,rss,atom四种格式数据,以供API使用,命中率为95%;
Page Cache主要原来缓存那些高人气用户的个人主页,命中率仅为40%。
下图为TwitterCache架构图:
Twitter为啥要为API通道设置Fragment Cache和Page Cahce呢?其原因是Twitter的80%流量来自API。
下面以新浪微薄介绍一下Cache流程:
消息发布流程:
更新自己的outbox
加载followers列表
更新followers inbox
获取首页流程:
检查inbox cache是否可用
获取关注列表
聚合内容,获得消息索引
根据索引,返回最终聚合的消息内容
3、关于存储
目前Twitter和新浪的落地存储,都是使用MySQL。而腾讯微薄则使用采用SSD+大文件存储(每次写操作都是append操作,写操作可以先用内存缓存,达到适当大小合并,尽量减少随机写)。其他细节因不清楚或不方便透露,不做细述。
4、关于洪峰处理。
一般用异步队列处理方式。消息队列产品有:Kestrel(twitter使用Scala实现),RabbitMQ(使用Erlang实现),MemcacheQ。
Twitter 09年时,用户的平均followers数量为126个。按照每秒400消息发布数算,那每秒就需要推送126*400=50400条消息出去。为了削峰,Twitter自己用Scala实现了一个分布式消息队列Kestrel,其代码仅为1200行,运行在3台机器上,其使用memcached协议,其Server之间无共享状态,且全内存。新浪使用的是MemcacheQ。
BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
BSON主要会实现以下三点目标:
1.更快的遍历速度
对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。
2.操作更简易
对JSON来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。
3.增加了额外的数据类型
JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。
当然,在有的时候,BSON相对JSON来说也并没有空间上的优势,比如对{“field”:7},在JSON的存储上7只使用了一个字节,而如果用BSON,那就是至少4个字节(32位)
目前在10gen的努力下,BSON已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着MongoDB进一步地发展。