一家以保险为核心的,融证券、信托、银行、资产管理、企业年金等多元金融业务为一体的紧密、高效、多元的综合金融服务集团,位列全球500强,在大陆及海外下设多家股份有限公司。集团通过旗下各专业子公司为个人客户及公司客户提供了保险保障、投资理财等各项金融服务。
面临的挑战 网管联盟bitsCN_com
目前客户数据中心管理面临的主要问题是将各个支撑业务系统(影像业务应用、邮件、MIS、系统运行日志等)的数据作集中统一安全存储,数据快速 备份和恢复。根据客户数据中心的数据集中存储提供的容量要求分析,存储系统的可用空间每年至少为 30 TB 以上在增长。数据备份是整个系统必须要考虑的问题,NetApp 从存储解决方案供应商的角度需要提出相应的建议,磁带备份或者近线存储备份都可以加以考虑。 网管u家u.bitscn@com
解决方案
根据客户总部、数据中心和各个分公司的不同业务需要,客户采用了NetApp的 中高端不同系列存储产品若干台,使用IP SAN、NAS 技术体系构建客户网络集中存储系统,设计 PA18、邮件归档、日志备份、虚拟机系统(VMWARE)、报表、呼叫中心、影像等多业务平台提供大容量、高性能、简单、灵活的存储及备份服务。
• 集中存储
NetApp FAS3040C、FAS3050C、FAS3020C、FAS270C、FAS250通过 IP SAN、NAS 系统架构为客户系统服务器提供高达 110 TB 的存储服务,通过iSCSI、NFS、CIFS为 Unix、Linux、Windows主机(file)的存储服务。
网管u家u.bitscn@com
其系统示意图如下所示: 网管联盟bitsCN_com
网管bitscn_com
方案优势 网管论坛bbs_bitsCN_com
客户对于该系统实施、运维之高效简单表示非常满意,也非常满意NetApp公司提供的非常专业的技术咨询和技术服务。此项目中NetApp的企业存储解决方案的技术优势可以总结为: 网管网www_bitscn_com
• 实现了存储整合,为多业务系统、多平台环境统一提供了大容量集中存储系统,解决了业务系统增加、平台环境多样化、数据量大幅增长下数据存储问题。
网管bitscn_com
• 在信息系统重要性显著提高、数据安全性需求提高的情况下,提高了数据保护级别,通过 RAID、RAID-DP、SnapShot、SnapRestore 等提供了多级别的数据保护功能,同时为旧信息系统提供数据备份功能。 网管论坛bbs_bitsCN_com
• 通过优秀的 WAFL 文件系统和 IP SAN 架构,提高了业务系统的访问性能和数据高可用性。
网管网www.bitscn.com
• 大大减少了存储系统的管理复杂度,增加了存储系统的可靠性。NetApp 自动精简配置(Thin Provisioning)技术提供了真正的存储虚拟化解决方案,能够缩减维护开销和成本费用,减少业务中断并降低风险,同时还具有很高的存储管理灵活 性,可以快速方便地适应企业不断变化的需求。NetApp 自动精简配置(Thin Provisioning)技术可以自动集中存储资源,便于在一个大型磁盘池中根据业务需求创建多个灵活的卷/分区,最大限度地提高存储系统的利用率和使 用效率,并可以快速、无缝地进行修改。利用 NetApp 存储解决方案,可以随时随地根据需要以最低成本增加存储容量,并且无需中断业务运作。
网管下载dl.bitscn.com
• NetApp 全球服务部(NGS)提供出色的专业化服务,覆盖了存储方案设计、安装、实施部署、上线割接、运行维护、性能优化、日常维护服务的全过程,提升了客户满意 度。无论评估与环境有关的业务需求和技术需求、设计存储网络体系结构,还是实际实施解决方案并进行管理,NetApp 团队提供的专业服务都确保客户从部署的存储体系结构中获得最佳性能、最高可用性和最大的价值。 网
看了麦田在分析51.com,我也来分析下,其实很多人更会做网站,只是不会表达,很多朋友都是从零ip做到十万几十万ip,其中酸甜苦辣有多 少人能了解,这些朋友他们服务器操作,服务器安全,域名选购,网站版面,广告联盟合作,流量推广合作,大多数都是一个人负责,这些都是宝贵的经验,也许是 他们不大想把经验分享出来,因为写出来也不一定会有人认同。
首先我不喜欢庞升东这个人,庞升东一开始做的是1tong统计,然后还做过86.net,再做51.com的时候,就说曾经赚过千万,以后估计他赚几个千万应该是有可能,那时赚千万肯定是没有的,然后51.com的成长和9991搞牛氓手段发展流量是分不开的。
今天暂且抛开这些不好的,来分析51.com值得我们学习的地方。
一、51首页的“大广播”,这个功能只是赚取小钱的一点点手段,玩游戏的朋友应该知道,游戏中有这个功能,视频聊天室也有这个功能,腾迅也有,腾迅而且能收费用qq消息的方式传递。
1 在视频聊天室类这个“大广播”的用处是:为了方便所有用户能看到信息;同时有些在视频聊天室搞活动,为了增加人气;另外还有一个搞笑的地方,是为了吵架骂对方。
2 在游戏中,是为了召换朋友,和卖游戏中的虚拟装备。
3 在交友网站,这是起到突出自己的作用。
4 这是一个交友网站用户特别需要的功能,但是一定要把架构设计好,用户除了想展示自己外,还想增加自己主页的人气,增加积分提高等级,最主要的还是目的性的。
5 给宠升东第一个建议,麦田说的开通匿名发言没有什么用处,现在一天一千条,最多一天增加十来条捣乱的,十来条不敢表达爱意的,乱说一通但没人觉得有用处的。
6 51.com的“大广播”目前每天1000多条,推出大概是三个月了,每条资费2元。我估计这个功能每月能给庞升东带来四万以上的收入。
7 相对于51.com的vip来说,这个收入也就是粒芝麻,大家可以看下在线用户,然后数下一页有多少个用户标了vip标志,一共有多少页。vip用户保守估计都在百万以上,vip10元一个月,那这会有多少收入?
二 51.com首页的“新人推荐”和好的地方
1 首页新人推荐这个一般般,每个网站都有,不是重点
2 首页推荐美女的比例,估计每个网站都差不多,谁叫中国重男轻女生太多男儿呢
3 首页“新人推荐”只是一般,这个功能每个站几乎都有。
4 首页好的地方,我比较喜欢下面那一句话,我们一直用心在做!心还是一张图,这是细节,每一个站长ceo都应该注重这些细节,并且以为用户提供更好更细更人性化的服务去努力。
5 首页“乱弹一下”也不错。
6 一个网站用户很多,要交叉性的把用户表达出来,“乱弹一下”,新人推荐,这些都是不够的,
三 上次和朋友聊天说了三点51.com做的好地方,
只说网站方面51有三点做的很好:
第一个是 抓住年轻人的心理,主页可以很个性化
第二个是 社区氛围,他的论坛群组什么的都很人性化,很多引导用户正确交友的文章
第三个是 等级制度,vip和普通用户的界限划的恰到处,能收到钱发展。
四 再套用一下聊天的话,web2.0最重要的就是网站架构
朋友说:像你刚才说的51,爱情公寓,都不是因为技术上的成功,而是模式,或者说游戏规则,貌似我们以前说过。。。
我说的:嗯,整个架构的规划,以前也说过呀,就像一个国家,制度好,会有不断的新人加入,让这个国家发展的越来越强大,技术只是基础,web2.0就是社区,互动,交流,就是一个平台,所以要有一个良性循环才能让这个平台发展的更好。
web2.0是什么?这个概念太广了,简单的说web2.0是一种服务,为网友提供更好的服务。
五 web2.0网站大多是以人为概念,而且以用户提供信息,博客,电影等内容为主,而让用户奉献东西和寻找自己想要的东西,就一定要有一个好的架构和制度。
51这个架构比较不错,但并不是适合任何站,51.com也不是我设计的架构,所以我了解的并不是很透彻,我只说几点我觉得一个web2.0交友网站“必需注意”的几个小地方。
1 惩罚部份,这是为了不让一粒老鼠屎坏了一锅汤,影响其他用户对网站的感觉,惩罚可以分多种,发脏话,捣乱的,暂停登录几天,发色情反动贴的,不手软,删除用户。
2 防骚扰部份,很多用户特别是美女,如果不做好这部份,都会收到很多垃圾信息,防骚扰大致的功能是,可以设置:所有用户可以留言/只有好友可以留言/vip才可以留言/拒绝所有人留言。
3 交友的引导,51上面有一个贴子,大致的内容是:标题:在51交友应该这样,内容:…没有必要大量发留言…想交到朋友不如真心留言鼓励他,赞美他…
4 接上一条,用户的引导,51的主页比较个性化,那些用户都喜欢用小图来装饰主页,(这种用户也有网站专门为他们提供服务,就是非主流,你们可以搜一下百度 的非主流,也有好几个网站有十万ip以上,这是题外话) 51的主页设计的比较个性,但也需要引导,可以搜一下51的群组“主页”这个词,看下51是怎样引导的。
5 vip的界限和积分等级,vip和普通用户的划分一定要洽到好处,要区分两种用户的不同,这样才能收到费用,积分等级是为了让老用户能有一个荣誉感。
6 让用户去攀比,51有个帅哥排行,美女排行,这个排行可以用很多因素排出来,51有一个比较细的地方是,vip用户可以给其他用户上传的相片打分,我想庞的意图是为了更好找出美女帅哥。
…..其他还有挺多,就不做51的广告了,:P虽然学习51但也痛恨51,因为51抢了太多用户,记住web2.0是架构和制度最重要,也不一 定要像谢文说的要全,全那盘子得多大呀,得投入多少,赚多少钱呀,适合谢文,不一定适合自己,找准自己的定位,设计好架构和制度,祝你们赚到自己想要的 钱….
希望我和我的团队所努力的下一个web2.0网站能够成功……
一、【理论知识】
MogileFS 是一个分布式文件存储的 解决方案,它能够做到 不需要特殊的核心组件、无单点失败、自动的文件复制、比RAID好多了、传输中立,无特殊协议(客户端可以通过NFS或HTTP来和MogileFS通 信)、简单的命名空间、不用共享任何东西、不需要RAID、不会碰到文件系统本身的不可知情况 等等优点。
相关知识和安装方面的问题可以去看官方的wiki:http://mogilefs.pbwiki.com/。(有可能被GFW了,请使用代理或者安装一个Firefox的gladder插件来访问)
[ Mogilefs分为几部分 ]
1. 数据库(MySQL)部分
你可以用 mogdbsetup程序来初始化数据库。数据库保存了Mogilefs的所有元数据,你可以单独拿数据库服务器来做,也可以跟其他程序跑在一起,数据库 部分非常重要,类似邮件系统的认证中心那么重要,如果这儿挂了,那么整个Mogilefs将处于不可用状态。因此最好是HA结构。
2. 存储节点
mogstored 程序的启动将使本机成为一个存储节点。启动时默认去读/etc/mogilefs/mogstored.conf ,具体配置可以参考配置部分。mogstored启动后,便可以通过mogadm增加这台机器到cluster中。一台机器可以只运行一个 mogstored作为存储节点即可,也可以同时运行其他程序。
3. trackers(跟踪器)
mogilefsd即 trackers程序,类似mogilefs的wiki上介绍的,trackers做了很多工作,Replication ,Deletion,Query,Reaper,Monitor等等。mogadm,mogtool的所有操作都要跟trackers打交 道,Client的一些操作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡。trackers也可以只运行在一台机器 上,也可以跟其他程序运行在一起,只要你配置好他的配置文件即可,默认在/etc/mogilefs/mogilefsd.conf。
4. 工具
主要就是mogadm,mogtool这两个工具了,用来在命令行下控制整个mogilefs系统以及查看状态等等。
5. Client
Client实际上是一个Perl的pm,可以写程序调用该pm来使用mogilefs系统,对整个系统进行读写操作。
[ 概念定义 ]
可以参考官方wiki的这儿,简单说一下
domain:最高域,在一个域下key是唯一的。
class:包含在domain中,可以针对每一个class定义保存的份数。
key:对文件的唯一标识。
file:文件。
[ 适用性 ]
由于Mogilefs不支持对一个文件的随机读写,因此注定了只适合做一部分应用。比如图片服务,静态HTML服务。
即文件写入后基本上不需要修改的应用,当然你也可以生成一个新的文件覆盖上去。
二、【安装Perl和相关包】
[ 安装环境 ]
操作系统:RHEL 4 (AS 4)
Perl版本:Perl v5.8.8
注意:请确保你的Perl版本为大于 v5.8.8,不然可能安装会有问题,另外,本文所有操作都是在一台机器上完成,可能多台机器上稍微有些不同,请自行调整
[ MySQL ]
安装前请安装好MySQL,如果MySQL Server和MogileFS不是一台机器,请在MogileFS机器安装好MySQL Client,本文假设MySQL Client安装在:/usr/local/mysql 目录,安装完客户端后请建立一个软链接:
ln -s /usr/local/mysql/lib/libmysqlclient.so.15 /usr/lib/libmysqlclient.so.15
[ Perl包安装 ]
因为MogileFS需要使用很多相关的Perl包,请逐一按照一下次序安装,本文采用的是比较笨,比较简单的安装方法,逐个把包下载回来本机手工安装,没有使用cpan的包安装方式。
要下载包,请在http://search.cpan.org中输入包名,然后下载,一般提供的是最新版,如果版本跟下面不一致,请以最新版为准。
为方便使用,本文包下载地址列表:(不保证您阅读本文的时候有效)
包安装次序:(务必按照本次序进行)
| BSD-Resource-1.2901.tar.gz Sys-Syscall-0.22.tar.gz — Time-HiRes-1.9715.tar.gz Danga-Socket-1.57.tar.gz — Net-Netmask-1.9015.tar.gz IO-AIO-3.07.tar.gz (本包要求Perl v5.8.8以上) Perlbal-1.71.tar.gz — String-CRC32-1.4.tar.gz Gearman-1.07.tar.gz Gearman-Client-Async-0.93.tar.gz Gearman-Server-1.08.tar.gz — #make test 有可能会有一个错误,不用管它 DBI-1.607.tar.gz DBD-mysql-4.008.tar.gz #以下命令假设MySQL服务器是在本机 MogileFS-Client-1.08.tar.gz |
一定要按以上顺序安装,解压缩,生成Makefile,测试,安装 这样的步骤来执行,命令是:
# tar zxvf xxxxx.tar.gz
# cd xxxxx
# perl Makefile.PL
# make
# make test
# make install
这样就安装成功了,注意make test的错误提示,如果不是很严重的错误提示,基本可以忽略继续下一步。
三、【配置MogileFS】
以下操作除非明确指定,不然是以root用户来运行,当然,你也可以使用自己的帐户来执行(除了一些特权操作),另外 10.15.6.28 是本机IP,本试验只使用了一台机器。如果配置过程不太顺利,请反复检查后反复试验。
1. 创建数据库(初始化)
可以预先在数据库服务器上建立好一个叫做 mogilefs 的数据库,便于进行下面的步骤.
#mogdbsetup –dbhost=10.15.6.28 –dbname=mogilefs –dbuser=root
–dbhost 是数据库主机地址, –dbname是数据库名,–dbuser是访问该数据库的用户,如果有密码请加上–dbpass选项,最好访问数据库的是超级用户root或者具 有很高权限的新建数据库用户,因为MogileFS需要一些比较高权限的初始化操作。
2. tracker配置
新建tracker配置文件 /etc/mogilefsd.conf ,写入以下文件内容:(请去掉#后面的注意信息)
db_dsn DBI:mysql:mogilefs #数据库配置
db_user mogile #数据库用户
db_pass 123123 #数据库密码
conf_port 6001 #tracker端口
listener_jobs 5
db_dsn指向的是你数据库的位置,如果你数据库不在同一个机器上,请改为:
db_dsn DBI:mysql:mogilefs:127.0.0.1
由于mogilefsd不能用root用户启动.所以添加mogile用户
# adduser mogile
在配置下面以前先启动 trackers server
# su mogile
# mogilefsd -c /etc/mogilefsd.conf –daemon
3. Storage Server 配置
说明:以下命令假设你的 Perl 的包文件都在 /usr/lib/perl5/5.8.8 目录,如果不是,请自行修改。
用mogadm工具将storage server加到数据库中:
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 host add mogilestorage –ip=10.15.6.28 –port=7500 –status=alive
(由于本文是在一台机器上配,故trackers的地址和ip地址是一样的)
用下面命令来检测是否成功:
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 host list
加入一个设备到你的storage server:
# mogadm -lib=/usr/lib/perl5/5.8.8 -trackers=10.15.6.28:6001 device add mogilestorage 1
用下面命令来检测是否成功:
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 device list
Device ID 是唯一的,一旦创建将无法删除,只能mark为dead. 所以,如果你某个磁盘坏了,你mark为dead, 后来又修好了,
那么你必须重新格式化并命名为新的device id, 不支持将device从dead变为alive.
新建Storage配置文件: /etc/mogstored.conf 内容是: (请去掉#后面的注意信息)
httplisten=0.0.0.0:7500 #HTTP监听端口
mgmtlisten=0.0.0.0:7501 #MongileFS监听端口
docroot=/opt/mogdata #数据存储物理路径
建立存放数据的路径:(必须使用root权限才能创建)
# mkdir -p /opt/mogdata/dev1
说明:mogadm 参数的用法请参考 http://search.cpan.org/~dormando/MogileFS-Utils/mogadm
4. 运行MogileFS
启动 Storage Server
# mogstored -c /etc/mogstored.conf –daemon
如果没有启动Trackers,请启动 Trackers
# su mogile
$ mogilefsd -c /etc/mogilefsd.conf –daemon
查看你所有的服务都起来没有
# ps -ef | grep mogilefsd
# ps -ef | grep mogstored
四、【MogileFS使用测试】
生成domain
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 domain add testdomain
加一个 class 到domain
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 class add testdomain testclass
写一个perl文件试一下test.pl
- #=======================================
- use MogileFS::Client;
- my $mogfs = MogileFS::Client->new(domain=>‘testdomain’, hosts=>['10.0.22.184:6001'], root=>‘/home/xiehl/mogdata’,);
- my $fh = $mogfs->new_file(“file_key”, “testclass”);
- die $fh unless $fh->print($mogfs->readonly);
- my $content = “file.txt”;
- @num = $mogfs->store_content(“file_key”,“testclass”,$content);
- print “@num \n”;
- my $file_contents = $mogfs->get_file_data(“file_key”);
- print “$file_contents \n”;
- #$mogfs->delete(”file_key”);
- $fh->print($file_contents);
- @urls = $mogfs->get_paths(“file_key”);
- print “@urls \n”;
- #=======================================
执行脚本
# perl test.pl
本文返回的内容是:(可能你返回的内容会不同,格式类似就行)
8
SCALAR(0×9ddaaa8)
http://10.15.6.28:7500/dev1/0/000/000/0000000008.fid
在浏览器里输入:http://10.15.6.28:7500/dev1/0/000/000/0000000008.fid,将会看到输出:
file.txt
能够访问我们存储的数据,配置成功!
五、【附加内容】
[ MySQL检测代码 ]
如果需要检测你的DBI和MySQL Client是否安装正常,可以使用一下数据库测试代码来检测能否正常连接到MySQL:
- #=======================================
- #!/usr/bin/perl
- # DBI is perl module used to connect to the database
- use DBI;
- # hostname or ip of server (for local testing, localhost should work)
- $config{’dbServer’} = “localhost”;
- $config{’dbUser’} = “root”;
- $config{’dbPass’} = “”;
- $config{’dbName’} = “test”;
- $config{’dataSource’} = “DBI:mysql:$config{’dbName’}:$config{’dbServer’}”;
- # Connect to MySQL
- my $dbh = DBI->connect($config{’dataSource’},$config{’dbUser’},$config{’dbPass’}) or
- die “Can’t connect to $config{’dataSource’}<br>$DBI::errstr”;
- print “Connected successfully<br>”;
- $dbh->disconnect();
- #=======================================
[ 相关参考 ]
mogilefs 最新版本安装: http://www.wuei.net/?p=33
Mogilefs学习: http://blog.chifeng.name/?p=220
mogileFS的工作方式: http://www.sunnyu.com/?p=32
mogileFS分布式文件存储解决方案: http://www.sunnyu.com/?p=10
[ 扩展阅读 ]
编译mogileFS的php模块: http://www.sunnyu.com/?p=78
mogileFS体系结构分析: http://www.sunnyu.com/?p=31
mogileFS体系结构分析: http://www.sunnyu.com/?p=30
王雷雷走了。这个从不缺少“激情与才干”的TOM在线“少帅”,应该是带着遗憾离开的吧!
在王雷雷身后,留下的是一个仍然在摸索方向的TOM在线:“第四大门户”的称谓已经没有人再提起,Skype的未来还不曾明确,易趣的亏损还在继续,而作为主业的SP无线业务却难以止跌。
TOM在线曾经非常非常地接近成功的巅峰,却最终滑落下来,曾经倾注了无限希望的四大业务都已风光不再。拥有如此多优质资源的TOM在线,在互联网的竞争中究竟是如何掉队的?
少帅的离开
9月3日,TOM集团宣布,王雷雷辞去集团副主席及执行董事之职务,同时辞去TOM在线 CEO及易趣中国控股董事职务。而十几天前,曾经的集团CEO汤美娟辞去集团非执行董事一职,与TOM集团彻底“分手”。官方对两人辞职的原因所给出的说 明惊人的一致:“个人事业发展以及家庭原因”。
实际上,这或许是能提供的唯一“合理”的理由。根据TOM集团发布的中期财报,2008年上半年TOM集团营业额为13.3亿港元,亏损5.47亿;互联网业务收入5.02亿港元,比去年同期减少11.1%,互联网业务亏损5500万港元。
一位王雷雷的圈内好友向本报私下表示,对他的离开不感到意外,“无线业务一直在下滑,易趣的 表现也很难让人振奋,这对他而言,很难接受。”对于心高气傲的王雷雷而言,这个曾经将TOM在线的无线增殖业务做得风生水起的“干将”,面对着自己最熟悉 领域的业务下滑,似乎已经束手无策。
自从1999年TOM集团成立以来,TOM在线就一直作为集团“旗舰”承揽着互联网业务发展的重任,然而,其SP业务、门户网站、TOM-Skype、TOM易趣都没能成为长期的稳定的营收增长点。
“没落”的无线
去年年中,TOM集团公布2007年中期财报,TOM集团上半年亏损7235万港元,亏损主要来自旗下互联网企业TOM在线,业绩的大幅下滑直接导致TOM在线于当年9月退市。TOM在线的退市,将TOM集团拉回到一个尴尬的现实:互联网业务第一次失去了重心。
Tom.com门户网站成立于2000年,曾经是TOM在线最雄心勃勃的一项业务。TOM在线一度号称自己已经跃升为国内的第三大门户网站,前景似乎一片光明。但其后,门户的声音却渐渐转弱。
2004年,TOM在线转投无线增值领域,开始大赚快钱,一度成为SP行业“老大”。然而,面对SP行业坑蒙拐骗的不规范操作,国家有关部门和电信运营商出台了一系列“铁血军规”进行严厉整顿,TOM在线与其他SP企业一样,无线业务迅速衰退,甚至遭遇“毁灭性”打击。
要命的是TOM在线当时主营业务逾90%的收入都来自无线增值业务,因此受宏观政策影响尤其明显,一连14个月业绩连续下滑,从此一蹶不振。
被糟蹋的业务
然而,TOM在线并非没有转型的机会,曾经有一大堆好的业务摆在它面前,却没有再迎来一飞冲天的发展。
Skype网络电话在国外发展得如火如荼,TOM在线将之引入中国,推出了TOM- Skype业务。这块肥得让人流口水的业务却最终没有帮TOM在线撑起门面。目前,TOM-Skype尽管拥有6900万注册用户,但由于国内Skype 用户充值的大部分直接支付到国外,TOM在线并未直接获得收入,财报亦未披露详细营收数据。而且,网络电话业务很大程度上受到电信监管政策的限制,前景仍 然不明朗。
TOM在线又将目光投向了电子商务领域。2007年8月,eBay与TOM在线合资设立 TOM-易趣,其中TOM在线51%控股并负责运营。平台发布之初,王雷雷称要在半年内拿下35%到40%的市场份额。但随后的财报显示,这一业务在 2007年为TOM在线带来了1.04亿元港币的亏损。今年上半年,TOM易趣仍亏损4400万港元,而且无法预测何时能扭亏为盈。
分析人士表示,尽管TOM易趣采取了一系列政策,比如将服务器从美国搬回国内,大大提升网页浏览速度,改善用户的使用体验等,也渐有起色,但仍难以撼动淘宝在C2C市场一家独大的地位,这也导致易趣在自身盈利能力不足的时候,面临很大的困境。
又一个救主奇兵?
不过,TOM集团似乎没有放弃互联网业务的打算。TOM集团董事会主席陆法兰此前表示,内地电信业重组正在进行,预期电信市场将出现新的增长领域。基于此,TOM集团已经开发出多项有市场潜力的无线业务新产品。
瞅着网络视频日益红火,TOM集团又将开拓疆土的重心转向了这一领域。不久前,TOM宣布与 Joost成立合资公司,共同为用户提供中文高清在线视频娱乐节目。然而,网络视频真的能够是TOM集团可以倚仗的突围“奇兵”吗?这个看似庞大的视频分 享网站市场早已拥挤不堪,而且是一项极为“烧钱”的业务。目前,国内尚没有一家视频网站堪称盈利。TOM集团在财务亏损的状况之下,网络视频业务多久能实 现盈利成为留给业界的一个“猜想”。本报记者陶国睿
■记者观察
别老跟在人家后面跑
在互联网行业,跟在别人后面跑是最危险的事情。当TOM集团忙于开发各种新业务、忙于紧跟时尚潮流的时候,新浪(
企业库 论坛)一直在朝着新闻资讯门户网站的方向努力,终至第一;网易也曾经历互联网泡沫的迷茫,但选准网游之后,就再也没有放弃过阵地,深耕细作之下,如今亦是风生水起;腾讯牢牢把握QQ庞大的用户资源,在此基础上开发各种增值应用,成为首屈一指的互联网公司……
正如正望咨询首席分析师吕伯望所说,TOM集团需要一个认认真真的互联网战略,这种“认真”意味着TOM必须彻底抛弃过去那种“沉迷于赚快钱”的短期行为,真正打造出自己的特色业务品牌。
猴子掰包谷,掰一个扔一个,最终可能一无所获。现在,TOM集团面临的最大挑战,是要重新找 到新的互联网业务重心,而且这一业务可以长期为客户创造价值,不会时兴时败。TOM在线曾经在SP领域“独步天下”,希望在新一轮的互联网版图重新划分形 势之下,TOM能再创一个新的“神话”。
1、选取最适用的字段属性
MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更 好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空 间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不 是BIGIN来定义整型字段。
另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。
2、使用连接(JOIN)来代替子查询(Sub-Queries)
MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一 个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递 给主查询,如下所示:
DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况 下,子查询可以被更有效率的连接(JOIN).. 替代。例如,假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:
SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
如果使用连接(JOIN).. 来完成这个查询工作,速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话,性能将会更好,查询如下:
SELECT * FROM customerinfo LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. CustomerID WHERE salesinfo.CustomerID IS NULL
连接(JOIN).. 之所以更有效率一些,是因为 MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。
3、使用联合(UNION)来代替手动创建的临时表
MySQL 从 4.0 的版本开始支持 UNION 查询,它可以把需要使用临时表的两条或更多的 SELECT 查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用 UNION 来创建查询的时候,我们只需要用 UNION作为关键字把多个 SELECT 语句连接起来就可以了,要注意的是所有 SELECT 语句中的字段数目要想同。下面的例子就演示了一个使用 UNION的查询。
SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author
UNION
SELECT Name, Supplier FROM product
4、事务
尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库操作都可 以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下,当这个语句块中的某一条语句运行出错 的时候,整个语句块的操作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突 然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是: 要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN 关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
BEGIN;
INSERT INTO salesinfo SET CustomerID=14;
UPDATE inventory SET Quantity=11
WHERE item=’book’;
COMMIT;
事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。
5、锁定表
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户
来使用,事务造成的影响不会成为一个太大的问题;但假设有成千上万的用户同时访问一个数据库系统,例如访问一个电子商务网站,就会产生比较严重的响应延迟。
其实,有些情况下我们可以通过锁定表的方法来获得更好的性能。下面的例子就用锁定表的方法来完成前面一个例子中事务的功能。
LOCK TABLE inventory WRITE
SELECT Quantity FROM inventory
WHERE Item=’book’;
…
UPDATE inventory SET Quantity=11
WHERE Item=’book’;
UNLOCK TABLES
这里,我们用一个 SELECT 语句取出初始数据,通过一些计算,用 UPDATE 语句将新值更新到表中。包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前,不会有其它的访问来对 inventory 进行插入、更新或者删除的操作。
6、使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。例如,外键可以保证每一条销售记录都指向某一 个存在的客户。在这里,外键可以把customerinfo 表中的CustomerID映射到salesinfo表中CustomerID,任何一条没有合法CustomerID的记录都不会被更新或插入到 salesinfo中。
CREATE TABLE customerinfo
(
CustomerID INT NOT NULL ,
PRIMARY KEY ( CustomerID )
) TYPE = INNODB;
CREATE TABLE salesinfo
(
SalesID INT NOT NULL,
CustomerID INT NOT NULL,
PRIMARY KEY(CustomerID, SalesID),
FOREIGN KEY (CustomerID) REFERENCES customerinfo
(CustomerID) ON DELETECASCADE
) TYPE = INNODB;
注意例子中的参数“ON DELETE CASCADE”。该参数保证当 customerinfo 表中的一条客户记录被删除的时候,salesinfo 表中所有与该客户相关的记录也会被自动删除。如果要在 MySQL 中使用外键,一定要记住在创建表的时候将表的类型定义为事务安全表 InnoDB类型。该类型不是 MySQL 表的默认类型。定义的方法是在 CREATE TABLE 语句中加上 TYPE=INNODB。如例中所示。
7、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(), MIN()和ORDERBY这些命令的时候,性能提高更为明显。那该对哪些字段建立索引呢?一般说来,索引应建立在那些将用于JOIN, WHERE判断和ORDER BY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况,例如 customerinfo中的“province”.. 字段,在这样的字段上建立索引将不会有什么帮助;相反,还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引,也可以使用ALTER TABLE或CREATE INDEX在以后创建索引。此外,MySQL
从版本3.23.23开始支持全文索引和搜索。全文索引在MySQL 中是一个FULLTEXT类型索引,但仅能用于MyISAM 类型的表。对于一个大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再使用ALTER TABLE或CREATE INDEX创建索引,将是非常快的。但如果将数据装载到一个已经有FULLTEXT索引的表中,执行过程将会非常慢。
8、优化的查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。下面是应该注意的几个方面。首 先,最好是在相同类型的字段间进行比较的操作。在MySQL 3.23版之前,这甚至是一个必须的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较;但是作为特殊的情况,在CHAR类型的字段和 VARCHAR类型字段的字段大小相同的时候,可以将它们进行比较。其次,在建有索引的字段上尽量不要使用函数进行操作。
例如,在一个DATE类型的字段上使用YEAE()函数时,将会使索引不能发挥应有的作用。所以,下面的两个查询虽然返回的结果一样,但后者要比前者快得多。
SELECT * FROM order WHERE YEAR(OrderDate)<2001;
SELECT * FROM order WHERE OrderDate<”2001-01-01″;
同样的情形也会发生在对数值型字段进行计算的时候:
SELECT * FROM inventory WHERE Amount/7<24;
SELECT * FROM inventory WHERE Amount<24*7;
上面的两个查询也是返回相同的结果,但后面的查询将比前面的一个快很多。第三,在搜索字符型字段时,我们有时会使用 LIKE 关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。例如下面的查询将会比较表中的每一条记录。
SELECT * FROM books
WHERE name like “MySQL%”
但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:
SELECT * FROM books
WHERE name>=”MySQL”and name<”MySQM”
最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。
PHP 是我用过的语言中,最令人恼火的但同时也是最有趣的语言。我之所以说“令人恼火”主要是因为函数命名极其不一致。尽管我每天都要用到这些函数,我还是要想一下“究竟是 str_pos 还是 strpos?是 str_split 还是 strsplit?”。另一方面,有时候可以用一行简单的代码就能解决一个难题。
下面是一些很酷的特性,很可能你也没有注意到:
- 使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。
- 在验证 email 地址的时候使用 checkdnsrr() 函数验证域名是否存在。这个内置函数能够确认指定的域名能够解析成 IP 地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数,这个函数基于 checkdnsrr(),用来验证 email 地址的合法性。对于那些认为自己的 email 地址是 “joeuser@wwwphp.net” 而不是 “joeuser@php.net” 的家伙们,这个方法可以很方便的抓住他们。
- 如果你使用的是 PHP 5 和 MySQL 4.1 或者更高的版本,考虑抛弃 mysql_* 系列函数改用改进版的 mysqli_* 系列函数。一个很好的功能就是你可以使用预处理语句,如果你在维护一个数据库密集型站点,这个功能能够加快查询速度。一些评估分数。
- 学会爱上三元运算符。
- 如果你在项目中感觉到有可复用的部分,在你写下一行代码前先看看 PEAR 中是否已经有了。很 多 PHP 程序员都知道 PEAR 是一个很好的资源库,虽然还有很多程序员不知道。这个在线资源库包含了超过 400 个可以复用的程序片段,这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的,你总能找到帮你节省时间的 PEAR 包。(参见 PECL)
- 用 highlight_file() 来自动的打印出格式化的很漂亮的源代码。如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话,这个函数用起来非常的顺手。当然了,要小心不要意外的泄露出你的数据库连接信息和密码等。
- 使用 error_reporting(0) 函数来防止用户看到潜在的敏感错误信息。在理想情况下,发布服务器应该在 php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话,你没有自己的 php.ini 文件,那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);(或者使用 require_once() 方法)。这就能够在出错的时候完全屏蔽敏感的 SQL 查询语句和路径名。
- 在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。这个 PHP 内置函数使用 gzip 算法,可以压缩普通文本达 90%。在我每次要读写 BLOB 类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。
- 通过“引用”传递参数的方法从一个函数中得到多个返回值。就像三元运算符一样,大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问“在仅能使用一次 return 的情况下,从一个函数里返回多个值?”答案就是在变量前加上一个 “&” 符号,通过“引用”传递而非“值”传递。
- 完全理解“魔术引号”和 SQL 注入的危险性。我希望阅读到这里的开发者都已经很对 SQL 注入和了解了。不过我还是把这条列在这里,是因为这个确实有点难以理解。如果你还没有听说过这种说法,那么把今天剩下的时间都用来 Google、阅读吧。
ajax跨域和JS的跨域通信(Cross The Site)的几种解决方案
最近做的一个项目中需要ajax跨域取得数据,如果是在本域中确实没有问题,但是放到二级域和其他域下浏览器直接就弹出提示框:“该页正在访问其控制范围之外的数据,这有些危险,是否继续”
1.什么引起了ajax跨域不能的问题
ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告。
2.有什么完美的解决方案么?
没有。解决方案有不少,但是只能是根据自己的实际情况来选择。
具体情况有:
一、本域和子域的相互访问: www.aa.com和book.aa.com
二、本域和其他域的相互访问: www.aa.com和www.bb.com 用 iframe
三、本域和其他域的相互访问: www.aa.com和www.bb.com 用 XMLHttpRequest访问代理
四、本域和其他域的相互访问: www.aa.com和www.bb.com 用 JS创建动态脚本
解决方法:
一、 如果想做到数据的交互,那么www.aa.com和book.aa.com必须由你来开发才可以。可以将book.aa.com用iframe添加到 www.aa.com的某个页面下,在www.aa.com和iframe里面都加上document.domain = “aa.com”,这样就可以统一域了,可以实现跨域访问。就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了。(这个办法我没有尝 试,不过理论可行)
二、当两个域不同时,如果想相互调用,那么同样需要两个域都是由你来开发才可以。用iframe可以实现数据的互相调用。解决方案就是用window.location对象的hash属性。hash属性就是http://domian/web/a.htm#dshakjdhsjka 里面的#dshakjdhsjka。利用JS改变hash值网页不会刷新,可以这样实现通过JS访问hash值来做到通信。不过除了IE之外其他大部分浏 览器只要改变hash就会记录历史,你在前进和后退时就需要处理,非常麻烦。不过再做简单的处理时还是可以用的,具体的代码我再下面有下载。大体的过程是 页面a和页面b在不同域下,b通过iframe添加到a里,a通过JS修改iframe的hash值,b里面做一个监听(因为JS只能修改hash,数据 是否改变只能由b自己来判断),检测到b的hash值被修改了,得到修改的值,经过处理返回a需要的值,再来修改a的hash值(这个地方要注意,如果a 本身是那种查询页面的话比如http://domian/web/a.aspx?id=3,在b中直接parent.window.location是无法取得数据的,同样报没有权限的错误,需要a把这个传过来,所以也比较麻烦),同样a里面也要做监听,如果hash变化的话就取得返回的数据,再做相应的处理。
三、 这种情形是最经常遇到的,也是用的最多的了。就是www.aa.com和www.bb.com你只能修改一个,也就是另外一个是别人的,人家告诉你你要取 得数据就访问某某连接参数是什么样子的,最后返回数据是什么格式的。而你需要做的就是在你的域下新建一个网页,让服务器去别人的网站上取得数据,再返回给 你。domain1下的a向同域下的GetData.aspx请求数据,GetData.aspx向domain2下的 ResponseData.aspx发送请求,ResponseData.aspx返回数据给GetData.aspx, GetData.aspx再返回给a,这样就完成了一次数据请求。GetData.aspx在其中充当了代理的作用。具体可以看下我的代码。
四、 这个和上个的区别就是请求是使用<script>标签来请求的,这个要求也是两个域都是由你来开发才行。原理就是JS文件注入,在本域内的a 内生成一个JS标签,它的SRC指向请求的另外一个域的某个页面b,b返回数据即可,可以直接返回JS的代码。因为script的src属性是可以跨域 的。具体看代码,这个也比较简单。
code:
http://www.live-share.com/files/300697/Cross_The_Site_Test_code.rar.html
(csdn不能粘贴附件么?)
总结:
第一种情况:域和子域的问题,可以完全解决交互。
第二种情况:跨域,实现过程非常麻烦,需要两个域开发者都能控制,适用于简单交互。
第三种情况:跨域,开发者只控制一个域即可,实现过程需要增加代理取得数据,是常用的方式。
第四种情况:跨域,两个域开发者都需要控制,返回一段js代码。
PS:代码自己按照情况修改即可。
这是拿别人的参考链接,老美的文章比较多。
1. Security Considerations: Dynamic HTML
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/sec_dhtml.asp
2. About Cross-Frame Scripting and Security
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/om/xframe_scripting_security.asp
3. Cross-Domain Proxy
http://ajaxpatterns.org/Cross-Domain_Proxy
4. Cross Domain XMLHttpRequest using an IFrame Proxy
http://manual.dojotoolkit.org/WikiHome/DojoDotBook/Book75
5. Back Button Support for Atlas UpdatePanels
http://www.nikhilk.net/BackButtonSupport.aspx
6. Cross-document messaging hack
http://blog.monstuff.com/archives/000304.html
7. Building Mash-ups with “Atlas”
http://atlas.asp.net/docs/Walkthroughs/DevScenarios/bridge.aspx
8. Calling web services hosted outside of your application with “Atlas”
http://blogs.msdn.com/federaldev/archive/2006/07/31/684229.aspx
http://www.federaldeveloper.com/Shared%20Documents/Presentations%20by%20Marc%
20Schweigert/CallAtlasWebServiceInDifferentProject.zip
9. AJAX Tip: Passing Messages Between iframes
http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=3b03cf9d-b589-4838-806e-64efcc0a1a15
10. OSCON Cross-site Ajax Slides
http://blog.plaxo.com/archives/2006/07/oscon_crosssite.html
http://www.plaxo.com/css/api/Joseph-Smarr-Plaxo-OSCON-2006.ppt
11. OSCON 2006: Cross-site Ajax
http://www.sitepoint.com/blogs/2006/07/28/oscon-2006-cross-site-ajax/
IP电话的呼叫过程
整个IP电话的呼叫流程可分为3部分:连接阶段、通话阶段、拆线阶段。+h5k’A1A3V-[!C.X;p.Z
(1)建立连接阶段tech.techweb.com.cn”d&C _!b6X7j S v,f
在空闲状态下,CPU一直循环检测是否有摘机或其它用户呼入的信号。用户摘机时, CPU检测到摘机信号,就发送拨号音给用户并准备接收用户所拨的电话号码。待号码收齐后,CPU给服务器发送ARP请求,收到服务器的应答后再发送ICMP请求,从服务器的ICMP应答
中获取对端的IP地址及物理地址,然后开始发起呼叫。通过ICMP包送到Ethernet,等待被叫用户回应,如果等待一段时间,用户未回应,说明用户不在或线路故障,给用户送忙音;如果被叫用户回应,就给话筒送回铃音,同时被叫用户一方振铃;若被叫久不摘机,被叫停止振铃,并发ICMP消息给主叫用户拆线,主叫用户收到此消息,送忙音,等待主叫用户挂机;如果被叫用户在规定时间内摘机,则停止送振铃音,并用ICMP应答信号,通知主叫用户,被叫已应答,主叫用户收到此消息,停止送铃音,通话开始。
(2)通话阶段TechWeb-技术社区(n+a4@;_%o(W+}+v
进入通话阶段,主叫用户就开始发送话音数据的IP包。具体过程如下:首先,将编码后的语音数据进行接收,并按照UDP进行封装,再封装成IP包送往Ethernet;同时,将Ethernet Card接收到的语音IP包进行拆包,并按一定节拍将解封语音数据进行解码,从而将被叫用户的话音送到听筒,将话筒的话音送到被叫方。被叫用户在通话阶段与主叫用户通&Q$R$|!C#?7T+l
话阶段所处理的过程完全相同。$l O*C B6G1G
(3)拆线阶段
当双方通话阶段结束时,如果主叫先挂机,CPU检测了挂机信号,就经被叫方送拆线信号ICMP。被叫方收到此拆线信号,就给被叫方送忙音,提醒被叫方挂机。如果被叫方挂机,就经主叫方送1个释放应答信号,并停止送忙音,这次通话就宣告结束。相反地,如果被叫方先挂机,其处理过程与上面是相同的。1次通话过程结束后,双方进入空闲状态,CPU再进行循环检测是否有摘机以及其它用户呼入的信号,然后重复上面的处理过程。TechWeb-技术社区1V(g4D’r/E7w-J z
ICMP模块程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛;W3B6o*S-I&m(v#A
ICMP模块主要实现对电话信令的封装。ICMP包可分为2种:ICMP请求和ICMP应答。ICMP请求包括2种情况:向服务器发送请求获取对方用户的IP地址及物理地址和向对端用户发送请求进行通话连接。相应的ICMP应答也有2种:服务器发送的应答和普通用户的应答。 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛$L*H1O7x.c.j+G:z’D
主叫用户与服务器取得联系后,向服务器发送1个ICMP请求并等待应答,从服务器的应答中获取对方的IP地址和物理地址,然后再向对端发送1个ICMP请求包,从叫用户收到主叫用户的请求,做出应答。ICMP包的格式如图3所示。
用数据区的第1个字节来标识2种情况:若第1个字节全为零,则在后面的数据区域中可填入IP地址及物理地址。若不全为零,则第1个字节为电话信令。电话信令可以自己定义,按照程控交换机的技术规范,只需要以下一些基本信令即可:(通过观察通话过程,发现只有结束通话时才通过ICMP通知对方说,不可达)
北京奥运会的百米飞人大战已尘埃落定,细心的朋友或许会发现,女子百米的前三名均为黑人,而站在男子百米决赛起跑线前的选手更是黑黝黝的一排。为什么在那些对爆发力有较高要求的运动项目中,常能看到黑人运动员摘金夺银?本文将带您了解其中的奥妙所在。
![]() Getty Images供图 北京奥运会女子100米比赛 |
生理优势
黑人运动员擅长爆发力强的运动与其肌肉的组成和结构有着莫大干系。肌肉组织分为白肌纤维和红肌纤维。前者又称快速运动单位,在进行快速爆发力运动时,得到锻炼的主要就是白肌纤维。黑人白肌纤维的比例超过80%,远远超过其他人种。另外黑人的肌肉呈长条状,张弛协调性非常好,极低的脂肪组织含量也可以降低肌肉在收缩和松弛过程中的摩擦作用。
除 了肌肉功能之外,黑人的体温调节能力也有突出之处。在进行剧烈运动时,由于代谢速度加快,导致体温上升,体温调节能力对于维持体内环境的稳定及电解质平衡 有着重要作用。黑人选手可以比其他人种选手更快地调节至正常体温。此外还有研究表明良好的体温调节能力有助于提高肌肉组织的效率。
身体特征优势
黑人具有一些独特的身体特征,使其爆发力优势愈加凸显。
黑人的躯干短,四肢长,有调查显示,相对全身长度,黑人的下肢、尤其是小腿,要比别的人种更长。较高的重心使黑人选手的稳定角减少,有利于快速灵活的运动。修长的小腿也便于获得更大的肢端线速度。值得注意的是,黑人的跟腱十分长,脚底屈肌强度也冠绝所有人种,这使得他们在起跑蹬地时,能获得更大的反作用力,在起跑时便获得了优势。
黑 人的臀部上翘,使得臀部与腿部肌肉的长度增加,产生的收缩力更大。长度增加的肌肉还可以增加收缩力对腿部的作用时间。这样的特征使得黑人选手获得了绝佳的 冲刺能力和弹跳能力。此外黑人的脚趾也有一些与众不同的特点,他们第二脚趾最长,跟骨较大,足弓更具弧度,加之脚底板脂肪组织绵软厚实,使得双脚如同一对 弹性良好的风火轮。
When h2xs creates a new module directory, it writes a skeleton .pm file. For example,
h2xs -X -n Foo::Bar
will create Bar.pm like this
package Foo::Bar;
use 5.008008;
use strict;
use warnings;
require Exporter;
use AutoLoader qw(AUTOLOAD);
our @ISA = qw(Exporter);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
# This allows declaration use Foo::Bar ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(
) ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{’all’} } );
our @EXPORT = qw(
);
our $VERSION = ‘0.01′;
# Preloaded methods go here.
# Autoload methods go after =cut, and are processed by the autosplit program.
1;
__END__
This page describes the initial contents of the .pm file, and explains how to use it as a starting point for a module.
package Foo::Bar; |
The package statement sets the default package for global names: variables, filehandles and subroutines. Since a module is implemented as a package, it is convenient to set the default package to the module name. |
use 5.008008; |
This line causes a compile-time error if the version of the Perl interpreter is less than 5.8.8. It’s a good idea to require the version number of the interpreter on which you’re developing the module; it might not run on earlier versions. |
use strict; |
use strict enforces a restricted programming model on your code. It is strongly recommended.The most obvious effect of use strict is that global variables must be referred to through fully qualified package names, e.g. $Foo::Bar::baz, rather than $baz. This has the practical consequence of flagging typos in lexically declared (my) variables. |
use warnings; |
use warnings turns on warnings for many questionable or potentially erroneous coding practices, such as use of uninitalized variables.Conventional wisdom holds that all Perl programs should run with warnings enabled. However, I find use warnings to be too picky, and rarely use it. |
require Exporter; |
Packages allow a program to be partitioned into separate namespaces. However, this leads immediately to the problem of how one package may access the facilities of another. Conceptually, there are two possibilities:
Reaching downPerl does not enforce access restrictions between packages. Any line of code, in any package, can access variables and subroutines in another package simply by naming them: $circumference = 2 * $Math::PI * $radius;
$area = Math::area($length, $width);
There are at least two problems with this:
Pushing upAlternately, a package can place its own variables in the namespace of the caller’s package: package Math;
$main::PI = 3.1415926;
sub main::area { ... }
The problem with this is that it risks the very namespace collisions that packages were designed to prevent. The Perl5 FixPerl5 provides support for both reaching down and pushing up. An object-oriented interface allows code to reach down into a package namespace without violating encapsulationConversely, the |
use AutoLoader qw(AUTOLOAD); |
One of the design objectives of Perl5 is to allow the language to scale. Current implementations compile a program each time it is run. This is acceptable for a 1000 line program, but could become a problem as programs scale up into the 10K-100K line range.The Autoloader module implements a scheme that compiles subroutines at run time, on demand. This can reduce both the CPU and memory requirements of a program.
|
our @ISA = qw(Exporter); |
The @ISA array controls method inheritance in Perl modules. If a method isn’t found in the current package, then Perl searches for it in the packages named in the @ISA array. (recursively, depth first).@ISA is a global. The our declaration allows us to refer to it without a fully qualified package name, even though use strict is in force. |
# Items to export into callers namespace by de
# names by default without a very good reason.
# Do not simply export all your public functio
# This allows declaration use Foo::Bar '
# If you do not need this, moving things direc
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(
) ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{’all’} } );
our @EXPORT = qw(
);
|
The usual way to include a module in your program is with a use statement:
use Foo::Bar LIST The Perl manual documents this statement as being exactly equivalent to BEGIN
{
require Foo::Bar;
import Foo::Bar LIST
}
The The The The If you’re not exporting anything, you can delete these three statements. Delete the explanatory comments, too. |
our $VERSION = '0.01'; |
This assigns a version number to the module. If a user writes
use Foo::Bar 1.01 then the program will |
# Preloaded methods go here. |
This is where you put methods, subroutines, variables, and whatever else the module needs. Preloaded means that they will be compiled in the usual fashion: at compile time.Go ahead and delete the comment. |
# Autoload methods go after =cut, and are proc |
Methods that are to be compiled at run time via the Autoload module are placed after the logical end of program text. I’ve never had occasion to do this.Delete this comment, too. |
1; |
A use statement evals the contents of a file. The last expression in the file must evaluate to true, or the eval dies.It is conventional to end .pm and .pl files with a 1 to provide this value. Of course, if your module has initialization code that could fail at compile time, then it should return the results of the initialization.
I like to drop the semicolon after the |
__END__ |
__END__ is the logical end of program text. You can put anything you want after this token; it will be ignored by the compiler. |
Notes
- ordinary
- It’s not completely ordinary. Normally, calling a method that doesn’t exist causes a fatal error. However, you can
usea module that neither has nor inherits animportmethod, and the interpreter will quietly ignore the problem.
Steven McDougall / resume / swmcd@world.std.com / 2007 March 14














