2011年8月

二元一次方程都弱爆了。。鸡兔同笼新算法:已知共有鸡和兔15只,共有40只脚,问鸡和兔各有几只。算法:假设鸡和兔训练有素,吹一声哨,它们抬起一只脚,(40-15=25) 。再吹一声哨,它们又抬起一只脚,(25-15=10) ,这时鸡都一屁股坐地上了,兔子还两只脚立着。所以,兔子有10/2=5只,鸡有15-5=10只。

转载请注明出处,本文地址:http://blog.imbugs.com/index.php/archives/99/

SSSH简介

SSSH (Super SSH)是我自家写的一个SSH自动登录工具,可在Shell中实现类似SecureCRT保存密码后自动登录的功能。
SSSH 通过expect来代替人工进行I/O交互,程序根据提示自动填入已保存的密码并登录远程机器。

整个程序共三个文件,代码如下:

1. super-ssh.sh ,实现密码管理功能,此脚本为需要执行的程序,此文件中需要编辑设置SSSH_HOME的值

[code lang="shell"]
#!/bin/bash

GET_CHAR()
{
SAVEDSTTY=`stty -g`
stty -echo
stty raw
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}

SSSH_HOME=/home/admin/sssh
if [ -z $1 ];then
echo -n "请输入要登陆的机器IP/域名: "
read target
else
target=$1
fi
target=".*$target.* .*"
AUTHFILE=$SSSH_HOME/ssh-passwd.conf
count=`grep "$target" $AUTHFILE -c`
targetfullname=`grep "$target" $AUTHFILE | awk '{print $1}'`
passwd=`grep "$target" $AUTHFILE | awk '{print $2}' | awk -F ':' '{print $2}'`
user=`grep "$target" $AUTHFILE | awk '{print $2}' | awk -F ':' '{print $1}'`
encoding=`grep "$target" $AUTHFILE | awk '{print $3}'`
if [ $count -gt 1 ];then
echo -e '查找到以下主机 (\033[0;31msit\033[0m)'
arrtarget=($targetfullname)
arruser=($user)
arrpasswd=($passwd)
arrencoding=($encoding)
length=${#arrtarget[@]}
for ((i=0; i<$length; i++))
do
echo -e '[\033[4;34m'$(($i+1))'\033[0m]' ${arruser[$i]}@${arrtarget[$i]}
done
echo -n "选择序号:"
choice=`GET_CHAR`
echo ""
targetfullname=${arrtarget[$(($choice-1))]}
passwd=${arrpasswd[$(($choice-1))]}
user=${arruser[$(($choice-1))]}
encoding=${arrencoding[$(($choice-1))]}
fi

if [ -z $targetfullname ] || [ -z $passwd ] || [ -z $user ];then
echo "配置文件中没有查找到匹配的信息";
exit 1;
fi
if [ -z $encoding ];then
encoding=GB18030
fi
target=$targetfullname
$SSSH_HOME/ssh-expect.sh $user $target $passwd $encoding
[/code]

2. ssh-expect.sh,实现自动登录功能

[code lang="shell"]
#!/usr/bin/expect
set USER [lindex $argv 0]
set TARGET [lindex $argv 1]
set PASSWD [lindex $argv 2]
set ENCODING [lindex $argv 3]
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

spawn luit -encoding $ENCODING ssh -l $USER $TARGET

expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$PASSWD\r" }
}
interact
[/code]

3. ssh-passwd.conf ,用于记录密码,格式为:IP USER:PASSWORD ENCODING

[code]
127.0.0.1 user:password
imbugs.com user:password UTF-8
[/code]

使用方法:

1. 将以上三个文件放在同一个文件夹下,例如:/home/admin/sssh
2. 执行命令
[code]
cd /home/admin/sssh
chmod +x *.sh
[/code]
3. 编辑super-ssh.sh找到SSSH_HOME=/home/admin/sssh,将/home/admin/sssh替换为你机器上super-ssh.sh所在的目录
4. 编辑ssh-passwd.conf,添加连接信息
5. 如果机器上没有安装expect,需要先安装
Debian/Ubuntu 执行命令
[code]
sudo apt-get install expect
[/code]
CentOS 执行命令
[code]
yum install expect
[/code]
6. 执行 ./super-ssh xxxx 就可以登录到目标机器了,xxxx为ssh-passwd.conf中配置的IP或域名的一部分,例如:./super-ssh 127会匹配到127.0.0.1,./super-ssh bugs会匹配到imbugs.com
7. 可以将super-ssh做为系统的一个命令,执行如下代码:
[code]
sudo ln -s /home/admin/sssh/super-ssh.sh /usr/bin/sssh
[/code]
从此以后,只要执行 sssh imb 就会自动登录到imbugs.com机器上了。

附件:super-ssh.tar

Unix发展史

Unix 简史

1965年时,贝尔实验室(Bell Labs)加入一项由奇异电子(General Electric)和麻省理工学院(MIT)合作的计划;该计划要建立一套多使用者、多任务、多层次(multi-user、multi- processor、multi-level)的MULTICS操作系统。直到1969年,因MULTICS计划的工作进度太慢,该计划就被停了下来。当时,Ken Thompson(后被称为Unix之父)已经有一个称为「星际旅行」的程序在GE-635的机器上跑,但是反应非常的慢,正巧也被他发现了一部被闲置的PDP-7(Digital的主机),Ken Thompson和Dernis Ritchie就将「星际旅行」的程序移植到PDP-7上。而这部PDP-7就此在整个计算机历史上留下了芳名。

MULTICS 其实是"MULTiplexed Information and Computing System"的缩写,在1970年时,那部PDP-7却只能支持两个使用者,当时,Brian Kernighan 就开玩笑地戏称他们的系统其实是:"UNiplexed Information and Computing System",缩写为"UNICS",后来,大家取其谐音,就称其为"Unix"了。1970年可称为是Unix元年。

1971年,他们申请了一部PDP-11/20,申请的名义是:要发展文书处理系统。该提案被获采纳,他们也发展出了一套文书处理系统 ─ 就是现在Unix操作系统里面文书处理系统(nroff/troff)的前身。有趣的是,没有多久,贝尔实验室的专利部门真的采用了这套系统作为他们处理文件的工具,而贝尔实验室的专利部门也就顺理成章地成为Unix的第一个正式使用者。当时,那部PDP-11/20只有0.5MB磁盘空间。而描述这整个系统的文件被标示为:"First Edition",版本日期是1970年11月。从此以后,Unix的版本就以系统文件的版别来称呼。

UNIX家谱

UNIX的历史开始于1969年ken Thompson,Dennis Ritchie(即著名的K&G,C语言的发明人)与一群人在一部PDP-7上进行的一些工作,后来这个系统变成了UNIX。它主要的几个版本为:

V1(1971):第一版的UNIX,以PDP-11/20的汇编语言写成。包括文件系统,fork、roff、ed等软件。

V4(1973):以C语言从头写过,这使得UNIX修改容易,可以在几个月内移植到新的硬件平台上。最初C语言是为UNIX设计的,所以C与UNIX间有紧密的关系。

V6(1975):第一个在贝尔实验室外(尤其是大学中)广为流传的UNIX版本。这也是UNIX分支的起点与广受欢迎的开始。1.xBSD (PDP-II)就是由这个版本衍生出来的。

V7(1979):在许多UNIX玩家的心目中,这是“最后一个真正的UNIX,”这个版本包括一个完整的K&RC编译器,Bourne shell。V7移植到VAX机器后称为32V。

目前开发UNIX(System V)的公司是Unix System Laboratories (USL)。USL本为AT&T所有,1993年初被Novell收购。Novell于1993年末将UNIX这个注册商标转让给X/Open组织。

目前为止,UNIX有两大流派:那就是AT&T发布的UNIX操作系统System V与美国加州大学伯克利分校发布的UNIX版BSD(Berkeley Software Distribution)。SVR4是两大流派融合后的产物。1991年底,与System V针锋相对的开放软件基金会(Open Software Foundation)推出了OSF/1。

现在几种主要的UNIX版本:

◆AIX:IBM的UNIX,是根据SVR2(最近已经出到SVR3.2)以及一部分BSD延伸而来,加上各种硬件的支持。具备特有的系统管理(SMIT)。

◆386BSD:Jolitz从Net/2 software移植过来的。支持Posix,32位。

◆FreeBSD:1.x从386BSD 0.1而来,FreeBSD 2.x版是用4.4BSD lite改写。

◆HP-UX(HP):旧系统是从S III(SVRx)发展面来,现在是由SVR2(4.2BSD)发展而来,目前是10.x版。

◆Linux(x86):遵从POSIX,SYSV及BSD的扩展,这一点从上页表中即可看出。

◆OSF/1(DEC):DEC对OSF/1的移植。

◆SCO UNIX(x86):SVR3.2,目前影响较大的PC UNIX。

◆SunOS(680x0,Sparc,i386):根据4.3BSD,包含许多来自System V的东西。Sun的主要成果在于:NFS,OpenLook GUI标准,后来演变为Solaris 。这也是目前最著名的UNIX版本之一。

◆Ultrix(DEC):根据4.2BSD再加上许多4.3BSD的东西。

◆Xenix(x86):Intel硬件平台上的UNIX,以SVR2为基础,由微软推出。在中国使用较广泛。

Linux 发展史

Linux发行版本图

Linux 里程碑

2011年8月12日至15日支付宝平台架构部门Outing,先是去宁波凤凰山玩了一天,第二天前往舟山,本次Outing是做为平台架构部成员的最后一次集体活动了。
[album=2,extend]

转自:用jQuery判断当前所按的按键

刚看到个问题,如何得知同时按下了哪几个键以及按键顺序(难道是格斗游戏的组合键?),其实jQuery实现起来是很简单的。

方法就是用一个外部的数组保存当前按键。
在触发keydown时,把keyCode push到数组里,并删除重复元素;触发keyup时,用$.grep从数组中删除该keyCode。

实现代码如下:
[code lang="js" htmlscript="true"]
当前按键:<span id="msg"></span>
<script type="text/javascript">
Array.prototype.unique = function () { //这个是删除重复元素用的,可惜$.unique只能处理DOM数组。
var o = {};
for (var i = 0, j = 0; i < this.length; ++i) {
if (o[this[i]] === undefined) {
o[this[i]] = j++;
}
}
this.length = 0;
for (var key in o) {
this[o[key]] = key;
}
return this;
};
var $msg = $('#msg');
var keys = [];
$(document).keydown(function(event){
keys.push(event.keyCode);
keys.unique();
$msg.html(keys.join(' '));
}).keyup(function(event){
keys.push(event.keyCode);
keys = $.grep(keys, function (n) {return n != event.keyCode;});
$msg.html(keys.join(' '));
});
</script>
[/code]