Skip to content


函数名字前的&,返回对函数的引用

&运算符置于函数name前,调用它返回函数的引用,而函数本身即$functionname不会在内存中消失
它和变量是一致的~

解释起来可能比较费劲,看一下这个三个有趣的小例子就明白了

//第一个:
function   &strAppOne()   {
static   $v   =   0;
$v++;
echo   $v.nl2br(“/n”);
return   $v;
}
strAppOne();
$b   =&   strAppOne();
$b   +=   10;
strAppOne();

/**输出:

*1<br />
*2<br />
*13<br />
*/

//第二个:
function   &strAppTwo()   {
static   $v   =   0;
$v++;
echo   $v.nl2br(“/n”);
return   $v;
}
strAppTwo();
$b   =   strAppTwo();
$b   +=   10;
strAppTwo();

/**输出:

*1<br />
*2<br />
*3<br />
*/

//第三个:
function   strAppThree()   {
static   $v   =   0;
$v++;
echo   $v.nl2br(“/n”);
return   $v;
}
strAppThree();
$b   =&   strAppThree();
$b   +=   10;
strAppThree();

/**输出:

*1<br />
*2<br />
*3<br />
*/

Posted in php.


Chrome+SSH+Myentunnel+Proxy Switchy!+gfwlist访问国外网站

鉴于特殊的网络环境,上国外网站真的很难,动不动就打不开。就连正常的使用Google查一下资料都 很困难,对一个Google迷来说,这样的生活真的很痛苦,还有各式各样的域名污染、域名劫持,运营商肆无忌惮的弹窗,想想都让人深恶痛绝。下面给大家介 绍一种方法,可以国外国内网站自动切换,也可以解决掉域名污染和劫持的问题。

首先先准备好几件工具:

Chrome:Google自产的一款浏览器

SSH账号:自己找(推荐优秀的vps:linode.东京机房的速度神速,可以通过连接http://www.linode.com查看,购买可以我的 Linode referral code: 731edd110415ee90619759785da320465d51ab27

Myentunnel:Windows下的SSH客户端

Proxy Switchy!:Chrome的一款插件

gfwlist:Firefox下的autoproxy插件的一个列表,在Chrome下同样可以用

工具都准备好了,下面我们来一步步介绍:

一、安装Chrome

二、找一个SSh的账号,童鞋们应该比我聪明

三、配置Myentunnel

 

输入你找到的SSh账号,输入SSH服务器的名称、SSH端口(默认22,有的主机端口不一样)、用户名、密码短语、重试延迟(默认10)、端口(默认 7070),然后点击连接,点击状态一栏,如果连接成功就会显示:连接已经稳定下来了,系统任务栏的下方也会显示绿色的Myentunnel 。

四、在Chrome网上应用店里搜索扩展:Proxy Switchy!,有中文版和英文版之分,好多人说中文版不稳定,不过我用的也挺稳定,就以中文版来介绍吧:

 

打开Proxy Switchy!的选项,新建一条代理规则,代理规则名称可以输入:SSH,SOCKS输入:127.0.0.1,端口输入:7070。需要注意的是,这个端口不是SSH端口。

五、这个时候已经可以通过SSH通道上网了,不过要是访问国内的网站速度会灰常的慢,频繁的切换有一点太麻烦了,下面我们来配置一下gfwlist切换规则,就可以实现自动切换了:

 

点击新规则,添加一条新规则:https://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt

模式类型选择wildcard,选择代理选择SSH。

在线规则列表里也输入以上新规则,更新时间设定在15分钟,代理选择SSH。点击保存后选择自动切换:

 

设置成功后, 如果是国外打不开的网站,会自动切换到SSH代理,如果是国内可以打开的网站,则使用的是直接连接。由于是只代理了浏览器,QQ和迅雷也不会变慢,还是走正常的通道。

Posted in internet.

Tagged with , , , , , , .


青岛全搜索(qdqss.cn) 偷窥一下

青岛全搜索,随处可见的广告,让我这个互联网人士不免要关注一下。

轰轰隆隆的打雷几个月了,看看情况确实一般般(排名还在几十万之外的个人网站级别),运营怎么怎么样不作评论。仅说说一个技术人看到的。

程序采用开源社区软件discuz打造,加上点模版的修改。

主服务器采用Windows + IIS,社区服务器采用Windows + Apache (很是业余的说,可能由于采用了php开源社区软件discuz的原因)

从技术上看应该是没有什么可说的,但是运营在报业集团的背景前景也许不错,毕竟有青岛新闻网的成功先例。

Posted in internet.


创业者是否应该自己学编程

最近常接到创业者电话,激情澎湃的陈述即将改变世界的创意,说就差一个编程的。一开始没有怎么在意,时间长了,越来越觉得这个现象值得思考。

未完待续……

Posted in other.


让能者不多得

一位读者写道:

我是一个软件工程师。对于任何一个从事于这个领域的人,这有一个众所周知而且毫无疑问的事实:最有效率最专业的程序员的产能会比最差的那个高上 1000倍。如果这个看起来不太可能,请记住,如果一个程序员写出了很多bug而需要其他程序员去修改,那他的生产率是负的。而且除非他造成的破坏性已经 产生后果,否则你很难发现问题所在。我过去曾给专业的程序员上课,即使在我的这些学生中,你也可以很容易的发现这种事实。

我没有发现哪个企业,不管在哪 — 即使在硅谷 –也没有一个企业能把对程序员的工资等级差异化到接近一个数量级的程度,更别说三个了。事实上,我们更倾向的做法是辞退或拒绝考虑任何超过35岁的人。给出的理由就是他们要求更多的钱。

在某种程度上讲这是有些道理的。如果你不能区分哪一个更好,你就该要那个便宜的。你实在是太难去评估一个程序员的效能了。

跟其他的人相比,一个好的程序员能用更精简的代码和更少的时间解决一个问题。所以你不能按代码行数和所花的时间来评估。按Bug数也不行 — 对于其他程序员,当看到有人漂亮的解决了一个问题后,都会确信自己也会这样的解决这类问题。不止一次的,当我按时的不带一点差错的做完一个任务后,我就会 被告知:因为那是个任务太简单。而同时,逾期未完的团队因为一周的通宵加班表现出来的敬业和苦干精神而受到嘉奖。完成了工作的优秀程序员也许并不知道他所 解决的问题对于其他的同事来说有多么的困难。

在一个公司里,你赢得了声誉,大家看到了你的工作。但你写的程序是商业机密,他们不可能轻易的让你把它们带走。不论你是好是差,打算雇你的人都看不到你的更详细的作品。他们可能会通过让你在白板上写几行代码的形式来筛选你,但这种事情就像是让钢琴师为观众用嘴哼出曲子。

我觉得印度外包产业所创造的一个辉煌成就就是放弃追求最好的程序员的思想。(我并没有侮辱印度软件工程师的意思 — 他们有很多人都很优秀,但单从数字上讲,我可以确信的说,如果他们能有像美国人那样多的机会,他们一定会从事其它行业。)人们知道,如果你能在印度雇到 20个普通的程序员,你的报价可以压的很低,即使他们花了20倍的努力完成任务,你的成本是一样的,软件的交付也是可预料的。相对于判断你招的那个程序员 究竟是高手还是低手来说,判断这20个程序员要多少时间完成任务还是更容易些。用20个普通的程序员,也许会用掉你两倍的时间。用一个程序员,也许只需要 一个普通团队花的时间的二十分之一,也许会是100倍。

Posted in other.


linux修改系统时间

做计划任务的时候,发现时间不对,可以通过下面的方法修改系统时间

在命令行输入:

date
显示当前时间 Wed Jul 29 11:05:11 CST 2009

date -s
按字符串方式修改时间
可以只修改日期,不修改时间,输入: date -s 2009-07-28
只修改时间,输入:date -s 15:32:00
同时修改日期时间,注意要加双引号,日期与时间之间有一空格,

输入:date -s “2009-07-28 15:32:00″

修改完后,记得输入:clock -w
把系统时间写入CMOS

Posted in linux.

Tagged with , .


mysql忘记密码

一. MySQL密码的恢复方法之一
如果忘记了MySQL的root密码,可以用以下方法重新设置:
1. KILL掉系统里的MySQL进程;
killall -TERM mysqld
2. 用以下命令启动MySQL,以不检查权限的方式启动;
safe_mysqld –skip-grant-tables &
3. 然后用空密码方式使用root用户登录 MySQL;
mysql -u root
4. 修改root用户的密码;
mysql> update mysql.user set password=PASSWORD(‘新密码’) where User=’root’;
mysql> flush privileges;
mysql> quit
重新启动MySQL,就可以使用新密码登录了。
二. MySQL密码的恢复方法二
有可能你的系统没有 safe_mysqld 程序(比如我现在用的 ubuntu操作系统, apt-get安装的mysql) , 下面方法可以恢复
1. 停止mysqld;
sudo /etc/init.d/mysql stop
(您可能有其它的方法,总之停止mysqld的运行就可以了)
2. 用以下命令启动MySQL,以不检查权限的方式启动;
mysqld –skip-grant-tables &
3. 然后用空密码方式使用root用户登录 MySQL;
mysql -u root
4. 修改root用户的密码;
mysql> update mysql.user set password=PASSWORD(‘newpassword’) where User=’root’;
mysql> flush privileges;
mysql> quit
重新启动MySQL
/etc/init.d/mysql restart
就可以使用新密码 newpassword 登录了。

Posted in msyql.

Tagged with , .


备份数据库常用命令

备份数据库

#mysqldump 数据库名 >数据库备份名

#mysqldump -A -u用户名 -p密码 数据库名>数据库备份名

#mysqldump -d -A –add-drop-table -uroot -p >xxx.sql

#mysqldump 数据库名 >数据库备份名

#mysqldump -A -u用户名 -p密码 数据库名>数据库备份名

#mysqldump -d -A –add-drop-table -uroot -p >xxx.sql

1.导出结构不导出数据

mysqldump –opt -d 数据库名 -u root -p > xxx.sql

mysqldump –opt -d 数据库名 -u root -p > xxx.sql

2.导出数据不导出结构

mysqldump -t 数据库名 -uroot -p > xxx.sql

mysqldump -t 数据库名 -uroot -p > xxx.sql

3.导出数据和表结构

mysqldump 数据库名 -uroot -p > xxx.sql

mysqldump 数据库名 -uroot -p > xxx.sql

4.导出特定表的结构

mysqldump -uroot -p -B数据库名 –table 表名 > xxx.sql

mysqldump -uroot -p -B数据库名 –table 表名 > xxx.sql

导入数据:

由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:

#mysql 数据库名 < 文件名

#source /tmp/xxx.sql

Posted in msyql.

Tagged with , , , .


使用screen,避免程序中断

简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可 以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen 中创建一个新的窗口有这样几种方式:

1.直接在命令行键入screen命令

[root@tivf06 ~]# screen

Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。

2.Screen命令后跟你要执行的程序。

[root@tivf06 ~]# screen vi test.c

Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。

3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。

screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:

[root@tivf06 ~]# screen vi /tmp/abc

之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:
暂时中断会话
暂时中断会话

半个小时之后回来了,找到该screen会话:

[root@tivf06 ~]# screen -ls
There is a screen on:
        16582.pts-1.tivf06      (Detached)
1 Socket in /tmp/screens/S-root.

重新连接会话:

[root@tivf06 ~]# screen -r 16582

看看出现什么了,太棒了,一切都在。继续干吧。

你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前 screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫 做键绑定(key binding),C-a叫做命令字符(command character)。

可以通过C-a ?来查看所有的键绑定,常用的键绑定有:

C-a ? 显示所有键绑定信息
C-a w 显示所有窗口列表
C-a C-a 切换到之前显示的窗口
C-a c 创建一个新的运行shell的窗口并切换到该窗口
C-a n 切换到下一个窗口
C-a p 切换到前一个窗口(与C-a n相对)
C-a 0..9 切换到窗口0..9
C-a a 发送 C-a到当前窗口
C-a d 暂时断开screen会话
C-a k 杀掉当前窗口
C-a [ 进入拷贝/回滚模式

Screen常用选项

使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:
Screen 常用选项
Screen 常用选项

因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:

-exy x为命令字符,y为转义命令字符的字符

下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。

[root@tivf18 root]# screen -e^tt

自定义命令字符和转义字符
自定义命令字符和转义字符

其他常用的命令选项有:

-c file 使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
-h num 指定历史回滚缓冲区大小为num行
-list|-ls 列出现有screen会话,格式为pid.tty.host
-d -m 启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname 创建screen会话时为会话指定一个名字
-v 显示screen版本信息
-wipe [match] 同-list,但删掉那些无法连接的会话

下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r <screen_pid>重新连接上:

[root@tivf18 root]# screen –ls
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Detached)
2 Sockets in /root/.screen.

[root@tivf18 root]# screen –r 8736

如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

[root@tivf18 root]# kill -9 8462
[root@tivf18 root]# screen -ls
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /root/.screen.

[root@tivf18 root]# screen -wipe
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Removed)
1 socket wiped out.
1 Socket in /root/.screen.

[root@tivf18 root]# screen -ls
There is a screen on:
        8736.pts-1.tivf18       (Detached)
1 Socket in /root/.screen.

[root@tivf18 root]#

-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname

启动一个初始状态断开的screen会话:

[root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test

连接该会话:

[root@tivf06 tianq]# screen -r mygdb

管理你的远程会话

先来看看如何使用screen解决SIGHUP问题,比如现在我们要ftp传输一个大文件。如果按老的办法,SSH登录到 系统,直接ftp命令开始传输,之后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开SSH连接 了。让我们使用screen来试试。

SSH登录到系统,在命令行键入screen。

[root@tivf18 root]# screen

在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?OK,在窗口中键入C-a d:
管理你的远程会话
管理你的远程会话

然后。。退出SSH登录?随你怎样,只要别杀掉screen会话。

是不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次 登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗 口,退出的时候C-a d“保存”你的工作,下次登录后直接screen -r <screen_pid>就可以了。

最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:
putty
putty

使用telnet:
telnet
telnet

更多Screen功能

Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME /.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。 如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文 件内容请参考screen的man页。

Posted in linux.

Tagged with , .


apache开启gzip压缩页面输出

首先查看你的httpd.conf中是否有这行代码:
LoadModule deflate_module modules/mod_deflate.so

如果没有,请添加mod_deflate模块,/usr/local/apache/bin/apxs -i -a -c /usr/src/apache2/modules/filters/mod_deflate.c
其中:/usr/src/apache2/为Apache源码路径。
添加后自动加入这行代码
LoadModule deflate_module modules/mod_deflate.so

最后在httpd.conf中添加以下代码:
<ifmodule mod_deflate.c>
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio
#LogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate
CustomLog logs/deflate_log.log deflate
</ifmodule>

查看日志 www.bestchao.net
“GET /index.php HTTP/1.1″ 13396/43301 (69%)
压缩前的字节数为43301,压缩后的字节数为 13396,压缩比为69%

效果还是很明显的。

注:新安装Apache编译时,可以直接加上–enable-deflate

Posted in web server.

Tagged with , , .