flex与air的区别

关于字节码

关于字节码的的概念,由来已久,只是一直没有仔细研究过;现在很多语言都在使用字节码的概念,如java 、.NET 、PHP 等等;
-====================
PHP程序执行的过程为:
源代码解析=》编译为字节码=》编译为机器语言(算是CPU指令吗?)=》执行

通过PHP加速器,使得字节码可以被缓存,这样,还是每次都要将字节码编译为机器语言,如果能缓存机器语言该多好,这样PHP就可以达到和c/c++一样的执行速度了,为什么不可以呢?.net好像是这么做的,java是怎么做的呢?

带着这写疑问阅读了下面资料:


1. 深入Java编程——Java的字节代码:
http://blog.csdn.net/wencool/archive/2009/03/20/4007922.aspx
(了解了一个java字节码分析工具javap

2. Java Bytecode-to-.NET MSIL Translator for Construction of Platform Independent Information Systems

http://www.springerlink.com/content/e35k821hjf8k1t6q/
(感觉不太好实现,也不知道是否真的已经实现了)

几个问题:
1. 为什么SUN官方没有给出java字节码的反编译工具
2.

测试驱动开发

测试驱动开发(Test Driven Development,英文缩写TDD)是极限编程的一个重要组成部分,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某 个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完成全部功能的 开发。代码整洁可用(clean code that works)是测试驱动开发所追求的目标。

使用PHP调用Httpwatch.controller 来分析httpwatch的log文件

httpwatch 的帮助文档中有关于使用javascript和ruby 、c#来分析httpwatch的log文件的例子,但是还没有PHP的;最开始我使用javascript来写了一点,但是在解析 Request.Stream 和Response.Stream时遇到了问题,不知道该怎么解,因为Stream是字节数组的形式出现的,怎么才能变成字符串呢?尤其是当 Response是gzip压缩过的,用javascript就更不好分析了,于是就想到了PHP。下面是PHP的一个小例子:

—— httpwatch.log.php ———–
<?php
$ct 
= new COM("HttpWatch.Controller");
$log $ct->OpenLog($argv[1]);
echo  
"The log file contains " $log->Entries->Count " entries\n";
$entries $log->Entries;
$cnt $log->Entries->Count;
for (
$i $i $cnt$i++) {
    
$entry $entries->item($i);  // item is a method , not a array
    
echo $entry->ClientIp .":" $entry->ClientPort"n";
    echo 
"=========== Request Stream =============n";
    echo 
decode($entry->Request->Stream);
    echo 
"\n";
    echo 
"\n";
    echo 
$entry->ServerIp .":"$entry->ServerPort ."n";
    echo 
"=========== Response Stream =============n";
    
$arrResponse getResponse($entry);
    echo 
$arrResponse["header"];
    echo 
"\n\n";
    echo 
$arrResponse["content"];
    echo 
"\n";
    echo 
"\n";
    echo 
"\n";
}

function getResponse($entry) {
    
$stream decode($entry->Response->Stream);
    
$pos strpos($stream"\r\n\r\n");
    
$header substr($stream0$pos);
    
$content substr($stream$pos 4);
    
$arrHeaders getHeader($entry"Response");
    if (
$arrHeaders["Transfer-Encoding"] == "chunked") {
        
$content getChunkedContent($content);
    }
    if (
$arrHeaders["Content-Encoding"] == "gzip") {
        
$content gzuncompress($content); 
// 目前这里是有问题的,不知道为什么
    }
    return array(
"header"=>$header"content"=>$content);
}

function getChunkedContent($content) {
    
$start 0;
    
$result "";
    while(
1) {
        
$pos strpos($content"\r\n"$start);
        
$size hexdec(substr($content$start$pos $start));
        if (
$size == 0) break;
        
$result .= substr($content$pos 2$size);
        
$start $pos $size 2;
    }
    return 
$result;
}
function 
getHeader($entry$type) {
    
$cnt $entry->$type->Headers->Count;
    for (
$i 0$i $cnt$i++) {
        
$header $entry->$type->Headers->item($i);
        
$arrResult[$header->Name] = $header->Value;
    }
    return 
$arrResult;
}
function 
decode($stream) {
    
$cnt count($stream); // 非常注意: 这里用strlen是不行的
    
for( $i $i $cnt $i ++) {
        
$result .= chr($stream[$i]);
    }
    return 
$result;
}

?>

运行: php httpwatch.log.php a.hwl

关于对浏览器兼容性的一点点理解

原来对浏览器兼容性的理解主要是:

1. 要对浏览器兼容性做判断
2. 不是所有浏览器都支持的东西尽量不要用

今天看了QQ空间的一点代码,有所启发:
1. 要善于利用浏览器的一些特性;比如,现在的主流浏览器是IE和FF,IE中有很多功能是FF中所没有的,如果用js来实现这些功能可能是很大一段的js;按照原来的想法就是不去使用IE的那个功能,统一使用js来实现,这样自然没有兼容性问题。但是今天的想法却是: 在IE中就是用IE提供的功能,只有在FF中才通过js来实现; 这样做的好处就是,对于大部分的用户不需要下载那一大段的js了,对用户和服务器都是有好处的。有些功能是FF中有的,IE中没有,我们也可以这么来做。

2. 下面给出一段QQ空间的代码:http://b.cnc.qzone.qq.com/proxy.html

<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><SCRIPT>
document.domain = "qq.com";var b=false;
if (window.execScript)try{execScript("b=Asc(‘啊’)=-20319","vbscript");
}catch(e){status = "系统vbscript引擎可能已经被损坏或者反注册。尝试运行 regsvr32 vbscript.dll 命令有可能解决此问题";
}
if(!b){
document.write("<script language=’javascript’ src=’http://imgcache.qq.com/qzone/client/js/gbk.js’><\/script>");
}else{
document.write("<script language=’vbscript’ src=’http://imgcache.qq.com/qzone/proxy.vbs’><\/script>");
String.prototype.GBEncode=function(){return URLEncoding(this)}
}
</SCRIPT><script src="http://imgcache.qq.com/qzone/proxy.js"></SCRIPT><script>
if (typeof proxyLoaded=="undefined"){
document.createElement("SCRIPT").src="http://imgcache.qq.com/qzone/proxy.js?"+Math.random();
alert("proxy脚本无法正常下载,可能与您当地的网络状况有关系。\n请您关闭浏览器,重新打开空间进行尝试。");
}
</script>
</head></html>

怎样在Apache2下开启gzip压缩

原来听说使用script标签动态加载js时,加载源不能做gzip压缩,今天测试了一下,没这回事儿,不管ff和ie都没有这回事儿。
顺便了解了一下怎样在Apache2下开启gzip压缩。

        

  1. # 加载deflate模块
  2.     

  3. LoadModule deflate_module modules/mod_deflate.so
  4.     

  5. # 设置压缩频率,取值范围在 1(最低压缩率) 到 9(最高压缩率)之间
  6.     

  7. # 不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源
  8.     

  9. DeflateCompressionLevel 3
  10.     

  11. # Compress everything except images
  12.     

  13. <Location />
  14.     

  15. # 插入过滤器
  16.     

  17. SetOutputFilter DEFLATE
  18.     

  19.  
  20.     

  21. # Netscape 4.x 有一些问题…
  22.     

  23. BrowserMatch ^Mozilla/4 gzip-only-text/html
  24.     

  25. # Netscape 4.06-4.08 有更多的问题
  26.     

  27. BrowserMatch ^Mozilla/4\.0[678] no-gzip
  28.     

  29. # MSIE 会伪装成 Netscape ,但是事实上它没有问题
  30.     

  31. BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  32.     

  33. # 不压缩图片
  34.     

  35. SetEnvIfNoCase Request_URI \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
  36.     

  37. </Location>

利用httpwatch做web自动化测试和分析

httpwatch 是个不错的东西,它是web开发者的一把利器;另一把利器就是Firebug 。
关于httpwatch自动化测试和分析的例子详见httpwatch的帮助文档之:
Automating HttpWatch

另外, 如果你有visual studio的话,可以在对象浏览器中选择“编辑自定义组件集”,添加httpwatch的com组件,这样查看httpwatch的api更加方便一些。非常推荐的哦

svn 命令行实例

关于命令行svn的学习:

检出: 需要 url 用户名 密码  
注意url中的地址不能写根目录,checkout使用的http header里的方法也是很特殊的
D:\svn_test\test2>svn checkout "https://localhost:8443/svn/test2/" –username svnuser –password lijunjie ./

更新

svn update

添加
svn add

删除
svn delete

提交
svn commit -m “提交的注释”

使用vim编辑注释
svn commit –editor-cmd vim

比较
svn diff
和上一个版本比较
svn diff -r PREV

关于svnserve服务器的配置,参考svn-book.pdf

1. 安装 (略)
2. 配置/etc/svnserve.conf
    #content , detail reference svn-book.pdf
    [general]
    password-db = /etc/svnserve.pass
    realm = example realm

    # annonymous users can only read the repository
    anon-access = read

    # authenticated users can both read and write
    aut-access = write

3. 配置权限文件 /etc/svnserve.pass
    [users]
    junjie = junjie

4. 创建版本库
    svnadmin create /var/svnroot/test1

5. 启动
    svnserve -d -r /var/svnroot/ –config-file /etc/svnserve.conf

6. checkout
    svn checkout "svn://phpor.net/test1"
    svn checkout –non-interactive –username lijunji –password xxxx "https://phpor.net/" ./

7. 比较
    svn diff -r 4974:17599 getst.php

8. 移动
    svn move –force a b\
9. 提交
    svn commit -m "comment for move "
10. merge
如: branches\branche1  是 trunk的一个分支,当truck有修改后,假设从版本11升到版本12,要想将版本11到版本12的修改在branche1里也
体现出来,则可以使用merge命令,即:
    svn merge -r 11:12 trunk branches\branche1
    这时branche1里面的文件也做了相应的修改,只是我们还需要人工确认一次,确认修改的没有问题后,再提交一次
    svn commit -m "merge from trunk"
    这时,相应的修改在分支里面体现为版本13,就是说分支里永远找不到版本12的修改
   
    merge 的实质是diff and apply

11. 查看log
svn log –limit 3  -v

–limit n  查看最近n条更新
-v  显示修改的详细信息
-r  指定要查看的版本号,也可以指定日期

svn log -r{2009-05-10}:{2009-06-10}  -v

在服务器上使用svn命令时总出现乱码,处理办法,使用icovn做转码:
svn log -r 4472 |iconv –from utf-8 –to gb2312

PHP 模块编写需要注意的一个问题—- php模块及函数名都定义成小写吧

   这是一个困扰我很长时间的问题,曾经由于没有思路,一直搁置没有去追究,现在要对该模块做一些修改,就想顺便把这个问题给查明白了,事情是这样的…

我们写了一个PHP模块String2Hash,其实里面只有一个函数叫: String2Hash() ,只是要将一个字符串hash成一个整数,由于PHP中的整型都是有符号的,该算法涉及移位,求和,求模,等操作,用PHP实现比较麻烦,就用C写了一个PHP的模块。
编译完之后,执行:
php –re String2Hash
就报错如下:
PHP Warning:  Internal error: Cannot find extension function String2
Hash in global function table in Unknown on line 0

虽然有警告,但是该模块时可以正常加载和使用的; 一般来讲,程序员只关心error,不关心Warning的,但是我就想知道个究竟。

第一步: 先做一个helloworld模块,这个完全是生成的,只有很少的修改,结果是没有报错的。
第二步: 将自己的函数添加进去,开始报错。
第三步: 将自己的函数重命名为myhash, 编译不再报错。问题基本出现在函数名上了。可能是大小写的问题吧?突然想到报错提示,可能是
global function table这个数组的key是区分大小写的?
第四步: 将String2Hash 重命名为string2hash, 为了保险,将所有出现的地方都改成小写吧,反正PHP函数是不区分大小写的,改成小写也无妨。 编译不再报错,测试通过,问题解决

have fun!!!