首页 » 开发 » 程序设计

十几岁的少年天才到处都有,三十多岁的优秀设计师凤毛麟角。

—Alexandrescu

程序实现笔记

Firefox的插件

既然我从Chrome的阵营回归到了Firefox, 就得研究下某些插件以提高效率。

首先是继续熟练Vimperator啦。

因为刚切换了berlinix.com的IP(42区东直门机房合同到期,切换到天坛机房), 所以有个小需求:在Firefox中执行ping。安装WorldIP插件。不错,很好用,速度快,信息准。

因为有登录网银需求,又懒得开IE了,所以安装了"IE Tab V2(Enhanced IE Tab)", 这样可以在Firefox的标签中打开IE。

2014-01-09

10s抓取一个淘宝页面

一个顽固的问题,在VMWare中访问我的网站总是很慢(当然实际情况是访问所有网站都很慢)。 抓取一个淘宝页面大概用10s,实在无法忍受了。猜测是DNS解析问题,在 /etc/resolv.conf配置一行:

nameserver 8.8.8.8
再重试,秒秒钟搞定。

此问题的延续。在修改/etc/resolv.conf后发现机子重启后我的配置就消失了,注意看这个文件:

$ cat /etc/resolv.conf
; generated by /sbin/dhclient-script
nameserver 58.221.45.90
nameserver 192.168.1.1

第一行说明了这个文件是由/sbin/dhclient-script自动生成的。 来看经由DHCP配置时,每次会覆盖/etc/resolv.conf文件。Google后发现几个解决方案。 参考 How To: Make Sure /etc/resolv.conf Never Get Updated By DHCP Client

方法1:如果是ext3系统,可以对/etc/resolv.conf加写保护:

$ df -T
Filesystem    Type   1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
              ext3    79227720  20446924  54691352  28% /
/dev/sda1     ext3      101086     12241     83626  13% /boot
tmpfs        tmpfs      255604         0    255604   0% /dev/shm

注意Type一列显示是ext3系统,Okay,对/etc/resolv.conf执行写保护:

# chattr +i /etc/resolv.conf

这样dhcp脚本就不能修改这个文件了。

方法2:为dhcp脚本添加一个钩子(以下为CentOS的操作,Debian/Ubuntu略有不同):

新建/etc/dhclient-enter-hooks文件,并添加代码:

# vi /etc/dhclient-enter-hooks
make_resolv_conf() {
    :
}

即定义了一个空函数,覆盖了脚本中默认的make_resolv_conf()函数。 这样我们就得以保全我们修改后的/etc/resolv.conf了。

2014-01-06 & 2014-01-09

不要把任何备份文件放在网站目录中

发现Apache error_log中的一些有趣的记录:扫描网站的备份文件:

...
[Sat Nov 16 10:23:58 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/1.zip
[Sat Nov 16 10:23:59 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/1.rar
[Sat Nov 16 10:23:59 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/2.zip
[Sat Nov 16 10:24:00 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/2.rar
[Sat Nov 16 10:24:01 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/3.zip
[Sat Nov 16 10:24:02 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/3.rar
[Sat Nov 16 10:24:02 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/wwwroot.rar
[Sat Nov 16 10:24:03 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/wwwroot.zip
[Sat Nov 16 10:23:41 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/htdocs.zip
[Sat Nov 16 10:23:42 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/db.rar
[Sat Nov 16 10:23:43 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/db.zip
[Sat Nov 16 10:23:43 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/wz.rar
[Sat Nov 16 10:23:44 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/wz.zip
[Sat Nov 16 10:23:45 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/fdsa.rar
[Sat Nov 16 10:23:45 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/fdsa.zip
[Sat Nov 16 10:23:46 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/wangzhan.rar
[Sat Nov 16 10:23:47 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/wangzhan.zip
[Sat Nov 16 10:23:50 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/root.rar
[Sat Nov 16 10:23:51 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/root.zip
[Sat Nov 16 10:23:52 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/admin.rar
[Sat Nov 16 10:23:52 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/admin.zip
[Sat Nov 16 10:23:53 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/data.rar
[Sat Nov 16 10:23:54 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/gg.rar
[Sat Nov 16 10:23:55 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/vip.rar
[Sat Nov 16 10:23:55 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/flashfxp.zip
[Sat Nov 16 10:23:56 2013] [error] [client 112.82.153.3] File does not exist: /www/tbring/htdocs/flashfxp.rar
...

在IP138上看到这个IP地址是来自“江苏省常州市 联通”。

分析error_log,过滤掉一些输出(前1000行中只有68行有用的信息;前1w行中只有832行有用信息):

$ head error_log_131119  -n1000|egrep -v "^\*|^<|^>|^Host|^Accept"|less
$ head error_log_131119  -n1000|egrep -v "^\*|^<|^>|^Host|^Accept" -c
68
$ head error_log_131119 -n10000|egrep -v "^\*|^<|^>|^Host|^Accept" -c 
832

Mysql启动超慢

网站无法正常访问,登录看是Mysql死了。重新启动Mysql,经过相当长的等待时间,还在启动:

Google后怀疑是Mysql在执行数据恢复(取决于之前Mysql是如何死掉的),检查Mysql日志:

# cd /usr/local/mysql/var
# ls -tl|less
-rw-rw---- 1 mysql root      22647 10月  6 21:43 berlinix.com.err
# tail -n30 berlinix.com.err

发现有这样一条日志:

131006 21:28:27 [ERROR] Could not use /usr/local/mysql/data/mysql_slow.log for logging (error 13). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.
/usr/local/mysql/libexec/mysqld: Disk is full writing './mysql-bin.~rec~' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)

其中的关键信息是:"Disk is full"。df后发现磁盘占用率到100%,用du简单定位,发现备份文件过多,吞噬了所有磁盘(没有定期清理)。这里有2条教训:

  • 应该有脚本扫描磁盘。如果发现磁盘使用率超过一定阈值,则执行自动清理(如删除一些过期的备份文件、日志等),并邮件通知管理员。
  • 应该有脚本监控各个服务的运行情况,当Mysql停止服务时,就应该邮件通知。在这条事件中,导致网站服务停止工作超过1天,属于严重事故。

代码清晰度的实现 - PHP生成HTML的类设计

刚开始用PHP时,觉得混淆了HTML标签,十分丑陋。 第一个解决方案,就是要拆分逻辑与显示(也就是要把负责前后台的人员拆分开)。 PHP只管业务逻辑(数据库处理),HTML负责显示。 要负责HTML的前端人员也来阅读PHP代码吗? 唔...不太靠谱。

这样的拆分有2个选择:

  • 一个MVC的PHP框架。
  • 一个简单的template类库。

无论如何,简单是第一位的。 在刚开始学习一门语言的时候,就动用框架,感觉会比较吃力。 我选了简单的一条路,选择一个template类库。 Google后直接挑了Smarty模版库来用。初试之下,感觉不错。

PHP Simple HTML Dom Parser访问含有"-"符号的属性

访问常见的属性,如<img src="/path/to/image.png">

$elem->src;

在解析淘宝页面时,发现淘宝商品页面的图片属性是这样:

<img id="J_ImgBooth" data-src="http://img04.taobaocdn.com/bao/uploaded/i4/18728026179090357/T108SXFi0dXXXXXXXX_!!0-item_pic.jpg_310x310.jpg" data-haszoom="700" src="http://gd4.alicdn.com/bao/uploaded/i4/18728026179090357/T108SXFi0dXXXXXXXX_!!0-item_pic.jpg_310x310.jpg_.webp">

虽然有个src属性,但其实它是动态生成的,原始的HTML代码中只有data-src这个属性。 随后有段JS代码生成WebP格式的图片。这个先不说。在抓取页面后,要提取图片地址,就变成了:

$elem->data-src

显示这是行不通的。修改如下即可:

$elem->{"data-src"};
2013-09-12

延迟加载图片

商品页面有大量图片,起初是简单使用:

<img src="/path/to/image.png" />

之后发现速度很慢,想起“分屏加载”之类的Tricks(典型的Pinterest之流)。Google后用了 lazyload 这个jQuery插件。

通过浏览器Network流量分析,效果显著,尤其一次需要加载数百张图片的页面,速度提升明显。

2013-09-11

跑到线上重构

重构一段代码。改一点测一点,非常顺利,一点错误都没发现。心花怒放。再迈一小步,加个功能。始终不对,新功能就是出不来。此时猛然发现,host指向线上,而不是开发机,刚才重构之所以一点错不出,是因为完全就没有运行它们,而且,随便的修改了线上数据!! 这叫个欲哭无泪、人生起伏阿。
2012-06-02

升级mysql到mysqli后,PHPUnit不能进行数据库代码测试的记录

将PHP mysql连接器升级到mysqli后,PHPUnit测试报错:

$ phpunit test/type_user_test.php
Fatal error: Class 'mysqli' not found in

在测试代码中添加extension_loaded()测试:

public function setUp() 
{   
    if(!extension_loaded('mysqli')) {
        $this->markTestSkipped("The Mysqli extension is not available");
    }   
}   

再次运行:

$ phpunit --verbose test/type_user_test.php 
There was 1 skipped test:
The Mysqli extension is not available

可见是没有加载mysqli扩展导致的。

解决:卸载PHPUnit,再重新安装:

pear uninstall phpunit/PHPUnit
pear install --alldeps pear.phpunit.de/PHPUnit
2011-12-09

删除yum后安装

昨天愚蠢的使用yum remove crontabs,结果连yum和rpm都删除掉了。接下来就是天人大战了。

下载yum 3.4.3。安装yum后运行遇到错误

No module named rpm

下载rpm 4.9.1.1。configure rpm遇到错误

configure: error: missing required NSPR / NSS header

NSPR(Netscape Portable Runtime),NSS(Network Security Services)。接下来是下载NSPR 4.8.3和NSS 3.9。

下载NSPR,编译完成后,居然没放在/usr/local下,而是只是在编译目录下生成了dist目录就完工了(恨!)。手工把dist中的include和lib移到/usr/local下。

继续NSS。cd nss-3.9/mozilla/security/nss然后执行make,遗憾的是,居然报Makefile有语法错误(也许是用法不对,似乎make前还有一些准备工作)。

放弃了源码安装的流程,转向乾坤大挪移秘籍。开发环境和线上环境比较相似,把yum所需的几个目录(主要是python/site-packages)和库(主要是rpm相关的动态库)copy到线上。简单搬运后,yum可用。

2011/09/06

rpmdb: Lock table is out of available locker entries

使用yum时有错误提示:rpmdb: Lock table is out of available locker entries, 缘故是当rpm访问berkeley数据库文件时, 将会为tables加个临时锁,但如果用户中断了rpm进程,则此锁就不得而解。

此问题的解决方案如下:

Step1: 备份/var/lib/rpm/目录。

Step2: 执行如下命令:

rm /var/lib/rpm/__db.00*
rpm --rebuilddb
rpm -qa
2010-12-15

warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 6b8d79e6

问题:

# yum install nmon -y
...
warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 6b8d79e6
...
Public key for nmon-14g-1.el5.rf.i386.rpm is not installed

解决:

# rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
2010-12-15

分享

0

评论

comments powered by Disqus