当你在编写一个程序时,有时不得不把字符写进文件里去。

正在装载数据……

如下面的:
 import java.io.*;   
    public class Encode1 {
        public static void main(String args[])
            throws IOException {
                Writer writer = new FileWriter(”out”);
                writer.write(”testing”);
                writer.close();
        }
    }
当你在solaris 系列的操作系统或windows 平台运行时,文本文件out 只有7字节。这就是你预期的结果。
 但这里还是有一个重要的问题。Java 字符是16位,这就是说每个字符是2 个字节长。程序Encode1把7个字符写进了文件out里了。并且结果是一个7字节长的文件。你可能要问:其它字符到那儿去了。难道这里把14个字节写进了文件中了吗。
 这个问题归结为“字符编码”了。这个问题是怎样把在java中的16位字符映射成8位字节保存到文件中去。事实上,这里有一非常好的机制,而不是简单的放大、缩小8位或16位,因为在全世界几百种字符编码在使用。这就是说:这种特殊的8位字符序列需要因不同平台、及场所而重新组合成java字符串。
Java系统是通过你因不同的需要而选择特殊编码配置来解决这个问题的。同时它也提供一默认的字符编码基于你的平台和环境。像上面的实例,java系统支持默认的字符编码进行i/o操作。另外,你也可以指定其它的编码(字符集)。这些字符编码是一字符串来描述,比如:”utf-8”。也可以是java.nio.charset.Charset 类的一个实例。Charset 是一抽象类,所以事实上这个实例是Charset 类的子类。
在Encode1例子中,解决编码问题的一种方法是把字符分解成两个字节写进文件中去。竟管这个文件可能没有字节散布在这里面。另外一种办法是把java字符中的高位抛弃。这种办法在上面的例子可以用,但你尝试写一希腊、日语字符串就不会成功了。
在这个例子中实际是用第二种方法来处理的(它的高位字节抛弃)。如果你在Encode1例子中把输出行:writer.write(”testing”); 改成:writer.write(”testing\u1234″); 这输出行的总长将是8字节而不是7字节了。竟管如此,这统一编码字符\u1234 还是不能以一个字节显示出来。
在前面讨论中的“抛弃“有两种意思。如果java字符的高位是0,就像字符是以7位ASCII表示,那么“抛弃”的意思是舍去高位字节。另外一种意思是在某种的环境下你不可能用映射使用一特殊的字符。在这种可能情况下字符(2个字节)可能被一默认的置换字节所取代。就像上面例子中的/u1234 由0×3f 取代了。
下面让我们来看看怎样使用字符集、在字符与字节之间映射。一个基本的问题是:那些字符集是可用呢?下面这个程序演示了一个列表:
import java.nio.charset.*;
    import java.util.*;
   
    public class Encode2 {
        public static void main(String args[]) {
            Map availcs = Charset.availableCharsets();
            Set keys = availcs.keySet();
            for (Iterator iter =
                keys.iterator();iter.hasNext();) [...]

网络爬虫

大家比较熟悉使用各种搜索引擎,但是,还有一种更主动和专门的搜索技术:网络爬虫。
1 爬虫技术研究综述
引言
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如:
(1) 不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。
(2) 通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。
(3) 万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频/视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。
(4) 通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。
为 了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关 的链接,获取所需要的信息。与通用爬虫(generalpurpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。
1 聚焦爬虫工作原理及关键技术概述
网 络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的 URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件,如图1(a)流程图所示。聚焦爬虫的工作流程较为复 杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步 要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止,如图1(b)所示。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过 滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:
(1) 对抓取目标的描述或定义;
(2) 对网页或数据的分析与过滤;
(3) 对URL的搜索策略。
抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。这两个部分的算法又是紧密相关的。
2 抓取目标描述
现有聚焦爬虫对抓取目标的描述可分为基于目标网页特征、基于目标数据模式和基于领域概念3种。
基于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。根据种子样本获取方式可分为:
(1) 预先给定的初始抓取种子样本;
(2) 预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等;
(3) 通过用户行为确定的抓取目标样例,分为:
a) 用户浏览过程中显示标注的抓取样本;
b) 通过用户日志挖掘得到访问模式及相关样本。
其中,网页特征可以是网页的内容特征,也可以是网页的链接结构特征,等等。
现有的聚焦爬虫对抓取目标的描述或定义可以分为基于目标网页特征,基于目标数据模式和基于领域概念三种。
基 于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。具体的方法根据种子样本的获取方式可以分为:(1)预先给定的初始抓取种子样本;(2) 预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等;(3)通过用户行为确定的抓取目标样例。其中,网页特征可以是网页的内容 特征,也可以是网页的链接结构特征,等等。
作者: [...]

标题:对称块加密算法加密模式详解作者:DragonKing Email: wzhah@263.net原发网站:中国openssl专业论坛 http://openssl.126.com版权声明:未经作者允许,不能转载和在出版物中使用本文
在openssl或其他密码相关的资料中,我们经常看到对称加密算法有ECB、CBC之类加密模式的简称,到底这些加密模式是什么呢?它们之间有什么不同呢,今天就是为大家解开这个迷。在现有的对称加密算法中,主要有4种加密处理模式,这4种加密处理模式一般是针对块加密算法而言的,如DES算法。这4种加密模式罗列如下:
   模式中文描述            英文名称(Openssl缩写)  电子密码本模式  Electronic Code Book(ECB)   加密块链模式          Cipher Block Chaining(CBC)   加密反馈模式          Cipher Feedback Mode(CFB)   输出反馈模式          Output Feedback Mode(OFB)   下面我们分别介绍这4种加密模式。【电子密码本模式】这
种模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。比如DES算法,一个64
位的密钥,如果采用该模式加密,就是将要加密的数据分成每组64位的数据,如果最后一组不够64位,那么就补齐为64位,然后每组数据都采用DES算法的
64位密钥进行加密。下图:_______________________My name |is Drago|nKing———————–上图“My name is DragonKing”这句话每8个字符(64位)作为一块,然后使用一个相同的64位的密钥对每个块进行加密,最后一块不足64位,就补齐后再进行加密。可以看到,因为ECB方式每64位使用的密钥都是相同的,所以非常容易获得密文进行密码破解,此外,因为每64位是相互独立的,有时候甚至不用破解密码,只要简单的将其中一块替换就可以达到黑客目的。【加密块链模式】该模式如下图所示:            P0           P1                              C0            C1            |               |                                  |              |            |               |                                  |—-|        |—>…IV—>XOR  |—>XOR  |—>…          Key Dec  |      [...]

网上找到的一篇文章讲的很清楚,就直接Copy过来了,在此感谢原作者。
xdebug是一个开源的php调试器,以php模块的形式加载并被使用。
windows 平台下:
一、安装xdebug模块
1、去www.xdebug.org下载相应版本php的模块文件,保存下载后的文件到php的ext目录,可以自己修改文件的名称,现在最新的版本是 2.0.1。
2、修改php.ini,增加如下信息
[Xdebug]
zend_extension_ts=”d:/php/ext/xdebug-xxx.dll”
xdebug.auto_trace=on
xdebug.collect_params=on
xdebug.collect_return=on
xdebug.trace_output_dir=”d:\Temp\xdebug”
xdebug.profiler_enable=on
xdebug.profiler_output_dir=”d:\Temp\xdebug”
参数解释:
zend_extension_ts=”d:/php/ext/xdebug-xxx.dll”
加载xdebug模块。这里不能用extension=xdebug-xxx.dll的方式加载,必须要以zend的方式加载,否则安装上后,
phpinfo打印出来的里的xdebug段的会有XDEBUG NOT LOADED AS ZEND EXTENSION的警告信息。
xdebug.auto_trace=on
自动打开“监测函数调用过程”的功模。该功能可以在你指定的目录中将函数调用的监测信息以文件的形式输出。此配置项的默认值为off。
xdebug.collect_params=on
打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。此配置项的默认值为off。
xdebug.collect_return=on
打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。此配置项的默认值为off。
xdebug.trace_output_dir=”d:\Temp\xdebug”
设定函数调用监测信息的输出文件的路径。
xdebug.profiler_enable=on
打开效能监测器。
xdebug.profiler_output_dir=”d:\Temp\xdebug”
设定效能监测信息输出文件的路径。
另外,xdebug 不能和 Zend Optimizer 以及其他 Zend 扩展 (DBG, APC, APD etc) 同时工作,目前这个问题正在修复中。
还有一些更为具体的参数设定,详见:http://www.xdebug.org/docs-settings.php
3、重启apache
这样,在本地运行php的时候,会在所设定的目录里产生一些调试信息的文件:
* 函数调用过程监测信息文件的文件名格式:trace.××××××.xt。这个文件可以直接查看,里面包含了函数运行的时间,函数调用的参数值,返回值,所在的文件和位置等信息。内容格式还是相对直观的。
* 效能监测文件的文件名格式:cachegrind.out.××××××××。
这个文件也可以直接查看,不过信息格式不易被人类所理解,
所以我们需要接下来的一个软件。

二、安装wincachegrind
由于效能监测文件:cachegrind.out.××××××××文件的内容不易被人类所理解,所以我们需要一个工具来读取它。windows下就有一款这样的软件:wincachegrind。
1、到http://sourceforge.net/projects/wincachegrind/下载安装wincachegrind
2、安装运行后,点击Tools->options,设定你的working folder(php.ini里xdebug.profiler_output_dir的值)
这样就可以比较直观的查看效能监测文件的信息了。
控制输出CacheGrind文件名的控制
http://xdebug.org/docs/all_settings#trace_output_name
ubuntu 下安装
一、安装xdebug
1. 先到xdebug.org下载最新的源码包。
2. 编译安装
tar -zxvf xdebug-xxx.tgz
cd xdebug-xxx
phpize
./configure –enable-xdebug
make
sudo make install
3. 修改配置文件php.ini,添加下面一行
zend_extension_ts=”/wherever/you/put/it/xdebug.so”
这里的/wherever/you/put/it/是 xdebug.so 所在的目录
第一行将装入 Xdebug 扩展;第二行将启用 Xdebug 的分析器功能,而第三行将启用扩展的调试功能。
一些推荐的配置
xdebug.default_enable = On
xdebug.profiler_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6
xdebug.dump_once = On
xdebug.dump_globals = [...]

The words on 20090211

1.abandon vt 离弃,丢弃,放弃;
The pretty woman abandoned her husband and went away with all their money;
abandon oneself to 沉溺于;
with bandon 1.放任的,放纵的;2.纵情的
abandon,desert,quit
abandon指因外界压力或影响彻底舍弃所感兴趣的事物或人;desert指违背誓言或法定义务,含贬义;quit指突然放弃某份工作、习惯和作法,常指“停止”。
2.ability n.[能力,本领],[才能,才智]
e.g. Now,a momentous queston scientists face is how to use man’s growing ability to genetically alter DNA.现在,科学家面临的一个重要问题是如何利用人类不断增长的能力来从基因方面改组脱氧核糖核酸。
to the best of one’s ability,尽自己最大的努力
ability,capability,capacity
ability为普通用词,尤指做事的智力或体力,后面通常接不定式;capability也指智力和体力方面的“能力”,但既可用于人,也可用于物,且后面常接of或for;capacity主要指收容和生产的能力,也可指人内在的潜力,后面可接不定式of或for.
He soon received promotion, for his superiors realized that he was a man of considerable [...]

1:选择或者创建一个新的套接字。(可以参看SUN´S的”创建一个典型的套接字”)。
2:创建一个服务器端的套接字
3:创建一个RMIClientSocketFactory
4:创建一个RMIServerSocketFactory
5:创建一个继承了UnicastRemoteObjec的远程对象,从而使用新的factories
根据这一大致的想法,我们来看每一步如何具体的实现。
步骤1: 创建ZipSocket
由于要进行Zip压缩,我们重新创建这样的套接字
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import java.net.Socket;
public class ZipSocket extends Socket {
private InputStream in;
private OutputStream out;
public ZipSocket() { super(); }
public ZipSocket(String host, int port) throws IOException {
super(host, port);
}
public InputStream getInputStream() throws IOException {
if (in == null) {
in = new ZipInputStream(super.getInputStream());
}
return in;
}
public OutputStream getOutputStream() throws IOException {
if (out [...]

在传统的OOP(面向对象编程:Object-Oriented Programming)思想里,一般把应用程序分解成若干个的对象,强调高内聚,弱耦合,从而提高应用程序的模块化程度,但是在处理某些问题的时 候,OOP会显得不够灵活,比如说,应用程序里很多业务逻辑都要在操作之初进行“权限检查”,在操作之后进行“日志记录”,如果直接把处理这些操作的代码 加入到每个模块中,那么无疑破坏了OOP的“单一职责”原则,模块的可重用性会大大降低,这时候传统的OOP设计往往采取的策略是加入相应的代理 (Proxy)层来完成系统的功能要求,但这样的处理明显使系统整体增加了一个层次的划分,复杂性也随之增加,从而给人过于厚重的感觉。正是为了处理这样 的问题,AOP(面向方面编程:Aspect-Oriented Programming)思想应运而生了,假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文 章模块等等),而AOP的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:权限检查,日志记录等等)。由此可见,AOP是OOP的一个有效 补充。
就目前的PHP来说,还没有一个完整的AOP内置实现,虽然出现了RunKit, 但一直都以BETA的状态呆在PECL项目里,估计很长时间内不太可能成为PHP的缺省设置。那是不是AOP在PHP里就破灭了呢?当然不是,因为我们有 __get(),__set(),__call()等魔术方法,合理使用这些方法可以为我们实现某种程度的“准AOP”能力,之所以说是准AOP,是因为 单单从实现上来看,称其为AOP有些牵强,但是从效果上来看,又部分实现了AOP的作用,虽然其实现方式并不完美,但对于一般的使用已经足够了。特别是从 PHP4.3.0开始,这些魔术方法已经成为了PHP的缺省内置实现,扫除了PHP4/5兼容的顾虑,那么就更加没有理由不使用它们。这里要说明的是 PHP4/5对这些魔术方法的实现有些许的不同,下面将分别举例说明:
先来看看PHP4的相应代码(下面代码只能运行在PHP4环境下):
<?php
//应用程序中某个业务逻辑类
class BIZ
{
function foobar()
{
echo ‘业务逻辑<br />’;
}
}
//业务逻辑类的包装类
class AOP
{
var $instance;
function AOP($instance)
{
$this->instance = $instance;
}
function __call($method, $argument, $return)
{
if(! method_exists($this->instance, $method))
{
return false;
}
echo ‘权限检查<br />’;
$callBack = array($this->instance, $method);
$return = call_user_func_array($callBack, $argument);
echo ‘日志记录<br />’;
return true;
}
}
//工厂方法
class Factory
{
function getBizInstance()
{
//PHP4必须这样声明一下才可以使用overload相关方法
overload(‘AOP’);
return new AOP(new BIZ());
}
}
//客户端调用演示
header(“Content-Type: text/html; charset=gbk”);
$obj = Factory::getBizInstance();
$obj->foobar();
?>
屏幕显示:
权限检查
业务逻辑
日志记录
再来看看PHP5的相应代码(下面代码只能运行在PHP5的环境下):
<?php
//应用程序中某个业务逻辑类
class BIZ
{
public function foobar()
{
echo ‘业务逻辑<br />’;
}
}
//业务逻辑类的包装类
class AOP
{
private $instance;
public function __construct($instance)
{
$this->instance = $instance;
}
public function __call($method, [...]

Php魔术函数学习与应用

(1)初识魔术方法
Php5.0发布以来为我们提供了很多面向对象的特性,尤其是为我们提供了好多易用的魔术方法,这些魔术方法可以让我们简化我们的编码,更好的设计我们的系统。今天我们就来认识下php5.0给我们提供的魔术方法。
1,__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。
class Test
{
function __construct()
{
echo “before”;
}
}
$t = new Test();
输出是:
start
我们知道php5对象模型 和类名相同的函数是类的构造函数,那么如果我们同时定义构造函数和__construct()方法的话,php5会默认调用构造函数而不会调用__construct()函数,所以__construct()作为类的默认的构造函数
2,__destruct() 当删除一个对象或对象操作终止的时候,调用该方法。
class Test
{
function __destruct()
{
echo “end”;
}
}
$t = new Test();
将会输出
end
我们就可以在对象操作结束的时候进行释放资源之类的操作
3,__get() 当试图读取一个并不存在的属性的时候被调用。
如果试图读取一个对象并不存在的属性的时候,PHP就会给出错误信息。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中反射的各种操作。
class Test
{
public function __get($key)
{
echo $key . ” 不存在”;
}
}
$t = new Test();
echo $t->name;
就会输出:
name 不存在
4,__set() 当试图向一个并不存在的属性写入值的时候被调用。
class Test
{
public function __set($key,$value)
{
echo ‘对’.$key . “附值”.$value;
}
}
$t = new Test();
$t->name = “aninggo”;
就会输出:
对 name 附值 aninggo
5,__call() 当试图调用一个对象并不存在的方法时,调用该方法。
class Test
{
public function __call($Key, $Args)
{
echo “您要调用的 {$Key} 方法不存在。你传入的参数是:” . print_r($Args, true);
}
}
$t [...]

2009.01.15  来自:51CTO
这里的大型网站架构只包括高互动性高交互性的数据型大型网站,基于大家众所周知的原因,我们就不谈新闻类和一些依 靠HTML静态化就可以实现的架构了,我们以高负载高数据交换高数据流动性的网站为例,比如海内,开心网等类似的web2.0系列架构。这个时候,就需要 一个好的数据并发处理策略以及缓存策略。5、数据索引的问题。们这里不讨论是PHP还是JSP或者.NET环境,我们从架构的方面去看问题,实现语言方面 并不是问题,语言的优势在于实现而不是好坏,不论你选择任何语言,架构都是必须要面对的。

这 里的大型网站架构只包括高互动性高交互性的数据型大型网站,基于大家众所周知的原因,我们就不谈新闻类和一些依靠HTML静态化就可以实现的架构了,我们 以高负载高数据交换高数据流动性的网站为例,比如海内,开心网等类似的web2.0系列架构。我们这里不讨论是PHP还是JSP或者.NET环境,我们从 架构的方面去看问题,实现语言方面并不是问题,语言的优势在于实现而不是好坏,不论你选择任何语言,架构都是必须要面对的。
这里讨论一下大型网站需要注意和考虑的问题
1、海量数据的处理
众所周知,对于一些相对小的站点来说,数据量并不是很大,select和update就可以解决我们面对的问题,本身负载量不是很大,最多再加几个 索引就可以搞定。对于大型网站,每天的数据量可能就上百万,如果一个设计不好的多对多关系,在前期是没有任何问题的,但是随着用户的增长,数据量会是几何 级的增长的。在这个时候我们对于一个表的select和update的时候(还不说多表联合查询)的成本的非常高的。
2、数据并发的处理
在一些时候,2.0的CTO都有个尚方宝剑,就是缓存。对于缓存,在高并发高处理的时候也是个大问题。在整个应用程序下,缓存是全局共享的,然而在 我们进行修改的时候就,如果两个或者多个请求同时对缓存有更新的要求的情况下,应用程序会直接的死掉。这个时候,就需要一个好的数据并发处理策略以及缓存 策略。
另外,就是数据库的死锁问题,也许平时我们感觉不到,死锁在高并发的情况下的出现的概率是非常高的,磁盘缓存就是一个大问题。
3、文件存贮的问题
对于一些支持文件上传的2.0的站点,在庆幸硬盘容量越来越大的时候我们更多的应该考虑的是文件应该如何被存储并且被有效的索引。常见的方案是对文 件按照日期和类型进行存贮。但是当文件量是海量的数据的情况下,如果一块硬盘存贮了500个G的琐碎文件,那么维护的时候和使用的时候磁盘的Io就是一个 巨大的问题,哪怕你的带宽足够,但是你的磁盘也未必响应过来。如果这个时候还涉及上传,磁盘很容易就over了。
也许用raid和专用存贮服务器能解决眼下的问题,但是还有个问题就是各地的访问问题,也许我们的服务器在北京,可能在云南或者新疆的访问速度如何解决?如果做分布式,那么我们的文件索引以及架构该如何规划。
所以我们不得不承认,文件存贮是个很不容易的问题
4、数据关系的处理
我们可以很容易的规划出一个符合第三范式的数据库,里面布满了多对多关系,还能用GUID来替换INDENTIFY COLUMN 但是,多对多关系充斥的2.0时代,第三范式是第一个应该被抛弃的。必须有效的把多表联合查询降到最低。
5、数据索引的问题
众所周知,索引是提高数据库效率查询的最方面最廉价最容易实现的方案。但是,在高UPDATE的情况下,update和delete付出的成本会高的无法想想,笔者遇到过一个情况,在更新一个聚焦索引的时候需要10分钟来完成,那么对于站点来说,这些基本上是不可忍受的。
索引和更新是一对天生的冤家,问题A,D,E这些是我们在做架构的时候不得不考虑的问题,并且也可能是花费时间最多的问题,
6、分布式处理
对于2.0网站由于其高互动性,CDN实现的效果基本上为0,内容是实时更新的,我们常规的处理。为了保证各地的访问速度,我们就需要面对一个绝大的问题,就是如何有效的实现数据同步和更新,实现各地服务器的实时通讯有是一个不得不需要考虑的问题。
7、Ajax的利弊分析
成也AJAX,败也AJAX,AJAX成为了主流趋势,突然发现基于XMLHTTP的post和get是如此的容易。客户端get或者post 到服务器数据,服务器接到数据请求之后返回来,这是一个很正常的AJAX请求。但是在AJAX处理的时候,如果我们使用一个抓包工具的话,对数据返回和处 理是一目了然。对于一些计算量大的AJAX请求的话,我们可以构造一个发包机,很容易就可以把一个webserver干掉。
8、数据安全性的分析
对于HTTP协议来说,数据包都是明文传输的,也许我们可以说我们可以用加密啊,但是对于G问题来说的话,加密的过程就可能是明文了(比如我们知道 的QQ,可以很容易的判断他的加密,并有效的写一个跟他一样的加密和解密方法出来的)。当你站点流量不是很大的时候没有人会在乎你,但是当你流量上来之 后,那么所谓的外挂,所谓的群发就会接踵而来(从qq一开始的群发可见端倪)。也许我们可以很的意的说,我们可以采用更高级别的判断甚至HTTPS来实 现,注意,当你做这些处理的时候付出的将是海量的database,io以及CPU的成本。对于一些群发,基本上是不可能的。笔者已经可以实现对于百度空 间和qq空间的群发了。大家愿意试试,实际上并不是很难。
9、数据同步和集群的处理的问题
当我们的一台databaseserver不堪重负的时候,这个时候我们就需要做基于数据库的负载和集群了。而这个时候可能是最让人困扰的的问题 了,数据基于网络传输根据数据库的设计的不同,数据延迟是很可怕的问题,也是不可避免的问题,这样的话,我们就需要通过另外的手段来保证在这延迟的几秒或 者更长的几分钟时间内,实现有效的交互。比如数据散列,分割,内容处理等等问题
10、数据共享的渠道以及OPENAPI趋势
Openapi已经成为一个不可避免的趋势,从google,facebook,myspace到海内校内,都在考虑这个问题,它可以更有效的留住 用户并激发用户的更多的兴趣以及让更多的人帮助你做最有效的开发。这个时候一个有效的数据共享平台,数据开放平台就成为必不可少的途径了,而在开放的接口 的情况保证数据的安全性和性能,又是一个我们必须要认真思考的问题了。

相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax,flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实 现的功 能。比如Google机会已经把最基本的office应用都搬到了互联网上。当然便利的同时毫无疑问的也使页面的速度越来越慢。自己是做前端开发的,在性 能方面,根据yahoo的调查,后台只占5%,而前端高达95%之多,其中有88%的东西是可以优化的。

以上是一张web2.0页面的生命周期图。工程师很形象地讲它分成了“怀孕,出生,毕业,结婚”四个阶段。如果在我们点击网页链接的时候能够意识到 这个过程而不是简单的请求-响应的话,我们便可以挖掘出很多细节上可以提升性能的东西。今天听了淘宝小马哥的一个对yahoo开发团队对web性能研究的 一个讲座,感觉收获很大,想在blog上做个分享。
相信很多人都听过优化网站性能的14条规则。更多的信息可见developer.yahoo.com

1. 尽可能的减少 HTTP 的请求数
[content]

2. 使用 CDN(Content Delivery Network)
[server]

3. 添加 Expires 头(或者 Cache-control )
[server]

4. Gzip 组件
[server]

5. 将 CSS 样式放在页面的上方
[css]

6. 将脚本移动到底部(包括内联的)
[javascript]

7. 避免使用 CSS 中的 Expressions
[css]

8. 将 JavaScript 和 CSS 独立成外部文件
[javascript] [css]

9. 减少 DNS 查询
[content]

10. 压缩 JavaScript 和 CSS (包括内联的)
[javascript] [css]

11. 避免重定向
[server]

12. 移除重复的脚本
[javascript]

13. 配置实体标签(ETags)
[css]

14. 使 AJAX 缓存

在firefox下有一个插件yslow,集成在firebug中,你可以用它很方便地来看看自己的网站在这几个方面的表现。

这是对用yslow对我的网站西风坊测评的结果,很遗憾,只有51分。呵呵。中国各大网站的分值都不高,刚测了一下,新浪和网易都是31分。然后yahoo(美国)的分值确实97分!可见yahoo在这方面作出的努力。从他们总结的这14条规则,已经现在又新增加的20个点来看,有很多细节我们真得是怎么都不会去想,有些做法甚至是有些“变态”了。
第一条、尽可能的减少 HTTP 的请求数 (Make Fewer HTTP Requests [...]

分类

 

9月 2010
« 4    
 12345
6789101112
13141516171819
20212223242526
27282930  

Blogroll