马丁博客

创业是条艰苦的路!

首页: http://www.blags.org


由马丁博客撰写的日志

linux 之间ssh无密码登录

环境:本机器:ubuntu 9.04,服务器centos5.x系列。
最近为了工作需要,开机启动将服务器的文件挂载到自己的工作区,
一开始采用smbmount进行挂载,建立项目进行开发。挂载里面的文件,每次保存时都会提示你文件已经修改需要你刷新整个项目,太麻烦了。都不敢随便保存。不实时保存容易出现的问题大家可想而知。
Samba是为大家在windows和linux进行文件共享量身定制的。但是对于linux而言就不尽人意了。

smbmount 挂载可以直接在参数上面输入用户名和密码。当然开机挂载很容易了,命令如下:
sudo /etc/rc.local;
smbmount //ip:/xxx /mnt/ -o user%pwd;

以上方式不推荐使用。
那么linux之间挂载采用什么方式呢 —— 有以下两种 nfs,sshfs。本人再用的是sshfs。
具体挂载命令如下。

安装 :sudo apt-get install sshfs;
sudo sshfs user@ip-address:/remote/directory /www/workspaces;
开机自动挂载
sudo /etc/rc.local;
在exit 0 之前加上:
su martin -c ’sshfs user@ip-address:/remote/directory /www/workspaces;’#martin拥有私钥的用户
但是这个中间需要输入密码。下面讲以下ssh无密码登录.

适用情景:

觉得输入密码烦躁的时候。
不得不从其他服务器scp文件的时候。

下面M表示本机,S表示服务器(或者目的ip)

首先在M运行ssh-keygen -t rsa;#dsa表示加密类型,exp:dsa,rsa
然后回车知道结束。
cd ~/.ssh/;ls -l;会看见有下面几个文件
其中id_rsa 是私钥。id_rsa.pub是公钥。
将M中ssh生成的公钥复制下来。
接下来进如ssh 链接上S机器。
将公钥内容复制到S机器。
vi ~/.ssh/authorized_keys;
在S机器将文件authorized_keys赋予600权限。
chmod 600 ~/.ssh/authorized_keys;
多个用户可以将自己机器内生成的公钥在authorized_keys下面复制进去。

这样就完成了。
vi /var/log/secure;可以看到登录记录。
卸载,方法使用umount /xxx就行。
出现错误

Agent admitted failure to sign using the key.
则需要在M机器上将私钥添加进来
ssh-add .ssh/id_rsa;

mysql 字符串处理函数

起因:最近需要用到mysql的字符串处理函数,一开始打算从数据库里面读取出来再采用php进行处理,后来一想干嘛非得借助别的语言呢,难道mysql真的不能完成以上工作吗。
环境:目标字段为一个text类型,存储的是一个json_encode过的对象,长度不一。需要将里面的某一个属性查询出来。
Exp:{“name”:”martin”,”age”:”25″,”Time”:”1299899245″,”status”:1} 取出Time属性。
初试:想采用mysql正则表达式去匹配其中的属性。
上网看了mysql正则表达式一章:http://dev.mysql.com/doc/refman/5.1/zh/regexp.html
发现只能匹配到某个字符存在与否。当然也可能我看得不够仔细。
再试:想采用mysql字符串处理函数,进行匹配。结果ok。
用到的函数 SUBSTRING、SUBSTING_INDEX、LENGTH、FROM_UNXITIME。

设置变量

View Code MYSQLset  @str = ‘{"name":"martin","age":"25","Time":"1299899245","status":1}’;

获取目标字符所在位置。

View Code MYSQLSELECT LENGTH(SUBSTRING( @str,’","status’,1 ));

使用SUBSTRING进行截取目标字符串

View Code MYSQLSELECT SUBSTRING_INDEX( @str ,  LENGTH(SUBSTRING( @str,’","status’,1 )) , 10 );

时间转换

View Code MYSQLSELECT FROM_UNIXTIME( SUBSTRING( @str ,  LENGTH(SUBSTRING_INDEX( @str,’","status’,1 )) -9, 10 ));

以上就完成了上述任务。还有更好的方法欢迎大家留言。

vim 删除快捷键

以前感觉vim删除操作挺麻烦,后来才发现有这么多快捷删除键,看样子使用得还是不够深入噢。
:%s/r//g 删除DOS方式的回车^M
:%s= *$== 删除行尾空白
:%s/^(.*)n1/1$/ 删除重复行
:g/s*^$/d 删除所有空行 :这个好用有没有人用过还有其他的方法吗?
:g!/^dd/d 删除不含字符串‘dd‘的行
:v/^dd/d 同上 (译释:v ==&nbspg!,就是不匹配!)
:g/str1/,/str2/d 删除所有第一个含str1到第一个含str2之间的行
:v/./.,/./-1join 压缩空行
:g/^$/,/./-j 压缩空行
ndw 或&nbspndW 删除光标处开始及其后的&nbspn-1 个字符。
d0 删至行首。
d$ 删至行尾。
ndd 删除当前行及其后&nbspn-1 行。
x 或&nbspX 删除一个字符。
Ctrl+u 删除输入方式下所输入的文本。
^R 恢复u的操作
J 把下一行合并到当前行尾
V 选择一行
^V 按下^V后即可进行矩形的选择了
aw 选择单词
iw 内部单词(无空格)
as 选择句子
is 选择句子(无空格)
ap 选择段落
ip 选择段落(无空格)
D 删除到行尾
x,y 删除与复制包含高亮区
dl 删除当前字符(与x命令功能相同)
d0 删除到某一行的开始位置
d^ 删除到某一行的第一个字符位置(不包括空格或TAB字符)
dw 删除到某个单词的结尾位置
d3w 删除到第三个单词的结尾位置
db 删除到某个单词的开始位置
dW 删除到某个以空格作为分隔符的单词的结尾位置
dB 删除到某个以空格作为分隔符的单词的开始位置
d7B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d) 删除到某个段落的结尾位置
d{ 删除到某个段落的开始位置
d7{ 删除到当前段落起始位置之前的第7个段落位置
dd 删除当前行
d/text 删除从文本中出现“text”中所指定字样的位置,
一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
dfc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
dtc 删除当前行直到下一个字符“c”所出现位置之间的内容
D 删除到某一行的结尾
d$ 删除到某一行的结尾
5dd 删除从当前行所开始的5行内容
dL 删除直到屏幕上最后一行的内容
dH 删除直到屏幕上第一行的内容
dG 删除直到工作缓存区结尾的内容
d1G 删除直到工作缓存区开始的内容

ubuntu 短密码设置

年终了,写篇小文章。相信对ubuntu爱好者有用。
起因:相信很多ubuntu用户都有遇到过相同的问题。sudo的时候会需要填写用户的密码,去处理需要较高权限的操作。
密码设置长了自然感觉到很繁琐。(对安全要求较高的用户不建议)。
linux 修改密码的方式很简单。passwd username 输入当前密码就可以进行新密码设置。
ubuntu 近期几个版本都对用户密码复杂程度进行了控制,不安全的密码不能通过。(小于六位)
下面介绍以下设置短密码的方法。

sudo passwd username 进行设置就ok拉。(加上sudo就可以设置较短的密码)。
当然也可以sudo su 进去root,然后直接passwd martin进行密码设置。

另外:ubuntu 支持密码找回。
由于最近比较忙。记录以下知识点,下次补上。
linux 管道使用。
linux crontab 定时任务。
php 系统日志处理。
php 高并发解决方案。
mysql 建索引介绍。

linux awk 使用

最近换了新的环境,上班时间忙,很长一段时间没有写文章了。把最近了解到的一些新知识记录一下。
管道命令:“|” 符号。Example:grep ‘xxx.php’ -r /www/ | grep ‘function xxx’ | grep -v svn (可以理解为筛选条件).
清空文件:”> aa.txt”,”echo ” > aa.txt”
awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,非常实用。例如一些linux日志文件。
Example:cat xxx.log | grep ‘xxx’ | awk ‘FS=”/” if($1>100){print $3}’
常用环境变量
变量    描述

$n   :   当前记录的第n个字段,字段间由FS分隔。
$0   :   完整的输入记录。
ARGC   :   命令行参数的数目。
ARGIND   :   命令行中当前文件的位置(从0开始算)。
ARGV   :   包含命令行参数的数组。
CONVFMT   :   数字转换格式(默认值为%.6g)
ENVIRON   :   环境变量关联数组。
ERRNO   :   最后一个系统错误的描述。
FIELDWIDTHS   :   字段宽度列表(用空格键分隔)。
FILENAME   :   当前文件名。
FNR   :   同NR,但相对于当前文件。
FS   :   字段分隔符(默认是任何空格)。
IGNORECASE   :   如果为真,则进行忽略大小写的匹配。
NF More >

centos 安装配置 openssl webmin

经过几个小时的摸索,终于将最新版本的webmin安装好了。
现在与大家分享自己的过程。
因为需要远程管理,所以连接的安全将首先考虑:
1:安装 OpenSSL软件
我本身就装了,版本号:0.9.7a
你可以按如下命令安装
wget http://www.openssl.org/source/openssl-0.9.7a.tar.gz
tar zxvf openssl-0.9.7a.tar.gz
cd openssl-0.9.7a
./configure
make
make install
2:安装NetSSLeay perl模块
我按装的版本号:1.30
你可以按如下命令安装
wget http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/Net_SSLeay.pm-1.30.tar.gz
tar zxvf Net_SSLeay.pm-1.30.tar.gz
cd Net_SSLeay.pm-1.30
perl Makefile.PL
make install
3:安装webmin软件
我按装的版本号:1.30(以下连接2006/9/20更新,官方9/16升级为1.30)
你可以按如下命令安装
wget http://puzzle.dl.sourceforge.net/sourceforge/webadmin/webmin-1.300-1.noarch.rpm
rpm -Uvh webmin-1.300-1.noarch.rpm
编辑防火墙配置文件
vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 10000 -j ACCEPT —插入
保存后重起防火墙
/etc/rc.d/init.d/iptables restart
设置与系统一起自动启动
chkconfig webmin on
重新启动WEBMIN服务
/etc/rc.d/init.d/webmin restart
在浏览器输入:http://你的域名或者IP:10000/
为了安全一般修改默认的端口”10000″->”xxxx”,需要关闭webmin可以禁止掉该端口.
出现登陆画面后,输入你的root帐号密码就进入了。
附图:

webmin

magento 性能优化

前言:
     Magento 是一个开源电子商务系统,尤其以扩展性高著称,但是很高的扩展性往往是牺牲了速度为代价的,虽然现在magento为速度提升做了很多工作,但是还是没能达到人们对速度的要求。既然如此还是很自然的选择了它,它的速度让很多客户无法接受,最近忙碌于magento性能优化。
     经过优化后,速度上了几个台阶,觉得能让大部分人都接受了,据本人目测最少快了(7-8倍)。
参考结合了前辈的经验总结了如下很重要的几点:
1) Magento Caching. Magento 自身cache
Goto Magento Admin -> System -> Cache Management
- Tick the following items:
– Configuration
– Layouts
– Block HTML output
– Translations
2) MySQL Cache Size 设置
query_cache_size=128M
innodb_buffer_pool_size=64M
innodb_additional_mem_pool=16M
4) Enabling Gzipping 启用gzip压缩
.htaccess
php_flag zlib.output_compression on
AddHandler application/x-httpd-php5 .css
修改 .htaccess mod_deflate 配置
本人配置如下:

View Code PHP # Insert filter on all content
SetOutputFilter DEFLATE
# More >

php 程序员

最近去了tencent,xunlei等互联网名企面试,总结一下:

如果想进入这类企业进行底层开发的话必须对互联网各方面的技术原理了解的很清楚,例如apache实现原理。语言方面既然是php开发自然对c/c++要求比较高。往往需要自己写php扩展。使用mysql自然想很多常见的,性能瓶颈要能有很好的解决方案。mysql 插件编写,apache模块编写。联系起来结合点还是要会c。
倘若是做中间层和前端工作则要求对css,javascript要求比较高。当然对web的一系列实现原理也是要非常熟悉的。
对新技术要比较敏感,才能证明你有很好的学习能力和使用能力。
努力提高自己的英文口语,和阅读能力。往往很多新技术都是老外想出来的。等有了中文版也许这个技术已经不是那么新了。

相信我们很多人都只是了解到中间的皮毛而已,对于技术原理。这类型的东西了解甚少。值得注意的一点,正则这个东西在他们严重也是很重要的。
想成为一位合格的php程序员(高级),必须符合如下条件。
◆ 文件目录处理函数包80%以上的函数的功能的灵活运用。
◆ 日期时间函数中的80%以上的函数的功能的灵活运用
◆ 数学函数库中的100%的内容。
◆ 网络库中的60%以上的内容,对各个函数的功能比较熟悉。
◆ 字符串处理函数下的60%以上的内容,特别是各种处理函数。
◆ 正则表达式函数下的90%以上的内容,特别是各种正则处理
◆ 一些安全库下的40%以上的内容,如果对于安全没有接触的话根本就不可能掌握PHP
◆ XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理。
◆ 图形图像函数库下的80%以上的内容,特别是一些图像生成和处理
◆ MySQL 数据库函数下的90%以上的内容,特别是处理各种数据的函数
◆ 数组处理函数下的90%以上的内容,特别是各种操作处理函数
◆ 其它PEAR,PECL,和一些扩展类库中的80%以上的内容,特别是一些常用的类的处理
◆ 针对不同的需求,查找不同的函数库。
◆ 测试:必须熟悉使用phpunit编写测试用例完成代码的自动测试。
◆ 管理:必须熟悉使用xinc, phing等完成工程管理的常用任务,例如工程编译、生成phpdoc、生成、版本控制、自动测试。
◆ 排错:应该可以根据异常信息比较快速的定位问题的原因和大致位置。
◆ 思想:必须掌握OOP的主要要求,这样使用PHP开发的系统才能是真正的PHP系统。
◆ 规范:编写的代码必须符合流行的编码规范,这样程序的可读性才比较好。
◆ 博学:掌握OOA、OOD、YiiFramework 、Zendframework、cakephp、symfony、模板技术等流行技术,掌握软件架构设计思想、搜索引擎优化、缓存系统设计、网站负载均衡、系统性能调优等实用技术。
◆ 多去看别人写的代码,php优秀的框架很多,很多人在认知上就有一个错误。认为自己能用一个框架开发一个系统了就认为自己已经熟悉这个框架了,其实会使用他并没有什么一个框架基本都有用户手册,一看基本都会使用了,要想自己技术上面提升,建议多看看这些框架的实现原理(设计模式)。

HTTP 状态代码

    如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求。
此状态代码提供了有关请求状态的信息,且为 Googlebot 提供了有关您网站和请求的网页的信息。
一些常见的状态代码为:

200 – 服务器成功返回网页
404 – 请求的网页不存在
503 – 服务器暂时不可用

以下提供了 HTTP 状态代码的完整列表。点击链接可了解详细信息。您也可以访问有关 HTTP 状态代码的 W3C 页来了解详细信息。
1xx(临时响应)
用于表示临时响应并需要请求者执行操作才能继续的状态代码。

代码
说明

100(继续)
请求者应当继续提出请求。服务器返回此代码则意味着,服务器已收到了请求的第一部分,现正在等待接收其余部分。

101(切换协议)
请求者已要求服务器切换协议,服务器已确认并准备进行切换。

2xx(成功)
用于表示服务器已成功处理了请求的状态代码。

代码
说明

200(成功)
服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。如果您的 robots.txt 文件显示为此状态,那么,这表示 Googlebot 已成功检索到该文件。

201(已创建)
请求成功且服务器已创建了新的资源。

202(已接受)
服务器已接受了请求,但尚未对其进行处理。

203(非授权信息)
服务器已成功处理了请求,但返回了可能来自另一来源的信息。

204(无内容)
服务器成功处理了请求,但未返回任何内容。

205(重置内容)
服务器成功处理了请求,但未返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如清除表单内容以输入新内容)。

206(部分内容)
服务器成功处理了部分 GET 请求。

3xx(已重定向)
要完成请求,您需要进一步进行操作。通常,这些状态代码是永远重定向的。Google 建议您在每次请求时使用的重定向要少于 5 个。您可以使用网站管理员工具来查看 Googlebot 在抓取您已重定向的网页时是否会遇到问题。

代码
说明

300(多种选择)
服务器根据请求可执行多种操作。服务器可根据请求者 (User agent) 来选择一项操作,或提供操作列表供请求者选择。

301(永久移动)
请求的网页已被永久移动到新位置。服务器返回此响应(作为对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码通知 Googlebot 某个网页或网站已被永久移动到新位置。

302(临时移动)
服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置。但由于 Googlebot 会继续抓取原有位置并将其编入索引,因此您不应使用此代码来通知 Googlebot 某个页面或网站已被移动。

303(查看其他位置)
当请求者应对不同的位置进行单独的 GET 请求以检索响应时,服务器会返回此代码。对于除 HEAD 请求之外的所有请求,服务器会自动转到其他位置。

304(未修改)
自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。
如果网页自请求者上次请求后再也没有更改过,您应当将服务器配置为返回此响应(称为 More >

mysql myisam innodb 区别

最近连续接到了两次tencent的电话面试,当然不是同一个部门。都涉及到了一个mysql的基础知识问题。为了防止第三次打电话来,备注下。^^。
题目1:讲讲你对mysql myisam,innodb的认识。然后你认为他们的区别在那里?为什么?
答:这两个是mysql主要存储引擎。
简要介绍来自官网。
简要介绍:MyIsam
MyISAM是 默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
简要介绍:InnoDB
InnoDB给MySQL提供 了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加 了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的 默认表。
InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。
简单概括几点如下:

通过不上不难看出,MyIsam InnoDB的用途,Myisam主要适用于中小型数据量。InnoDB引擎适用于大数据量。上面已经讲得很清楚拉。著名的开源电子商务系统[magento]就是采用InnoDB创建。
MyIsam写入速度比InnoDB快。
在使用InnoDB时候需要对my.cnf进行配置以保证mysql达到最大效率。详细可以查看官网[inndo性能调节]:http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning。

其中有很多人在网上发表了关于mysql MyIsam 和 InnoDB在存贮和读取方面的差异。暂时还没有做过度研究。
基本测试都是基于使用[事务]和不使用[事务],进行对比。mysql对于[非事务表]速度会比较块。
原因:待查证。
猜测:设定了 innodb_flush_log_at_trx_commit 如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交[SET AUTOCOMMIT = 0]来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能。
通过上面的分析,在我们采用mysql存储引擎的时候要按需分配。针对不同的存储引擎要采用不同的数据设计。
题目2:开发过程中,遇到糟糕的sql语句你是怎么解决的。
答:使用mysql的[EXPLAIN]对sql进行解释。因该还有更多好方法。
mysql 常见问题可以查看:http://www.blags.org/mysql-error-daquan-and-solutions/
mysql存储引擎的介绍 :http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html
以上如有不足之处,请大家帮忙补充,thk。