手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

一些笔记

单独开个题目吧,觉得太小,所以以笔记的形式列出来,这样感觉会比较好一点
1、dedecms相关
dedecms用的人很多,但不限于,我用的还是很少的,所以看到一些东西就认为应该记录下来,比如这个{dede:loop}标签,就是查询后生成一个数组,然后循环。对于简单的数据读取还算是比较方便。当然也有缺点,没看到有缓存生成(我不知道是不是用了tag就自动缓存,不过我想应该不是,生成静态的话就忽略这点问题了吧。)只是现在还不知道如何将页码参数传进去。。。

2、创业

这里并不是说我的创业故事,当然我也有创业的想法,我这里是两个人对于创业的看法,一个是awflasher(http://www.awflasher.com/blog/archives/1829),他说:【借此,我想顺便说一点我的看法:为了让员工的风险降到最低全力工作,创业公司的薪水应该略高于大公司,那些号称是创业阶段要压低薪水或者拖欠薪水的公司, 如果没有股份可以不考虑了(证明管理团队的盈利能力太弱,这种公司风险太大);另外,我认为在中国,真的要慎用“股权”这个概念,这个概念不适用于大多数 人,在我这个行业内,我亲眼目睹了一个例子:有几家公司给出低薪+大量股份,而有一家公司给出高薪,结果后者很快就发展壮大了,而那几家把薪水压低出让股 份的公司几乎都死掉了。】还有一个就是DBA Notes(http://www.dbanotes.net/jobs/Jobs_info.html)上的【从大公司出来,投身创业团队。遇到的最大问题就是招聘问题。创业公司,薪水不可能像上市公司那样大方,公司福利也做不到国企那要啥有啥。好不容易瞄上个技 术差不多的,仔细沟通下来,人家还未必愿意一起来参与创业,更想着找个钱多人傻、事少家近的地方,不能破坏人家美好生活不是。其它包括地域问题的、家庭原 因的... 所以,招聘是个困难活儿,也是个持久战。创业团队,只能慢慢来,只找合适的,找对的。】

总之,创业是一个痛苦的事情。。以前在cnblog上看吉日嘎拉说自己的创业故事,说到创业时觉得要买这个买那个,等到买回来发现,大多数实际上可以不买,反而浪费了自己的精力和钱的时候。就觉得创业真的是需要考虑的事情。

3、php A-Z的循环问题

php的A-Z循环并不和其他程序一样。只是长度为26的循环,相反,PHP follows Perl’s convention when dealing with arithmetic operations on character variables and not C’s. For example, in Perl ‘Z’+1 turns into ‘AA’, while in C ‘Z’+1 turns into ‘[‘ ( ord(‘Z’) == 90, ord(‘[‘) == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.这个信息来自http://www.laruence.com/2010/07/30/1682.html,以前真的一直不知道。或者说没有注意过。

Tags: dedecms

PHP图像识别

对于一些几乎没有变型的图片来说,下面这个方法或者会减轻你的工作量。
事实上,我也是从http://fr.cc0311.com/php-telephone-number-ocr.html看的代码,再想想,walkerlee在05年就写过了关于bmp图片的识别。不过BMP可能会相对简单一点吧?
看了这个法月博客的代码。脑子一热,花了半小时,重写了一遍。。。没有优化。因为大部分方法还是参考的他的,只是对法月的这篇文章中的代码,我做了简单的改动。版权,还是算他的吧。。。去年的时候,也写过类似的。。只是因为图片变形,最终识别率超低,因此对于这种不变形的,还是写下代码做个笔记吧。

PHP代码
  1. <?php  
  2.   
  3. $imgfile = 'http://bj.ganji.com/tel/5463013757650d6c5e31093e563c51315b6c5c6c5237.png';  
  4.   
  5. interface imagedatas {  
  6.     public function setimagedata();  
  7.     public function getimagedata();  
  8. }  
  9.   
  10. class GanjiImage implements imagedatas{  
  11.     public $imagedata;  
  12.     public function __construct(){  
  13.         $this->setimagedata();  
  14.     }  
  15.     public function setimagedata(){  
  16.         $this->imagedata = array(  
  17.             0=>'000011111000001111111110011000000011110000000001110000000001110000000001110000000001011000000011011100000111000111111100000001110000',  
  18.             1=>'011000000000011000000000111111111111111111111111',  
  19.             2=>'001000000011011000000111110000001101110000011001110000011001110000110001111001100001011111100001000110000001',  
  20.             3=>'001000000010011000000011110000000001110000000001110000110001110000110001011001110011011111011111000110001100',  
  21.             4=>'000000001100000000111100000001111100000011101100000111001100001100001100011000001100111111111111111111111111000000001100000000000100',  
  22.             5=>'111111000001111111000001110001000001110001000001110001100001110001100001110000110011110000111111000000001100',  
  23.             6=>'000011111000001111111110011000110011110001100001110001100001110001100001110001100001010001110011010000111111000000001100',  
  24.             7=>'110000000000110000000111110000111111110001110000110111000000111100000000111000000000111000000000',  
  25.             8=>'000100011110011111111111110011100001110001100001110001100001110001100001110011100001011111111111000100011110',  
  26.             9=>'001111000000011111100001110000110001110000110001110000110001110000110001011000100001011111100111000111111110000001110000',  
  27.         );  
  28.     }  
  29.     public function getimagedata(){  
  30.         return $this->imagedata;  
  31.     }  
  32. }  
  33.   
  34. class imageValidation  
  35. {  
  36.     protected $imgfile;  
  37.     protected $imgsize;  
  38.   
  39.     protected $imgdata//数组  
  40.     protected $hordata//横向  
  41.     protected $verdata//纵向  
  42.   
  43.     protected $imgfunc;  
  44.   
  45.     function __construct( $imgfile , $imgsource = ''){  
  46.         $this->imgfile = $imgfile;  
  47.         $this->imgsize = getimagesize($imgfile);  
  48.         $this->imgfunc = $this->getImageFunc();  
  49.         if($this->imgfunc == 'imagecreatefromstring'){  
  50.             $this->imgfile = file_get_contents($this->imgfile);  
  51.         }  
  52.         $this->imgsource = new $imgsource();  
  53.     }  
  54.   
  55.     function getImageData(){  
  56.         $func = $this->imgfunc;  
  57.         $resource = $func$this->imgfile );  
  58.         for$i=0 ; $i < $this->imgsize[1] ; $i++){  
  59.             for$j=0 ; $j<$this->imgsize[0] ; $j++){  
  60.                 $rgbcolor = imagecolorat( $resource , $j , $i);  
  61.                 $rgbarray = imagecolorsforindex( $resource , $rgbcolor );  
  62.                 if($rgbarray['red'] < 125 || $rgbarray['green']<125 || $rgbarray['blue'] < 125){  
  63.                     $data[$i][$j]=1;  
  64.                 }else{  
  65.                     $data[$i][$j]=0;  
  66.                 }  
  67.             }  
  68.         }  
  69.         $this->imgdata = $data;  
  70.     }  
  71.       
  72.     function getHorData(){  
  73.         $z = 0;  
  74.         for($i=0; $i<$this->imgsize[1]; $i++){  
  75.             if(in_array('1',$this->imgdata[$i])){  
  76.                 for($j=0; $j<$this->imgsize[0]; $j++){  
  77.                     if($this->imgdata[$i][$j] == '1'){  
  78.                         $newdata[$z][$j] = 1;  
  79.                     }else{  
  80.                         $newdata[$z][$j] = 0;  
  81.                     }  
  82.                 }  
  83.                 $z++;  
  84.             }  
  85.         }  
  86.         $this->hordata = $newdata;  
  87.         return $newdata;  
  88.     }  
  89.   
  90.     function getVerData(){  
  91.         //$data = array_reverse($this->hordata); //这是180度翻转,不是90度  
  92.         for$i=0; $icount($this->hordata[0]) ; ++$i){  
  93.             for$j=0;$j<count($this->hordata);$j++){  
  94.                 $newdata[$i][$j] = $this->hordata[$j][$i];  
  95.             }  
  96.         }  
  97.         $i = 0;  
  98.         foreach($newdata as $k=> $v){  
  99.             if( in_array(1 , $v ) || (isset($newdata[$k+1]) && in_array(1,$newdata[$k+1]) )){  
  100.                 $newdatas[$i] = $v;  
  101.                 $i++;  
  102.             }  
  103.         }  
  104.         $this->verdata = $newdatas;  
  105.         return $newdatas;  
  106.     }  
  107.     function get(){  
  108.         $i = 0;  
  109.         foreach$this->verdata as $val){  
  110.             if(in_array(1,$val)){  
  111.                 $datas[$i] .= join("",$val);  
  112.             }else{  
  113.                 $i++;  
  114.             }  
  115.         }  
  116.         foreach$datas as $k => $val ){  
  117.             $number[$k] = $this->check($val);  
  118.         }  
  119.         return $number;  
  120.     }  
  121.     function check($str){  
  122.         $imgsourcesdata = $this->imgsource->getimagedata();  
  123.         foreach$imgsourcesdata as $k => $val){  
  124.             similar_text($str,$val,$percent);  
  125.             $ret[$k]=$percent;  
  126.         }  
  127.         return array_search(max($ret),$ret);  
  128.     }  
  129.   
  130.     function draw( $data ){  
  131.         $str = '';  
  132.         if(is_array($data)){  
  133.             foreach ($data as $key => $val){  
  134.                 foreach ($val as $k => $v){  
  135.                     if($v == 0){  
  136.                         $str .= "<font color='#FFFFFF'>".$v."</font>";  
  137.                     }else{  
  138.                         $str .= $v;  
  139.                     }  
  140.                 }  
  141.                 $str.= "<br/>";  
  142.             }  
  143.         }  
  144.         echo $str;  
  145.     }  
  146.   
  147.     function getImageFunc(){  
  148.         switch($this->imgsize[2]){  
  149.             case IMAGETYPE_PNG :  
  150.                 $this->imgfunc = 'imagecreatefrompng';  
  151.             break;  
  152.             case IMAGETYPE_JPEG :  
  153.             case IMAGETYPE_JPG :  
  154.                 $this->imgfunc = 'imagecreatefromjpeg';  
  155.             break;  
  156.             case IMAGETYPE_GIF :  
  157.                 $this->imgfunc = 'imagecreatefromgif';  
  158.             break;  
  159.             default:  
  160.                 $this->imgfunc = 'imagecreatefromstring';  
  161.             break;  
  162.         }  
  163.         return $this->imgfunc;  
  164.     }  
  165.   
  166. }  
  167.   
  168. $img = new imageValidation($imgfile,'GanjiImage');  
  169. $img->getImageData();  
  170. $img->getHorData();  
  171. $img->getVerData();  
  172. $phone = $img->get();  
  173. dump($phone);  
  174.   
  175.   
  176.   
  177. function dump($data){  
  178.     print("<pre>");  
  179.     print_r($data);  
  180.     print("</pre>");  
  181. }  

对于该图片,识别率很高。

Tags: 图像识别

杂谈

1、高春辉表示升级到了5.3.3,不知道是不是手机之家,但,我真的不敢升级,即使我的版本中basename对中文的处理一塌糊涂,我也不敢升,因为实在不知道升级后会出现什么样奇怪的错误。高春辉说:

http://www.paulgao.com.cn/index.php?itemid=150
  1. 1、parse_url 执行出错的时候不再报 warning 错误了,不再需要使用 @ 了,但是要仔细判断结果是否为 FALSE 了;  
  2. 2、FPM 终于内置了,配置文件从 XML 改成 INI 方式了,增加了例如 xxx.com/status 的报告,和例如 xxx.com/ping 的健康检查功能了,挺好;  
  3. 3、另外这次编译的时候把 ereg 模块也干掉了。以前是为了兼容 PMA,现在 PMA 也不用 ereg 了,就可以 DROP 它了。  

2、对于typecho,我对牧师的网站上的两个模版,我很喜欢。。。

  1. http://typecho.demo.m4go.com/m4tom/ 
  2. http://bl.typecho.me/ 

这可能是个人爱好问题,并非其他模版不好看。

3、上次我在博客里贴了老王的:<?php if($a = 100 && $b= 200){var_dump($a,$b);}?>,结果风雪之隅解释的更详细:http://www.laruence.com/2010/07/26/1668.html,他说,手册上说了:

XML/HTML代码
  1. Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.   
差不多就是说:其实也简单, 运算符优先级是在存在二义性文法的时候的一种规约规则选择的手段, 而PHP的语法分析文件定义中, 却让等号和T_BOOLEAN_AND(&&)之前不存在了规约冲突.

Tags: 高春辉, typecho, 运算符, 风雪之隅

pack 和 unpack 的使用

来自kakapo的博客:http://www.kakapo.cn/blog/read.php?112,主要是实在不懂。事实上,我看完,我也不懂。

      任何一款拥有socket操作能力的语言都有一个专门用于组包的函数,php也不例外!          

      用了很久php了却很少有机会用php进行一些二进制操作。 最近用php写一个socket客户端连接一个用C++语言开发的游戏服务端。 服务器端开发人员使用了二进制的形式来定义协议的格式。协议格式如下:

   包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容

1.包头的内容是记录帧内容的长度;
2. 加密:0表示不加密,1表示加密;
3. 命令码为服务端命令识别符号;

    一开始不了解php原来有pack可以来组装二进制包, 走了弯路,让服务端开发人员用C语言帮忙开发了的几个内存操作函数,按照协议规则返回二进制包,然后我将这几个方法编译成一组扩展函数供php使用。
   
    话归正题,本文是介绍如何使用pack和unpack这两个方法的。php官方手册举例太少,不能很容易理解,特别是那些格式化参数的使用。

转 摘的参数中文说明:

pack/unpack 的摸板字符字符 含义
a 一个填充空的字节串
A 一个填充空格的字节串
b 一个位串,在每个字节里位的顺序都是升序
B 一个位串,在每个字节里位的顺序都是降序
c 一个有符号 char(8位整数)值
C 一个无符号 char(8位整数)值;关于 Unicode 参阅 U
d 本机格式的双精度浮点数
f 本机格式的单精度浮点数
h 一个十六进制串,低四位在前
H 一个十六进制串,高四位在前
i 一个有符号整数值,本机格式
I 一个无符号整数值,本机格式
l 一个有符号长整形,总是 32 位
L 一个无符号长整形,总是 32 位
n 一个 16位短整形,“网络”字节序(大头在前)
N 一个 32 位短整形,“网络”字节序(大头在前)
p 一个指向空结尾的字串的指针
P 一个指向定长字串的指针
q 一个有符号四倍(64位整数)值
Q 一个无符号四倍(64位整数)值
s 一个有符号短整数值,总是 16 位
S 一个无符号短整数值,总是 16 位,字节序跟机器芯片有关
u 一个无编码的字串
U 一个 Unicode 字符数字
v 一个“VAX”字节序(小头在前)的 16 位短整数
V 一个“VAX”字节序(小头在前)的 32 位短整数
w 一个 BER 压缩的整数
x 一个空字节(向前忽略一个字节)
X 备份一个字节
Z 一个空结束的(和空填充的)字节串
@ 用空字节填充绝对位置


string pack ( string $format [, mixed $args [, mixed $...]] )

一些规则:
1. 每个字母后面都可以跟着一个数字,表示 count(计数),如果 count 是一个 * 表示剩下的所有东西。
2.如果你提供的参数比 $format 要求的少,pack 假设缺的都是空值。如果你提供的参数比 $format 要求的多,那么多余的参数被忽略。

下面还 是用例子来说明用法会容易理解一点:

关于Pack:

下 面的第一部分把数字值包装成字节:
$out = pack("CCCC", 65, 66, 67, 68);      # $out 等于"ABCD"
$out = pack("C4", 65, 66, 67, 68);         # 一样的东西

下面 的对 Unicode 的循环字母做同样的事情:
  $foo = pack("U4", 0x24b6, 0x24b7, 0x24b8, 0x24b9);

下面的做类似的事情,增加了一些空:
  $out = pack("CCxxCC", 65, 66, 67, 68);      # $out 等于 "AB\0\0CD"

打包你的短整数并不意味着你就可移植了:
  $out = pack("s2", 1, 2);        
# 在小头在前的机器上是 "\1\0\2\0"
# 在大头在前的机器上是 "\0\1\0\2"

在二进制和十六进制包装上,count 指的是位或者半字节的数量,而不是生成的字节数量:
  $out = pack("B32", "...");
    $out = pack("H8", "5065726c");         # 都生成“Perl”

a 域里的长度只应用于一个字串:
  $out = pack("a4", "abcd", "x", "y", "z");      # "abcd"

要绕开这个限制,使用多倍声明:
  $out = pack("aaaa",    "abcd", "x", "y", "z");   # "axyz"
   $out = pack("a" x 4,   "abcd", "x", "y", "z");   # "axyz"

a 格式做空填充:
  $out = pack("a14", "abcdefg");         # " abcdefg\0\0\0\0\0\0"


关于unpack:

array unpack ( string $format, string $data )

$data = "010000020007";
unpack("Sint1/Cchar1/Sint2/Cchar2",$data);

## array('int1'=>1, 'char1'=>'0','int2'=>2,'char2'=>7);

      最后本文开头讲到的协议使用pack/unpack 举例程序代码为 :

PHP代码
  1. $lastact   = pack('SCSa32a32',0x0040, 0x00, 0x0006, $username$passwd );  
  2.   
  3. unpack('Sint1/Cchar1/Sint2/Cchar2/',$lastmessage);  

Tags: pack, unpack

IE中iframe跨域丢失Session问题(续 p3p)

P3P,不算是新名词,但还是有些人不清楚。事实上我也不清楚。。。在百度上看到有这玩意就备份下来。说真的,我只是知道用,但不知道为什么用。额。。很明显,因为在ucenter同步的时候,在discuz的ui/api里有写过。

看内容吧。。。。

IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存 在此问题了。

在frameset里面,也就是里面的frame是来自第三方站点(不同IP或不同域名),那么默认情况下IE会自动禁用这些站点的cookie, 也就是在请求某url时在HTTP header里不发送它们的cookie,包括session的cookie。注意,这些站点在response里面设置的cookie还是会被发送到浏 览器的。

在用户浏览a.php时 A.com写入的为第一方Cookie,其嵌入的iframe指向 b.php.这时B.com写入的就为第三方Cookie了,所以它是被IE当在了大门外。 所以,每次当用户提交的cookie提交时,就挂掉了.因为传不到真实的服务器.

解决方案.

PHP程序,可以直接在B网站中写入www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z

PHP代码
  1. <?php  
  2. header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');  
  3. ?>  
这样就能接受第三方的Cookie啦。

 

lighttpd的服务器

XML/HTML代码
  1. server.modules    = ("mod_setenv")  
  2. setenv.add-response-header = ( "P3P" => "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'")  
apache的服务器

XML/HTML代码
  1. <VirtualHost>  
  2. Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'  
  3. </VirtualHost>  
IIS的服务器www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z

增加一个网站http头来解决问题;www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
管理工具——〉选择一个网站——〉属性——〉 http头,增加一个http头www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
然后输入头名:P3Pwww.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
输入头内容:CP=CAO PSA OUR

jsp页面:

XML/HTML代码
  1. <%  
  2. response.setHeader("P3P","CP=CAO PSA OUR");  
  3. %>  
java代码最简单的办法,增加一个filte:
Java代码
  1. public class TransNameFilter extends HttpServlet implements Filter {  
  2. private static org.apache.commons.logging.Log logWriter =  
  3.    LogFactory.getLog(TransNameFilter.class.getName());  
  4.   
  5. /** 
  6. * 
  7. */  
  8. public TransNameFilter() {  
  9.    super();  
  10.   
  11. }  
  12. /* (非 Javadoc) 
  13.    * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 
  14.    */  
  15. public void init(FilterConfig arg0) throws ServletException {  
  16.   
  17. }  
  18.   
  19. /* (非 Javadoc) 
  20. * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 
  21. */  
  22. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
  23.    throws IOException, ServletException {  
  24.   
  25.    HttpServletRequest hreq = (HttpServletRequest) request;  
  26.    String transName = hreq.getParameter("transName");  
  27.    if (Util.isNullOrEmpty(transName)) {  
  28.     logWriter.fatal(" there is no transName for this request");  
  29.    } else {  
  30.   
  31.     logWriter.info(" transName is " + transName);  
  32.    }  
  33.     
  34.    HttpServletResponse res = (HttpServletResponse) response;  
  35.         //iframe引起的内部cookie丢失  
  36.    res.setHeader("P3P","CP=CAO PSA OUR");  
  37.    if (chain != null)  
  38.     chain.doFilter(request, response);  
  39.   
  40. }  
  41.   
  42. /* (非 Javadoc) 
  43.    * @see javax.servlet.Filter#destroy() 
  44.    */  
  45. public void destroy() {  
  46.   
  47. }  
  48.   
  49. }  

Tags: session, cookie, p3p