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

即时到账–银行网关提前功能

在商家的收银台页面选择银行,提交到支付宝页面后就默认为买家选择的银行。
目的:操作更顺,流程更简单! 例如:该图是商家自己网站设计的页面。

Alipay form Example

测试页面:http://alipaysales.cn:8082/cpys/jsdz/

如何集成 ?

即时到账技术文档中有这两个参数:
paymethod :(bankPay(网银);cartoon(卡通); directPay(余额))
defaultbank:默认网银 String (见常见银行表)
银行列表:

银行简码 银行名称
ICBCB2C 中国工商银行
CMB 招商银行
CCB 中国建设银行
ABC 中国农业银行
SPDBB2B 上海浦东发展银行(B2B)
CIB 兴业银行
GDB 广东发展银行
SDB 深圳发展银行
CMBC 中国民生银行
COMM 交通银行
POSTGC 邮政储蓄银行
CITIC 中信银行
BOCB2C 中国银行

只需要 在接口中新增加 paymethod,defaultbank 这两个参数,这两个参数也需要经过签名,否则会报错。

比如:买家选择 工行,那这两个参数的值就应该为 paymethod=bankPay; defaultbank=ICBCB2C;

以php即时到账代码为例就是:

require_once(“alipay_service.php”);
require_once(“alipay_config.php”);
$parameter = array(
“service” => “create_direct_pay_by_user”, //交易类型
“partner” => $partner, //合作商户号
“return_url” => $return_url, //同步返回
“notify_url” => $notify_url, //异步返回
“_input_charset” => $_input_charset, //字符集,默认为GBK
“subject” => “商品名称”, //商品名称,必填
“body” => “商品描述”, //商品描述,必填
“out_trade_no” => date(Ymdhms), //商品外部交易号,必填(保证唯一性)
“total_fee” => “0.01”, //商品总价,必填(价格不能为0)
“payment_type” => “1”, //默认为1,不需要修改

“paymethod” => “bankPay”, //bankPay(网银);cartoon(卡通); directPay(余额)
“defaultbank” => “ICBCB2C”, //见银行简码表
“show_url” => $show_url, //商品相关网站
“seller_email” => $seller_email //卖家邮箱,必填
);
$alipay = new alipay_service($parameter,$security_code,$sign_type);
$link=$alipay->create_url();