1 |
<font size="3" face="Courier New">1. AIR是独立的桌面应用,Flex是借助浏览器这个宿主的。相比浏览器应用程序,AIR基本没有什么安全限制。<br /></font><font size="3" face="Courier New">AIR可以操作本地文件系统,而FLASH程序只能访问,不能写本地数据。实现方式都是AS。</font><br /><br /><font size="3" face="Courier New">2. </font><font size="3" face="Courier New">站在开发者的角度说 air就是比flex多了那么几个类,都可以用FlexBuilder 开发<br /><br />3. </font><font size="3" face="Courier New">AIR(Adobe Integrated Runtime) 是一个运行时环境,需要安装;<br />另外AIR提供了SDK,包括苹果的,windows的,linux的<br /><br />4. 你可以使用Dreamweaver、Flash CS4、 Flex来写AIR,官方都有相关插件; <br /> 官方介绍: http://www.adobe.com/products/air/tools/<br /><br />5. air还不够成熟,暂时先不要关注air<br /></font> |
关于字节码
关于字节码的的概念,由来已久,只是一直没有仔细研究过;现在很多语言都在使用字节码的概念,如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.
用asscii画图
今天了解了一个assii画图的软件: jave5, 他不但可以将你画的图用assii字符描绘出来,还可以直接将一个图片或一段视频用asscii描绘出来。
以前总是在网上看到使用assii图组合的图形,以为他们自己的创意,感情都是用工具画出来的啊
测试驱动开发
测试驱动开发(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 = 0 ; $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($stream, 0, $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 + 2 + $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 = 0 ; $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压缩。
- # 加载deflate模块
- LoadModule deflate_module modules/mod_deflate.so
- # 设置压缩频率,取值范围在 1(最低压缩率) 到 9(最高压缩率)之间
- # 不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源
- DeflateCompressionLevel 3
- # Compress everything except images
- <Location />
- # 插入过滤器
- SetOutputFilter DEFLATE
- # Netscape 4.x 有一些问题…
- BrowserMatch ^Mozilla/4 gzip-only-text/html
- # Netscape 4.06-4.08 有更多的问题
- BrowserMatch ^Mozilla/4\.0[678] no-gzip
- # MSIE 会伪装成 Netscape ,但是事实上它没有问题
- BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
- # 不压缩图片
- SetEnvIfNoCase Request_URI \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
- </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 String2Hash in global function table in Unknown on line 0
虽然有警告,但是该模块时可以正常加载和使用的; 一般来讲,程序员只关心error,不关心Warning的,但是我就想知道个究竟。
第一步: 先做一个helloworld模块,这个完全是生成的,只有很少的修改,结果是没有报错的。
第二步: 将自己的函数添加进去,开始报错。
第三步: 将自己的函数重命名为myhash, 编译不再报错。问题基本出现在函数名上了。可能是大小写的问题吧?突然想到报错提示,可能是global function table这个数组的key是区分大小写的?
第四步: 将String2Hash 重命名为string2hash, 为了保险,将所有出现的地方都改成小写吧,反正PHP函数是不区分大小写的,改成小写也无妨。 编译不再报错,测试通过,问题解决
have fun!!!