博客首页|TW首页| 同事录|业界社区
2011-06-19

PHP 调用函数传递可变参数的方法

//方法一

//接收一系列参数,并逐一输出

function show_params () {

//获取传递参数的个数

$count = func_num_args();

//遍历参数并逐一输出

for ($i = 0; $i < $count; $i++) {

//获取参数

$param = func_get_arg($i);

echo $param . PHP_EOL;

}

}

//调用函数

show_params(1, 2, ‘apple’, 3.14);

//方法2

function show_params () {

//定义存储传递参数的数组

$params = array();

//获取全部参数

$params = func_get_args();

$count = count($params);

//遍历并逐一输出参数

for ($i = 0; $i < $count; $i++) {

echo $params[$i];

echo PHP_EOL;

}

}

//注: 方法2比方法1执行的慢一些

2011-06-18

网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务。最终成功的方法如下:

sudo apt-get install openssh-server

Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。

然后确认sshserver是否启动了:

ps -e |grep ssh

如果只有ssh-agent那ssh-server还没有启动,需要/etc/init.d/ssh start,如果看到sshd那说明ssh-server已经启动了。

ssh-server配置文件位于/ etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号,如222。然后重启SSH服务:

sudo /etc/init.d/ssh restart

2011-06-10

# uname -a # 查看内核/操作系统/CPU信息

# head -n 1 /etc/issue # 查看操作系统版本

# cat /proc/cpuinfo # 查看CPU信息

# hostname # 查看计算机名

# lspci -tv # 列出所有PCI设备

# lsusb -tv # 列出所有USB设备

# lsmod # 列出加载的内核模块

# env # 查看环境变量

资源

# free -m # 查看内存使用量和交换区使用量

# df -h # 查看各分区使用情况

# du -sh <目录名> # 查看指定目录的大小

# grep MemTotal /proc/meminfo # 查看内存总量

# grep MemFree /proc/meminfo # 查看空闲内存量

# uptime # 查看系统运行时间、用户数、负载

# cat /proc/loadavg # 查看系统负载

磁盘和分区

# mount | column -t # 查看挂接的分区状态

# fdisk -l # 查看所有分区

# swapon -s # 查看所有交换分区

# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)

# dmesg | grep IDE # 查看启动时IDE设备检测状况

网络

# ifconfig # 查看所有网络接口的属性

# iptables -L # 查看防火墙设置

# route -n # 查看路由表

# netstat -lntp # 查看所有监听端口

# netstat -antp # 查看所有已经建立的连接

# netstat -s # 查看网络统计信息

进程

# ps -ef # 查看所有进程

# top # 实时显示进程状态

用户

# w # 查看活动用户

# id <用户名> # 查看指定用户信息

# last # 查看用户登录日志

# cut -d: -f1 /etc/passwd # 查看系统所有用户

# cut -d: -f1 /etc/group # 查看系统所有组

# crontab -l # 查看当前用户的计划任务

服务

# chkconfig –list # 列出所有系统服务

# chkconfig –list | grep on # 列出所有启动的系统服务

程序

# rpm -qa # 查看所有安装的软件包

2011-06-06

1、首先需要安装SVN。Ubuntu下的SVN安装十分简单。

使用命令:sudo apt-get install subversion(或者sudo apt-get install rapidsvn)

然后根据提示一步一步,就完成了SVN的安装; 也可以通过Synaptic Package Manager来搜索安装两者。

2、检出文件(checkout)。

使用命令:svn co http://{svn repository url} /destination

然后系统会用当前的用户名登录,提示输入密码,如果第一次密码输入错误,会提示你输入用户名;

输入正确后,就可以检出文件了。

3、提交文件(commit)。

进入需要更新的目录,输入命令:

svn commit -m path-to-commit,其中path-to-commit可以为空,成功后会提示更新后的版本号。

4、更新文件(update)。

svn update,在要更新的目录运行这个命令就可以了。

5、查看日志(log)。

svn log path
几个常用命令

svn up  更新

svn st 状态

svn di 修改对比

svn log 查看日志

svn ci -m “note” 提交

svn add 增加到版本控制

svn 文件忽略

用svn st查看时,常有 ? 标记的文件,其实这些文件是不要版本控制的,每次出现会干扰视线。

可以通过svn的配置文件: /etc/subversion/config

配置全局忽略: global-ignores

对个别目录和文件的忽略:
如果想对public/photos目录设置为ignores ,要对public目录进行设置: svn pe svn:ignore public

进入编辑器输入photos 保存就可以了。多个文件分隔用换行

2011-05-31

vim编辑器终结版-原创
vim的三种工作模式
命令模式:用于对文章内容的操作,如复制、粘贴、删除、光标定位等。
编辑模式:用于编写文件。
末行模式:用于保存文件、读写文件、复制、粘贴、光标定位、vim参数设置等。
各个模式之间的切换
命令模式–>编辑模式:输入i/I,a/A,o/O
编辑模式–>命令模式:直接按esc键返回
命令模式–>末行模式:输入“:”,“/”,“?”
末行模式–>命令模式:直接按esc键返回
编辑模式–>末行模式:没有直接进入命令,需通过命令模式中转。
末行模式–>编辑模式:没有直接进入命令,需通过命令模式中转。
复制:
yy:复制光标所在的行
nyy:复制从光标所在行算起的n行,5yy
:1,5 co 10  将1到5行的所有内容,复制到第10行。
删除
dd:删除光标所在的行
ndd:nyy一样。
dG:删除从当前光标起到文件的末尾的所有内容。
d0:删除从光标所在处开始到本行的行首的所有内容。
d$:删除从光标所在处开始到本行的行尾的所有内容。
x/X:向后删除一个字符/向前删除一个字符。
delete键:向后删除一个字符。
dw,d3w,d10w:删除一个字/向后删除3个字/向后删除10个字。
:1,5 d:删除第1行到第5行的所有内容。
移动/剪切
先删除,再粘贴。(dd)–>p/P
:1,5 mo 10  将第1行到第5行的所有内容,移到第10行的下一行。
粘贴
p:粘贴到光标所在行的下一行。
P:粘贴到光标所在行的上一行。
撤消
u:撤消上一次的操作,或上上次的操作,直到还原为初始状态。
替换
r/R
:1,10s /old/new/  在第1行到第10行这个范围内进行替换,只替换每一行的第一个old。
:1,10s /old/new/g  在第1行到第10行这个范围内进行全部替换。
:%s /old/new/g    进行全文替换。
:%s #old#new#g    进行全文替换。分隔符可以是/ # ,
:%s ,old,new,g    进行全文替换。
:%s /^/#/g
:%s /$/#/g
:%s #\\#\/#g      将\替换成/
:%s /#/$/g
保存
:w    :1,12w /root/filename  另存为
:wq   :wq!                   保存退出
:x                           保存退出
ZZ                           保存退出
退出
:q:不修改退出。
:q!:强制退出,但不保存。
读文件
:r ~/filename    读一个文件
:r !ls -l        将ls -l命令查果,读到文件中。
:19 r aa.txt    将aa.txt文件,读到19行的下面
执行shell命令
:! ls -l        执行shell命令。
打开某个文件
:e /etc/filename  打个/etc/filename文件。
查找
/char   ?char    /从上往下,?从下往上。
n/N   继续查找。
vim的配置
:set nu    设置行号,把行号打开。
:set nonu  关闭行号。
:set noh   关闭高亮度显示。
配置vim的文件
~/.vimrc
/etc/vim/vimrc

在vim里,末行命令分由地址段+命令+参数或选项或地址组成。

首先要了解两个时间定义

UTC—-全球标准时间指的是由世界时间标准设定的时间。原先也被称为格林威治标准时间或者 GMT
CST—-CMOS时间,即本机的时间!

因为刚安装系统是使用UTC时间,所以安装系统后,需要设置回上海时区!操作需要root权限!
#date YYMMDDHHMM   (年月日时分)                           设定当地时间
date 0901221020 2009年1月22日10点20分
#cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 指定时区
#adjkerntz -a                                         调节COMS时间
#date

PS:
adjkerntz 命令 adjkerntz = adjust kernal timezone
调节改变CMOS时间来反映出时区的改变及让kernel维持着当前的时区
-a 当时区改变时,这个形态被用来更新 CMOS 当地时间

安装VIM有两个方法
一个是运行下面命令
# pkg_add -r -v vim-lite

另一个是使用FreeBSD Ports System
# cd /usr/ports/editors/vim-lite/
# make install clean

可选择性
运行命令 让vi等于vim
$ alias vi vim

设置vimrc 文件
cp /usr/local/share/vim/vim72/vimrc_example.vim /usr/local/share/vimrc

或者到个人的环境中
保存为 ~/.vimrc

2011-02-26

以前写过一个图片等比缩放的Js函数,缺陷是要等到所有图片都加载完毕了,才能进行等比缩放。

昨天用jQuery插件aeImageResize,发现它更有优势:每张图片加载完后,会马上进行等比缩放。

这归于图片对象Image的加载事件onload的功劳。

查看插件的源码,发现它也依赖图片对象的complete属性和onload事件,并且特别把IE6区分对待,到底IE6在图片加载对象上,与其它浏览器有什么不同呢?

看下文:

====================================================================

通过js操纵DOM很多情况下都是为了实现和当前页html元素的异步载入,我谈谈对Image对象的一些认识。

看个例子:

查看源码
打印
01
02
03
14

当包含上述代码的页面打开时并不载入“tt.jpg”,当点击按钮时候才载入。当载入完成后触发onload事件显示到页面上。如果你是第一次加载 “tt.jpg” 这张图片的话,运行正常。点击按钮加载并显示一张图片,如果重复点击会怎么样呢?
IE、Opera中,除了第一次加载 图片时候显示正常,之后再点击就没有反应了,刷新也一样。难道它们只触发一次 “onload”事件?是缓存机制?
FF、Chrom中,每点击一次加载一张该图片。

稍微修改下:

查看源码
打印
01
02
03
14

运行后发现,奇怪的事情发生了。

所有的浏览器都一致了,都是每点击一次加载一张图片。这又是什么原因?由此可以见 IE、Opera 执行过程中并不是只触发一次 onload 事件!
联想一下 Image 对象的一些属性看看,complete、readyState(IE专属值[uninitialized,complete]) (为防止缓存影响效果请更换图片名称!)

查看源码
打印
01
02
03
04
18

经过以上测试,可以看出一些不同点,对于 complete 属性来讲,IE是根据图片是否显示过来判断,就是说当加载的图片显示出来后,complete 属性的值才为 true ,否则一直是 false ,和以前是否加载过该张图片没有关系,即和缓存没有关系!但是其它浏览器表现出来的确不一样,只要以前加载过该图,浏览器有缓存,complete 就为 true ,这和IE的 readyState 属性的表现一致!

至此,可以肯定的是所有的浏览器都会缓存图片!可是上面的问题到底是什么原因导致的呢?
众所周知,从缓存里加载东西的速度是很快的,那么在

查看源码
打印
1 …
2 Img.src = isrc;
3 Img.onload = …
4 …
的过程中,难道 IE、Opera 加载的速度快到,来不及追加事件?

这回加载一张根本不存在的图片看看效果:

查看源码
打印
01
02
03
04
17

可以肯定的是所有浏览器都不触发 onload 事件。

从是否缓存或已经加载过图片的角度讲,IE、Opera表现正常,complete 始终为 false ;IE的 readyState 始终为uninitialized 。

令人疑惑的是FF,其中 Imgttmt.complete 的值一直是 true ;

更令人困惑的是 Chrom,它是在最初 new Imgttmt() 的时候 Imgttmt.complete 值为 false。而之后 Imgttmt.complete 值就一直为 true 了!

如果换一张从来没有加载过的图片,FF和Chrom 的行为就一致了,都是一开始加载时, Imgttmt.complete 值为false, 之后为 true!

测试的过程中还发现,脚本的执行顺序的确会影响到类似于 onload 等事件的追加,如果在其显示后在追加事件就没有什么实际意义了!

基于 javascript 这种解释性语言的特性,在追加事件的时候一定要注意把事件追加在触发该事件的句柄之前。

2011-02-22

在JavaScript的世界里,定义函数的方法多种多样,这正是JavaScript灵活性的体现,但是正是这个原因让初学者摸不着头脑,尤其对于没有语言基础的同学。正所谓条条大道通罗马,但是如果道路太多,会让行路者不知所措,因为不知道走那条路才是正途,呵呵,废话一大篇,闲言少叙,先看代码:

查看源码
打印
01 /*第一种方法,使用function语句,格式如下*/
02 function fn(){
03   alert(”这是使用function语句进行函数定义”);
04 }
05 fn();
06
07 /*第二种方法,使用Function()构造函数克隆函数*/
08 var F = new Function(”a”,”b”,”alert(a+b)”);
09 F(a,b);
10
11 其实相当于如下代码:
12 function F(a,b){
13   alert(a+b);
14 }
15
16 /*第三种方法,使用函数直接量*/
17 var zhenn = function(){
18   alert(”zhenn”);
19 }
20 zhenn();

其中用“function语句”和使用“函数直接量”来定义函数的方法似乎比较常见,也比较好理解,在此不多说。针对使用Function()构造函数克隆函数,一般很少用,因为一个函数通常有多条语句组成,如果将他们以字符串的形式作为参数传递,难免会使得代码的可读性很差。

在这里再顺便提一下构造函数吧,其实从字面上理解,构造函数似乎也是函数,其实它并不是函数,而只是一种函数模型。举个不恰当的例子,构造函数相当于一部刚组装好的车子,无论远看还是近看,它都是一部车子,但是还没有加油(代表在使用前的一个必要步骤),所以它并不能启动。如果想要这部车子正常行驶,就必须给它加上油,其实这个过程就等同于构造函数的实例化,否则它并不能正常运行!看下面这个例子:

查看源码
打印
1 function Fn(){ //定义构造函数  
2   this.elem =”这里是使用function()构造函数定义函数,呵呵”;  
3   this.fn = function(){    
4     alert(”这是使用function()构造函数定义函数,嘿嘿”);  
5   }
6 }
7 var f = new Fn(); //实例化
8 alert(f.elem);
9 f.fn();

2011-02-21

this是Javascript语言的一个关键字。

它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,

  function test(){

    this.x = 1;

  }

随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。

下面分四种情况,详细讨论this的用法。

情况一:纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。

请看下面这段代码,它的运行结果是1。

  function test(){

    this.x = 1;

    alert(this.x);

  }

  test(); // 1

为了证明this就是全局对象,我对代码做一些改变:

  var x = 1;

  function test(){

    alert(this.x);

  }

  test(); // 1

运行结果还是1。再变一下:

  var x = 1;

  function test(){

    this.x = 0;

  }

  test();

  alert(x); //0

情况二:作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this就指这个上级对象。

  function test(){

    alert(this.x);

  }

  var o = {};

  o.x = 1;

  o.m = test;

  o.m(); // 1

情况三 作为构造函数调用

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

  function test(){

    this.x = 1;

  }

  var o = new test();

  alert(o.x); // 1

运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:

  var x = 2;

  function test(){

    this.x = 1;

  }

  var o = new test();

  alert(x); //2

运行结果为2,表明全局变量x的值根本没变。

情况四 apply调用

apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。

  var x = 0;

  function test(){

    alert(this.x);

  }

  var o={};

  o.x = 1;

  o.m = test;

  o.m.apply(); //0

apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。

如果把最后一行代码修改为

  o.m.apply(o); //1

运行结果就变成了1,证明了这时this代表的是对象o。