在PHP中使用HTTP Proxy(HTTP代理)来访问网络资源

1. 最简单的方法
连接HTTP代理,给它发一个GET的HTTP头。
指令如下:
telnet proxy.example.com 8080
GET http://www.example.com/some/url.html HTTP/1.0
Host: whatever

最后要跟一个空行表示结束。完了就赶紧读取代理返回的数据就好了。返回的数据是不带HTTP头的文件真实内容。

2. 用CONNECT指令
上面的例子用于获取一个资源时非常简单,但它也有定制性差的缺点:只能做一些非常简单的应用,想发送一个HEAD请求,或自定义下HTTP请求头的话,这种方法行不通。
CONNECT是这么样的一个指令:允许你先连接上代理服务器,返回连接状态后,再接收HTTP请求头,并帮你转发给目标服务器。
看指令:

telnet 10.6.234.33 8080
Trying 10.6.234.33…
Connected to 10.6.234.33.
Escape character is ‘^]’.
CONNECT 10.6.234.33:8080 HTTP/1.0
Host: 10.6.234.33:8080

HTTP/1.1 200 Connection established

HEAD http://www.example.com/css/global.css HTTP/1.1
Host: www.example.com
Accept: */*
Proxy-Connection: Keep-Alive

HTTP/1.1 200 OK
Server: NWS-imgcache
Date: Wed, 17 Nov 2010 04:28:21 GMT
Expires: Wed, 17 Nov 2010 05:28:21 GMT
Cache-Control: max-age=3600
Last-Modified: Mon, 08 Nov 2010 11:01:49 GMT
Content-Type: text/css
Content-Length: 29703
X-Cache-Lookup: MISS from proxy:8080

Connection closed by foreign host.

空行分隔,分别是用户输入、服务器返回、用户输入、服务器返回。

看PHP实现的一个例子。proxy.zip

Linux获取硬件标识

  1. gethostid()

首先,unistd.h中有提供一个获取主机标识的函数: gethostid(); 可以返回一个以32位整数表示的标识符,它是由机器的IP经过移位后得到的。

long hostid = gethostid();

正因为这个hostid是由IP地址转换得来的,我们可以用它来快速获得当前机器的主IP:

如hostid为:AABBCCDD,则IP为 BB.AA.DD.CC,当然各个部分还得转换成二进制数。

  1. Get harddisk Product ID

这步的关键是ioctl的使用。首先,以只读的方式打开硬盘设备,给ioctl的第一个参数传递fd, 第二个参数传递HDIO_GET_IDENTITY,第三个地址是out类型参数,给它一个struct hd_driveid的结构体指针即可。

ioctl(fd, HDIO_GET_IDENTITY, &hid);

  1. Get MAC address

MAC地址的获取也是通过ioctl。

  1. Get CPU ID

这个就是汇编了。

见附件。

mac.c ip.c hostid.c cpuid.c disk.c

又见Bash炸弹

今天一位同事在编码时不小心,忘记给循环加break。导致开发机(虚拟机)负载过高而无响应。ping值忽高忽低,ssh连不上,mysql连接超时。
这不禁让人想起大名鼎鼎的Bash炸弹:

:(){ :|:& };:

在Bash中,冒号(:)是可以做为函数名的,所以这个炸弹也就很容易理解了:

  1. 定义一个函数
  2. 函数体中,递归调用此函数,并把输出重定向到管道。
  3. Bash中,函数调用是会启动新进程的,而管道后端又启动一个进程。
  4. 管道启动的新进程又会继续递归启用管道、启动新进程。
  5. & 符号把任务置于后台运行,避免终端交互。
  6. 连锁反应会继续,直接到达内核资源限制。若无限制,则直接会把服务器拖死。

Perl 版本炸弹

perl -e “fork while fork” &

Python版本炸弹

import os
while(1):
os.fork()

Windows XP 批处理

:bomb
start %0
goto bomb

C语言版本

int main() { while(1) fork(); }

如何防范?

通过限制用户对资源的占用来防止。因为此类炸弹是用耗尽系统资源来达到攻击目的的。Linux的限制方法有:
ulimit 命令 或者 /etc/security/limits.conf

LINUX命令xargs的简单应用及举例

大多数 Linux 命令都会产生输出:文件列表、字符串列表等。但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办?例如,file 命令显示文件类型(可执行文件、ascii 文本等);您可以处理输出,使其仅显示文件名,现在您希望将这些名称传递给 ls -l 命令以查看时间戳记。xargs 命令就是用来完成此项工作的。它允许您对输出执行其他某些命令。

Read More

rsync 错误与解决方案收集

问题一:
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器端的目录不存在或无权限,创建目录并修正权限可解决问题。

问题二:
@ERROR: auth failed on module tee
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。
提供正确的用户名密码解决此问题。

问题三:
@ERROR: Unknown module ‘tee_nonexists’
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器不存在指定模块。提供正确的模块名或在服务器端修改成你要的模块以解决问题。

nginx 下QUERY_STRING 的一个bug

配置选项:
location / {
root “D:/xampp/htdocs/teeume.com”;
try_files $uri /t.php;
}

实现重写后,我们用 /search/?q=test 请求,会发现$_GET[‘q’] 无值,$_SERVER[‘QUERY_STRING’]无值。

这就影响了正常的取值方式。
我们做如下修正:
$uri = $_SERVER[‘REQUEST_URI’];
$uri = strtok($uri, ‘?’);
$qs = $_SERVER[‘QUERY_STRING’] = strtok(‘?’);
parse_str($qs, $qs_arr);
$_REQUEST = array_merge($_REQUEST, $qs_arr);

Chrome扩展编写教程

今天闲着没事,自己做了一个扩展玩玩,随便写下笔记。

要求Google Chrome 4.0+

首先,我们先建立一个工作目录,我这里是E:\chrome

创建一个文件,名字叫manifest.json,内容如下:

{  “name”: “Seaprince’s Blog Reader”,  “version”: “1.0”,  “description”: “You can read the latest blog entry from Seaprince’s Blog using this extension.”,  “browser_action”: {    “default_icon”: “23.gif”,    “popup”: “popup.html”  },  “permissions”: [    "http://blog.eaxi.com/"  ]}

自己制作一个小图标放在文件夹中,命名为23.gif

创建一个HTML文件,命名为popup.html,内容为:

点击chrome中的小扳手图标,选择“扩展程序”项。

在开发人员模式这里,点击“载入正在开发的扩展程序”,选择刚才我们创建的E:\chrome

成功!你会看到工具条中多了一个图标,点击它,就可以看到你的扩展效果!

分享给他人

在开发人员模式这里,点击,打包扩展程序,完成后,会在chrome的平级生成chrome.crx和chrome.pem两个文件,把chrome.crx发给别人,并让他用chrome打开,就可以安装扩展程序!

测试:chrome.crx

参考文章:http://code.google.com/chrome/extensions/getstarted.html

Win7 中 gVim 不出现在右键菜单中的解决办法

安装完gVim,也许你会发现右键菜单中找不到gVim的菜单项。这是由于64位系统和32位系统的差异导致的。当然,如果你是和我一样有系统洁癖,喜欢绿色版本的话,也可以用这个方法来建立右键菜单项。
regedit 打开注册表,依次打开HKEY_CLASSES_ROOT/*/shell
在shell节点上点击右键,新建一个键值(key),叫“Edit with gVim”,或者叫其他你喜欢的名字,这将会出现在右键菜单中。
然后继续在刚新建的键值下再新建一个键值,叫”command”,这里必须严格按照这个。
在command下的字符串值中写入 E:\soft\Vim\vim72\gvim.exe “%1″
关掉注册表编辑器马上可以看到效果。

导出注册表项时可以看到:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT*\shell\Edit with Vim\command]
@=”E:\soft\Vim\vim72\gvim.exe ”%1””

直接下载注册表文件:gvim.reg

Coreseek Fulltext Search

资料准备

http://www.coreseek.cn/products/ft_down/

下载csft和mmseg,并且分别解压到~/coreseek

安装

开始编译mmseg

./configure –prefix=/usr/local/mmseg

make && make install

复制词库

cp -R ~/coreseek/mmseg-3.1/data /usr/local/mmseg/

生成词库

cd /usr/local/mmseg/data

../bin/mmseg -u unigram.txt

mv unigram.txt.uni uni.lib

开始编译sphinx (coreseek)

./configure –with-mmseg=/usr/local/mmseg –with-mmseg-includes=/usr/local/mmseg/include/mmseg –with-mmseg-libs=/usr/local/mmseg/lib –prefix=/usr/local/csft

make && make install

特别要注意的是mmseg/include下还有一层文件夹,必须写成–with-mmseg-includes=/usr/local/mmseg/include/mmseg,否则出错。

配置

创建/usr/local/csft/etc/csft.conf,内容参见附件,但必须注意的几点:

  1. 防止中文乱码

sql_query_pre = SET NAMES utf8

  1. 加载中文词库

index test1

{

source = src1

path = /usr/local/csft/var/data/test1

docinfo = extern

charset_type = zh_cn.utf-8

charset_dictpath = /usr/local/mmseg/data

}

数据库的建立要注意utf8编码,可以直接下载附件在phpmyadmin导入。

使用Sogou的词库

搜狗提供了一个优秀的词库,地址在:http://www.sogou.com/labs/dl/w.html,许可证位于:http://www.sogou.com/labs/dl/license.html

但Sogou的词库和mmseg的格式还是有差别的,需要自己转换格式。

为了方便,我在研究的同时写了一个小程序,用于转换工作,感兴趣的可以在附件处下载。(有小BUG,自己解决,呵呵)

附件也有我转换好的版本,可以直接使用。

PHP中使用sphinx (coreseek)

可以直接安装扩展http://pecl.php.net/package/sphinx

或者使用coreseek包中自带的csft-3.1/api/sphinxapi.php

附件中有使用例子(PHP扩展方式)。

附录(附件列表)

附件下载:mmseg.zip