1、include和require区别

当要包含的文件不存在时,include产生一个警告(Warning),该语句后面的程序会继续执行;而 require则导致一个致命错误(Fatal error),程序就此终止。

2、路径问题(适用于include和require)

+c.php
+folder1
+----a.php
+----folder2
+--------b.php

a.php
    include 'folder2/b.php';
b.php
    include 'c.php';

执行a.php过程

  1. 包含"b.php",并执行"b.php"
  2. 在folder1(当前工作目录,"a.php"所在目录下)下查找"c.php",查找不到则执行下一步
  3. 在folder2(当前文件目录,"b.php"所在目录下)下查找"c.php"。

无论是"a.php",还是"b.php",若include路径中含有"../",则都在当前工作目录(folder1)的上级目录中查找

3、变量作用域

  1. 一个文件被包含时,所包含的代码继承了“include”所在行的变量范围,该行处可用的任何变量在被包含的文件中都可用。主要针对于函数中的include。
  2. 所有在包含文件中定义的函数和类都具有全局作用域,和变量不同。普通变量的变量作用于继承了“include”所在行的变量范围,例如函数中的include。

4、include_path

set_include_path(       
    get_include_path()
    . PATH_SEPARATOR . './library' 
    . PATH_SEPARATOR . './application/models'
); 

默认的include_path=".;C:\xampp\php\PEAR",使用set_include_path设置后,(不论文件的包含层级怎样)后续的所有程序都会使用该值,该函数可多次调用。

posted @ 2011-12-29 10:14 Rain Man 阅读(50) 评论(0) 编辑

1、基础知识

HTTP流的概念

持久HTTP流只是一种是HTTP链接保持打开状态的简单方法,这样大量的HTTP请求不需要进行打开和关闭操作就可以被一个一个地发送。

常用PHP函数

sleep(10);  //暂停 10 秒 
ob_flush();
flush();    

PHP向浏览器周期性发送数据的功能,并不是所有服务器都可行,更多相关信息请参阅www.php.net/flush。关于flush的内容,请参考深入理解ob_flush和flush的区别

<script>标签的执行时间

在绝大多数浏览器中,当还没有读取到</script>结束标签时,代码是不会执行的。

配置脚本最大执行时间

在Comet执行时,经常超过了php脚本的最大执行时间,因此需要配置maxexecutiontime(详细参考:PHP - PHP.ini配置中文解释),并结合心跳机制。

var iTimer;
function heartbeat() {
    clearTimeout(iTimer);
    iTimer = setTimeout(function(){
        // 执行一次Comet
        // 300为服务器端配置的max_execution_time
    }, 300);    
}

2、Comet的实现方法

IE浏览器

demo.html

<script type="text/javascript">
    var oPage = new ActiveXObject("htmlfile");
    oPage.open();
    oPage.write("<html><body></body></html>");
    oPage.close();
    oPage.body.innerHTML = '<iframe src="connection.php"></iframe>';        
    oPage.parentWindow._parent = self;

    function heartbeat() {}
    function modifiedAt() {}
</script>
  • oPage.parentWindow访问的是HTMLFile对象的window属性
  • connection.php中JS使用top或parent访问的不是demo.html的window属性
  • connection.php中JS使用top或parent访问HTMLFile对象的window属性

connection.php

<html>
<head></head>
<body>
<script type="text/javascript">
    parent._parent.heartbeat();
    parent._parent.modifiedAt();
</script>
</body>
</html>

其他浏览器

demo.html

var oXHR = new XMLHttpRequest();
oXHR.open('get', 'connection.php', true);
oXHR.readystatechange = function() {
    switch (oXHR.readyState) {
        case 3:
            alert(oXHR.responseText);
            break;
        case 4:
            alert('done');
    }
};
  • 每次从服务器收到数据时(即服务器端调用“ob_flush(); flush();”时),都会触发readyStatechange事件。
  • readyState等于3时,oXHR.responseText返回的内容,不是本次变化新增的内容,而是之前接受到的内容+本次变化新增的内容。

3、LiveConnect的HTTP流

LiveConnect是Firefox、Safari和Opera支持的一种未充分利用的技术,通过它可以再JavaScript种使用Java对象,但客户机必须安装JRE,并且浏览器必须启用Java。

4、服务器端发送的Dom事件

示例

demo.html

<body>
    <event-source id="iBox" src="connection.php" />
    <script type="text/javascript">
        var iBox = document.getElementById('iBox');
        iBox.addEventListener('modified', function(oEvent){
            console.log(oEvent);
        });
    </script>
</body>

connection.php

<?php
    header("Content-type:application/x-dom-event-stream");
    while (true) {
        echo 'Event: modified';
        echo 'data: 5:23:06';       
        ob_flush();
        flush();
        sleep(1);
    }
?>
  • 使用的就是一个保持打开的链接
  • Event后面是事件名称,其余的是event对象的属性;每两个事件之间使用一个空白换行区分。
  • Target后面紧跟触发的元素,格式类似于CSS选择器。 * 疑问之处,服务器端事件处理函数会不会触发浏览器的默认事件,即想<input type="submit"/>发送click事件,会不会提交表单,还是仅调用该元素的click绑定函数?
  • 服务器端发送的Dom事件可以触发自定义事件,上例中的”modified”事件就是自定义事件。还可以触发客户端的UI事件,Dom Level 3事件规范中命名的所有事件都能够通过服务器端的Dom事件来触发。
  • 不一定要为元素绑定事件处理函数,每个事件都将自动传给目标元素,并由钙元素的事件处理函数负责处理,如下例。

返回内容

Event: click
Target: #iBox
button: 2
screenX: 0
screenY: 0
Event: click
Target: Document
data: See you later!

支持性

到2006年10月为止,Opera9.0.1是唯一支持服务器端发送的Dom事件的浏览器,经测试Opera 11.52不支持。

5、连接管理

HTTP1.1协议中规定,一个客户端最多允许同时保持两个连接(这点取决于浏览器,迅雷等下载工具也会提高这个并发的数目)。使用Comet的后果就是会占用一个连接,具体的解决办法是为Comet指定专门的子域名。

Comet也会增加服务器的并发数目,所以在使用Comet技术之前要与维护服务器的人员交流,确保他们理解所要实现的功能,并给与支持。

Comet技术早在2007年左右就有人提出,最早的一篇文章是What else is burried down in the depth’s of Google’s amazing JavaScript?,至今仍未大面积使用。主要原因还在于它对服务器的开销和开发模式上的改变,另一方面使用Ajax绝大多数情况下可以很好的替代Comet。

posted @ 2011-11-28 14:51 Rain Man 阅读(88) 评论(0) 编辑

线性关系

定义

两个变量之间存在一次函数关系,就称它们之间存在线性关系。 即如果可以用一个二元一次方程来表达两个变量之间关系的话,这两个变量之间的关系称为线性关系,因而,二元一次方程也称为线性方程。 推而广之,含有n个变量的一次方程,也称为n元线性方程,不过这已经与直线没有什么关系了。

扩展定义

  • 首先每一项(常数项除外)的次数必须是一次的(这是最重要的)。
    如果每项的次数不是一次就不是线性关系:x=y * z(这里假定y、z是变量而不是常数),那么x与y,或x与z就不是线性关系。
  • 线性关系的显著特征是图像为过原点的直线;而当图像为不过原点的直线时,函数称为直线关系。
    线性关系与直线关系是两不同的,经常被大家搞混淆。

百科:线性关系

相关系数

相关系数是用以反映变量之间相关关系密切程度的统计指标,但无法确切地表明两个变量之间相关的程度。

相关关系是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。由于研究对象的不同,相关系数有如下几种定义方式。

  • 如将反映两变量间线性相关关系的统计指标称为相关系数;
  • 将反映两变量间曲线相关关系的统计指标称为非线性相关系数、非线性判定系数;
  • 将反映多元线性相关关系的统计指标称为复相关系数、复判定系数等。

百科:相关系数

posted @ 2011-11-18 16:35 Rain Man 阅读(324) 评论(0) 编辑

索引

1. 第一行必须是"#!/bin/sh"

  • 它不是注释,"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在;
  • 如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本的shell.
  • 如果脚本被编写为在Kornshell ksh中运行,而默认运行shell脚本的为C shell csh,则脚本在执行过程中很可能失败。
  • 所以建议大家就把"#!/bin/sh"当成C 语言的main函数一样,写shell必须有,以使shell程序更严密。

2. 注释:一行开头为 #

3. 定义变量

定义单变量

p_name='kang'

使用单变量

echo  $p_name'.js'    # 输出kang.js
echo  $p_name.js      # 输出kang.js
cp  $p_name.js  copy.js;

4. 逻辑符号

命令1 && 命令2

如果左边的“命令1”执行成功,那么右边的“命令2”才会被执行。

命令1 || 命令2

与&&相反。如果“命令1”未执行成功,那么就执行“命令2”。

() {}

...

5. 接收参数

脚本文件“copy.sh”,其内容如下:

m=$1
n=$2
echo $m-$n

执行命令:“sh copy.sh 111 222”;输出 111-222

6. 控制流:if/then/elif/else/fi

注意"["和"]"前后的空格必须有,否则提示错误

m="kang2"
if [ "$m" == 'kang' ]; then
    echo 'kang'
elif [ $m == 'kang2' ]; then
    echo 'kang2'
else
    echo 'no'
fi

示例:判断文件夹

if [ -d './js' ]; then
 echo 'js是文件夹'
fi

7. 循环:for/do/done

注意:循环项是以“空格”拆分的字符串

name="rain man's blog"
for loop in $name; do
    echo $loop;
done

8. 格式化输出日期

curdate="`date +%Y%m%d%H%M%S`"
echo $curdate

执行结果:20110904175817

9. exist

退出当前shell脚本,一般来说,返回0表示执行成功,其他值表示没有执行成功。

exist 0    # 返回0
exist 1    # 返回1

10. 系统变量

pwd=$PWD      # 当前目录
user=$USER    # 当前用户
echo $pwd
echo $user

运行脚本后输出:

/home/rainman/test
rainman

参考文档

posted @ 2011-09-16 23:42 Rain Man 阅读(279) 评论(0) 编辑

索引

Fskey servername

保存登陆信息,下次登陆不必再输入密码

Fskey  username@192.168.0.2

scp命令

说明

用于2个 linux 主机间复制文件

格式:

scp  [可选参数]  file_source  file_target

示例

从“本次”复制到“远程”:

复制文件:scp  local_file_path  username@192.168.0.2:remote_folder_path
复制目录:scp  -r  local_file_path  username@192.168.0.2:remote_folder_path

从 “远程” 复制到 “本地”:

复制文件:scp  username@192.168.0.2:remote_folder_path  local_file_path
复制目录:scp  -r  username@192.168.0.2:remote_folder_path  local_file_path

grep 命令

grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来

示例

在文件4.txt中查找含student的行

grep  student  4.tx

在所有以d开头的文件中查找含test的行

grep 'test'  d*

在aa.js、bb.js、cc.js文件中查找含test的行

grep 'test' aa.js bb.js cc.js

从当前文件夹的所有子文件(包含子目录中的文件)中查找含test的行

grep 'test' . -r

示例:-E(开启正则查找)

查找含“template/”或“static/”的行

grep -E "template/|static/"  test.text

查找含“template/|static/”的行

grep "template/|static/"  test.text

查找含“$”的行

grep "\\$" test.text

find 命令

在指定目录下查找文件,查找的范围包含了“指定目录”的子目录。

格式

find pathname -options
    * -print: find命令将匹配的文件输出到标准输出
    * -type:
        * b - 块设备文件。
        * d - 目录。
        * c - 字符设备文件。
        * p - 管道文件。
        * l - 符号链接文件。
        * f - 普通文件。
    * -name:按照文件名查找文件。

示例

列出当前用户目录(/home/username/)下的所有文件,下面两句命令作用相同

find $HOME -print
find ~ -print

在当前目录下的所有.svn文件夹

find  .  -type  d  -name  '.svn'

在当前目录下查找文件名包含ent的文件

find . -type f -name '*ent*'

echo 命令

向屏幕上打印输出;或将内容输出到某一文件中。

示例:

打印222

echo '222';

将222“输出”到log.txt,会替换到原文件里的内容。

echo '222' >log.txt;

将222“追加”到log.txt

echo '222' >>log.txt;

清空log.txt

echo  >log.txt

逐行读取t.js的文件,追加到Log.txt中

while read line; 
do 
    echo $line >>log.txt;
done <'t.js'

xargs 命令

大多数 Linux 命令都会产生输出:文件列表、字符串列表等。
但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办?使用xargs。

示例:

在当前目录下查找“.svn”文件夹,并产出这些文件夹。“find”命令查找,然后将查找出的内容传给后面的“rm”命令

 find . -type d -name ".svn" | xargs rm -rf;

file 命令

辨识文件类型,有些类似windows中的"查看->详细信息列表"

示例

列出当前目录下所有“文件”和“文件夹”的信息

file ./*;

列出当前目录下“docs”文件夹的信息

file ./docs;

cat 命令

输出,类似于echo;但其可以对输出的内容进行加工

参数:

n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
v 或 --show-nonprinting

示例:

textfile的内容为:

aaa

bbb
ccc

把 textfile1 的档案内容加上行号后输入到 textfile2 这个档案里

cat -n textfile1 > textfile2;

textfile2的内容为:
     1  aaa
     2
     3  bbb
     4  ccc

把 textfile1 的档案内容加上行号(空白行不加)之后将内容附加到 textfile2 里。

cat -n textfile1 > textfile2;

textfile2的内容为:
     1  aaa

     2  bbb
     3  ccc

把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。

cat -b textfile1 textfile2 >> textfile3

此为清空/etc/test.txt档案内容,使用echo不能完全清空文件内容,文件仍有一个空行符。

cat /dev/null > /etc/test.txt

cat 也可以用来制作 image file。例如要制作软碟的 image file,将软碟放好后打

cat /dev/fd0 > OUTFILE

相反的,如果想把 image file 写到软碟,请打

cat IMG_FILE > /dev/fd0

/dev/null

把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.

示例

禁止标准输出,原本要输出的内容,现被写入到"/dev/null"中,从而不显示任何内容

cat filename >/dev/null;

带有编号的示例

  • 2 # 如果"$filename"不存在,将不会有任何错误信息提示
  • 3 ...
  • 还有其他的编号

禁止标准输出和标准错误的输出

cat filename 2>/dev/null >/dev/null

tar 打包

所谓打包,就是把多个文件(夹)组成一个集合。linux下只能对一个文件进行压缩,所以如果想对多个文件进行压缩的话,就必须先打包。

格式: tar -参数 压缩后的文件名 需要压缩的文件

参数

  • -c :建立一个压缩文件的参数指令(create 的意思);
  • -x :解开一个压缩文件的参数指令!
  • -t :查看 tarfile 里面的文件!
  • 特别注意,c/x/t 仅能存在一个!因为不可能同时压缩与解压缩。
  • -z :是否需要用 gzip 压缩?
  • -j :是否需要用 bzip2 压缩?
  • -v :压缩的过程中显示文件!
  • -f :使用档名,请留意,f后面紧跟归档的文件名

gzip 压缩

对打包后的文件进行压缩

示例:打包和压缩

压缩

将整个 "/etc" 目录下的文件全部打包成为 "/tmp/etc.tar"

tar  -cvf  /tmp/etc.tar  /etc;      # 仅打包,不压缩
tar  -zcvf  /tmp/etc.tar.gz  /etc;  # 打包,并以 gzip 压缩
tar  -jcvf  /tmp/etc.tar.bz2  /etc; # 打包,并以 bzip2 压缩

解压和解包

gzip -d test.tar.gz;    # 将“test.tar.gz”解压为“test.tar”  
tar  -xf  test.tar;     # 将“test.tar”的包解开

上述两步骤可以合称为:

tar -zxvf .tar.gz;    # 解开一个gizp压缩的包
tar -xvf  .tar;       # 解开一个tar包

awk 命令

awk是一种用于处理数据和生成报告的编程语言。一般的使用格式是:

awk '{pattern + action}' {filenames}

文件test.txt的内容如下,相应的分割符号为两个空格

aa2  bb3  cc4
dd  ee  ff
gg  ee  hh

执行命令:awk '{print $2}' test.txt,该命令的“pattern”部分为空,就是匹配所有行,输出结果如下

bb3
ee
ee

执行命令:awk '/e/ {print $2}' test.txt,该命令会匹配含有字符"e"的行,输出结果如下

ee
ee

综合示例

svn st | grep -E 'template/|static/' | grep -E 'M|?' | awk '{print $2}'

上述命令的功能是,筛选出当前版本库内“template”和“static”两个目录下修改的文件,并打印出这些文件,详解:

* 第一部分:显示文件和子目录的状态
* 第二部分:筛选出含template/或static/的行
* 第三部分:筛选出含M或?的行
* 第三部分:只输出文件的地址列
posted @ 2011-09-16 23:30 Rain Man 阅读(159) 评论(0) 编辑

1、PNG图片类型

PNG格式有8位、24位、32位三种,下面是一些术语:

  • 索引透明:类似于GIF,某一像素只有全透和全不透明两种效果
  • Alpha透明:半透明

PNG8

8位的PNG最多支持256(2的8次方)种颜色,8位的PNG支持索引透明和alpha透明。

PNG24

支持2的24次方种颜色,但不支持透明信息。

PNG32

32位的PNG在24位的PNG基础上增加了8位的透明信息,因此支持不同程度的半透效果。

总结

格式颜色种类位数透明支持
PNG8 2的8次方 8 不支持
PNG8+索引透明 2的8次方 8 仅支持全透或全不透明
PNG8+alpha透明 2的8次方 8 支持半透明
PNG24 2的24次方 24 不支持
PNG32 2的32次方 32 支持半透明

2、图形处理软件

Fireworks

在Fireworks中,以上提到的各种格式PNG都能正确生成,只要在OPTIMIZE面板中选择相应的格式即可。

Fireworks导出PNG

Photoshop

在Photoshop(简称PS)中,PNG格式选择可以通过选择File菜单的Save for Web & Devices实现,注意:

  • PS不支持8位PNG+alpha透明的格式;
  • PS中也没有32位PNG选项,但其中的PNG24+透明实际上就是PNG32。

Photoshop导出PNG

3、浏览器支持情况

IE6对PNG8和PNG32的半透明效果并不支持,用滤镜可解决PNG32的半透明问题,但解决不了PNG8的半透明效果。

下面我们测试一下浏览器对透明PNG的支持情况,其中IE6使用滤镜对PNG图片进行加载。其余浏览器则使用img标签。经过试验,发现非IE6浏览器表现一致,而IE6对PNG8+alpha透明支持的不够好,图像半透明部分是完全按照全透明方式进行处理的。 测试结果如下图所示:

IE6下PNG图片的兼容性测试

4、总结

  1. PNG格式有8位、24位、32位三种形式。
    • 8位PNG支持两种不同的透明形式(索引透明和alpha透明);
    • 24位PNG不支持透明;
    • 32位PNG 在24位基础上增加了8位透明通道,因此可展现256级透明程度。
  2. 图片处理工具
    • Photoshop:不支持也不能输出PNG8+alpha透明的PNG;
    • Photoshop:32位PNG输出是由24位PNG加透明信息形式输出;
    • Fireworks:对 PNG支持较好。
  3. 浏览器支持性
    • 非IE6的浏览器都能正常显示包含透明信息(包括索引透明和alpha透明)的PNG图片;
    • IE6在滤镜的帮助下能够PNG32的透明PNG图像
    • IE6下无论是否是用滤镜,半透明部分是完全按照全透明方式进行处理;
    • IE6对 PNG8+alpha透明的图像支持不够好。

参考文章

本文绝大部分是转载,转自:《说说PNG的那点事儿

posted @ 2011-09-11 12:01 Rain Man 阅读(545) 评论(0) 编辑
摘要: 表单元素拥有submit方法,同时也具有onsubmit事件句柄,用于监听表单提交。可以使用elemForm.submit();方法触发表单提交。表单元素中出现了name="submit"的元素这种情况下elemForm.submit();将不会触发表单提交,因为表单原始的submit方法将会被覆盖(formElem.submit就是对该元素的引用)。elemForm.submit();不会触发表单的onsubmit事件没有为什么,标准中就是这么规定的。与此有些类似的是onfocus、onblur和focus()、blur()之间的关系却不同,调用elem.blur()或e阅读全文
posted @ 2011-09-05 23:38 Rain Man 阅读(302) 评论(0) 编辑
摘要: 经常会使用background-position:left center,将背景图片垂直居中。浏览器渲染页面的最小单位是像素,所以某些情况下即使定义了“center”,实际效果也未必是垂直居中。例如:元素:高16px;背景图片:高13px;定义background-position:left center实际效果如下图:可以清晰的看到背景图片距上边框“2px”,距下边框“1px”。上图是在Chrome下测试结果,其它浏览器也是如此,只不过是有的距上边框“1px”,距下边框“2px”。解决方案若想实现100%垂直居中,则“元素高度 - 背景图片高度”可以被2整除,所以上例可以将元素高度设置为“1阅读全文
posted @ 2011-08-17 21:51 Rain Man 阅读(265) 评论(1) 编辑
摘要: CSS优先级包含四个级别标签内定义样式ID选择符Class选择符元素选择符CSS优先级的计算规则类型计算规则元素标签中定义的样式(Style属性)加1,0,0,0每个ID选择符(如 #id)加0,1,0,0每个Class选择符(如 .class)、每个属性选择符(如 [attribute=])、每个伪类(如 :hover)加0,0,1,0每个元素选择符(如p)或伪元素选择符(如 :firstchild)等加0,0,0,1其它选择符包括全局选择符*,不过这也是一种specificity。加0,0,0,0,相当于没加然后,将这四个数字分别累加,就得到每个CSS定义的优先级的值从左到右逐位比较大小,阅读全文
posted @ 2011-08-17 10:30 Rain Man 阅读(127) 评论(0) 编辑
摘要: 简介JsDoc Toolkit 是一款辅助工具,你只需要根据约定在 JavaScript 代码中添加相应的注释,它就可以根据这些注释来自动生成API文档。对Java 熟悉的人可能会发现它和 Java 的文档自动化工具 JavaDoc 很像,没错,JsDoc Toolkit 就是基于 JavaDoc 开发的。下载地址http://code.google.com/p/jsdoc-toolkit/目录结构app : 存放的是js文件。包括一些实例文件和读取js和模板生成文档的js文件。conf : 提供默认的配置的文件。java : 存放的是“rhino”这是一个脚本java写的javascript阅读全文
posted @ 2011-08-14 14:27 Rain Man 阅读(218) 评论(0) 编辑