这里解释下config.php中的配置信息,供大家配置时候使用

$seccodedata['type'] = 0; //0英文图片验证码 1中文图片验证码 2Flash 验证码 3语音验证码
$seccodedata['width'] = 150;//验证码宽度
$seccodedata['height'] = 60;;//验证码高度
$seccodedata['background'] = 1;//是否需要随机背景
$seccodedata['adulterate'] = 1;//是否随机混淆
$seccodedata['ttf'] = 1;//使用ttf字体
$seccodedata['angle'] = 1;//自动旋转
$seccodedata['color'] = 1;//随机颜色
$seccodedata['size'] = 1;//字体随机大小
$seccodedata['shadow'] = 1;//添加字体阴影
$seccodedata['animator'] = 1;//这个是关键,能动的gif验证码
$timestamp = time();
$_DCOOKIE = array();
$seccode = 0;
$charset = "GBK";
$GLOBALS['auth_key'] = "duyipeng";//这个越复杂越好,算是密钥
define("_SITE_ROOT_",dirname(__FILE__)."/");
define("_SESSION_PATH_",_SITE_ROOT_."session");
session_save_path(_SESSION_PATH_);
session_start();
//这里定义session回收命令 定义seesion存储路径是为了方便多台机器部署

index.php+test.php是测试例子。

个人感觉这个验证码便于阅读,又不容易被破解,很不错。

ps.不要使用cookie,不然容易被cc.

下载地址:http://cid-7826486a7f7dc8a9.skydrive.live.com/self.aspx/.Public/seccode.rar 解压密码:www.71j.cn

Categories: 分享 Tags: ,

一个全面获取图象信息的函数,包括EXIF信息0+

17,693 views / 2010.03.09 / 12:12 下午

呵呵,中文化的EXIF解析,是不是你想要的呢?使用此方法,可以任意改写出你所需要的东东。

<?
/**
* 获取图象信息的函数
*
* 一个全面获取图象信息的函数
*
* @access public
* @param string $img 图片路径
* @return array
*/
function GetImageInfoVal($ImageInfo,$val_arr) {
    $InfoVal    =    "未知";
    foreach($val_arr as $name=>$val) {
        if ($name==$ImageInfo) {
            $InfoVal    =    &$val;
            break;
        }
    }
    return $InfoVal;
}
function GetImageInfo($img) {
 
    $imgtype            =    array("", "GIF", "JPG", "PNG", "SWF", "PSD", "BMP", "TIFF(intel byte order)", "TIFF(motorola byte order)", "JPC", "JP2", "JPX", "JB2", "SWC", "IFF", "WBMP", "XBM");
    $Orientation        =    array("", "top left side", "top right side", "bottom right side", "bottom left side", "left side top", "right side top", "right side bottom", "left side bottom");
    $ResolutionUnit        =    array("", "", "英寸", "厘米");
    $YCbCrPositioning    =    array("", "the center of pixel array", "the datum point");
    $ExposureProgram    =    array("未定义", "手动", "标准程序", "光圈先决", "快门先决", "景深先决", "运动模式", "肖像模式", "风景模式");
    $MeteringMode_arr    =    array(
        "0"        =>    "未知",
        "1"        =>    "平均",
        "2"        =>    "中央重点平均测光",
        "3"        =>    "点测",
        "4"        =>    "分区",
        "5"        =>    "评估",
        "6"        =>    "局部",
        "255"    =>    "其他"
        );
    $Lightsource_arr    =    array(
        "0"        =>    "未知",
        "1"        =>    "日光",
        "2"        =>    "荧光灯",
        "3"        =>    "钨丝灯",
        "10"    =>    "闪光灯",
        "17"    =>    "标准灯光A",
        "18"    =>    "标准灯光B",
        "19"    =>    "标准灯光C",
        "20"    =>    "D55",
        "21"    =>    "D65",
        "22"    =>    "D75",
        "255"    =>    "其他"
        );
    $Flash_arr            =    array(
        "0"        =>    "flash did not fire",
        "1"        =>    "flash fired",
        "5"        =>    "flash fired but strobe return light not detected",
        "7"        =>    "flash fired and strobe return light detected",
        );
 
    $exif = exif_read_data ($img,"IFD0");
    if ($exif===false) {
        $new_img_info    =    array ("文件信息"        =>    "没有图片EXIF信息");
    }
    else
    {
        $exif = exif_read_data ($img,0,true);
        $new_img_info    =    array (
            "文件信息"        =>    "-----------------------------",
            "文件名"        =>    $exif[FILE][FileName],
            "文件类型"        =>    $imgtype[$exif[FILE][FileType]],
            "文件格式"        =>    $exif[FILE][MimeType],
            "文件大小"        =>    $exif[FILE][FileSize],
            "时间戳"        =>    date("Y-m-d H:i:s",$exif[FILE][FileDateTime]),
            "图像信息"        =>    "-----------------------------",
            "图片说明"        =>    $exif[IFD0][ImageDescription],
            "制造商"        =>    $exif[IFD0][Make],
            "型号"            =>    $exif[IFD0][Model],
            "方向"            =>    $Orientation[$exif[IFD0][Orientation]],
            "水平分辨率"    =>    $exif[IFD0][XResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],
            "垂直分辨率"    =>    $exif[IFD0][YResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],
            "创建软件"        =>    $exif[IFD0][Software],
            "修改时间"        =>    $exif[IFD0][DateTime],
            "作者"            =>    $exif[IFD0][Artist],
            "YCbCr位置控制"    =>    $YCbCrPositioning[$exif[IFD0][YCbCrPositioning]],
            "版权"            =>    $exif[IFD0][Copyright],
            "摄影版权"        =>    $exif[COMPUTED][Copyright.Photographer],
            "编辑版权"        =>    $exif[COMPUTED][Copyright.Editor],
            "拍摄信息"        =>    "-----------------------------",
            "Exif版本"        =>    $exif[EXIF][ExifVersion],
            "FlashPix版本"    =>    "Ver. ".number_format($exif[EXIF][FlashPixVersion]/100,2),
            "拍摄时间"        =>    $exif[EXIF][DateTimeOriginal],
            "数字化时间"    =>    $exif[EXIF][DateTimeDigitized],
            "拍摄分辨率高"    =>    $exif[COMPUTED][Height],
            "拍摄分辨率宽"    =>    $exif[COMPUTED][Width],
            /*
            The actual aperture value of lens when the image was taken.
            Unit is APEX.
            To convert this value to ordinary F-number(F-stop),
            calculate this value's power of root 2 (=1.4142).
            For example, if the ApertureValue is '5', F-number is pow(1.41425,5) = F5.6.
            */
            "光圈"            =>    $exif[EXIF][ApertureValue],
            "快门速度"        =>    $exif[EXIF][ShutterSpeedValue],
            "快门光圈"        =>    $exif[COMPUTED][ApertureFNumber],
            "最大光圈值"    =>    "F".$exif[EXIF][MaxApertureValue],
            "曝光时间"        =>    $exif[EXIF][ExposureTime],
            "F-Number"        =>    $exif[EXIF][FNumber],
            "测光模式"        =>    GetImageInfoVal($exif[EXIF][MeteringMode],$MeteringMode_arr),
            "光源"            =>    GetImageInfoVal($exif[EXIF][LightSource], $Lightsource_arr),
            "闪光灯"        =>    GetImageInfoVal($exif[EXIF][Flash], $Flash_arr),
            "曝光模式"        =>    ($exif[EXIF][ExposureMode]==1?"手动":"自动"),
            "白平衡"        =>    ($exif[EXIF][WhiteBalance]==1?"手动":"自动"),
            "曝光程序"        =>    $ExposureProgram[$exif[EXIF][ExposureProgram]],
            /*
            Brightness of taken subject, unit is APEX. To calculate Exposure(Ev) from BrigtnessValue(Bv), you must add SensitivityValue(Sv).
            Ev=Bv+Sv   Sv=log((ISOSpeedRating/3.125),2)
            ISO100:Sv=5, ISO200:Sv=6, ISO400:Sv=7, ISO125:Sv=5.32.
            */
            "曝光补偿"        =>    $exif[EXIF][ExposureBiasValue]."EV",
            "ISO感光度"        =>    $exif[EXIF][ISOSpeedRatings],
            "分量配置"        =>    (bin2hex($exif[EXIF][ComponentsConfiguration])=="01020300"?"YCbCr":"RGB"),//'0x04,0x05,0x06,0x00'="RGB" '0x01,0x02,0x03,0x00'="YCbCr"
            "图像压缩率"    =>    $exif[EXIF][CompressedBitsPerPixel]."Bits/Pixel",
            "对焦距离"        =>    $exif[COMPUTED][FocusDistance]."m",
            "焦距"            =>    $exif[EXIF][FocalLength]."mm",
            "等价35mm焦距"    =>    $exif[EXIF][FocalLengthIn35mmFilm]."mm",
            /*
            Stores user comment. This tag allows to use two-byte character code or unicode. First 8 bytes describe the character code. 'JIS' is a Japanese character code (known as Kanji).
            '0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00':ASCII
            '0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00':JIS
            '0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00':Unicode
            '0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00':Undefined
            */
            "用户注释编码"    =>    $exif[COMPUTED][UserCommentEncoding],
            "用户注释"        =>    $exif[COMPUTED][UserComment],
            "色彩空间"        =>    ($exif[EXIF][ColorSpace]==1?"sRGB":"Uncalibrated"),
            "Exif图像宽度"    =>    $exif[EXIF][ExifImageLength],
            "Exif图像高度"    =>    $exif[EXIF][ExifImageWidth],
            "文件来源"        =>    (bin2hex($exif[EXIF][FileSource])==0x03?"digital still camera":"unknown"),
            "场景类型"        =>    (bin2hex($exif[EXIF][SceneType])==0x01?"A directly photographed image":"unknown"),
            "缩略图文件格式"    =>    $exif[COMPUTED][Thumbnail.FileType],
            "缩略图Mime格式"    =>    $exif[COMPUTED][Thumbnail.MimeType]
        );
    }
    return $new_img_info;
}
 
//Example
 
print_r(GetImageInfo("DSC00596.JPG"));
 
?>
Categories: 分享 Tags:

linux系统dig和nslookup的安装2+

52,032 views / 2010.01.28 / 1:01 下午

nslookup是常用来查询本机域名解析情况的命令,但是一些linux系统下默认无此命令。我们可以通过安装一个包来使该命令生效,这个包中也包括dig命令。

Ubuntu:

# sudo apt-get install dnsutils

Debian:

# apt-get update
# apt-get install dnsutils

Fedora / Centos:

# yum install bind-utils
Categories: 分享 Tags: , ,

php curl cookie 存取示例1+

29,537 views / 2009.12.02 / 1:01 下午

好多人发来消息询问curl存取cookie文件的问题,杜工并不觉得这是个难点,因为只看手册就可以很容易把握。下面给个例子,看完后就全都明了了:

<?php
$cookie_jar_index = 'cookie.txt';
 
$url = "http://www.71j.cn/perl/login.pl";
$params = "username=dudu&password=****";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar_index);
//curl_setopt($ch, CURLOPT_COOKIE, "fruit=apple; colour=red");
//上面代码是直接传递cookie信息,而非文件
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
//curl_setopt($ch, CURLOPT_NOBODY, 1);//这个不能打开,否则无法生成cookie文件
ob_start();
curl_exec($ch);
curl_close($ch);
ob_clean();
 
$url = "http://www.71j.cn/perl/myfavorites.pl";
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, $url);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar_index);
ob_start();
curl_exec($ch2);
curl_close($ch2);
$rs = ob_get_contents(); //$rs就是返回的内容
ob_clean();
 
print_r($rs);
 
?>
Categories: 分享 Tags: , ,

范式设计简单介绍(二)0+

11,482 views / 2009.09.08 / 1:01 下午

1.3] Third Normal Form(3NF)

3NF 要求所有的属性都直接依赖于 primary key。3NF 和 2NF 最大的不同之处是,2NF 有依赖传递性,而 3NF 不准许。

例如,有一个符合 2NF 的表:

错误方式:

+———————+———–+—————-+———–+———-+——————

..some属性s | 用户号 | 用户发表文章数 | 用户登录数| 用户积分 | other 列 …

+———————+———–+—————-+———–+—————————–

…… | ID_001 | 4 | 20 | 13 | ……

+———————+———–+—————-+———–+———-+——————

用户积分规则:用户发表文章数 x 2 + 用户登录数 /4

在 3NF 中是不符合的。因为‘用户积分’是通过‘用户发表文章数’和‘用户登录数’,用公式计算得来的。也就是说,‘用户积分’依赖于‘用户发表文章数’和‘用户登录数’。

3NF 符合的划分方式是:

正确方式:

+———————+———–+—————-+———–+——————-

..some属性s | 用户号 | 用户发表文章数 | 用户登录数| other 列 …

+———————+———–+—————-+———–+——————-

…… | ID_001 | 4 | 20 | ……

+———————+———–+—————-+———–+——————-

正确方式:

+———————+———–+———–+——————–

..some属性s | 用户号 | 用户积分 | other 列 …

+———————+———–+———–+——————–

…… | ID_001 | 13 | ……

+———————+———–+———–+——————–

用户积分规则不变

需要注意的是,虽然 3NF 更加清楚地将用户资料和用户积分这两个关系表示了出来。但是在需要联合查询用户资料和积分的情况下,在大多数 RDBMS 如 MySQL 中,会造成性能消耗严重的情况。进一步讨论在 1.4 中进行。

1.3.1] Joining 关系

关系之间相互关联的方式有两种:INNER JOIN 和 OUTER JOIN

INNER JOIN 查询会返回两个关系完全匹配的情况,MYSQL 默认的匹配方式为 INNER JOIN 。

如果你希望查询的结果即使没有匹配也会被查询出来,那么就要使用 OUTER JOIN 的连接方式。OUTER JOIN 又细分为三种:LEFT OUTER JOIN, RIGHT OUTER JOIN 和 FULL OUTER JOIN 。

LEFT OUTER JOIN 是将左边的查询关系作为主关系,如果右面的关系有相匹配的 tuple , 那么处理方式和 INNER JOIN 一样;如果右面的关系没有与左边的关系相匹配,那么属性就会列出一个 NULL 的值。

RIGHT OUTER JOIN 的处理方式与 LEFT OUTER JOIN 类似,只不过是以右面的关系为主 关系。

FULL OUTER JOIN 与 INNER JOIN 的显示结果相同。

1.3.2] BCNF

修正的第三范式(BCNF) 全称 Boyce-Codd normal form 。是 3NF 的一个拓展,所以 BCNF 的前提和 3NF 是一样的:关系 必须符合 2NF ,并且有 KEY 可以用来相互关联。并不是所有符合 2NF 的关系都可以划分为 BCNF。

BCNF 简单来说,就是所有的 tuple 都依赖于 candidate key 或者这个 tuple 是 superkey 。因此所有的 tuple 都依赖于 key,从而避免了传递依赖问题。

1.4] NF 设计与性能消耗

NF 理论在设计之初,主要是为了应付数据冗余与存储重复而出的。当越来越庞大的数据库应用出现时,高度设计的 NF 带来的好处与性能所带来的坏处相互抵消了。因为通常,越高层次的 NF 会划分越多的 关系,从而查询出所需要的数据就需要更多的 join 操作。虽然 view 在一定程度上可以解决这个问题,但是视图本身也是一个不小的性能消耗。

如果一个 MySQL 执行的多是 SQL-Transaction 的话,那么使用高层次的 NF 设计就显得尤为必要,因为书写 transaction 的 SQL 语言通常都不适于做复杂的过程处理,而高层次的 NF 设计可以在逻辑上更清楚的划分关系,从而较少的操作关系之间的关系处理,较多的操作关系之间的数据。

而如果一个 MySQL 在应用中 ,更多的是扮演数据存储与统计的操作,那么高层次的 NF 设计就没有必要。因为此类应用中,通常都搭配使用高级编程语言,而高级编程语言灵活多样,在逻辑、过程与数据的处理过程中,都要比 SQL 更加的强壮。

1.5] NF 与 SQL 的关系

SQL 语言是为了结构化的查询数据而发明的一种机器查询语言。主要的功能是查询,兼顾数据定义与控制的功能。

SQL 大致可以分为三类:

1.5.1] Data Manipulation Language (DML)

DML 主要用来 查/删/改/插关系的 tuple 。他们共同的特点是都需要指定作用的关系和关系之间的关系。

1.5.1.1] Select

Select 用来查询关系中的 tuple 包括:

Select : 后面跟属性,作用是控制查询的输出。

From : 后面跟关系与 joins ,作用是控制与关联关系之间的关系。

Where : 后面跟属性的限制语句,主要是用来划分查询的区域。

Group By : 后面跟属性,主要用来将相似的属性分成单一的结果集。

Having : 与 Where 作用相同,作用域为 Group By 控制的结果集。

Order By: 用来将最后筛选出来的结果集,通过某一 tuple 来进行排序。

具体作用详见:1.2.1]

1.5.1.2] Insert

Insert 用来插入 tuple。具体作用详见:1.2.2]

1.5.1.3] Update

Update 用来更新 tuple 。具体作用详见:1.2.3]

1.5.1.4] Delete

Delete 用来删除 tuple 。作用域与 Select 类似,但是不返回查询的 tuple。

1.5.2] Data Definition Language (DDL)

DDL 的作用是创建关系与定义关系中的属性。主要包括三大部分:

1.5.2.1] CREATE

创建语句,可以用来创建 Database、关系、transaction(祥见 1.2.4) 等。根据需要创建的类型不同,语句稍有差别。

1.5.2.2] DROP

删除语句,与 CREATE 语句相反。

1.5.2.3] ALTER

修改关系和 Transaction 。

1.5.3] Data Control Language (DCL)

DCL 的作用是用来控制关系和属性的权限。主要有两部分:

1.5.3.1] GRANT

用来创建访问关系与属性的权限

1.5.3.2] REVOKE

用来删除访问关系与属性的权限

原文作者:韩述 杜工稍作修改。

Categories: 分享 Tags: ,