关于作者

姓名:刘刚

性别:其他

出生日期:--

地区:湖北 武汉

联系电话:

QQ:75587147婚否:未婚
用户名:hustlg
笔名:hustlg
地区: 湖北 武汉
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



hustlg(刘刚)的博客

 

欢迎访问hustlg(刘刚)的博客,专注于分布式网络,P2P,VPN系统开发。希欢旅游,古典音乐,乒乓球,长跑,平时对地理,经济学及管理学很感兴趣;对哲学、人物传记也有一定的兴趣。我的技术专栏:http://blog.csdn.net/ganghust/ ganghust@gmail.com QQ:75587147 逝水无痕......(相册) MyPhoto:我的照片

文章

再回丹江口  (作者置顶)
摘要:2008年8月23号,一夜的火车终于在凌晨的迎着晨曦驶入了武昌火车站,从深圳到武汉,1200多公里,十几个小时,然后从武昌火车站乘坐前往十堰的火车,在襄樊下车,然后辗转前往此行的目的地丹江口市,离开这里8年多以后再次回到这里,心里有一种特别的感情和期望。 查看全文

- 作者: hustlg 2008年09月11日, 星期四 20:46  回复(0) |  引用(0) 加入博采

eMue片选择算法  (作者置顶)
摘要:由于从事eMule协议的相关开发已经有一段时间了,最近经常收到一些网友的邮件,探讨p2p网络中片选择的一些问题。 比如,在p2p假如一个文件被分为很多块,当有很多个client请求时,谁向谁请求哪些文件块,因为client和文件的提供者都是不断变化的啊。不知道emule是怎样处理这个问题的。就某一个时刻而言,client和文件的提供者是固定的,以什么样的规则请求文件块呢? 查看全文

- 作者: hustlg 2008年03月24日, 星期一 13:07  回复(2) |  引用(0) 加入博采

互联网江湖-百度IM  (作者置顶)

     互联网江湖最近又兴起一波新的巨浪,百度推出了他传闻已久的即时通讯工具百度Hi,其实百度要做IM早在业内传的沸沸扬扬,只是消息封锁的比较好,一直都没有准确的消息罢了,所有的消息都是大家的推测,例如之前所说“百度小生”。现在中国的IM领域,QQ占据了90%的市场分额;百度占据了75%的中国搜索市场。两家公司毫无疑问都是各自领域的绝对霸主,就像相当年如日中天“盛大”一样,单单一款“热血传奇”占据中国60%的游戏市场分额。百度在这个时候推出其IM产品,并且定义为战略级别的产品,可见其对IM的重视程度。IM产品和其他的网络产品相比,用户的迁移成本非常高。不知道百度的IM产品是如何定位的,根据最近从网上泄露出来的内部测试版本来看,实在看不出什么特别之处。百度占有中国搜索引擎市场75%的市场分额,但是百度想要轻而易举的在IM市场打下一大片领土也绝非易事。凭借这雄厚的资本实力,百度拥有Hao123、千千静听、天空软件、超级兔子,这四个产品全部都是国内拥有庞大用户,在加上百度贴吧的用户群,短期内产生惊人的数量增长是没有问题的。但是,百度会把“Hi”定位在什么层面上呢?作为自己其他产品的一个附属品?还是选择游走在QQ和MSN两中模式之间的一种?现在都不明朗,当然企业之间的竞争,最终的受益者是广大的网民。QQ过于臃肿,MSN定位与高端白领,虽然两者的用户之间存在一定程度的重叠。可是这对于他们各自的影响并不大,那是因为他们的产品定位完全不同,所以两者才能相对融洽的存在。在这个市场剩余的空间并不多,网易泡泡,Uc,lavalava的前车之鉴已经证明了这一点。

    百度目前已经形成了巨大的中文社区,贴吧,知道等等都有非常高的人气,IM可以做为串联这些平台产品的工具。但是具体如何整合,提供更具特色的服务,是一个知道思考的问题。个人觉得,一个'简'和'垂直服务'是非常知道考虑的。现有的IM,比如QQ花哨的功能太多,占用大量的系统资源,令人郁闷的弹出广告层出不穷。另外一点就是加强和扩充群的功能,如果贴吧一样,群可以增加一些功能。 目前群作为一个活动的圈子,还有很大的潜力没有发掘出来。 比如QQ群: 1、没有好的用户档案,用户登记的特征信息太简单  2、用户的活动没有积累,无法评价一个用户的活跃和信誉的累积过程  3、用户产生的信息没有输出。  4、群内产生的关系链,没有发展到外部,为群内组织所有。 5.可以赋予群主也可以说是吧主更多的权限,激励和刺激用户 。  刚才是对群的一些想法,当然这样做可能群主会非常累,可以考虑积分和实际的奖励。但是可以刺激用户提高群的质量。群里有一个人贡献大、经常维护群内容,那么他有很多积分,能否获得人的尊重,这种尊重甚至会带来商机和工作机会,我们将线上的服务和线下的服务结合起来,也许会产生一片新的天地:)

   准备下班回去了,随便谢谢自己的想法,也是好久没有更新Blog了。 

- 作者: hustlg 2008年02月27日, 星期三 20:05  回复(0) |  引用(0) 加入博采

桂林阳朔行  (作者置顶)
摘要:200年11月28日,周四晚的火车,T37,从深圳出发,隆隆地奔行于湘西南,窗外一片漆黑,只是从列车停靠知道已过了广州,郴州、衡阳、永州。清晨,外面景色清晰起来,一下火车,一阵凉意袭来,比深圳清晨的气温还是低了很多.小时候,跟着老师念:“桂林山水甲天下。今天终于有机会可以领略这里的山水了. 查看全文

- 作者: hustlg 2007年12月7日, 星期五 20:30  回复(0) |  引用(1) 加入博采

工作7个月了-今天明天未来和希望  (作者置顶)
摘要:时光入流水,今天是工作的第7个月,一个人静静地坐在电脑前,回顾和总结自己地过去几个月的经历,展望未来,勇敢的像先迈进。 查看全文

- 作者: hustlg 2007年11月15日, 星期四 22:24  回复(4) |  引用(1) 加入博采

一个'听书"的好地方--博客思听  (作者置顶)
摘要:在现今这个信息爆炸的时代,我们有太多的书需要读,却只有太少的时间可以读书。大部分的时候,我们的眼球总是忙碌着,但我们的耳朵,却空闲着。我一直通过这个网站【博客思听】了解最新的书籍,作为紧张的技术工作之于一个放松的好方法,如果听后,喜欢可以直接网络购买。你可以通过听书来了解作者的主要观点,如果你需要仔细阅读,可以把这里作为一个入口,从网上订购。我已经从这里听和看了很多书,发现的确是一个很不错的地方。向大家推荐,如果由机会我们可以交流”听书“和读书的感受:) 查看全文

- 作者: hustlg 2007年10月8日, 星期一 22:46  回复(0) |  引用(1) 加入博采

今天是我的生日,祝愿自己生日快乐  (作者置顶)
摘要:我的生日,我相信自己,努力一定会有所收获.愿天下所有努力奋斗的人都能实现自己的梦想!好好珍惜现在所拥有的一切,珍惜疼爱你及你所爱的人! 查看全文

- 作者: hustlg 2007年09月15日, 星期六 18:11  回复(3) |  引用(1) 加入博采

武汉特色小吃和饮食文化--毕业前夕的感想  (作者置顶)
摘要:在武汉念书将近7年了,马上即将毕业了。说起来还真是遗憾啊,武汉还有很多地方没有去过了。 一座城市无论怎样,待久了,总会让人产生感情的。也许只有到离别的时候才会体验到这份感情的 感人之处。武汉是一座历史悠久而又富有光荣革命传统的城市。1986 年经国务院颁布为国家历史文化名城。 查看全文

- 作者: hustlg 2007年01月29日, 星期一 11:28  回复(2) |  引用(1) 加入博采

推荐《西方艺术史》记录片  (作者置顶)
摘要:日子和单调,每天打交道最多的是机器,文档-代码-文档。。。。最近几天一直再看《西方艺术史》记录片,感觉很不错。让我体会到艺术的伟大和无穷的魅力。记录片主要包含的内容介绍如下: 查看全文

- 作者: hustlg 2006年07月24日, 星期一 09:49  回复(0) |  引用(1) 加入博采

腾讯的产品管理之道
最近看了一些讲腾讯产品管理体系的文章,虚实都有,恰好有个同事以前在腾讯工作,能提供第一手的资料。于是今天下午开了1小时会议,专门讨论腾讯的管理之道,发现有这么几点处理得很好。

1、设置一个质量监控小组,由经验非常丰富的高Level的产品人员构成,赋予他们很大的权力,去监控和规范所有的产品项目。并且用KPI来制约产品项目服从这些规范。为了不搞教条主义,很多规范都是在立项之初,由项目经理和这个小组共同确认的,未必是硬性指派,一经确认就受到严格监控。确保好的规范不流于空喊口号。

2、每个产品都设置公开的反馈论坛,突出外部入口,积极征询用户意见,并以内部轮班方式回复“每一条”有价值的反馈,要求以“人对人,面对面”的沟通态度来进行解答,禁止机械问答。公司高层(包括小马哥)不定期巡查每一个产品论坛,一旦发现有不认真回复用户的情况,立即予以训诫。确保产品人员与用户长期保持近距离接触。

3、每个产品都设置内部的交流平台,分为两部分,一块类似留言板,由产品主管发布项目的进度、动态;另一块是论坛,向公司内部所有人开放,接纳反馈。在腾讯内部已经形成了非常活跃的氛围,甚至以该平台人气高涨为荣(至少你主管会喜欢这个),利用这个平台跨项目提意见,或是项目组内部交流思维碎片都很常见,达到了群策群力,内部监督的效果。

4、设置产品架构师这样一个职位,由少数几个技术精英,负责所有项目的系统架构搭建,只搭架构,确保每个项目的底层合理性。

5、执行项目总结制度,在每个版本上线后,由相应的策划-开发-测试人员开一个会,每个人都总结在这个版本过程里,有什么心得,有什么失误,可以怎么改善,尤其注意改进三方人员的配合过程。用制度的方式来强制反省,强制跨职能沟通。几个版本下来,项目效率就会有明显的提高。

6、执行灰度发布政策非常之彻底,一个版本会经过若干级的内部测试,再向外部用户逐步放量升级,不断修正问题之后,最后进行大规模发布。确保提前发现问题,受影响的用户面尽可能小。与此同时,腾讯异常活跃的内部交流氛围,也能让产品在内部测试时得到较多专业反馈。

7、拥有背靠客户端,强大的数据挖掘功能,具体描述起来比较复杂,总之非常强大,数据细致到令人吃惊的地步。数据挖掘部门的地位也是相当高的。我以前说过“统计数据太单薄无法推导出可靠结果”这样的话,但在腾讯的数据挖掘机能面前,这句话恐怕要改口。

8、设置对新人和新项目的风险管理机制,比如3个老程序员带1个新程序员,将技术管理和具体开发的工作彻底分离,每周进行代码走读,对新产品采取格外严格的测试安排等等,使得缺乏经验带来的技术损害被降至最低。

其他还有一些大路货的东西,一些理想化的不可靠的东西,就不讲了。令我感慨并且佩服的,就是以上八点。不是佩服腾讯能做这八件事情——要说想法,我都能够想到,我也有自己的一套项目管理团队建设的技巧。但腾讯从公司层面,从最高领导人的层面,身体力行地把产品管理的专业准则给贯彻下去,用多种监控手段来避免其放空炮,令产品管理制度化,体系化,好的经验在内部流通开来,成为一种积极向上的约束力,带来整个大产品团队的合力,而不是任由项目经理各自摸爬滚打。马化腾带着一大批产品高管自上而下,持之以恒地推动产品本位的管理体制规范化,并不断地创新和优化这套体制,使得整个公司上上下下融入了“产品的基因”,最终成就了“产品的腾讯”。

- 作者: hustlg 2009年10月19日, 星期一 22:00  回复(0) |  引用(0) 加入博采

Linux 常用系统管理的命令
1、查看某文件的一部分
如果你只想看文件的前 5 行,可以使用 head 命令,
如:head -5 /etc/passwd
如果你想查看文件的后 10 行,可以使用 tail 命令,
如:tail -10 /etc/passwd
查看文件中间一段,可以使用 sed 命令
如:sed –n '5,10p' /etc/passwd 这样你就可以只查看文件的第 5 行到第 10 行
2、将 file.txt 里的123改为 456
方法 1
sed 's/123/456/g' file.txt > file.txt.new    修改的保存到其它文件
sed -i 's/123/456/g' file.txt 直接修改原文件
方法 2
vi file.txt
输入命令:
:%s/123/456/g
注意:如果替换的文件有特殊符号如/就要用\来取消。
例:sed -i 's/\/usr\/local\/apache2\/htdocs/\/var\/www\/html/g' /usr/local/apache2/conf/httpd.conf
如果只是下原有的行后添加就用&
例:sed -i 's/DirectoryIndex index.html index.html.var/& index.htm index.php /g' /usr/local/apache2/conf/httpd.conf
3、echo 典型应用
echo "abcdefg" | perl -lne '{$a = reverse($_); print $a;}' 把一个字符串翻转
echo bottle|rev 把一个字符串翻转
[文件目录管理]
1、删除几天以前的所有东西(包括目录名和目录中的文件)
1) find . -ctime +3 -exec rm -rf {} \;
2) find ./ -mtime +3 -print|xargs rm -f –r
2、在多级目录中查找某个文件的方法
1) find /dir -name filename.ext
2) du -a | grep filename.ext
3) locate filename.ext
3、删除软硬连接注意点
删除软件连接的时候一定要记得不要在删除的文件夹后加一斜杠,
rm -f filename/   
会说这是一个文件夹不能删除
rm filename
会提示说是否要删除这个连接。
如果用的第一种可能会把其它文件都删除
4、删除目录中含输入关键字的文件
find /mnt/ebook/ -type f -exec grep "在此输入关键字" {} \; -print -exec rm {} \;
5、在当前目录下解压 rpm 文件
cat kernel-ntfs-2.4.20-8.i686.rpm | rpm2cpio | pax –r
6、用命令清空 Root 回收站中的文件
cd /var/.Trash-root
rm -rf *
[系统与安全]
1、让用户的密码必须有一定的长度,并且符合复杂度
vi /etc/login.defs,修改 PASS_MIN_LEN
2、用 dat 查询昨天的日期
date --date='yesterday'
3、修改系统时
1) 设置你的时区: timeconfig 里选择Asia/Shanghai (如果你位于 GMT+8 中国区域)
2) 与标准时间服务器校准: ntpdate time.nist.gov
date -s “2003-04-14 cst”,cst 指时区,时间设定用 date -s 18:10  
修改后执行 clock -w 写到 CMOS
3) 将当前软件系统时间写入硬件时钟: hwclock –systohc
4、改变 redhat 的系统语言/字符集
修改 /etc/sysconfig/i18n 文件,如
LANG="en_US",xwindow会显示英文界面,
LANG="zh_CN.GB18030",xwindow会显示中文界面。
还有一种方法
cp /etc/sysconfig/i18n $HOME/.i18n
vi $HOME/.i18n 文件,如
LANG="en_US",xwindow会显示英文界面,
LANG="zh_CN.GB18030",xwindow会显示中文界面。
这样就可以改变个人的界面语言,而不影响别的用户
5、查看系统信息
cat /proc/cpuinfo - CPU (i.e. vendor, Mhz, flags like mmx)
cat /proc/interrupts - 中断
cat /proc/ioports - 设备 IO端口
cat /proc/meminfo - 内存信息(i.e. mem used, free, swap size)
cat /proc/partitions - 所有设备的所有分区
cat /proc/pci - PCI设备的信息
cat /proc/swaps - 所有 Swap 分区的信息
cat /proc/version - Linux 的版本号 相当于 uname -r
uname -a - 看系统内核等信息
6、让 linux自动同步时间
vi /etc/crontab
加上一句:
00 0 1 * * root rdate -s time.nist.gov
7、如何防止某个关键文件被修改
在 Linux 下,有些配置文件是不允许任何人(包括 root)修改的。为了防止被误删除或修改
可以设定该文件的“不可修改位(immutable) ”。命令如下:
# chattr +i /etc/fstab
如果需要修改文件则采用下面的命令:
# chattr -i /etc/fstab
[管理与网络]
1、 lsof 用法小全
lsof abc.txt 显示开启文件 abc.txt 的进程
lsof -i :22 知道 22 端口现在运行什么程序
lsof -c nsd 显示 nsd 进程现在打开的文件
lsof -g gid 显示归属 gid 的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4   显示使用 fd 为4 的进程
lsof -i
用以显示符合条件的进程情况
语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4 位置
service --> /etc/service中的 service name (可以不止一个)
port --> 端口号(可以不止一个)
例子: TCP:25 - TCP and port 25
@1.2.3.4 - Internet IPv4 host address 1.2.3.4
[email=tcp@ohaha.ks.edu.tw:ftp]tcp@ohaha.ks.edu.tw:ftp[/email]
- TCP protocol host:ohaha.ks.edu.tw service name:ftp
lsof -n 不将 IP转换为 hostname,预设是不加上-n参数
例子: lsof -i
[email=tcp@ohaha.ks.edu.tw:ftp]tcp@ohaha.ks.edu.tw:ftp[/email]
-n
lsof -p 12    看进程号为 12的进程打开了哪些文件  
2、grep 不显示本身进程
#ps -aux|grep httpd|grep -v grep
grep -v grep可以取消显示你所执行的 grep 本身这个进程,-v 参数是不显示所列出的进程名
3、查看本机IP
ifconfig |grep "inet" |cut -c 0-36|sed -e 's/[a-zA-Z: ]//g'
hostname –i
4、查看有多少活动的Httpd进程
#!/bin/sh
while (true)
do
pstree |grep "*\[httpd\]$"|sed 's/.*-\([0-9][0-9]*\)\*\[httpd\]$/\1/'
sleep 3
done
    同样可以引用到其它的进程
   5、设置 com1口,让超级终端通过 com1口进行登录
第一步:确认有/sbin/agetty,编辑/etc/inittab,添加
7:2345:respawn:/sbin/agetty /dev/ttyS0 9600
9600bps 是因为连路由器时缺省一般都是这种速率,也可以设成
19200、38400、57600、115200
第二步:修改/etc/securetty,添加一行:ttyS0,确保 root 用户能登录
第三步:重启机器,就可以拔掉鼠标键盘显示器(启动时最好还是要看看输出信息)了
6、查找或删除正在使用某文件的进程
fuser filename
fuser -k filename
7、已知网络中一个机器的硬件地址,如何知道它所对应的 IP地址
在 Linux 下,假定要查“00:0A:EB:27:17:B9”这样一个硬件地址所对应的 IP 地址,可以使
用以下命令:
# cat /proc/net/arp |grep 00:0A:EB:27:17:B9
192.168.2.54 0x1 0x6 00:0A:EB:27:17:B9 *eth2
另外,还可以用“arp -a”命令查询:
# arp –a|grep 00:0A:EB:27:17:B9
(192.168.2.54)at 00:0A:EB:27:17:B9[ether] on eth2
8、在 Linux下如何绑定 IP地址和硬件地址
可以编辑一个地址对应文件,里面记录了 IP地址和硬件地址的对应关系,然后执行“arp –
f 地址对应文件”。如果没有指定地址对应文件,则通常情况下一默认文件/etc/ethers为准。
地址对应文件的格式如下:
192.168.0.1 00:0D:61:27:58:93
192.168.0.2 00:40:F4:2A:2E:5C
192.168.0.3 00:0A:EB:5E:BA:8E
9、更改 eth0是否混杂模式(混杂模式可以监听其它主机的信息)
网卡 eth0 改成混杂模式:
ifconfig eth0 promisc
关闭混杂模式:
ifconfig eth0 –promisc
10、linux下清空 arp表的命令
#arp -d -a(适用于 bsd)
for HOST in `arp | sed '/Address/d' | awk '{ print $1}'` ; do arp -d $HOST; done
11、如何得到网卡的 MAC地址
arp -a | awk '{print $4}'
ifconfig eth0 | head -1 | awk '{print $5}'
12、一个网卡绑定多 ip
方法一、建立eth0:1在网卡后加冒号和数字的文件
cp /etc/sysconfig/network-scripts/eth0 /etc/sysconfig/network-scripts/eth0:1
再修改下eth0:1就可以了.
方法二、
在/etc/sysconfig/network-scripts/下创建一个文件:ifcfg-ethX-rangeX ("X"为网卡号)
文件内容:
IPADDR_START=
IPADDR_END=
CLONENUM=0
可以有 256个 ip
13、一个 ip如何绑定两块网卡
假设 192.168.0.88 是ip,192.168.0.1 是网关:
/sbin/modprobe bonding miimon=100 mode=1
/sbin/ifdown eth0
/sbin/ifdown eth1
/sbin/ifconfig bond0 192.168.0.88
/sbin/ifenslave bond0 eth0 eth1
/sbin/route add default gw 192.168.0.1
14、设置ssh 上来能不自动断线
修改自己 HOME 目录下的.bash_profile文件,加上
export TMOUT=1000000 (以秒为单位)
然后运行 source .bash_profile
15、mount 局域网上其他windows机器共享出的目录
mount -t smbfs -o username=guest,password=guest //machine/path /mnt/cdrom
16、向登陆到同一台服务器上的所有用户发一条信息
1)输入 wall并回车
2)输入要发送的消息
3)结束时按“Control-d”键,消息即在用户的控制窗口中显示
17、向远程机器上的所有用户发送消息
使用 rwall(向所有人远程写)命令同时发送消息到网络中的所有用户。
rwall hostname file
当使用 CDE或 OpenWindows 等窗口系统时,每个窗口被看成是一次单个的登录;
如果用户登录次数超过一次则消息直接发送到控制窗口  
18、向网络中的所有用户发送消息
发送消息到网络中的所有用户
1)输入 rwall -n netgroup 并回车
2)输入要发送的消息
3)结束时按“Control-d”键,消息即在系统每个用户的控制窗口中显示,下面是系统管理员
发消息到网络组 Eng 每个用户的例子:
% rwall -n EngSystem will be rebooted at 11:00.(Control-d)
%
用户控制窗口中的消息:Broadcast message from root on console…System will be rebooted at
11:00.EOF
注意:也可以通过 rwall hostname(主机名)命令到系统的所有用户  
19、 将 top的结果输出到文件中
top -d 2 -n 3 -b >test.txt
可以把 top 的结果每隔 2秒,打印 3次,这样后面页的进程也能够看见了
20、装双系统不能看到另一个系统的解决办法
首先光盘启动,进入 rescue 模式,运行 GRUB,进入 grub 提示符 grub>,然后敲入下面的
语句,重启就好了。
root (hd0,2),setup (hd0)
21、压缩传输文件或目录
传输到远程:tar czf - www | ssh server "tar zxf -"
压缩到远程:tar czf - www | ssh server "cat >
www.tar.gz
"
解压到远程:ssh server "tar zxf -"
22、命令行下发送带附件的邮件
方法 1.      uuencode   | mail -s "title"
[email=mail@address]mail@address[/email]

本地需要作为附件的文件名。
邮件中的附件文件名,可以和不同,其实内容一样。
方法 2.       cat  | mutt -s "title" -a  
[email=mail@address]mail@address[/email]

邮件正文内容。
本地需要作为附件的文件名。
[Mysql维护]
1、mysql 的数据库存放在什么地方
1) 如果使用 rpm包安装,应该在/var/lib/mysql 目录下,以数据库名为目录名
2) 如果源码安装在/usr/local/mysql中,应该在/usr/local/mysql/var中,以数据库名为目录名
2、 从 mysql 中导出和导入数据
导出数据库
mysqldump 数据库名 > 文件名
导入数据库
mysqladmin create 数据库名
mysql 数据库名
   5、 导出数据的几种常用方法
1)使用 mysqldump
#mysqldump -uuser -ppassword -B database --tables table1 --tables table2 >
dump_data_20051206.sql
详细的参数
2)backup to语法
mysql>BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory';
详细请查看 mysql 手册
3)mysqlhotcopy
#mysqlhotcopy db_name [/path/to/new_directory]

#mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory

#mysqlhotcopy db_name./regex/
详细请查看 mysql 手册
4)select into outfile
详细请查看 mysql 手册
5)客户端命令行
#mysql -uuser -ppassword -e "sql statements" database > result.txt
以上各种方法中,以 mysqldump 最常用
   6、 如何在命令行上执行 sql 语句
#mysql -uuser -ppassword -e "sql statements" database
7、 导入备份出来文件的常见方法
1)由 mysqldump 出来的文件
#mysql -uuser -ppassword [database] source /path_to_file/dump.sql;
3)按照一定格式存储的文本文件或 csv 等文件
#mysqlimport [options] database file1 [file2....]
详细请查看 mysql 手册
4)文件类型同上,也可以使用 load data 语法导入
详细请查看 mysql 手册
4、过滤掉#号打头的行,和所有的空行(对于查看配置文档很有用)
awk '/^[^#]/&&/^[^$]/' filename > new.file
7.删除文件大小为零的文件
rm   -i   `find ./   -size 0`  
find ./   -size 0   -exec   rm   {}   \;  
find ./   -size |xargs   rm   -f &非常有效  
for   file   in   * #自己定义需要删除的文件类型  
do  
if   [   !   -s ${file}   ]  
then  
rm   ${file}  
echo   "rm   $file   Success!"  
fi  
done  
8.利用现存两个文件,生成一个新的文件
1) 取出两个文件的并集(重复的行只保留一份)  
2) 取出两个文件的交集(只留下同时存在于两个文件中的文件)  
3) 删除交集,留下其他的行  
A cat   file1   file2   | sort   | uniq  
B cat   file1   file2   | sort   | uniq -d  
C cat   file1   file2   | sort   | uniq -u  
6、更改字符集
     网站因为迁移改变了原有的字符集,导致前台看到乱码。如果是少数的几个页可以直接拿到本地用Editplus或者UltraEdit进行另存为时选择字符编码。现在有一个不用拿到本地的方法,在Linux机器上就能进行。
conv -f    -t       -o   
如:将GB2312转为UTF-8   注意:转成的必须是新的文件名,不然会出错。
/usr/bin/iconv –f GB2312 –t UTF-8 sourcefile > targetfile
[管理与维护]
增加虚拟内存
        26.如果SWAP(交换空间)不够了,要增加怎么办?只要你的硬盘上有空闲的空间,直接用命令:mkswape/dev/hda(假设你的驱动器是/dev/hda),swapon/dev/hda;要自动启动SWAPE,可以把新的分区加到/etc/fstab中去,照着原来SWAP的写就行了。用“free” 检查 你SWAP的大小,Linux支持最多16个交换分区,每个交换分区最大128MB,没有空闲分区的时候,可以用个大文件来建立,用命令“man mkswap”查看帮助。
# dd if=/dev/zero of=swapfile bs=1024 count=8192
# mkswap swapfile 8192
# sync
# swapon swapfile
27、一次解压多个.tar.gz文件
find ./ -name '*.tar.gz' -exec tar zxvf {} \; -print

- 作者: hustlg 2009年09月28日, 星期一 23:20  回复(0) |  引用(0) 加入博采

IPTPS'09 论文评析(转)

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

声明:本人计算机菜鸟一个,指点江山、激扬文字,纯属个人观点。希望借此为中国计算机领域尽绵薄之力,欢迎交流探讨、批评指正!转载请注明出处,尊重知识权益。 

 

IPTPS'09共收录论文12篇,数目明显比前几届少了很多(前几届都是20多篇),这说明两个问题:1、P2P正在从热点逐渐变冷,研究的黄金阶段暂时低落,期待新应用和新价值的发掘;2、IPTPS的评审要求一直很严格,所以没有因为录取论文数少而降低质量。从内容上来看,大致可以分为如下几类:

(1)新应用系统:1-P2P+SNS,2-P2P+虚拟现实,3-AIagent+P2P,6-P2P点播+VCR,7-Web浏览器+P2P 

(2)测量优化:8-P2P+迂回路由,10-BTtorrent合并,11-DHT流量监控,12-BT视频文件共享的局部性特征

(3)理论建模:4-P2P队列论分析框架,5-P2P流媒体系统的flash crowd过程建模

(4)系统安全:9-P2P带宽评估的PCA方法

综上所述,可以看到P2P的研究主要转入系统应用和测量优化,P2P领域本身已经成熟,科研工作主要应该从扩大P2P的范围、发挥P2P的优势等方面着手。 

 

1、Birds of a fethr: Open, decentralized micropublishing

Daniel R. Sandler,Dan S. Wallach,Rice大学

背景:以Twitter为代表的微博客(Microblogging)系统正受广大网民日益亲睐,微博客的功能就是在社会网络系统(SNS)中订阅和发布短消息,对即时通信工具和手机短消息的支持使其极具实时性和互动性。

动机:当前的微博客系统是私有的、集中式的、互相隔离的,不利于微博客这一媒体形式的长期活力。(通过对Twitter系统中47万用户的3个星期消息发布的跟踪记录,以及Twitter的媒体报道信息来证实上述三个特性)

想法:提出一种开放的、分布式的、安全的微发布(Micropublishing)服务,以解决动机中提到的问题。

做法:本文设计的FETHR系统涉及到很多具体的操作和组件,但最本质的消息发布是通过基于push的gossip多播来完成的,其原理非常简单,懂gossip多播的人都能想到。此外,FETHR系统在安全性和动机方面也有具体工作,不是核心,这里不详述。

个人点评:1)这篇文章的想法很新颖,我前些天才听说Twitter,他们就已经把它P2P化了,速度快啊!可见做研究真如曹老师所说——“一万年太久,只争朝夕”。2)本文的结论部分说FETHR系统已经实现了原型,1500行Python代码,但是通篇我都没看到介绍FETHR原型、FETHR性能评价的内容,不知道是篇幅原因还是作者尚未做好,但我相信在不久后的某个重要会议上会看到完备的长文。

2、A Walkable Kademlia Network for Virtual Worlds
Matteo Varvello, Thomson and Institut Eurecom; Christophe Diot, Thomson; Ernst Biersack, Institut Eurecom

背景:以Second Life游戏为代表的虚拟世界正受广大网民日益亲睐。其中最主要的核心操作为范围查询(Range Query)。

动机:当前的虚拟世界系统都采用集中化的C/S模式来支持范围查询,它虽然简单但缺乏可扩展性。

想法:通过扩展Kademlia DHT来支持虚拟世界中的分布式范围查询,其方法基于以前曾出现过的前缀散列树(PHT)方法,针对虚拟世界系统做了扩展的优化。

实验:作者使用Second Life中收集的对象信息来模拟一个小型的虚拟世界,其中有1000个模拟的节点,节点在虚拟世界中的移动是人工生成的。

个人点评:这篇文章能被录用,我认为原因有两个方面,1)应用很新颖,将P2P应用到虚拟世界这可能是头一回;2)基于DHT的范围查询在P2P领域一直是个广为探讨的挑战性问题,本文的工作给予该问题一个实践性的佐证。本文的前驱工作发表在INFOCOM’09上,看起来作者下一步还会有更大的计划。

 3、Offloading AI for Peer-to-Peer Games with Dead Reckoning
Jiaqiang Bai, Daryl Seah, James Yong, and Ben Leong, National University of Singapore

背景和想法:网络游戏的P2P化已经研究了好几年,本文的工作来自于作者开发一款Facebook坦克战游戏的经验。在他们开发的Facebook坦克战网游架构中,不存在专用的服务器,由普通用户中选举出一个节点作为维护网游状态的服务器,另一个节点作为备份结点、随时准备替代工作的伪服务器。

个人点评:这篇文章要解决的问题并不新,但它采用了AI agent方面的一些新机制来解决该问题,且在facebook上实现了原型系统。由于我一直未能读懂AI agent方面的内容,所以对这篇文章理解的一直很浅。

 4、Queuing Models for Peer-to-peer Systems
Taoyu Li(李洮禹),清华大学在读博士Minghua Chen and Dah-Ming Chiu,香港中文大学;Maoke Chen,清华大学

背景和动机:自Kleinrock用队列论研究计算机系统开始,几十年来已有大量致力于用队列论来建模网络系统的工作。用队列论来建模P2P系统时,挑战在于P2P系统中不仅工作(job)是随机到来的,且服务站点(service station)也是随机到来的。

想法:提出一种分类系统来划分P2P队列论模型,并且对几种基础的队列论模型给出了稳定性条件。

个人点评:队列论一直是研究计算机网络的重要理论工具,但随着现代计算机网络的日趋复杂,用队列论来给计算机网络建模面临越来越大的复杂性挑战,变得愈发困难。P2P系统是一种极其分布式、极其动态性的网络,近几年出现过一些给其建模的队列论工作,但数目很少,本文对以前的工作给予了较好的总结,并有自身独特的扩展和贡献。我的队列论基础薄弱,不能完全读懂,就不做更多的评论了。

 5、How P2P Streaming Systems Scale Over Time Under a Flash Crowd?
Fangming Liu, Bo Li, and Lili Zhong, 香港科大, Baochun Li and Di Niu, 多伦多大学

动机:P2P Live Streaming系统面临一个不可避免的Flash Crowd问题:当某个热门视频开始播放后的短期内会有数万用户蜂拥而入,造成系统堵塞、服务质量下降

想法:1)首先给P2P Streaming中的Flash Crowd构造了一个简单但较为合理的理论模型(我跟着算了一遍,觉得确实有较高的合理性),2)其次定理1证明了系统可容纳节点数的“理想上限”(与时间相关,且假定所有参与节点上传容量都被理想利用),3)再次定理2对定理1给出的理想上限做了进一步的限制与完善(也引入了不少理想假设,P2P系统的建模太过复杂,恐怕也只能如此)。

个人点评:这是一篇纯理论的文章,主要贡献就是定理1和定理2,虽然作者在结论部分也说这仅仅是初步工作,更多的复杂性、全面性考虑将成为Future work,但不失为P2P Streaming Flash Crowd问题上的先驱性理论工作。文中没有任何模拟和实验结果作为理论的印证,可能是确实比较困难。

 6、Kangaroo: Video Seeking in P2P Systems
Xiaoyuan Yang (Telefonica Research); Minas Gjoka (University of California, Irvine); Parminder Chhabra (Telefonica Research); Athina Markopoulou (University of California, Irvine); Pablo Rodriguez (Telefonica Research)  

动机:P2P VoD近年来成为研究热点,其跳播(VCR功能)问题一直是一个难点

想法:采用集中式的Tracker服务器来维护每个用户的当前播放点和部分历史播放信息,并且在Tracker服务器上使用了一些优化机制以降低计算和存储开销。

个人点评:Kangaroo这一集中式的方案,可能会被指出存在单点失效和瓶颈问题,但我个人认为简单、实用,不失为一种实效性方法。在文章结论部分提到了曾使用Kangaroo进行08年北京奥运会的点播实验,但规模较小(数百用户),如果有朝一日能将规模扩大到数万,则会更具说服力。

 7、Bringing P2P to the Web: Security and Privacy in the Firecoral Network
Jeff Terrace, Harold Laidlaw, Hao Eric Liu, Sean Stern, Michael J. Freedman (Princeton University) 

背景和动机:P2P作为一种思想、一门技术和一个工具,其影响力渗透到各种各样的Internet应用,如文件共享、在线视频、博客、SNS社会网络等等。本文作者气魄更大,直接将P2P带入Internet核心应用——Web浏览器中来。

作者八卦Michael Freedman是本届IPTPS会议的PC Member,在P2P领域做过大量的工作,主要是集中在安全、隐私、CDN方面,如Tarzan系统、CoralCDN系统(其博士论文课题)。

想法:所设计的Firecoral系统(名称来自Firefox+CoralCDN,即Firefox的CoralCDN插件)采用集中式的Tracker服务器来维护可用URL信息、URL内容在终端用户中的存储信息;采用第三方认证的签名服务来确保URL、Web内容的完整性与安全性。

个人点评:首先很佩服Michael Freedman在P2P CDN这一课题上多年来坚持不懈的工作!能够如此专注于一个课题展开方方面面的研究,实在不易。Firecoral系统的动机和想法并不复杂,搞网络的人一听就能明白是怎么回事,但作者能将其原型系统和Alpha版测试软件发布,这种搞研究的坚实性怕是一般人做不到的。如果Firecoral系统真的能够得到广泛应用,则前途无量,势必对Web浏览器产生质的改变。

 8、Deconstructing Internet Paths: An Overlay for AS-Level Detour Route Discovery
Sing Wang Ho, Thom Haddow (Imperial College London); Jonathan Ledlie (Nokia Research); Moez Draief, Peter Pietzuch (Imperial College London)

背景和动机:利用P2P覆盖网实现迂回路由(Detour Route)的思想已出现好几年,其研究成果不断发表在各大顶级会议上。相比于IP层直接路由,迂回路由在修复失效链路、建立有保证的QoS链路方面起到很好的辅助作用,当然其缺点是增加了路由的复杂性,而且必须应用层的参与。

想法:本文通过解析Internet路由路径的“白盒”方法,提出一种发现AS层迂回路由的选路方法。作者在Planetlab上通过Traceroute测量出176个节点互相之间的路由路径(数万条),通过两两比较路径间的链路(AS层链路)重复性来将链路集簇到一个个的cluster,cluster之间也可以基于路由相似性集簇到更大的cluster,每个cluster都关联一个迂回结点集合。在生成了所有的cluster之后,依据cluster信息对每条路径进行优化,具体操作是将迂回结点引入到路径上来,看采用哪个迂回结点最优。上述过程属于集中式的方法,作者还提出了分布式的方法,原理类似,只是cluster信息是局部性的。

个人点评:这篇文章的想法并不复杂,也没有什么高深理论,但考虑的很全面,想法新颖、合理。目前的实验规模很小,仅176个节点,说服力还不够。文章最后提到了进一步的扩展和完善,估计会有更成熟的论文发表在更高层次的大会上。

 9、EigenSpeed: Secure Peer-to-peer Bandwidth Evaluation
Robin Snader, Nikita Borisov (University of Illinois at Urbana-Champaign)

背景和动机:在P2P系统中,让结点之间互相获得可靠的带宽信息具有重要意义。但如何能够保证带宽信息评价的可靠性?如何识别出恶意结点?

想法:利用矩阵运算的PCA(主成分分析)方法作为一种核心数学工具已成功应用在Google的PageRank算法和P2P声誉评价的EigenTrust算法中,鉴于此,本文使用了优化过的PCA方法来获得可靠的带宽评价。此外,针对几种欺骗、恶意行为分别探讨了解决方法。

个人点评:PCA这一数学工具是很有意义的,EigenSpeed使用它可算是正常、合理的选择。但目前的EigenSpeed算法是集中式的,也没有在实际系统中的实现;作者在文章结尾已经提到了这些问题,期望看到进一步的工作早日发表。

 10、Dynamic Swarm Management for Improved BitTorrent Performance
György Dán (KTH, Royal Institute of Technology); Niklas Carlsson (University of Calgary)

背景和动机:目前的BT系统中,同样的文件可能存在多个torrents集群在并行工作,有的集群太大,影响性能,有的集群太小,也影响性能。

想法:对于小的swarm(集群),合并它们以使其足够大;对于大的swarm,切分它们以使其足够小。合并与切分的原则是:swarm不能太大导致其tracker无法承受,合并切分时迁移swarm的用户数尽量小。

个人点评:这篇论文的想法非常简单,但新颖、有意义。作者使用了网上实际跟踪到的数据作为依据,使其动机、想法真实可信。

 11、Large-Scale Monitoring of DHT Traffic
Ghulam Memon, Reza Rejaie (University of Oregon); Yang Guo (Thomson); Daniel Stutzbach (Stutzbach Enterprises)

背景和动机:监控DHT流量是研究DHT的有效手段。然而过去的方法,要么是被动记录,要么是主动插入节点,前者能记录的数据有限,后者则可能导致DHT系统本身被改变,两种方法都不理想。

想法:基于Kademlia这一实用DHT,作者采用主动插入节点但基本不参与路由过程的方法(其实就是忽略其他节点发来的消息)来监控DHT中的节点,使得监控行为对DHT系统本身的影响尽量小。

个人点评:想法并不复杂,但新颖、实用。(题外话:对于DHT,可能大家最关心的话题还是DHT本身是否实用,从DHT出现到今天都快10年了,DHT方面的论文成百上千,就是不见真正实用过……)

 12、On the Locality of BitTorrent-based Video File Swarming
Haiyang Wang, Jiangchuan Liu (Simon Fraser University); Ke Xu (Tsinghua University, Beijing)

背景和动机:对基于BT的视频文件共享系统来说,存在着一对矛盾。一方面,节点的邻居选择应当尽量具有局部性以提升性能、减少ISP间流量;另一方面,节点的邻居选择又应当尽量随机以提升系统容错性与健壮性。

想法:基于真实的BT系统测量,作者发现系统中AS Clusters(位于同一个AS中的系统节点构成一个AS Cluster)的分布满足Mandelbrot-zipf规律,也就是说,系统中某些AS中的节点更容易形成AS Cluster,对这些AS中的节点在邻居选择上应当尽量局部;而其它AS中的节点不容易形成AS Cluster,所以就顺其自然、让其中节点随机选择邻居。通过上述观察,作者提出一种基于预测的方法来指导节点的邻居选择。

个人点评:从本质上说,作者提出的方法是一种面临矛盾权衡的折中考虑——两个极端各有其利弊,不如就让一部分节点走一个极端、另一部分节点走另一个极端,适合什么走什么。以折中方案写成的paper汗牛充栋,本文的亮点在于有坚实的测量数据支持,折中的有凭有据、不服不行。

- 作者: hustlg 2009年08月14日, 星期五 20:24  回复(0) |  引用(0) 加入博采

P2SP技术简介
摘要:P2SP就是让互联网网上的URl链接有了生命,由于有了服务器的帮助,URL成为资源索引的入口,这对广大网民来说无疑是一件非常还得事情。 查看全文

- 作者: hustlg 2009年08月2日, 星期日 14:19  回复(0) |  引用(0) 加入博采

[营养知识]43个不可不知的健康常识
1、常吃宵夜,会得胃癌,因为胃得不到休息。
    
    2、一个星期只能吃四颗蛋,吃太多对身体不好。
    
    3、鸡含有致癌物,不要吃较好。
    
    4、饭后吃水果是错误的观念,应是饭前吃水果。
    
    5、女生月经来时,不要喝绿茶,反正茶类的不要喝就对了,多吃可以补血的东西。
    
    6、喝豆浆时,不要加鸡蛋及糖,也不要喝太多。
    
    7、空腹时不要吃蕃茄,最好饭后吃。
    
    8、早上醒来,先喝一杯水,预防结石。
    
    9、睡前三小时不要吃东西,会胖。
    
    10、少喝奶茶,因为高热量、高油,没有营养价值可言,长期饮用,易罹患高血压、糖尿病...等疾病。
    
    11、刚出炉的面包不宜马上食用。
    
    12、远离充电座,人体应远离30公分以上,切忌放在床边。
    
    13、天天喝水八大杯。
    
    14、每天十杯水,膀胱癌不会来。
    
    15、白天多喝水,晚上少喝水。
    
    16、一天不要喝两杯以上的咖啡,喝太多易导致失眠、胃痛。
    
    17、多油脂的食物少吃,因为得花5~7小时去消化,并使脑中血液集中到肠胃,易昏昏欲睡。
    
    18、下午五点后,大餐少少吃,因为五点后身体不需那么多能量。
    
    19、10种吃了会快乐的食物:深海鱼、香蕉、葡萄柚、全麦面包、菠菜、大蒜、番茄、低脂牛
  奶、鸡肉、樱桃。
    
    20、睡眠不足会变笨,一天须八小时睡眠,有午睡习惯较不会老。
    
    21、最佳睡眠时间是在晚上10点~清晨6点。
    
    22、每天喝酒不要超过一杯,因为酒精会抑制制造抗体的B细胞,增加细菌感染的机会。
    
    23、服用胶囊应以冷水吞服(可以第一个吃),睡前30分先服药,忌立即躺下。
  
    25、掉发因素:熬夜、压力、烟酒、香鸡排、麻辣锅、油腻食物、调味过重的料理。
    
    26、帮助头发生长:多食用包心菜、蛋、豆类;少吃甜食(尤其是果糖)。
    
    27、每天一杯柠檬汁、柳橙汁,不但可以美白,还可以淡化黑斑。
    
    28、苹果:机车族、瘾君子、家庭主妇的常备良药;一天一颗,才能让自己有个干干净净的肺。
    
    29、抽烟又吃维他命(B胡萝卜素-A维他命的一种)会致癌,尽早戒烟,才是最健康的做法。
    
    30、女性不宜喝茶的五个时期:月经来时、孕妇、临产前、生产完后、更年期。
    
    31、抽烟:关系最大的是肺癌、唇癌、舌癌、喉癌、食道癌,也与膀胱癌有关。
    
    32、饮酒导致肝硬化,引发肝癌。
    
    33、吃槟榔会导致口腔纤维化,引发口腔癌。
    
    34、食物过于精细,缺乏纤维,含大量脂肪,尤其是胆固醇,会引发胃癌。
    
    35、食物过于粗糙,营养不足时,导致食道癌、胃癌。
    
    36、食品中的黄曲毒素、亚硝酸类物皆具有致癌性。
    
    37、不抽烟,拒吸二手烟。
    
    38、适量饮酒,不拚酒,不醉酒。
    
    39、减少食用盐腌、烟熏、烧烤的食物。
    
    40、每天摄取新鲜的蔬菜与水果。
    
    41、每天摄取富含高纤维的五谷类及豆类。
    
    42、每天摄取均衡的饮食,不过量。
    
    43、正确饮食习惯:早上吃的像皇帝,中午吃的像平民,晚上吃的像乞丐

- 作者: hustlg 2009年07月21日, 星期二 13:09  回复(0) |  引用(0) 加入博采

【赞】上海巨便宜又好玩的20个地方【转】
1.上海服饰新低价-----轻纺市场 (曹安路1618号)

其实上海服饰批发的源头并不是七浦路,而是轻纺市场.你会发现同类型服装,价格可能比七浦路还要便宜七成左右,而很多七浦路老板直接到轻纺去进货的.

2.大牌随地挑----------青浦奥特莱斯 (沪青平公路2888号OUTLET)

OUTLET 是目前内地最大的一家品牌服饰折扣店,面积相当于好几个商场.经营方式和国外的不相上下,每个品牌独立成店.户外品牌也很全,如The NorthFace ,Columbia,Quiksilv e r…都是对折或6折,而Levi’s根本就是摊在地上卖的.

3.省钱必上------------在线酒吧(www.papayabar.com)

金融危机横扫全球,你知道怎么能够少去夜店又能延续夜店交际,为自己剩下一笔开支么?目前一个比较权威的在线酒吧网站“木瓜吧”可以推荐。那里可以在线泡吧、在线喝酒、交友,极具特色。

4.回家不用钱-----------大润发班车

从杨浦到宝山?听上去老远的,现在交通费也挺高,那你可以留意下大润发的班车,它提供从起点到终点的一站式无停留服务,而且是免费的,只需要准备个超市塑料袋,里面塞点东西就可搭乘

5.低价品位女装-------(淮海路宝庆路口)

淮海路的一些小店价格都挺高的,不过在宝庆路的无名小店里,女装花式繁多且质量上乘,需要慢慢的淘了,不过那里的价格比别的地方可要便宜很多.

6.跳水价夜店---------C’S酒吧 (定西路679号地下一层)

整个酒吧的主体就是一间地下室改建而成的,昏暗的灯光给人一种叛逆的心理,迷宫式的走廊,木制的圆桌,高脚椅.酒吧风格显得非常原始,这里的音乐以HIP HOP为主,年轻人居多,还有不少留学生,该酒吧不设最低消费,甚至可自己带饮料进去,平均消费10元.

7.便宜车扎堆---------岚皋路桥 (岚皋路桥二手车市场)

8.交通AA制―――――拼车网 (www.pinchela.com)

每天相约坐同一辆出租车去公司,包月制的出租车还很便宜,四人分摊.省钱省时间.

9.屏蔽货币------------广告网 (www.comhuan.com)

你不需要的他需要,他没用的东西在你? 饫锶词潜?把自己家里没用的东西都整理出来千万别丢了,到广告网上去看看有谁需要它们,如果大家不都提倡双赢吗??

10.低价电子天堂-----------虬江路(虬江路500---526号)

11.无敌便宜图书-----------延安东路1号

这里是超大型的折扣书店,最大特色是各类书籍摆放的非常清楚,另外,在书店进门后左边有三个大书架,架子上一般摆放的都是比较新的书籍成套书多,更新很快,所以,每次去那边,最开

始就应该看这三个书架的书.

12. 二手潮货摊头-------胶州路(胶州路343号5楼LAB实验室平台)

该市场在胶州路某栋大楼的天台上,双休日这里总是有一大批摇滚和非主流文化的爱好者,摆开摊头,将自己要卖的东西全部放在地上.这里经常能找到一些外国留学生从自己国家带来的服饰,包,小物品,价格也很公道.此外,在这里买东西可不是简单的买卖家的关系,还可以谈论自己喜欢的音乐,谈得兴起还能来两段HIP HOP,非常轻松随意.

13. 超级廉价的火锅店----------傣庄 (海宁路498号)

是傣庄,可不是傣妹哦,它可比傣妹更便宜哦,丸子每串1—2元,羊牛肉5元一盆.最贵的海带也只卖到一份6元,四个人,撑死才80元不等,而且饮料免费

14.六元钱无限喝-------宜家 (漕溪路126号)

宜家家居的咖啡座花6元,想喝多少喝多少,逛逛家居喝喝咖啡,度过一个惬意的下午吧

15.不花钱当富豪-- ---------明天广场 (南京西路399号)

明天广场的5楼宴会厅等候区免费体验豪门饮茶方式,壶边不仅有各种茶包可供选择,还有非常豪华的大沙发

16.富豪享受也打折----------一点红咖啡 (滨江大道富都段滨江花园内)

在星巴克里坐几个小时装小资其实很无趣.不如去外滩滨江大道的一点红喝咖啡,现在推出第二杯咖啡打折的活动,富豪级的享受不缩水,价格是原来的一半

17.低价鲜蔬----------定海桥菜市场(杨树浦路2802号)

如果你不定时吃晚饭的话,可以在菜场收摊前去逛,人不多,且价格低廉容易还价,此市场内蔬菜大多是农民们直接从浦东摆渡运过来的,超级新鲜,价格也便宜,和其他菜市场还真不太一样呢

18.自由行大本营------------驴友公社

平均每个自由行都要比跟团便宜80%左右

19. 免费的电影小窝------------猫雨 (长乐路1221号)

作为上海无数小酒吧的一员,猫雨找到了自己的出路,喜爱电影的你也找到了****,里面放映的电影种类丰富,有大导演的名作,也有小制作的独立电影,你唯一的花费可能只是10元左右的饮料费了.

20.不用付钱的艺术展----------M50 (莫干山路50号)

作为上海目前势头最好的艺术展览园区,这里不仅定期有艺术家办的各类展览,还有许多艺术家就把工作室安在那里,随时供人参观,也欢迎志同道合的朋友进去侃山海经.最要紧? 氖?这一切都是免费的,很有些当年格林威治村的味道.

- 作者: hustlg 2009年07月21日, 星期二 09:16  回复(0) |  引用(0) 加入博采

来上海工作一个月了
时间过得真快,从6月19号到上海,转眼之间1个月的时间已经过去了。昨天买了一辆自行车,这样就不用每天步行上班了,骑车到公司10分钟以内,以后还可以骑车在周围转转。周六从上海火车骑回漕河泾开发区这边花了2个多小时,沿着高架路一路风景还不错,幸好是下午,要是上午或者中午,这么炎热就惨了。。。

- 作者: hustlg 2009年07月20日, 星期一 23:01  回复(0) |  引用(0) 加入博采

来上海了,开始新的环境工作
摘要:不管怎么样,经过2周的折腾,总算是安定下来了。我们是一个年轻的Team,还是有很多事情可以去做,对此我也充满信息。在深圳的2年,认识了很多的朋友,自己也成长和很多,南方的气候依然是那么让然怀念,在上海再也看不到那样的蓝天啦。新的环境新的开始:)加油 查看全文

- 作者: hustlg 2009年07月10日, 星期五 15:09  回复(0) |  引用(0) 加入博采

16个知名英文科技博客媒体

以下博客有些之前有推荐。http://www.caozenghui.cn/archives/320.html



1  http://www.techcrunch.com/  知名博客Michael Arrington一手创建,主要报道互联网,尤其是Web2.0领域,堪称Web2.0风向标。Arrington是最活跃的科技blogger,没有之一,也算是硅谷的明星人物了。

2  http://www.paidcontent.org/  关注互联网及新媒体行业,paidContent.org算是媒体化比较严重的一个科技博客,以及时消息为主,每天更新量比较大,且以短小文章为主,在观点分析上一般。

3  http://gigaom.com/  GigaOM算是比较全面的一个科技博客媒体,关注互联网、电信及IT技术领域。创始人Om Malik的文章在技术分析、趋势判断上堪称经典,这跟Malik的Business 2.0、红鲱鱼经历有关。

4  http://networks.feedburner.com/atd-feed  由华尔街日报的两位当红科技专栏作者Walt Mossberg和Kara Swisher及知名博客John Paczkowski担纲。不过,目前最知名最活跃的算是Kara的BoomTown专栏了,关注互联网,kara在互联网及时新闻上表现突出,活跃度更是直逼Arrington。

5  http://www.readwriteweb.com/  集中关注互联网行业,Read/WriteWeb的特点是大量深度的分析文章,以趋势和技术见长。当然,这跟它要求文章统一的“多个小标题”格式有关,少量文章反应及时消息。

6  http://mashable.com/  关注互联网及宽泛新媒体领域,创始人Pete Cashmore本身就是一个新媒体专家、科技顾问。

7  http://www.alleyinsider.com/  关注互联网、电信及技术领域,与GigaOM类似。不过更新量比较大,以消息居多,在深度趋势上一般。

8  http://valleywag.com/  著名的“硅谷八卦”博客,关注互联网、IT等领域。每天的更新量那是大的惊人,这也得益于它以“八卦”人和公司为主。报道除了新闻本身外,更多是关注轻松和八卦话题。

9  http://venturebeat.com/  关注互联网、IT等领域,以报道投资并购为特色,当然也有常规新闻。这在美国这种VC活跃的市场上显然成了一个卖点。

10  http://www.centernetworks.com/,关注互联网及新媒体,在新媒体:广告、社会化媒体方面报道比较突出。

11  http://blogs.cnet.com/?tag=hd_ts  CNET和纽约时报是我在这个推荐中唯一提到的两个传统媒体网站。CNET旗下可以说拥有阵营非常强大的blog media,比如:关注Web2.0的Webware、关注gadgets的Crave,以及Newsblog、Between the Lines。很可惜没有整合好。

12  http://bits.blogs.nytimes.com/ Bits是纽约时报网站下很有特点的一个科技blog network,包括:关注互联网、消费电子的Saul Hansell、关注互联网搜索的David F. Gallagher、关注社交网络的Vindu Goel等10位。

13  http://www.techmeme.com/  Techmeme本身并不产生内容,但这并未阻止它成为美国科技blogger作者的最爱;Techmeme聚合了优秀科技博客及科技媒体的内容,并通过link追踪方式发现和推动热点。单就及时新闻的捕捉更新上,techmeme已经算一个成功的聚合媒体。

14  http://www.engadget.com/  最知名的两大消费电子博客媒体,Engadget和Gizmodo;偏产品新闻类,如果你关注及时的数码产品,就它了。

15  http://arstechnica.com/index.ars ars是一个比较象传统IT网站的博客媒体,除了软硬件产品外,同时还关注热点新闻。不过ars的特长仍然是Game、apple等垂直领域的深度报道和权威的硬件评测内容。

16  http://gizmodo.com/  最知名的两大消费电子博客媒体,Engadget和Gizmodo;偏产品新闻类,如果你关注及时的数码产品,就它了。

- 作者: hustlg 2009年01月10日, 星期六 15:09  回复(0) |  引用(0) 加入博采

推荐几本书摘:后美国世界 。。。品牌DNA

最近看了一下出版市场的变化,有几本新书出版,看了一下相关的摘要紧密联系当前的国际经济形势,内容还不错推荐。

具体如下:

《后美国世界》

法理德.札卡瑞亚认为,进入了二十一世纪之后,世界开始面临第三次全球权力转变,也就
是「后美国」群雄崛起的时代。 虽然美国在后美国世界时期的强权地位,并不会在短期之内有所改变,但是全球各国的政治
经济势力,却必须重新界定。其中最明显 的转变,就是大多数的国家从追随美国,变成追随强国,例如在2007年对全球成长的贡献比美国还大的中国。札卡瑞亚表示,这种趋 势正是美国在「后美国世界」时代,所必须面临的最大挑战。
 《走对下一步》

二十二岁就成为史上最年轻的西洋棋世界冠军的天才棋王盖瑞.卡斯帕洛夫,透过自述的方
式将一生投注于西洋棋竞技的心路历程,转化成一般人都能够体会、实践的逻辑哲理。在这
本《走对下一步:向棋王学策略思考》中,盖瑞.卡斯帕洛夫详细的说明了这套哲理,以及
它能对策略加以评估分析,并且有助于整和、融会贯通、以及心智锻炼的功能。卡斯帕洛夫
也表示,这套哲理还能强化自信,增加宏观处事的能力,进而刻画出属于自己的人生版图。

 《谁把孔雀变黑白》

很久很久以前,企鹅是“组织之海”的统治者,他们统治着王国里的每一寸土地,穿着企鹅
的礼服,掌握着组织的大权。企鹅虽然踏实勤奋,却也非常保守,总是照规矩办事。而其它
不同种类的鸟儿,虽然在组织里从事不同的工作,却都希望能够升官。但是想得到企鹅的信
任,掌握权利和地位,却几乎是不可能的事。企鹅王国在企鹅的规矩下,太太平平的运行着
,然而这种看来井然有序的生活方式,却因为一只名叫佩里的孔雀的到来,开始产生了变化


 《品牌DNA》

任何一个品牌,都是由创业者所精心打造的,里面充满了对产品或服务的热情和执着。根据
日本全球商业研究中心主任研究员森摄,和东京大学经济研究所教授片平秀贵的调查,有品
牌号召力的企业,无论经营者怎么换、时代如何变,都能坚守住品牌的DNA。而一个品牌能?
裼佬罟丶囊蛩兀簿驮谟谠惫な欠衲芄淮衅放频腄NA。只要能做到让员工传给员
工,而每一个员工也都能以行动为品牌的实际精神做担保,品牌的DNA就可以一直延续下去?

- 作者: hustlg 2008年12月25日, 星期四 20:49  回复(0) |  引用(0) 加入博采

Google Sparsehash
 
Google Sparsehash 包
实现背景:
该包由2种类型和HashTable实现组成。
Sparse 设计的实现过程中考虑的是空间优先;dense 设计上考虑的是时间优先。设计的注重点不一样,所以实现也不一样。为了和通用的STL相适应,每一种实现提供了hash-map和Hash-set2种封装方式。
 
 
 
在使用Hash_map和Hash_set的过程中是不需要安装STL库的,google提供了整个的实现过程。Google在实现的过程中大量使用了模板和泛型编程。
 
实现特点:
1。这个库提供了内存中Hash tables的一种实现,同时提供了持久化存储的能力。实现上尽可能快,可移植和小。 实现这些目标使用了Knuth在<<计算机程序设计艺术 第三卷>>中提到的 内部探测散列算法(具体Hash函数的实现可以参考http://burtleburtle.net/bob/hash/evahashhttp://burtleburtle.net/bob/c/lookup2.c)。与开放链Hash算法不同,它不需要指向每个元素的指针项,在实践中仍然达到了常数级的查找时间。
2.为了节省空间,在插入Hash table的过程中,无论是Key还是data使用Union方式:如果Key或data很小,就直接存储,否则就存取一个指针。
为了便于存取Key和data,可以使用2个宏 KEY_PTR和PTR_KEY在参数和指针实际所指的数据之间转换比如:
 
     char key[] = "ab", *key2;
      HTItem *bck; HashTable *ht;
      HashInsert(ht, PTR_KEY(ht, key), 0);
      bck = HashFind(ht, PTR_KEY(ht, "ab"));
      key2 = KEY_PTR(ht, bck->key);
 
主要接口:
这个Hash table的实现支持的主要接口如下:
 

 1. HashTable *AllocateHashTable(int cchKey, int fSaveKeys)
 
   功能:分配一个Hashtable的结构并且返回它
参数:    cchKey: 为正数时候,表明每个Key是固定长度的;为0表明Key是一个以\0结束的固定长度的字符串。
       fSaveKey: 通过是需要调用者分配Key的空间,如果设置为1,会Copy一个Key。
 
 2.     ClearHashTable(HashTable *ht)
功能:移除 hashtable的所有元素;
 
 3.   void FreeHashTable(HashTable *ht)
功能: 释放 hashtable使用的内存
 
 4.    HTItem *HashFind(HashTable *ht, ulong key)
         功能:查询Hashtable,找到返回该元素,否则为空;
 5.     HTItem *HashFindLast(HashTable *ht)
     功能:返回最后查找过的的元素
 6     HTItem *HashFindOrInsert(HashTable *ht, ulong key, ulong dataInsert)
           功能:查找指定的Key的元素,不在就插入。  
 
 7.   HTItem *HashFindOrInsertItem(HashTable *ht, HTItem *pItem)
          功能:插入一个Key/data对,是否覆盖已经存在的元素由  SAMEKEY_OVERWRITE标记设定。
 
 9     HTItem *HashInsert(HashTable *ht, ulong key, ulong data)
             功能: -- 插入 key/data as an HTItem.
 10    int HashDelete(HashTable *ht, ulong key)
          功能:   -- 移除一个制定Key的元素,成功返回1,否则不存在返回0
 11     int HashDeleteLast(HashTable *ht)
       功能: -- 删除最近查询过的元素.
 
 12     HTItem *HashFirstBucket(HashTable *ht)
             功能-- 用来遍历hashtable的桶, 遍历过程中不要做插入和删除操作;
 13    HTItem *HashNextBucket(HashTable *ht)
                  -- RETURNS NULL at the end of iterating.
 
 14     int HashSetDeltaGoalSize(HashTable *ht, int delta)
                  功能:一次性批量插入数据;
 
 15    void HashSave(FILE *fp, HashTable *ht, int (*dataWrite)(FILE *, char *))
                 
          功能:将整个Hash表的内容保存在文件中。如果数据域是一个指针或者复杂的数据结构,需要传递一个函数指针将文件指针作为参数,此时可以写入你想写入的东西,函数返回写入的字节数。如果数据域是整数,不需要传函数指针。
        
 16    static HashTable *HashDoLoad(FILE *fp, char * (*dataRead)(FILE *, int),
        HashTable *ht)
 
          功能:  --装入Hash表. 他需要一个函数来读取一个文件的结构和结构的大小。功能与 HashSave对应。
 17     HashTable *HashLoadKeys(FILE *fp, char * (*dataRead)(FILE *, int))
               功能:        -- 与 HashLoad(),不同 只有必要的时候才从磁盘Load相应的数据.这种方法可以节省内存 。
注意:在装入数据的时候不应该插入和删除数据。
 

功能扩展:
 
这个HashTable实现没有使用共享内存的方式,我们可以对AllocateHashTable进行简单改写使用共享内存的方式;另外这个Hashtable没有提供自动淘汰节点的功能,可以增加LRU,对访问节点的计数和时间统计,在无法继续插入新的节点时候触发淘汰操作。

- 作者: hustlg 2008年12月4日, 星期四 21:07  回复(0) |  引用(0) 加入博采

动态规划算法[转]

原文:http://www.kuqin.com/algorithm/20080511/8343.html

摘要
  上世纪40年代,Richard Bellman最早使用动态规划这一概念表述通过遍历寻找最优决策解问题的求解过程。1953年,Richard Bellman将动态规划赋予现代意义,该领域被IEEE纳入系统分析和工程中。为纪念Bellman的贡献,动态规划的核心方程被命名为贝尔曼方程

以前在学习非数值算法的时候,曾经了解过动态规划算法(Dynamic programming),以下是对Wikipedia上动态规划的翻译,图也是Wikipedia上的,仓促行文,不到之处,请方家指正。

这篇文章的术语实在是太多了,所以我在文中加入了少量注释,一律以粗斜体注明。

本文的不足之处将随时修正,MIT的《Introduction to Algorithms》第15章是专门讲动态规划的。

_____________________________________________________________

动态规划

在数学与计算机科学领域,动态规划用于解决那些可分解为重复子问题(overlapping subproblems,想想递归求阶乘吧)并具有最优子结构(optimal substructure,想想最短路径算法)(如下所述)的问题,动态规划比通常算法花费更少时间。

上世纪40年代,Richard Bellman最早使用动态规划这一概念表述通过遍历寻找最优决策解问题的求解过程。1953年,Richard Bellman将动态规划赋予现代意义,该领域被IEEE纳入系统分析和工程中。为纪念Bellman的贡献,动态规划的核心方程被命名为贝尔曼方程,该方程以递归形式重申了一个优化问题。

在“动态规划”(dynamic programming)一词中,programming与“计算机编程”(computer programming)中的programming并无关联,而是来自“数学规划”(mathematical programming),也称优化。因此,规划是指对生成活动的优化策略。举个例子,编制一场展览的日程可称为规划。 在此意义上,规划意味着找到一个可行的活动计划。

  • 概述

 

图1 使用最优子结构寻找最短路径:直线表示边,波状线表示两顶点间的最短路径(路径中其他节点未显示);粗线表示从起点到终点的最短路径。

不难看出,start到goal的最短路径由start的相邻节点到goal的最短路径及start到其相邻节点的成本决定。

 

 

最优子结构即可用来寻找整个问题最优解的子问题的最优解。举例来说,寻找图上某顶点到终点的最短路径,可先计算该顶点所有相邻顶点至终点的最短路径,然后以此来选择最佳整体路径,如图1所示。

一般而言,最优子结构通过如下三个步骤解决问题:

a) 将问题分解成较小的子问题;

b) 通过递归使用这三个步骤求出子问题的最优解;

c) 使用这些最优解构造初始问题的最优解。

子问题的求解是通过不断划分为更小的子问题实现的,直至我们可以在常数时间内求解。

 

 

图2 Fibonacci序列的子问题示意图:使用有向无环图(DAG, directed acyclic graph)而非树表示重复子问题的分解。

为什么是DAG而不是树呢?答案就是,如果是树的话,会有很多重复计算,下面有相关的解释。

 

 

一个问题可划分为重复子问题是指通过相同的子问题可以解决不同的较大问题。例如,在Fibonacci序列中,F3 = F1 + F2和F4 = F2 + F3都包含计算F2。由于计算F5需要计算F3和F4,一个比较笨的计算F5的方法可能会重复计算F2两次甚至两次以上。这一点对所有重复子问题都适用:愚蠢的做法可能会为重复计算已经解决的最优子问题的解而浪费时间。

为避免重复计算,可将已经得到的子问题的解保存起来,当我们要解决相同的子问题时,重用即可。该方法即所谓的缓存(memoization,而不是存储memorization,虽然这个词亦适合,姑且这么叫吧,这个单词太难翻译了,简直就是可意会不可言传,其意义是没计算过则计算,计算过则保存)。当我们确信将不会再需要某一解时,可以将其抛弃,以节省空间。在某些情况下,我们甚至可以提前计算出那些将来会用到的子问题的解。

总括而言,动态规划利用:

1) 重复子问题

2) 最优子结构

3) 缓存

动态规划通常采用以下两种方式中的一种两个办法:

自顶向下:将问题划分为若干子问题,求解这些子问题并保存结果以免重复计算。该方法将递归和缓存结合在一起。

自下而上:先行求解所有可能用到的子问题,然后用其构造更大问题的解。该方法在节省堆栈空间和减少函数调用数量上略有优势,但有时想找出给定问题的所有子问题并不那么直观。

为了提高按名传递(call-by-name,这一机制与按需传递call-by-need相关,复习一下参数传递的各种规则吧,简单说一下,按名传递允许改变实参值)的效率,一些编程语言将函数的返回值“自动”缓存在函数的特定参数集合中。一些语言将这一特性尽可能简化(如Scheme、Common Lisp和Perl),也有一些语言需要进行特殊扩展(如C++,C++中使用的是按值传递和按引用传递,因此C++中本无自动缓存机制,需自行实现,具体实现的一个例子是Automated Memoization in C++)。无论如何,只有指称透明(referentially transparent,指称透明是指在程序中使用表达式、函数本身或以其值替换对程序结果没有任何影响)函数才具有这一特性。

  • 例子

1. Fibonacci序列

寻找Fibonacci序列中第n个数,基于其数学定义的直接实现:

   function fib(n)
       if n = 0
           return 0
       else if n = 1
           return 1
       return fib(n-1) + fib(n-2)

如果我们调用fib(5),将产生一棵对于同一值重复计算多次的调用树:

  1. fib(5)
  2. fib(4) + fib(3)
  3. (fib(3) + fib(2)) + (fib(2) + fib(1))
  4. ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
  5. (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))

特别是,fib(2)计算了3次。在更大规模的例子中,还有更多fib的值被重复计算,将消耗指数级时间。

现在,假设我们有一个简单的映射(map)对象m,为每一个计算过的fib及其返回值建立映射,修改上面的函数fib,使用并不断更新m。新的函数将只需O(n)的时间,而非指数时间:

   var m := map(0 → 1, 1 → 1)
   function fib(n)
       if map m does not contain key n
           m[n] := fib(n-1) + fib(n-2)
       return m[n]

这一保存已计算出的数值的技术即被称为缓存,这儿使用的是自顶向下的方法:先将问题划分为若干子问题,然后计算和存储值。

自下而上的方法中,我们先计算较小的fib,然后基于其计算更大的fib。这种方法也只花费线性(O(n))时间,因为它包含一个n-1次的循环。然而,这一方法只需要常数(O(1))的空间,相反,自顶向下的方法则需要O(n)的空间来储存映射关系。

   function fib(n)
       var previousFib := 0, currentFib := 1
       if n = 0
           return 0
       else if n = 1
           return 1
       repeat n-1 times
           var newFib := previousFib + currentFib
           previousFib := currentFib
           currentFib  := newFib
       return currentFib

在这两个例子,我们都只计算fib(2)一次,然后用它来计算fib(3)和fib(4),而不是每次都重新计算。

2. 一种平衡的0-1矩阵

考虑n*n矩阵的赋值问题:只能赋0和1,n为偶数,使每一行和列均含n/2个0及n/2个1。例如,当n=4时,两种可能的方案是:

+ - - - - +             + - - - - +
| 0 1 0 1 |             | 0 0 1 1 |
| 1 0 1 0 |             | 0 0 1 1 |
| 0 1 0 1 |             | 1 1 0 0 |
| 1 0 1 0 |             | 1 1 0 0 |
+ - - - - +             + - - - - +

问:对于给定n,共有多少种不同的赋值方案。

至少有三种可能的算法来解决这一问题:穷举法(brute force)、回溯法(backtracking)及动态规划(dynamic programming)。穷举法列举所有赋值方案,并逐一找出满足平衡条件的方案。由于共有C(n, n/2)^n种方案(在一行中,含n/2个0及n/2个1的组合数为C(n,n/2),相当于从n个位置中选取n/2个位置置0,剩下的自然是1),当n=6时,穷举法就已经几乎不可行了。回溯法先将矩阵中部分元素置为0或1,然后检查每一行和列中未被赋值的元素并赋值,使其满足每一行和列中0和1的数量均为n/2。回溯法比穷举法更加巧妙一些,但仍需遍历所有解才能确定解的数目,可以看到,当n=8时,该题解的数目已经高达116963796250。动态规划则无需遍历所有解便可确定解的数目(意思是划分子问题后,可有效避免若干子问题的重复计算)。

通过动态规划求解该问题出乎意料的简单。考虑每一行恰含n/2个0和n/2个1的k*n(1<=k<=n)的子矩阵,函数f根据每一行的可能的赋值映射为一个向量,每个向量由n个整数对构成。向量每一列对应的一个整数对中的两个整数分别表示该列上该行以下已经放置的0和1的数量。该问题即转化为寻找f((n/2,n/2),(n/2,n/2),...,(n/2,n/2))(具有n个参数或者说是一个含n个元素的向量)的值。其子问题的构造过程如下:

1) 最上面一行(第k行)具有C(n, n/2)种赋值;

2) 根据最上面一行中每一列的赋值情况(为0或1),将其对应整数对中相应的元素值减1;

3) 如果任一整数对中的任一元素为负,则该赋值非法,不能成为正确解;

4) 否则,完成对k*n的子矩阵中最上面一行的赋值,取k=k-1,计算剩余的(k-1)*n的子矩阵的赋值;

5) 基本情况是一个1*n的细小的子问题,此时,该子问题的解的数量为0或1,取决于其向量是否是n/2个(0, 1)和n/2个(1, 0)的排列。

例如,在上面给出的两种方案中,向量序列为:

((2, 2) (2, 2) (2, 2) (2, 2))       ((2, 2) (2, 2) (2, 2) (2, 2))     k = 4
  0      1      0      1              0       0       1      1

((1, 2) (2, 1) (1, 2) (2, 1))       ((1, 2) (1, 2) (2, 1) (2, 1))     k = 3
  1      0      1      0              0      0      1      1

((1, 1) (1, 1) (1, 1) (1, 1))       ((0, 2) (0, 2) (2, 0) (2, 0))     k = 2
  0      1      0      1              1      1      0      0

((0, 1) (1, 0) (0, 1) (1, 0))       ((0, 1) (0, 1) (1, 0) (1, 0))     k = 1
  1      0      1      0              1      1      0      0

((0, 0) (0, 0) (0, 0) (0, 0))       ((0, 0) (0, 0), (0, 0) (0, 0))

动态规划在此的意义在于避免了相同f的重复计算,更进一步的,上面着色的两个f,虽然对应向量不同,但f的值是相同的,想想为什么吧:D

该问题解的数量(序列a058527在OEIS)是1, 2, 90, 297200, 116963796250, 6736218287430460752, ...

下面的外部链接中包含回溯法的Perl源代码实现,以及动态规划法的MAPLE和C语言的实现。

3. 棋盘

考虑n*n的棋盘及成本函数C(i,j),该函数返回方格(i,j)相关的成本。以5*5的棋盘为例:

5 | 6 7 4 7 8
4 | 7 6 1 1 4
3 | 3 5 7 8 2
2 | 2 6 7 0 2
1 | 7 3 5 6 1
- + - - - - -
  | 1 2 3 4 5

可以看到:C(1,3)=5

从棋盘的任一方格的第一阶(即行)开始,寻找到达最后一阶的最短路径(使所有经过的方格的成本之和最小),假定只允许向左对角、右对角或垂直移动一格。

5 |
4 |
3 |
2 |   x x x
1 |     o
- + - - - - -
  | 1 2 3 4 5

该问题展示了最优子结构。即整个问题的全局解依赖于子问题的解。定义函数q(i,j),令:q(i,j)表示到达方格(i,j)的最低成本。

如果我们可以求出第n阶所有方格的q(i,j)值,取其最小值并逆向该路径即可得到最短路径。

记q(i,j)为方格(i,j)至其下三个方格((i-1,j-1)、(i-1,j)、(i-1,j+1))最低成本与c(i,j)之和,例如:

5 |
4 |     A
3 |   B C D
2 |
1 |
- + - - - - -
  | 1 2 3 4 5

q(A) = min(q(B),q(C),q(D)) + c(A)

定义q(i,j)的一般形式:

            |-  inf.                                                  j<1 or j>n
q(i,j) = -+-  c(i,j)                                                i=1
            |-  min(q(i-1,j-1),q(i-1,j),q(i-1,j+1))+c(i,j)   otherwise.

方程的第一行是为了保证递归可以退出(处理边界时只需调用一次递归函数)。第二行是第一阶的取值,作为计算的起点。第三行的递归是算法的重要组成部分,与例子ABCD类似。从该定义我们可以直接给出计算q(i,j)的简单的递归代码。在下面的伪代码中,n表示棋盘的维数,C(i,j)是成本函数,min()返回一组数的最小值:

function minCost(i, j)
    if j < 1 or j > n
        return infinity
    else if i = 1
        return c(i,j)
    else
        return min(minCost(i-1,j-1),minCost(i-1,j),minCost(i-1,j+1))+c(i,j)

需要指出的是,minCost只计算路径成本,并不是最终的实际路径,二者相去不远。与Fibonacci数相似,由于花费大量时间重复计算相同的最短路径,这一方式慢的恐怖。不过,如果采用自下而上法,使用二维数组q[i,j]代替函数minCost,将使计算过程快得多。我们为什么要这样做呢?选择保存值显然比使用函数重复计算相同路径要简单的多。

我们还需要知道实际路径。路径问题,我们可以通过另一个前任数组p[i,j]解决。这个数组用于描述路径,代码如下:

function computeShortestPathArrays()
     for x from 1 to n
         q[1, x] := c(1, x)
     for y from 1 to n
         q[y, 0]     := infinity
         q[y, n + 1] := infinity
     for y from 2 to n
         for x from 1 to n
             m := min(q[y-1, x-1], q[y-1, x], q[y-1, x+1])
             q[y, x] := m + c(y, x)
             if m = q[y-1, x-1]
                 p[y, x] := -1
             else if m = q[y-1, x]
                 p[y, x] :=  0
             else
                 p[y, x] :=  1

剩下的求最小值和输出就比较简单了:

function computeShortestPath()
     computeShortestPathArrays()
     minIndex := 1
     min := q[n, 1]
     for i from 2 to n
         if q[n, i] < min
             minIndex := i
             min := q[n, i]
     printPath(n, minIndex)

function printPath(y, x)
     print(x)
     print("<-")
     if y = 2
         print(x + p[y, x])
     else
         printPath(y-1, x + p[y, x])

4. 序列比对

序列比对是动态规划的一个重要应用。序列比对问题通常是使用编辑操作(替换、插入、删除一个要素等)进行序列转换。每次操作对应不同成本,目标是找到编辑序列的最低成本。

可以很自然地想到使用递归解决这个问题,序列AB的最优编辑通过以下措施之一实现:

插入B的第一个字符,对AB的剩余序列进行最优比对;

删去A的第一个字符,对AB进行最优比对;

B的第一个字符替换A的第一个字符,对A的剩余序列和B进行最优比对。

局部比对可在矩阵中列表表示,单元(i,j)表示A[1..i]到b[1..j]最优比对的成本。单元(i,j)的成本计算可通过累加相邻单元的操作成本并选择最优解实现。至于序列比对的不同实现算法,参见Smith-WatermanNeedleman-Wunsch

对序列比对的话题并不熟悉,更多的话也无从谈起,有熟悉的朋友倒是可以介绍一下。

  • 应用动态规划的算法

1) 许多字符串操作算法如最长公共子列、最长递增子列、最长公共字串;

2) 将动态规划用于图的树分解,可以有效解决有界树宽图的生成树等许多与图相关的算法问题;

3) 决定是否及如何可以通过某一特定上下文无关文法产生给定字符串的Cocke-Younger-Kasami (CYK)算法;

4) 计算机国际象棋中转换表和驳斥表的使用;

5) Viterbi算法(用于隐式马尔可夫模型);

6) Earley算法(一类图表分析器);

7) Needleman-Wunsch及其他生物信息学中使用的算法,包括序列比对、结构比对、RNA结构预测;

8) Levenshtein距离(编辑距离);

9) 弗洛伊德最短路径算法;

10) 连锁矩阵乘法次序优化;

11) 子集求和、背包问题和分治问题的伪多项式时间算法;

12) 计算两个时间序列全局距离的动态时间规整算法;

13) 关系型数据库的查询优化的Selinger(又名System R)算法;

14) 评价B样条曲线的De Boor算法;

15) 用于解决板球运动中断问题的Duckworth-Lewis方法;

16) 价值迭代法求解马尔可夫决策过程;

17) 一些图形图像边缘以下的选择方法,如“磁铁”选择工具在Photoshop;

18) 间隔调度;

19) 自动换行;

20) 巡回旅行商问题(又称邮差问题或货担郎问题);

21) 分段最小二乘法;

22) 音乐信息检索跟踪。

对于这些算法应用,大多未曾接触,甚至术语翻译的都有问题,鉴于本文主要在于介绍动态规划,所以仓促之中,未及查证。

  • 相关

1) 贝尔曼方程

2) 马尔可夫决策过程

3) 贪心算法

  • 参考
  • Adda, Jerome, and Cooper, Russell, 2003. Dynamic Economics. MIT Press. An accessible introduction to dynamic programming in economics. The link contains sample programs.
  • Richard Bellman, 1957, Dynamic Programming, Princeton University Press. Dover paperback edition (2003), ISBN 0486428095.
  • Bertsekas, D. P., 2000. Dynamic Programming and Optimal Control, Vols. 1 & 2, 2nd ed. Athena Scientific. ISBN 1-886529-09-4.
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, 2001. Introduction to Algorithms, 2nd ed. MIT Press & McGraw-Hill. ISBN 0-262-03293-7. Especially pp. 323–69.
  • Giegerich, R., Meyer, C., and Steffen, P., 2004, "A Discipline of Dynamic Programming over Sequence Data," Science of Computer Programming 51: 215-263.
  • Nancy Stokey, and Robert E. Lucas, with Edward Prescott, 1989. Recursive Methods in Economic Dynamics. Harvard Univ. Press.
  • S. P. Meyn, 2007. Control Techniques for Complex Networks, Cambridge University Press, 2007.
    • 外部链接

    _____________________________________________________________

    关于动态规划,这只是一篇译文,后面将根据实际问题具体写点动态规划的应用。