月度归档:2012年03月

UNIX下的编辑器VI命令总结

文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等,其中,使用最为广泛的是vi,而vi命令繁多,论坛里好像这方面的总结不多,以下稍做总结,以资共享!渴望更正和补充!
进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename….filename :打开多个文件,依次进行编辑
移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾
屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行
删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本
搜索及替换命令
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换
选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息
最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行
寄存器操作
“?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
“?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
“?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
“?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

opencart开发架构分析[转]

1. opencart的系统架构
1.1. 架构分析
opencart是有自己的开发架构的,其架构的核心都在systemengine 下,访问控制统一用 根目录下的 index.php 来协调。
Route 就是起到一个中转器的作用,它会根据你的Route目录去找到它要执行的方法,比如:

index.php?route=account/login

根据这个route,op的框架会找到Controller下的Account里的Login.php, 注意login.php的类名一定是这种格式的

ControllerAccoutLogin{…}

否则Op就识别不了目录,route=account/login 会执行类的默认方法:index
如果要指明执行那个方法,则在login后面再加上

route=account/login/你定义的方法名

并且在login.php 里定义你要执行的方法。
同理,Op里 load 语言包和model等都是以这种机制为基础的。请结合程序,应该是比较好理解的。
至于View层,Op都是把要显示的数据加载到 this->data里去的,这样就可以用 $变量名 在页面上显示变量了。
1.2. Op系统配置文件 (这段是引用别人的。。。找不到出处了 – – 作者看到请联系我)
在Op的目录下,可以发现一个 Config.php文件,这里是配置一些OP要使用到的配置路径,并且是每个单独项目里都有一个单独的配置(这点要注意),比如admin和catalog下就分别有这个文件。
OpenCart是使用面向对象编程的,同时又使用了MVC的设计思想,因此在解读其源代码时是看不到过程式的代码的。同时它把MVC框架部分单独放在library目录中,这个部分的内容一般是不作修改的。就象你显式地使用其它框架编程一样。
Engine下有一个装配器文件:loader.php,这个文件中只有一个类:loader,实际上是一个调度程序,框架中的其它组件,如controller,module,session,cache,language统统由它装载调度。
为了让系统运行起来, 象所有的PHP程序一样,OpenCart需要把系统中的一些重要的参数从config.php中,对于这个文件,按惯例,使用一句:

require(‘config.php’);

连接数据库的DSN参数和相关目录设置就可用了,下面有必要将config.php文件列表在下,这有利于我们理解OpenCart的设计思想:

// HTTP
define(‘HTTP_SERVER’, ‘http://localhost/cnopencart/’);
define(‘HTTP_IMAGE’, ‘http://localhost/cnopencart/image/’);
// HTTPS
define(‘HTTPS_SERVER’, ”);
define(‘HTTPS_IMAGE’, ”);
// DIR
define(‘DIR_CACHE’, ‘C:wampwwwcnopencart/cache/’);
define(‘DIR_DOWNLOAD’, ‘C:wampwwwcnopencart/download/’);
define(‘DIR_IMAGE’, ‘C:wampwwwcnopencart/image/’);
define(‘DIR_LIBRARY’, ‘C:wampwwwcnopencart/library/’);
define(‘DIR_MODEL’, ‘C:wampwwwcnopencartcatalog/model/’);
define(‘DIR_CONTROLLER’, ‘C:wampwwwcnopencartcatalog/controller/’);
define(‘DIR_LANGUAGE’, ‘C:wampwwwcnopencartcatalog/language/’);
define(‘DIR_EXTENSION’, ‘C:wampwwwcnopencartcatalog/extension/’);
define(‘DIR_TEMPLATE’, ‘C:wampwwwcnopencartcatalog/template/’);
// DB
define(‘DB_HOST’, ‘localhost’);
define(‘DB_USER’, ‘root’);
define(‘DB_PASSWORD’, ‘111111’);
define(‘DB_NAME’, ‘opencart’);
?>

与别的系统可能有些不同是的,OpenCart有一个config类用来从别的设置文件或数据库里存取数据,这些数据也是在程序一开始运行就需要的,因此第一个由loader装载的就是config类,装载config类就只简单地用了一句:

// Config
$config =$this->load->….

其它所有的对象这是以这种方法来进行管理。
2. Op的加载器
2.1. 系统加载
在System下有一些公共类,所以的基础类和公共类都是通过index.php 去加载的,这样你就可以去加载你需要的类和文件了。比如:

$loader = new Loader();
Registry::set(‘load’, $loader);

然后你就可以在系统里调用Load方法去加载需要的Model和language 文件了。调用方式如下:

$this->load->….

Op里就是通过这个方法来注册他所需要的资源的。

php 序列化(serialize)与反序列化(unserialize)

把复杂的数据类型压缩到一个字符串中
serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量
eg:
$stooges = array(‘Moe’,’Larry’,’Curly’);
$new = serialize($stooges);
print_r($new);echo ”
“;
print_r(unserialize($new));
结果:a:3:{i:0;s:3:”Moe”;i:1;s:5:”Larry”;i:2;s:5:”Curly”;}
Array ( [0] => Moe [1] => Larry [2] => Curly )
当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
$shopping = array(‘Poppy seed bagel’ => 2,’Plain Bagel’ =>1,’Lox’ =>4);
echo ‘<a href=”next.php?cart=’.urlencode(serialize($shopping)).'”>next</a>’;
margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。
如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:
$new_cart = unserialize(stripslashes($cart)); //如果magic_quotes_gpc开启
$new_cart = unserialize($cart);
如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:
$fp = fopen(‘/tmp/cart’,’w’);
fputs($fp,addslashes(serialize($a)));
fclose($fp);
//如果magic_quotes_runtime开启
$new_cat = unserialize(stripslashes(file_get_contents(‘/tmp/cart’)));
//如果magic_quotes_runtime关闭
$new_cat = unserialize(file_get_contents(‘/tmp/cart’));
在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列化数据必须要经过addslashes()的处理,以便能够适当地存储。
mysql_query(“insert into cart(id,data) values(1,'”.addslashes(serialize($cart)).”‘)”);
$rs = mysql_query(‘select data from cart where id=1’);
$ob = mysql_fetch_object($rs);
//如果magic_quotes_runtime开启
$new_cart = unserialize(stripslashes($ob->data));
//如果magic_quotes_runtime关闭
$new_cart = unserialize($ob->data);
当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。

CentOS 5.5开通Ftp和Telnet服务配置

在安装好CentOS以后,需要设置Ftp和Telnet服务文件,才能启动Ftp和Telnet服务,可以通过远程控制进行开启。
1.1、进入终端命令模式,用root用户登录;
1.2、开启ftp服务。

cd /etc/xinetd.d
#编辑ftp服务的配置文件gssftp:
vi gssftp
#将 修改两项内容:
server_args = -l –a # 去掉-a 改为server_args = -l
disable=yes #改为disable=no

1.3、开启telnet服务

cd /etc/xinetd.d
#察看telnet服务的配置文件krb5-telnet的设置:$ {! b7 r0 A8 d. z
#开启telnet服务设置
vi krb5-telnet
disable=yes # 改为disable=no,保存退出。

1.4、激活服务:
telnet /ftp 是挂在 xinetd 底下的,所以自然只要重新激活 xinetd 就能够将 xinetd 里头的设定重新读进来,所以刚刚设定的telnet /ftp自然也就可以被激活。
激活目录和命令:

cd /etc/rc.d/init.d/
service xinetd restart

有时会提示命令不存在,需要加上命令的路径

[root@localhost init.d]# service xinetd resart
bash: service: command not found
[root@localhost init.d]# /sbin/service xinetd restart

若提示xinetd: 未被识别的服务,则说明/etc/rc.d/init.d下无xinetd包

[root@localhost init.d]# yum -y install xinetd* #下载xinetd包
[root@localhost init.d]# service xinetd resart #重新启动FTP、Telnet服务

这样既可ftp登陆到服务器

PHP高级工程师的面试题【转】

这些题目都能搞定,你就是高高手了~

1. 基本知识点
HTTP协议中几个状态码的含义:503 500 401 200 301 302。。。
Include require include_once require_once 的区别.
PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。
HEREDOC介绍
写出一些php魔幻方法;
一些编译php时的configure 参数
向php传入参数的两种方法。
(mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
error_reporting 等调试函数使用
您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?
posix和perl标准的正则表达式区别;
Safe_mode 打开后哪些地方受限.
写代码来解决多进程/线程同时读写一个文件的问题。
写一段上传文件的代码。
Mysql 的存储引擎,myisam和innodb的区别。
2. web 架构,安全,项目经验
介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。
使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请先打开mod_rewrite.
MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
写出一种排序算法(原理),并说出优化它的方法。
请简单阐述您最得意的开发之作
对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题
您是否用过模板引擎? 如果有您用的模板引擎的名字是?
请介绍Session的原理,大型网站中Session方面应注意什么?
测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。
正则提出一个网页中的所有链接.
介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。
您写过的PHP框架的特点,主要解决什么问题,与其他框架的不同点。
大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?
相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。
3. unix/linux 基本使用
linux下查看当前系统负载信息的一些方法。
vim的基本快捷键。
ssh 安全增强方法;密码方式和rsa key 方式的配置。
rpm/apt/yum/ports 装包,查询,删除的基本命令。
Makefile的基本格式,gcc 编译,连接的命令,-O0 和-O3区别。
gdb,strace,valgrind的基本使用.
4. 前端,HTML,JS
css盒模型。
javascript中的prototype。
javascript中this对象的作用域。
IE和firefox事件冒泡的不同。
什么是怪异模式,标准模式,近标准模式。
DTD的定义
IE/firefox常用hack.
firefox,IE下的前端js/css调试工具。