2009/06/08

php探测编码

<?php

//探测编码。注意:由于gb2312,gbk,big5范围有重合,按照最小范围判断
function get_encoding($string)
{

    $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
    $re
['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
    $re
['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
    $re
['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
   
   
foreach( $re as $encoding=>$pattern )
    {

        $rstring = preg_replace($pattern, "", $string);
       
if( $rstring == "")
        {

            return $encoding;
        }

    }
    return null;
}


?>

注意:遇到内有乱码或者错误字符的情况未作测试,例如半个汉字的情形。

 

php探测字符编码

<DIV style="BACKGROUND: #fdfdfd; COLOR: black"><U>PHP语言</U>: <A
href="http://fayaa.com/code/view/1934/">Codee#1934</A></DIV>
<DIV class=source style="COLOR: #000000; FONT-FAMILY:
'[object]','Consolas','Lucida Console','Courier New';
BACKGROUND-COLOR: #f9f7ed" jQuery1244450739390="2"><SPAN style="COLOR:
#008080">&lt;?php</SPAN><BR><BR><SPAN style="COLOR: #008800;
FONT-STYLE: italic">//探测编码。注意:由于gb2312,gbk,big5范围有重合,按照最小范围判断</SPAN><BR><SPAN
style="FONT-WEIGHT: bold; COLOR: #000080">function</SPAN> <SPAN
style="COLOR: #000000">get_encoding</SPAN>(<SPAN style="COLOR:
#000000">$string</SPAN>)<BR><SPAN style="COLOR:
#000000">{</SPAN><BR>&nbsp;&nbsp;&nbsp; <SPAN style="COLOR:
#000000">$re</SPAN><SPAN style="COLOR: #000000">[</SPAN><SPAN
style="COLOR: #0000ff">&#39;utf-8&#39;</SPAN><SPAN style="COLOR:
#000000">]</SPAN> <SPAN style="COLOR: #000000">=</SPAN> <SPAN
style="COLOR: #0000ff">&quot;/[</SPAN><SPAN style="COLOR:
#0000ff">\x01</SPAN><SPAN style="COLOR: #0000ff">-</SPAN><SPAN
style="COLOR: #0000ff">\x7f</SPAN><SPAN style="COLOR:
#0000ff">]|[</SPAN><SPAN style="COLOR: #0000ff">\xc2</SPAN><SPAN
style="COLOR: #0000ff">-</SPAN><SPAN style="COLOR:
#0000ff">\xdf</SPAN><SPAN style="COLOR: #0000ff">][</SPAN><SPAN
style="COLOR: #0000ff">\x80</SPAN><SPAN style="COLOR:
#0000ff">-</SPAN><SPAN style="COLOR: #0000ff">\xbf</SPAN><SPAN
style="COLOR: #0000ff">]|[</SPAN><SPAN style="COLOR:
#0000ff">\xe0</SPAN><SPAN style="COLOR: #0000ff">-</SPAN><SPAN
style="COLOR: #0000ff">\xef</SPAN><SPAN style="COLOR:
#0000ff">][</SPAN><SPAN style="COLOR: #0000ff">\x80</SPAN><SPAN
style="COLOR: #0000ff">-</SPAN><SPAN style="COLOR:
#0000ff">\xbf</SPAN><SPAN style="COLOR: #0000ff">]{2}|[</SPAN><SPAN
style="COLOR: #0000ff">\xf0</SPAN><SPAN style="COLOR:
#0000ff">-</SPAN><SPAN style="COLOR: #0000ff">\xff</SPAN><SPAN
style="COLOR: #0000ff">][</SPAN><SPAN style="COLOR:
#0000ff">\x80</SPAN><SPAN style="COLOR: #0000ff">-</SPAN><SPAN
style="COLOR: #0000ff">\xbf</SPAN><SPAN style="COLOR:
#0000ff">]{3}/&quot;</SPAN>;<BR>&nbsp;&nbsp;&nbsp; <SPAN style="COLOR:
#000000">$re</SPAN><SPAN style="COLOR: #000000">[</SPAN><SPAN
style="COLOR: #0000ff">&#39;gb2312&#39;</SPAN><SPAN style="COLOR:
#000000">]</SPAN> <SPAN style="COLOR: #000000">=</SPAN> <SPAN
style="COLOR: #0000ff">&quot;/[</SPAN><SPAN style="COLOR:
#0000ff">\x01</SPAN><SPAN style="COLOR: #0000ff">-</SPAN><SPAN
style="COLOR: #0000ff">\x7f</SPAN><SPAN style="COLOR:
#0000ff">]|[</SPAN><SPAN style="COLOR: #0000ff">\xb0</SPAN><SPAN
style="COLOR: #0000ff">-</SPAN><SPAN style="COLOR:
#0000ff">\xf7</SPAN><SPAN style="COLOR: #0000ff">][</SPAN><SPAN
style="COLOR: #0000ff">\xa0</SPAN><SPAN style="COLOR:
#0000ff">-</SPAN><SPAN style="COLOR: #0000ff">\xfe</SPAN><SPAN
style="COLOR: #0000ff">]/&quot;</SPAN>;<BR>&nbsp;&nbsp;&nbsp; <SPAN
style="COLOR: #000000">$re</SPAN><SPAN style="COLOR:
#000000">[</SPAN><SPAN style="COLOR:
#0000ff">&#39;gbk&#39;</SPAN><SPAN style="COLOR: #000000">]</SPAN>
<SPAN style="COLOR: #000000">=</SPAN> <SPAN style="COLOR:
#0000ff">&quot;/[</SPAN><SPAN style="COLOR: #0000ff">\x01</SPAN><SPAN
style="COLOR: #0000ff">-</SPAN><SPAN style="COLOR:
#0000ff">\x7f</SPAN><SPAN style="COLOR: #0000ff">]|[</SPAN><SPAN
style="COLOR: #0000ff">\x81</SPAN><SPAN style="COLOR:
#0000ff">-</SPAN><SPAN style="COLOR: #0000ff">\xfe</SPAN><SPAN
style="COLOR: #0000ff">][</SPAN><SPAN style="COLOR:
#0000ff">\x40</SPAN><SPAN style="COLOR: #0000ff">-</SPAN><SPAN
style="COLOR: #0000ff">\xfe</SPAN><SPAN style="COLOR:
#0000ff">]/&quot;</SPAN>;<BR>&nbsp;&nbsp;&nbsp; <SPAN style="COLOR:
#000000">$re</SPAN><SPAN style="COLOR: #000000">[</SPAN><SPAN
style="COLOR: #0000ff">&#39;big5&#39;</SPAN><SPAN style="COLOR:
#000000">]</SPAN> <SPAN style="COLOR: #000000">=</SPAN> <SPAN
style="COLOR: #0000ff">&quot;/[</SPAN><SPAN style="COLOR:
#0000ff">\x01</SPAN><SPAN style="COLOR: #0000ff">-</SPAN><SPAN
style="COLOR: #0000ff">\x7f</SPAN><SPAN style="COLOR:
#0000ff">]|[</SPAN><SPAN style="COLOR: #0000ff">\x81</SPAN><SPAN
style="COLOR: #0000ff">-</SPAN><SPAN style="COLOR:
#0000ff">\xfe</SPAN><SPAN style="COLOR: #0000ff">]([</SPAN><SPAN
style="COLOR: #0000ff">\x40</SPAN><SPAN style="COLOR:
#0000ff">-</SPAN><SPAN style="COLOR: #0000ff">\x7e</SPAN><SPAN
style="COLOR: #0000ff">]|</SPAN><SPAN style="COLOR:
#0000ff">\xa1</SPAN><SPAN style="COLOR: #0000ff">-</SPAN><SPAN
style="COLOR: #0000ff">\xfe</SPAN><SPAN style="COLOR:
#0000ff">])/&quot;</SPAN>;<BR>&nbsp;&nbsp;&nbsp;
<BR>&nbsp;&nbsp;&nbsp; <SPAN style="FONT-WEIGHT: bold; COLOR:
#000080">foreach</SPAN>( <SPAN style="COLOR: #000000">$re</SPAN> <SPAN
style="FONT-WEIGHT: bold; COLOR: #000080">as</SPAN> <SPAN
style="COLOR: #000000">$encoding</SPAN><SPAN style="COLOR:
#000000">=&gt;</SPAN><SPAN style="COLOR: #000000">$pattern</SPAN>
)<BR>&nbsp;&nbsp;&nbsp; <SPAN style="COLOR:
#000000">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN
style="COLOR: #000000">$rstring</SPAN> <SPAN style="COLOR:
#000000">=</SPAN> <SPAN style="COLOR:
#000000">preg_replace</SPAN>(<SPAN style="COLOR:
#000000">$pattern</SPAN><SPAN style="COLOR: #000000">,</SPAN> <SPAN
style="COLOR: #0000ff">&quot;&quot;</SPAN><SPAN style="COLOR:
#000000">,</SPAN> <SPAN style="COLOR:
#000000">$string</SPAN>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<SPAN style="FONT-WEIGHT: bold; COLOR: #000080">if</SPAN>( <SPAN
style="COLOR: #000000">$rstring</SPAN> <SPAN style="COLOR:
#000000">==</SPAN> <SPAN style="COLOR:
#0000ff">&quot;&quot;</SPAN>)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<SPAN style="COLOR:
#000000">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<SPAN style="FONT-WEIGHT: bold; COLOR: #000080">return</SPAN> <SPAN
style="COLOR: #000000">$encoding</SPAN>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<SPAN style="COLOR: #000000">}</SPAN><BR>&nbsp;&nbsp;&nbsp; <SPAN
style="COLOR: #000000">}</SPAN><BR>&nbsp;&nbsp;&nbsp; <SPAN
style="FONT-WEIGHT: bold; COLOR: #000080">return</SPAN> <SPAN
style="FONT-WEIGHT: bold; COLOR: #000080">null</SPAN>;<BR><SPAN
style="COLOR: #000000">}</SPAN><BR><BR><SPAN style="COLOR:
#008080">?&gt;</SPAN><BR></DIV>

2009/04/23

php simplexml object to array

一般使用simplexml来解析xml文档,比较方便,但有时侯需要把文档转为php的标准数组来操作。

下面写了一个函数用来把simplexml对象转换为数组,支持SimpleXMLElement和SimpleXMLIterator对象。


<?php

//simplexml文档对象转换为标准数组
function simplexml_obj2array($obj)
{   
    if( count($obj) >= 1 )
    {
        $result = $keys = array();
       
        foreach( $obj as $key=>$value)
        {  
            isset($keys[$key]) ? ($keys[$key] += 1) : ($keys[$key] = 1);
           
            if( $keys[$key] == 1 )
            {
                $result[$key] = simplexml_obj2array($value);
            }
            elseif( $keys[$key] == 2 )
            {
                $result[$key] = array($result[$key], simplexml_obj2array($value));
            }
            else if( $keys[$key] > 2 )
            {
                $result[$key][] = simplexml_obj2array($value);
            }
        }
        return $result;
    }
    else if( count($obj) == 0 )
    {
        return (string)$obj;
    }
}
?>


示例:
<?php

$string = '<?xml version="1.0" encoding="UTF-8"?> 
<root>
<name><![CDATA[三叶草]]></name>
<url><![CDATA[http://bloomandkevin.cn]]></url>
<items>
    <product>
        <name><![CDATA[三叶草]]></name>
        <url><![CDATA[http://bloomandkevin.cn]]></url>
    </product>
    <product>
        <name><![CDATA[三叶草]]></name>
        <url><![CDATA[http://bloomandkevin.cn]]></url>
    </product>
</items>
</root>
';

var_dump( simplexml_obj2array(simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA)));

?>


结果:
array(3) {
  ["name"]=>
  string(9) "三叶草"
  ["url"]=>
  string(23) "http://bloomandkevin.cn"
  ["items"]=>
  array(1) {
    ["product"]=>
    array(2) {
      [0]=>
      array(2) {
        ["name"]=>
        string(9) "三叶草"
        ["url"]=>
        string(23) "http://bloomandkevin.cn"
      }
      [1]=>
      array(2) {
        ["name"]=>
        string(9) "三叶草"
        ["url"]=>
        string(23) "http://bloomandkevin.cn"
      }
    }
  }
}


缺点:
丢失了XML节点中的属性值。

2009/04/20

Linux下PHP保持进程唯一运行


<?php

//确认进程唯一,防止死掉
function check_proc() {
    if( $pidfile = @file_get_contents("./my.pid") )
    {
        list($pid, $last_time) = explode(",", $pidfile);       
        if( $link = @readlink("/proc/{$pid}/exe") )
        {
            if( time()-$last_time > 60*60 )//1 hour
            {
                //超时KILL掉那个进程
                system("kill -9 {$pid}");
            }else{
                echo "already exist, process exit.\n";
                exit;
            }
        }
    }
    //写入当前PID信息
    file_put_contents("./my.pid", getmypid().','.time() );
}

?>


getmypid()获取进程的ID。

在PHP程序起始处运行此函数,即可确保进程唯一,且可以踢掉超时的进程。

也可以使用shell_exec("ps aux|grep ".$pid)来判断进程是否存在。对Linux越熟悉就越多方法。

2009/03/31

php一行搞定过滤字符


<?php
iconv('GBK', 'GBK//IGNORE', $file);//过滤掉错误字符,防止解析错误
?>


解决问题:如果你的文件中含有错误字符,在执行解析xml等操作时有时会引发解析错误。在解析xml文档时若头部编码为gb2312,尽量替换为gbk。

方法:iconv,将进出编码均设置为同一编码即可,加上'//IGNORE'即可。

优点:省去自己解析字串剔除错误编码,非常方便。

应用场景:

1.使用simplexml_load_file(),simplexml_load_string(),出现错误Premature end of data in tag...。改用file_get_contents(),然后iconv(),再simplexml_load_string()即可。

2.Warning: SimpleXMLElement::__construct() [function.SimpleXMLElement---construct]:
input conversion failed due to input error, bytes 0xC2 0x2E 0x20 0x20 in。。。

2009/03/23

黑莓所有按键失效

昨天我的黑莓所有按键全部失效了,原因是因为轨迹球下方的触点移位了,导致触点一直处于按下状态,所以其它按键通通无效了。

送修也是很郁闷,中关村鼎好地下一层,虽然卖家人品还好,免费给维修了。但修理的结果确实郁闷,拧裂了机壳,太暴力了,电池后盖合上还总有缝,键盘有两个键也大不如以前好使了。泪奔。。。我的882啊

以为很大的问题呢,如果知道只是这么一点小问题,我就自己在家修了。

学到一点小技巧,处理手机内屏的灰尘时,用胶带粘去即可,注意胶的粘性不可太强,否则会适得其反会把胶留在内屏里头。以前我拆了手机总是处理不掉里面的灰尘。手机在保质期内还是送修吧,别自己把问题搞大了,还无法保修。

EACCELERATOR导致Apache宕机

最近服务器总出现apache宕机,错误日志总出现类似的记录,EACCELERATOR: PHP crashed on opline...
例:
[2332] EACCELERATOR: PHP crashed on opline 73 of query() at /XXX/app/vendors/classes_common.php:294

解决办法:
1.eaccelerator.filter选项中过滤掉出错的文件。
我尝试了,但开启debug后,在日志里依然可以发现过滤文件的踪影,郁闷。

2.关掉eaccelerator。PHP5.2.6后的版本已经优化的很不错了,加上zend出的加速器,速度还可以。

配置:apache 2.2.4 + php 5.2.5 + windows server 2003



参考
[1]http://bbs.laxjyj.com/read-htm-tid-4678360.html

2009/03/21

动心是否值得?

佛云人有七苦,生、老、病、死、爱别离、怨憎会、求不得。

2009/03/18

在友播找王菲的《闷》居然排在后面N多页,匪夷所思,友播算是我觉得还行的网站,品味比google music稍微好那么一些,但也好不到哪里去。一个字:真烂!

公司一堆不太熟的人,唱歌实在不是什么好打算,品味差异太大了,听靡靡之音实在烦得很,来点痛快的行不?

[PHP]PDO连接MS SQL SERVER/ORACLE二三事

无法查看这则摘要。请 点击此处查看博文。

2009/03/17

Notepad++运行python、php

F5弹出运行框

Python:
cmd /k C:\Python25\python.exe "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT


PHP:
cmd /k D:/server/php/5.2.5/php.exe "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT


可以保存上述命令为快捷方式,想修改快捷键,在 "设置->管理快捷键->Run Commands" 中修改。

$(FULL_CURRENT_PATH) 的含义是当前文件的完整路径,这是 Notepad++ 的宏定义,更多的相关宏可以参见官方FAQ:Run external tools。注意要用引号括起来,防止路径中间有空格。

更多CMD命令,运行cmd.exe,敲入help命令即可。

EXIT 退出 CMD.EXE 程序(命令解释程序)。
PAUSE 暂停批文件的处理并显示消息。
ECHO.(或ECHO\) 打印换行。

参考:http://arccos.blogspot.com/2009/03/notepad-python.html

没事做了几道PHP的面试题,传说是新浪的

1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名

思路:是标准URL,应该是符合规范的。所以没有考虑复杂的情况。从左边寻找到第一次出现‘?’的位置,然后从此位置向前寻找‘.’号,中间部分既是扩展名。


<?php
function findFileTypeFromUrl( $url )
{
if( $url == "" )
  return false;

$r = strpos($url, '?');

if( $r != false )
{
  $l = strrpos( substr($url, 0, $r), '.');
  //echo '1';
  return substr($url, $l+1, $r-$l-1);
}
else
{
  $l = strrpos($url, '.');
  //echo '2';
  return substr($url, $l+1);
}
}
?>



2.在 HTML 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以下是一个标准的 meta 语句
<META http-equiv='Content-Type' content='text/html; charset=gbk'>
请使用 PHP 语言写一个函数,把一个标准 HTML 页面中的类似 meta 标记中的 charset 部分值改为 big5
请注意:
(1) 需要处理完整的 html 页面,即不光此 meta 语句
(2) 忽略大小写
(3) ' 和 " 在此处是可以互换的
(4) 'Content-Type' 两侧的引号是可以忽略的,但 'text/html; charset=gbk' 两侧的不行
(5) 注意处理多余空格

思路:这个写的比较弱,就替换而已。


<?php
function replaceCharset( $string )
{

    echo preg_replace( "/(\<meta\40+http\-equiv\=[\'|\"]?content\-type[\'|\"]?\40+content\=[\'|\"]text\/html;\40*charset\=)(gbk)[\'|\"]\40*\>/i","\${1}big5>",$string );
}


3. 写一个函数,算出两个文件的相对路径
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上

思路:从两个文件的根目录开始比较,找到不一致的地方,然后计算第一个文件需要返回至此的‘../’步数,再就是打开另一个文件的目录路径。函数返回-1表示两个路径完全一致。


<?php
function findDirDiff($a, $b)
{
    if( $a{0} != '/' || $b{0} != '/' )
    {
        return false;
    }
   
    $a_array = explode('/', $a);
    $b_array = explode('/', $b);
   
    $a_size = count($a_array)-1;
    $b_size = count($b_array)-1;
       
    for( $i=0 ; $i <= $a_size; $i++)
    {
        if( (!isset($b_array[$i])) || $a_array[$i] != $b_array[$i] )
        {
            $i--;
            break;
        }
    }
   
    $a_upSteps = $a_size - $i;
       
    if( $a_upSteps == -1)
    {
        return -1;
    }
   
    for( $i++; $i < $b_size ; $i++ )
    {
        $b_upDir .= '/'.$b_array[$i];
    }
   
    return str_repeat('../', $a_upSteps-1).substr($b_upDir,1);
}


4.简要说明PHP的垃圾回收机制

答:引用计数。引用数为零时即销毁。

5.如何高并发写文件?

答:加锁。一种可以用flock()来操作,还是就写一个xxx.lock的文件或目录作为锁。有锁时等待,写入时加锁,写完释放锁。高并发可以写入副本,再合并文件,这样会比较复杂一点。

6.找猴王。N个猴子围成一圈,从第一开始报数,1、2、3...,报M者退出,然后重新报数,M者退出,重复此操作直到剩下一只猴,此猴为猴王,问猴王的编号?

思路:猴子看成元素值为1,2,3...N的一维数组。M%N求余,余数即本轮退出者,unset()此元素,继续下一轮,直到数组元素为一,此元素的值即为猴王编号。在M%N过程中,N的数目为剩下猴子的总数,每轮递减一。PHP注意点:使用array_splice()而不是unset(),array_splice()的key值会自动计算,而unset()则保持原始的索引。

PHP语言: 找猴王

<?php
/**
* 找猴王。N个猴子围成一圈,从第一开始报数,1、2、3...,报M者退出,然后重新报数,M者退出,重复此操作直到剩下一只猴,此猴为猴王,问猴王的编号?
*/
function findKing($n, $m)
{
    $q = range(1, $n);
   
    while( ($n=count($q)) > 1 )
    {
        array_splice($q, $m%$n-1, 1);
    }
   
    return $q[0];
}

2009/03/06

沉浮的兄弟

《疯狂的赛车》插曲:搞笑黑社会之《沉浮的兄弟》。


《沉浮的兄弟》

词:芊合

曲:戎祥

踏入江湖是我的命

不是甘愿做坏子

做兄弟好过时

打刚(每天)穿金又戴银

有时嘛会手头紧

结拜兄弟逗撒挺(帮忙过难关)

那是遇到垃圾的兄弟

丫撒不鲁归大堆(烂七八糟一大堆)

谁知命运的安排

乎阮(让我)失败一次搁(又)一次

拿出兄弟的勇气

总会等到出头天


简评:

这是一首新创的闽南风格的歌曲,戎祥在电影《疯狂的赛车》中饰演一位台湾黑社会老大,就是那个胖子。为了这部电影,他创作并演唱的了这首风格独特的歌曲,使得其在剧中的人物更具喜剧和搞笑色彩,为电影增添了许多别样的味道,看过之后,依然会为那些镜头,那歌声所征服!
(以上内容均来自互联网)

2009/02/25

cookie读写类

JavaScript语言: cookie操作代码

smartclick_Cookie = {

    get: function(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = smartclick_Cookie.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    },
    set: function(key, value, ttl, path, domain, secure) {
        cookie = [key+'='+    encodeURIComponent(value),
                   'path='+    ((!path   || path=='')  ? '/' : path),
                   'domain='+  ((!domain || domain=='')?  window.location.hostname : domain)];
       
        if (ttl)         cookie.push( 'expires='+smartclick_Cookie.hoursToExpireDate(ttl));
        if (secure)      cookie.push('secure');
       
        return document.cookie = cookie.join('; ');
    },

    //@param integer    ttl        Time To Live (hours)
    hoursToExpireDate: function(ttl) {
        if (parseInt(ttl) == 'NaN' ) return '';
        else {
            now = new Date();
            now.setTime(now.getTime() + (parseInt(ttl) * 60 * 60 * 1000));
            return now.toGMTString();
        }
    },
    trim: function( text ) {
        return (text || "").replace( /^\s+|\s+$/g, "" );
    }
}

几点说明:
1.ttl生存期时间单位是小时。
2.get方法的原理是字符串匹配,对[key=]value的中括号部分进行匹配,优于使用正则进行匹配,正则如有特殊字符的情况会很麻烦。

2009/02/21

周末看了两部电影,歌舞青春3和史密斯夫妇


晚上拖着看了看《歌舞青春3》,比较喜欢这部个中文名字,还是比较感慨老美的,能拍出这样的电影。记得大宝曾经说过,青春是要挥霍的。年少时候还是感性一点嘛,这样以后能够多回忆一些东西。




《史密斯夫妇》,恩,属于老早就上映了自己一直没看的电影。08暑假才看《疯狂的石头》,觉得宁浩很NB,所以《疯狂的石头》一上映就看,肯定不后悔。喜欢朱利皮特,好莱坞模范夫妻啊,是不是挺羡慕的?


Posted by Picasa

2009/02/18

最近看了本书《赚钱机器,Money Machine》

笔记

1.财富的定义:停止你现在的工作,能够继续生存多久?

2.做有积累性的工作。无积累性的工作:有十年出租车驾龄的司机和一天驾龄的司机的价格是一样的,别人不会因为你开了十年而多付钱。

3.使用你的钱来赚钱。

4.终极目标:打造属于你的赚钱机器,最终得到财富自由和时间自由。

5.没有捷径,勤奋努力的工作吧(个人想法)。

晚上两个小时瞎倒腾,原来IE设置了代理。。。

现象
1.写python使用urllib2模块,出现如下错误:urllib2.URLError: <urlopen error (10054, 'Connection reset by peer')>。

2.朋友汇款,使用招行专业版无法登陆,具体表现为,“通讯故障(#12):(*5)请检查您的通讯线路”。

检测网络,傲游浏览器一直可以上网、试试火狐也可以、飞信一直可以使、ping命令可以ping通,纳闷啊,反复google,检查本机服务,登陆路由器更改设置、更改网络连接、关闭防火墙、切换有线无线。。。未果,后来无意点开IE,无法打开网页,不会是设置了代理了吧?果然是!顿时泪奔,一晚上就浪费了啊,还以为python有问题,真可以把IE拖出去斩了!

2009/02/14

堆排序,C版


#include <stdio.h>
#include <math.h>


#define LEFT(i)        ((i)<<1)
#define RIGHT(i)    (((i)<<1) + 1)

void max_heapify(int a[], int i, int heapsize);
void heap_sort(int a[], int heapsize);
void build_max_heap(int a[], int heapsize);
void exchange(int *x, int *y);

//交换两个数的值
void exchange(int *x, int *y) {
    int temp;

    temp = *x;
    *x = *y;
    *y = temp;
}

//保持最大堆性质
void max_heapify(int a[], int i, int heapsize) {
    int left, right, largerest;

    left = LEFT(i);
    right = RIGHT(i);

    if (left <= heapsize && a[left]>a[i])
    {
        largerest = left;
    }else{
        largerest = i;
    }

    if (right <= heapsize && a[right]>a[largerest])
    {
        largerest = right;
    }

    if(largerest != i) {
        exchange(&a[i], &a[largerest]);
        max_heapify(a, largerest, heapsize);
    }

}

//建造最大堆
void build_max_heap(int a[], int heapsize) {
    int i;

    for (i=(int)ceil(heapsize/2); i >=1 ; i--)
    {
        max_heapify(a, i, heapsize);
    }
}

//堆排序
void heap_sort(int a[], int heapsize) {

    //build heap
    build_max_heap(a, heapsize);

    while(heapsize>1)
    {
        //exchange max
        exchange(&a[1], &a[heapsize]);
        heapsize--;
        max_heapify(a, 1, heapsize);
    }
   
}

int main() {
    int a[] = {0,    2,        0,        23,        38,        19,
                    98,        203,    803,    3,        78,
                    34,        68,        49,        9,        55};
   
    int array_size = sizeof(a)/sizeof(int);
    int i,heapsize;

    heapsize = array_size - 1;

    heap_sort(a, heapsize);
   
    //打印排序后的数组
    for (i=1; i<=heapsize ; i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n");
    getchar();
    return 0;

}

2009/02/06

支持中文的截取字符函数,不同编码下中文字符的范围一目了然

有时候经常需要查找某个编码下中文字符的编码范围,下面这个函数一目了然,省事!

PHP语言: 中文截取

<?php
/*
* 中文截取,支持gb2312,gbk,utf-8,big5
*
* @param string $str 要截取的字串
* @param int $start 截取起始位置
* @param int $length 截取长度
* @param string $charset utf-8|gb2312|gbk|big5 编码
* @param $suffix 是否加尾缀
*/
public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
{
    if(function_exists("mb_substr"))
        return mb_substr($str, $start, $length, $charset);

    $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
    $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
    $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
    $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";

    preg_match_all($re[$charset], $str, $match);
    $slice = join("",array_slice($match[0], $start, $length));
    if($suffix) return $slice."…";
   
    return $slice;
}
?>

2009/01/16

2008年Erlang十大新闻【译】

原文:http://erlanginside.com/the-top-ten-erlang-news-stories-of-2008-69

以下是翻译:

不用说,2008对大多人来讲是艰苦的一年,2009看上去可能会更难过。但对于Erlang社区来讲,应该是自从Joe Armstrong发布Erlang以来最好的一年了。呃,算起来2007应该是使用Erlang的最佳时机了。下面是2008 Top Ten有关Erlang的事件,从小到大排序。我个人预言Erlang将在2009年里大显威力(This is my subjective ranking with a focus on the trends that will introduce the most number of developers to the power of Erlang in 2009.)。

10.根据IT Jobs Watch,过去的一年里,英国有关Erlang的工作岗位数翻了4倍,我相信美国也应该有相似的情况,但尚未有数据证明。

9.LangPop.com发现有关类似Erlang和Haskell的编程语言的讨论高于它们的使用(到目前为止)。比如:Erlang在讨论的频繁度上已经超过C#和Visual Basic,在SD Times已出现Erlang的封面新闻more stories on Erlang

8. Erlang Inside的出现将填补Erlang新闻站点的空白。

7.亚马逊在其SimpleDB release上更多使用了Erlang,尽管SimpleDB在2007还是beta版,直到2008才发布官方正式版。

6.Pragmatic Programmers发布一系列优秀视频演示。

5.Reia的alpha版放出。提供了包含Erlang运行环境和VM的脚本语言,这成了Erlang Inside的头条。

4.RabbitMQ,--参阅Google Talk有关RabbitMQ部分。

3.Nitrogen Web Framework for Erlang,这成为那时的封面新闻。Rusty通过发布一些展示框架威力的演示视频获得很大发展。

2.CouchDB,越来越多的用户正在选择使用。CouchDB已入住Apache Incubator。更多的人开始讨论:“你知道它是由Erlang写的吗?”。

1.最后。。。Erlang编写的Facebook的聊天室用户数到达了7000万,同时在线哦。我实在想不出有这更能展示Erlang威力的好广告了(电信应用除外)。


--------------------------------
错误之处,欢迎指正。

2009/01/14

终于回家有着落了

邰鹏帮忙买车票,连夜排队,前天晚上十点多就去北京北站,赶在队伍第二名,结果还没到。Z51,一张都没有?!这铁路真是混蛋阿,人民强烈不满意!

哎,只好和同事一起订了去上海的机票,然后坐汽车回家。

查火车票时,在网上发现了一个QQ群,盐城/东台人比较多,叫做“北漂的盐城人”,号码:1755899。

2009/01/12

curl模拟浏览器抓取URL

使用php的curl模块,模拟浏览器行为,“E:/www/pachong/cookie.txt”为cookie存放的地方。curl默认输出为PHP的标准输出php://stdout,您也可以修改输出记录的磁盘文件。


<?php
set_time_limit(0);
ob_start();

$keyWords = rawurlencode("论语");

$url = 'http://www.amazon.cn/mn/searchApp?fea=layout&ix=sunray&keywords='.$keyWords.'&searchType=&showType=3&sortType=&node=0&searchKind=keyword&uid=168-5083975-3489864';

//初始化
$ch = curl_init();

curl_setopt($ch, CURLOPT_COOKIEJAR, "E:/www/pachong/cookie.txt");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; InfoPath.1; CIBA)");
curl_setopt($ch, CURLOPT_URL, $url);

//echo header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//mark this as a new cookie "session".
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
//echo body html
curl_setopt($ch, CURLOPT_NOBODY, FALSE);

//写入磁盘文件
/*
$outputFile = fopen("E:/www/pachong/contents.txt", 'ab');
curl_setopt($ch, CURLOPT_FILE, $outputFile);
*/

curl_exec($ch);

curl_close($ch);

$content = ob_get_clean();



echo '<pre>';
echo htmlspecialchars($content);
echo '</pre>';
?>

UTF8版的wordwrap()

wordwrap()发邮件有时候会用到之,php中原生的有时候会将汉字截断,它无法识别单字节和多字节,这里写了一个utf8版的。

<?php

function wordwrap_utf8( $string, $length=75, $break="\n", $cut=false) {
    preg_match_all("/./u", $string, $matches);
    $s = $matches[0];
    $ct = count( $s );
    for($i=0; $i<ceil($ct/$length) ; $i++) {
        $ns .= implode("", array_slice($s, $i*$length, $length) ) . $break;
    }
    return $ns;
}

?>


解决了wordwrap截断汉字的问题。缺点是$cut参数无法使用,会将英文单词截断。

如何保证程序唯一运行?

以前写过如何让php程序在后台运行,客户端触发,后台方式运行PHP程序 ,但某些场合要求我们此程序只能唯一运行,只跑一个。

解决办法:
1.使用文件锁来控制
2.创建目录
上述两个操作均可保证唯一性,当然还有其他办法,查找进程中是否有同名的进程之类,不太适合php。


<?php

$fp = fopen("/tmp/lock.txt", "w+");

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
    //do something
   
   
    flock($fp, LOCK_UN); // 释放锁定
} else {
    echo "Couldn't lock the file !";
    exit();
}

fclose($fp);

?>

2009/01/09

The Great Fucking Wall !

ghs.sinoestate.com被封了,域名的CNAME无效了,博客暂不能访问,Fucking GFW。

大宝的http://tongteen.blogspot.com/可以访问。GFW天天堵啊堵,不知道防民之口胜于防川么?存在必然有其合理性。

GFW,日你娘!

2009/01/05

有点浮躁,不要急,要让自己有实力

毕业半年了,周围好几个兄弟没有继续读书,和我一样出来工作了。

现在大家遇到了一些的问题,找不到感觉,不知道自己到底要做什么,觉得待遇太低,和当初自己设想的不太一样。

都有些浮躁了。有时候浮躁是件好事情,表明有欲望,心未死(有了让儿子混好的想法时估计就不行了)。

十年磨一剑,应该有这样的决心的。男人帅最没有用了,应该变得有实力,你能够做别人做不了的事情么?哪怕你说去护城河冬泳、连续跑步4小时以上,更不要提什么社会经验、人脉资源和专业技能之类。

亲爱的朋友们,一起持续、刻苦的努力吧,勤奋是成功的前提。天上永远不会掉馅饼,我只相信合理的回报。