最近通过了新浪云计算SAE高级开发者认证

发表于

从申请到拿到证书,完成认证,将近一个月的时间.

通过高级认证之后每个月会自动把云豆补满到1.5万,也就是说我以后基本上可以完全免费使用SAE的资源了,嘿嘿.

支持JAVA,PYTHON,PHP等语言,相当于一个免费的虚拟主机,但比虚拟主机更加强大.

也可以绑米,可惜我的域名没有备案,绑定之后访问速度太慢,也许以后要想个法子去备个案.这样就方便多了.

SAE的访问速度也很快,关键是稳定,安全.

更多关于SAE的资料可以去官网查看一下,

http://sae.sina.com.cn/

另外SAE是根据资源使用情况计费的,可以针对每个应用设置每天的限额.

根据我的使用情况,访问量不大的个人主页,一个月大概300云豆就足够了.也就是3元.一年才36,顶多就50元.比虚拟主机靠普多了.

我最早接触的是GAE,也就是Google的,大家都知道的,在国内想正常使用Google的服务是不太可能的而且很麻烦的,所以以前只是申请了没有怎么用.

现在云计算是一个趋势,像百度云,阿里云,等,大家都在云上飘,我也要顺风而上,体验一下云.^_^

[记录] VPS 初步接触

发表于

最近从PzEA入手一个xen VPS,从网上搜到的优惠链接(PzEa给力特价VPS 256M Xen VPS 2.5美元 洛杉矶和圣何塞机房)购买的,以下是购买时可以看到的配置信息。实际上硬盘是10G的。够用了

  • CPU:单核
  • 内存:256M
  • 硬盘:10G
  • 流量:250G
  • IPs:1IPv4
  • 架构:xen
  • 可选系统:linux

用人民币购买1年是162.5元,用美元是$25,按照目前的汇率(太概是155人民币)用美元购买会便宜一些,如果有双币种信用卡可以用美元,否则还是老老实实用支付宝,这个价格比一般的虚拟主机还划算,付完款之后就立即开通了,

开通之后只安装了一个系统,其它的都需要自己配置.

为了方便先装一个管理面板,从网上搜了一下感觉AMH挺不错的就它了.很方便,装上之后基本就可以使用了.

用SSH连接VPS的IP地址,然后按照官方的安装方法

wget http://amysql.com/file/AMH/3.1/amh.sh; chmod 775 amh.sh; ./amh.sh 2>&1 | tee amh.log;

然后就是漫长的等待了.太概20分钟左右的样子.完成之后再用

http://ip:8888 进入管理面板

里面可以管理虚拟主机,FTP/MYSQL等.挺方便的.

然后想怎么折腾就怎么折腾吧,别忘了VPS安全,使用iptables设置一下规则.(都可以从Google上找到)

这个比较适合有一定LINUX基础的人练手,有独立IP可以做很多事情….

申请了一个免费的tk域名先装一个typecho来测试一下.

http://xvps.tk/

嘿嘿,有了这个就相当于有了一台属于自己的永不断电的电脑了.以后又有得折腾了.^_^

[PHP] 打算整合多个网盘资源

发表于

目前有N多的网络硬盘,各有各的好处和优缺点.另外基本上都有开放API.只是API调用方法都不一样.若是可以让所有网盘的调用方法变得一致.这样一来如是要开发什么的都很方便了.一个网盘不行了就换一个,什么代码都不用改.

HOHO~~~应该有搞头吧,

这里的金山快盘SDK就是一个原型http://chenall.net/post/sdk_kp_php/

最终我希望所有的网盘都可以这样子来调用

$disk = 'kuaipan';
$fs = new $disk(CONSUMER_KEY,CONSUMER_SECRET);
$fs->ls();

这样一来,批量管理网盘就变得容易了.一个文件可以同时上传到N个网盘. 不知有没有支持的?

以后有空再放个DEMO出来.

EDIT: 由于时间还有个人精力有限,搁浅了…

单文件程序制作利器Cameyo更新

发表于

本站的软件大部份是使用该软件制作的.

Cameyo News

Version 2.0.873 is out

  • Improved Windows 8 support
  • Automatically notifies about new Cameyo versions
  • New languages

    If you don’t already have it, download it now

Coming soon(看到以下内容了吗?太赞了.期待新的版本)

Our upcoming major version will:

  • Be FAST
  • Include execute-from-memory mode (no files pre-extraction)
  • Store program files separately from data / modified files
  • Support auto-updating for virtual applications
  • Allow password protection against package editing
  • Be Terminal Servers friendly
  • Contain many more things we can’t tell you just yet!

Online App Library
Access your personal Favorite apps, from anywhere
Our unique online packager

金山快盘PHP SDK(普通版+简化版)[2013-04-12]

发表于

金山快盘开放平台 PHP SDK

来源: 金山快盘PHP SDK(普通版+简化版)[2013-04-12]
时间: 2013-04-12
使用方法:

有两个版本,一个是普通版kuaipan.class.php,一个是简化版(简化操作)kp.class.php

可以根据自己的需要选择使用。

  1. 首先初化始一个类.
    kp = new KuaiPan(CONSUMER_KEY,CONSUMER_SECRET);
    
  2. 通用API调用方法
    $kp->APINAME($params,$path)
    

其中$params是参数列表,可以使用字符串方式也可以使用组数的方式。不需要参数可以留空。
$path,路径,部份API需要带路径信息,可以加上,该参数可以省略。
如果不需要参数直接留空就行了。
例子:

$kp->metadata()
$kp->metadata('','/mytest');
$kp->upload_file(array('overwrite'=>"true",'root'=>'app_folder','path'=>'/test.txt'),array('file'=>'@/test.php;filename=test.txt'));

调用API正常的话返回一个JSON OBJECT数据,否则会设置变量$kp->errstr.
只要判断$kp->errstr是否为空就可以知道调用是否成功了。

目前可使用API,按官方SDK的命名方式

  • account_info
  • metadata
  • history
  • shares
  • create_folder
  • delete
  • move
  • copy
  • copy_ref
  • upload_locate
  • download_file
  • download_file_by_id
  • upload_file
  • upload_file_by_id
  • thumbnail
  • documentView
  • requestToken
  • accessToken

关于params参数可以自己上官网查看

http://www.kuaipan.cn/developers/document.htm

SDK简化版说明 kp.class.php

  1. 授权
    $oauth = $kp->OAuth();
    
    打开一个窗口供用户信息授权信息,然后返回。
    授权成功后自己请保存以下OAUTH信息,下次可以直接使用。
    $oauth->oauth_token
    $oauth->oauth_token_secret
    
    以后可以直接使用下面的方法不需要再次授权。
    $kp->oauth_token = $oauth->oauth_token
    $kp->oauth_token_secret = $oauth->oauth_token_secret
    
  2. 创建文件夹
    $ret = $kp->md(PATH)
    
  3. 删除文件(夹)
    彻底删除
    $ret = $kp->rm(PATH)
    
    删除到回收站
    $ret = $kp->rm(PATH,"false")
    
  4. 复制文件(夹)
    $ret = $kp->cp(FROM_PATH,TO_PATH);
    
  5. 移动文件(夹)
    $ret = $kp->mv(FROM_PATH,TO_PATH);
    
  6. 下载文件
    直接下载
    $ret= $kp->download(PATH);
    
    手动下载,返回一个地址
    $ret= $kp->download(PATH,false);
    
  7. 上传文件
    $ret= $kp->upload(PATH,FILE);
    
    如果PATH路径最后字符是’/‘,认为是一个目录,上传到该目录,上传后的文件名从FILE中提取。如果PATH路径最后字符不是’/‘,认为是一个文件,上传后的文件名就是PATH指定的文件名。
    $ret= $kp->upload(PATH,FILE,true);//显示上传进度百分比
    
  8. 列出文件夹内容
    $ret= $kp->ls(PATH);
    
  9. 判断操作是否成功可以使用变量errstr
    if (empty($kp->errstr))
        echo '成功';
    else
        echo '失败'.$kp->errstr;
    

可以看一下k_test.php里面的测试实例。

最新SDK源码下载地址:

https://github.com/chenall/chenall/tree/master/sdks/kuaipan

[PHP] 简易的SMTP邮件发送类

发表于

最近由于需要发送(带大附件)的邮件,上网找了一下,像PHPMailer等试了一下,虽然封装得很好,但是用起来都不太顺手。

像PHPMailer发送大附件时就会提示类似如下的错误:
Allowed memory size of 16777216 bytes exhausted (tried to allocate 7355049 bytes)

我分配了128MB的内存发送个20MB的附件都不行,把内存加到512可以了,说明这个PHPMailer太占用内存了。可能是和PHPMail的封装有关,因为数据要转来转去的,很占用内存。

去看了一下SMTP协议,才发现原来用SMTP协议发送邮件是如此的简单。

可以使用TELNET 命令验证
以下是使用TELNET命令发送一个邮件的过程记录,红色是输入的内容,绿色是注释。

TELNET SMTP.QQ.COM 25

220 smtp.qq.com Esmtp QQ Mail Server

HELO LOCALHOST 首先需要发送HELO或EHLO命令

250 smtp.qq.com

AUTH LOGIN SMTP用户验证

334 VXNlcm5hbWU6 BASE64解码后: Username:就是告诉你要输入使用BASE64编码的用户名

经过BASE64编码的用户名

334 UGFzc3dvcmQ6 BASE64解码后: Password:

经过BASE64编码的密码

235 Authentication successful 验证通过

MAIL FROM: 发送者邮件地址要和上面的用户名一样

250 Ok

RCPT TO: 接收者邮件地址

250 Ok

DATA 告诉服务器我要开始发送邮件数据了

354 End data with <CR><LF>.<CR><LF> 告诉你要使用 <CR><LF>.<CR><LF>即PHP的”\r\n.\r\n”来告之服务器已经完成了。这里只是简单的发送了一些字符信息,先输入一个回车,然后你要发送的内容,完成之后再按回车,接首输入”.”再回车完成数据发送。

abcdtest

aass

.

250 Ok: queued as

QUIT

退出

然后就可以到你的邮箱中去看看有没有收到刚发送的邮件。
明白了发送原理就可以去写代码来实现了。这里用的是fsock方式。使用PHP写了一个很简单的SMTP类,可以发送带附件的邮件。需要的可以拿去用。

使用github托管源码,可以从以下地方下载最新版本源码。
https://github.com/chenall/chenall/tree/master/cs_smtp

<?php

/*
    简易的SMTP发送邮件类,代码比较少,有助于学习SMTP协议,
    可以带附件,支持需要验证的SMTP服务器(目前的SMTP基本都需要验证)
    编写: chenall
    时间: 2012-12-04
    网址: http://chenall.net/post/cs_smtp/
    修订记录:
        2012-12-08
            添加AddURL函数,可以直接从某个网址上下载文件并作为附件发送。
            修正由于发送人和接收人邮件地址没有使用"<>"126邮箱SMTP无法使用的问题。
        2012-12-06
            添加reset函数,重置连接,这样可以发送多个邮件。
        2012-12-05
           发送附件的代码整合到send函数中,减少变量的使用,快速输出,节省内存占用;
        2012-12-04
           第一个版本

    使用方法:

        1. 初始化:连接到服务器(默认是QQ邮箱)
           $mail = new cs_smtp('smtp.qq.com',25)
           if ($mail->errstr) //如果连接出错
               die($mail->errstr;
        2. 登录到服务器验证,如果失败返回FALSE;
           if (!$mail->login('USERNAME','PASSWORD'))
                die($mail->errstr;
        3. 添加附件如果不指定name自动从指定的文件中取文件名
           $mail->AddFile($file,$name) //服务器上的文件,可以指定文件名;
        4. 发送邮件
            $mail->send($to,$subject,$body)
            $to 收件人,多个使用','分隔
            $subject 邮件主题,可选。
            $body  邮件主体内容,可选
*/
class cs_smtp
{
    private $CRLF = "\r\n";
    private $from;
    private $smtp = null;
    private $attach = array();
    public $debug = true;//调试开关
    public $errstr = '';

    function __construct($host='smtp.qq.com',$port = 25) {
        if (empty($host))
            die('SMTP服务器未指定!');
        $this->smtp = fsockopen($host,$port,$errno,$errstr,5);
        if (empty($this->smtp))
        {
            $this->errstr = '错误'.$errno.':'.$errstr;
            return;
        }
        $this->smtp_log(fread($this->smtp, 515));
        if (intval($this->smtp_cmd('EHLO '.$host)) != 250 && intval($this->smtp_cmd('HELO '.$host)))
            return $this->errstr = '服务器不支持!';
        $this->errstr = '';
    }

    private function AttachURL($url,$name)
    {
        $info = parse_url($url);
        isset($info['port']) || $info['port'] = 80;
        isset($info['path']) || $info['path'] = '/';
        isset($info['query']) || $info['query'] = '';
        $down = fsockopen($info['host'],$info['port'],$errno,$errstr,5);
        if (!$down)
            return false;
        $out = "GET ".$info['path'].'?'.$info['query']." HTTP/1.1\r\n";
        $out .="Host: ".$info['host']."\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($down, $out);
        $filesize = 0;
        while (!feof($down)) {
            $a = fgets($down,515);
            if ($a == "\r\n")
                break;
            $a = explode(':',$a);
            if (strcasecmp($a[0],'Content-Length') == 0)
                $filesize = intval($a[1]);
        }
        $sendsize = 0;
        echo "TotalSize: ".$filesize."\r\n";
        $i = 0;
        while (!feof($down)) {
            $data = fread($down,0x2000);
            $sendsize += strlen($data);
            if ($filesize)
            {
                echo "$i Send:".$sendsize."\r";
                ob_flush();
                flush();
            }
            ++$i;
            fwrite($this->smtp,chunk_split(base64_encode($data)));
        }
        echo "\r\n";
        fclose($down);
        return ($filesize>0)?$filesize==$sendsize:true;
    }

    function __destruct()
    {
        if ($this->smtp)
            $this->smtp_cmd('QUIT');//发送退出命令
    }

    private function smtp_log($msg)//即时输出调试使用
    {
        if ($this->debug == false)
            return;
        echo $msg."\r\n";
        ob_flush();
        flush();
    }

    function reset()
    {
        $this->attach = null;
        $this->smtp_cmd('RSET');
    }

    function smtp_cmd($msg)//SMTP命令发送和收收
    {
        fputs($this->smtp,$msg.$this->CRLF);
        $this->smtp_log('SEND:'. substr($msg,0,80));
        $res = fread($this->smtp, 515);
        $this->smtp_log($res);
        $this->errstr = $res;
        return $res;
    }

    function AddURL($url,$name)
    {
        $this->attach[$name] = $url;
    }

    function AddFile($file,$name = '')//添加文件附件
    {
        if (file_exists($file))
        {
            if (!empty($name))
                return $this->attach[$name] = $file;
            $fn = pathinfo($file);
            return $this->attach[$fn['basename']] = $file;
        }
        return false;
    }

    function send($to,$subject='',$body = '')
    {
        $this->smtp_cmd("MAIL FROM: <".$this->from.'>');
        $mailto = explode(',',$to);
        foreach($mailto as $email_to)
            $this->smtp_cmd("RCPT TO: <".$email_to.">");
        if (intval($this->smtp_cmd("DATA")) != 354)//正确的返回必须是354
            return false;
        fwrite($this->smtp,"To:$to\nFrom: ".$this->from."\nSubject: $subject\n");

        $boundary = uniqid("--BY_CHENALL_",true);
        $headers = "MIME-Version: 1.0".$this->CRLF;
        $headers .= "From: <".$this->from.">".$this->CRLF;
        $headers .= "Content-type: multipart/mixed; boundary= $boundary\n\n".$this->CRLF;//headers结束要至少两个换行
        fwrite($this->smtp,$headers);

        $msg = "--$boundary\nContent-Type: text/html;charset=\"ISO-8859-1\"\nContent-Transfer-Encoding: base64\n\n";
        $msg .= chunk_split(base64_encode($body));
        fwrite($this->smtp,$msg);
        $files = '';
        $errinfo = '';
        foreach($this->attach as $name=>$file)
        {
            $files .= $name;
            $msg = "--$boundary\n--$boundary\n";
            $msg .= "Content-Type: application/octet-stream; name=\"".$name."\"\n";
            $msg .= "Content-Disposition: attachment; filename=\"".$name."\"\n";
            $msg .= "Content-transfer-encoding: base64\n\n";
            fwrite($this->smtp,$msg);
            if (substr($file,4,1) == ':')//URL like http:///file://
            {
                if (!$this->AttachURL($file,$name))
                    $errinfo .= '文件下载错误:'.$name.",文件可能是错误的\r\n$file";
            }
            else
                fwrite($this->smtp,chunk_split(base64_encode(file_get_contents($file))));//使用BASE64编码,再用chunk_split大卸八块(每行76个字符)
        }
        if (!empty($errinfo))
        {
            $msg = "--$boundary\n--$boundary\n";
            $msg .= "Content-Type: application/octet-stream; name=Error.log\n";
            $msg .= "Content-Disposition: attachment; filename=Error.log\n";
            $msg .= "Content-transfer-encoding: base64\n\n";
            fwrite($this->smtp,$msg);
            fwrite($this->smtp,chunk_split(base64_encode($errinfo)));
        }
        return intval($this->smtp_cmd("--$boundary--\n\r\n.")) == 250;//结束DATA发送,服务器会返回执行结果,如果代码不是250则出错。
    }

    function login($su,$sp)
    {
        if (empty($this->smtp))
            return false;
        $res = $this->smtp_cmd("AUTH LOGIN");
        if (intval($res)>400)
            return !$this->errstr = $res;
        $res = $this->smtp_cmd(base64_encode($su));
        if (intval($res)>400)
            return !$this->errstr = $res;
        $res = $this->smtp_cmd(base64_encode($sp));
        if (intval($res)>400)
            return !$this->errstr = $res;
        $this->from = $su;
        return true;
    }
}

使用共享打印机的另一个方案

发表于

一直都懒得写文章,嘿嘿,抽空把一些日常工作中用到的实用功能分享一下,也许会有人需要.

一般情况下使用共享打印机都是直接输入计算机名或IP然后双击那个共享的打印机进行安装,这个方法比较简单.

但是有一些软件它必须使用LPT端口来打印,这时就没有办法用共享了,这里介绍另一种安装方法,可以解决这类问题.如果你早就知道了可以跳过,因为可能是一样的方法.

例子: 有一个条码打印机 OS-214的,使用佳为软件的标签打印,如果是本机的打印一切正常,但是如果使用上面的共享打印就不行了,因为它是直接写LPT端口的.

解决方法:

  1. 在装有条码打印机的机子上把这个打印机设为共享比如名为LABEL
  2. 在需要使用的机子上映射并安装这个共享打印机

    例子,有装打印机的电脑IP是192.168.0.5,共享名为LABEL
    在需要使用的机子上直接输入以下命令先进行共享映射.

     net use LPT1: \\192.168.0.5\LABEL /PERSISTENT:YES
    

    成功之后就可以把这个打印机当成本地的来使用了,只要再本地添加新打印机就行了,端口选择LPT1,驱动就是对应的驱动.

  3. 装完了可以打印一下测试页,如果正常的话就OK了,否则请查看是不是哪一步出错了.
  4. 其它机子只要重复用2-3的方法依次安装就行了.

再试试看,是不是可以了.

用这个方法也可以把USB端口等的打印机转换成LPT端口(只要全部在同一机子上操作就行了),因为某些软件必须使用LPT端口.

使用PHP+CURL搭建一个简易的HTTP代理服务端[2012-12-17]

发表于

使用PHP做的一个简易HTTP代理服务端,没有多少技术含量.有时可以利用一下.嘿嘿.比如在公司内部可以用它来偷偷上网,当然了要求了内部网站,并且支持PHP而且该服务器可以上网,你还要有办法访问到这个电脑.

最初我是利用它来抓取数据包用的,通过代理可以在代理服务器上抓取到所有发送和接收的数据包,所以使用别人的代理时需要注意,因为别人可以截获/修改你发送的数据包,

要求: 有独立IP,支持PHP+CURL.

PHP相关记录

发表于
  1. PHP Curl 417 Expectation Failed
    原因: 服务端使用lighttpd,而lighttp不支持返回”Expect: 100-continue”这样的header,就会以417 “Expectation failed” 来代替(lighttpd 1.5.0无此问题)。
    解决方法:更新到新版或设置CURL头信息CURLOPT_HTTPHEADER=>array(‘Expect:’);
  2. 使用MYSQLI或PDO来代替MYSQL
    相关文章,http://php.sinaapp.com/manual/zh/mysqlinfo.api.choosing.php
    通过对比可以发现使用MYSQLI或PDO_MYSQL更容易移植.操作起来也更方便.
  3. MYSQL数据库查询语句优化
    如下例子第二句比第一句速度更快,当然了,两个命令显示的结果是不一样的,具体可以查一下相关资料,只是大部份情况下都可以用join命令来优化.
    select * from t1,t2 where t1.id=t2.id
    select * from t1 left join t2 using(id)
    
  4. 在线PHP手册国内镜像站点
    http://php.sinaapp.com/manual/zh/

    http://cn2.php.net
  5. PHP使用CURL时显示上下传进度的方法
    function curl_progress($download_size, $downloaded, $upload_size,$uploaded)
    {//PHP手册上的说明有误,其实应该是四个参数。如本例。
        if ($download_size)
            echo "D:".(round(($downloaded100)/$download_size,2))."%\t\r";
        else if ($upload_size)
            echo "U:".(round(($uploaded100)/$upload_size,2))."%\t\r";
        return 0;
    }
    $curl_opts = array(CURLOPT_URL => $url,
        CURLOPT_PROGRESSFUNCTION=> ‘curl_progress’,
        CURLOPT_NOPROGRESS => false);
    $curl = curl_init();
    curl_setopt_array ($curl, $curl_opts);
    $ret = curl_exec ($curl);
    curl_close($curl);
    

关于2345网址导航

发表于

关于2345网址导航,我最早是从无忧启动论坛的推广广告中看到的,据说只要设为主页就有工资拿,

平时也不太理会它,只是帮人装机就顺手设置一下主页,应该有一年了吧,才2万左右积分.

三个月前积分被冻结,说是推广数据异常,可是我实在查不出为什么异常,申诉了几次,一直到现在还是冻结状态.

昨天的申诉结果是你的数据从一开始就存在虚假数据。请采用合理的推广方式,待数据恢复正常,方可解冻!好吧,即然你发现了一开始就存在虚拟数据,为什么不一开始就冻结,要等到积分上万了才冻结呢?

根据它的比例太概是1000:1也就是说1000积分1元.我一天的数据在100左右不过是1毛钱,如果说我是刷号的我浪费那么多时间去刷1毛钱值得吗,真要刷的话怎么也得弄个几千吧.

另外发现被冻结的也不只我一人,其中当然有部份是刷积分的.有很多像我这样的一天100左右的被冻结了,我猜测可能是因为推广的人数太少了,所以被冻结了,因为推广人数达不到它们的要求吧.

我再申诉了一次,不管结果如何,也不再管了,接下去就是全面撤销该推广链接,碰到一台电脑就撤一台吧,

建议朋友们慎用该推广,到头来很可能是白忙活一场,