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

ThinkInLamp聚会记录

说起来,上次参加聚会到现在已经过去两个月时间了,ThinkInLamp聚会是每个月的第一周的周末举办,这是我第二次参加,在安居客公司的会议室里。
与会者嘛,还是安居客的开发占了大部分,毕竟天时地利人和啊。确实,如果有这样的聚会放在公司里,一来可以让单位的开发人员进行学习二来也可以了解认识一下其他开发人员,对于公司来说几乎没有任何投入成本,但所获颇多(毕竟真要请人来培训花的钱更多。。)
这次聚会其实就三个内容,一团队,二求职,三敏捷开发
从上个月的聚会开发stingchen就开始有他的分享了,可惜7月份无缘参加,(那次还有逍遥冰心讲的领域驱动方面的内容,也没有听到。惋惜,所以这次我怎么样也得来了。)sting介绍了团队建设方面的一些要点,以及注意事情,引起了很多人的共鸣,看来很多人在工作中遇到过类似问题啊(看来领导们很多)
板子介绍的是不要让工作外的事情来影响工作。总结起来就是有一颗平常心,不以物喜不以已悲,了解自己的真实想法做下去,不要频繁跳槽。
最后的敏捷开发就是讲的如何让工作变得更有效率。在讲之前做了一个游戏,每组8个人,每组中又有不同的分工,一个客户,一个客户老板,三个经理,每个经理下面有一个工人。然后分组开始数硬币(当然是有一定的规则)。客户将硬币交给工人时,客户与客户老板同时开始计时,当第一个工人开始翻硬币时,对应的经理开始计时。当第一个工作完成任务后,把硬币交给第二个工人时,第二个工人对应的经理开始计时。当第一个工人全部把硬币给了第二个工人时,第一个工人对应的经理停止计时。客户在收到第三个工人第一枚硬币时结束计时。当最后一枚硬币到达客户手里时,客户经理停止计时。然后做了五次不同方式的游戏,比如从左手到右手再到两只手一起,等等。DannelTeng的意思就是想让我们把工作能够细分,而且并不是在细分全部结束后再下达任务,这样的工作效率会有提高。
突然想起几件事,一小时学的语文课文里有个统筹方法,好象与此类似。还有就是在夜大学习的工商管理中的管理学,都有涉及类似方面。工厂运作本来就与程序开发有类似之处,毕竟理论是一样的,只是在实现的方法中有不同的方式而已,就如那句:戏法人人会变,手法各有不同。当然,如果没有经过培训过的人,可能在工作过程中也会摸索出类似的方式,但如果经过事先培训,岂不是会更加增加工作效率 ?

最后再做一个广告,锅巴哥哥准备在10月份左右举办一次数据库的专题会,他说到时候会请一些数据库方面的专家来与大家分享和讨论数据库设计方面的事情。也坦言在PHP开发中,其实DBA处于一个很尴尬的地位,即DBA在开发中几乎是没有介入开发中的机会,往往数据库的设计都是由开发人员自行设计,这导致在遇到问题时无法进行调优。而这次分享会上,就是请不同行业的专家们来分享如何更好的设计数据库,以及一些调优方法 。
顺便,锅巴哥哥说的原来从最初设计MYSQL时就是为了电信级的应用。我承认我真不了解这个背景,我想,恐怕80%的PHP开发者不了解MYSQL设计的背景吧。了解的最多的恐怕就是开源、免费。想着MYSQL被我们用成这样,不知道那些数据库设计人员是否会很郁闷。
估计,下一周就会有今天分享的PPT和视频出现在thinkinlamp官方网站了。你也可以到官网查看往期的分享(官网:www.thinkinlamp.com)。

Tags: lamp, 聚会, 分享

知道分子:这个版本太新了

知道分子的这个事例事实也经常遇到过。只是谁都没有提出来当成一回事
在自己的机器上,各种不同版本的PHP一直存在着,或许,相对稳定的也就apache和mysql吧?每次要升级前都看着changelog,但即使这样,也会有或多或少的问题发生,然而,在公司的版本库里,测试机里等等中早就存在着不同版本的PHP,只是可能从来就没有注意过罢了。

升还是不升这是个问题,但如果真的版本不对了,出现的问题也就稀奇古怪了,所以,保证版本号一致还是有着非常重要的作用(如果为了新特性需要升级,那就通知所有的人一起升,最终仅保留一台两台有明显记号的,旧版本的服务器专门用来调试,开发人员有虚拟机的也通通升级到统一的版本号里,一切为了稳定 )

下面是知识分子的内容:这个版本太新了

以前偶尔听到同事 A 问同事 B,某软件出新版本了,我们要不要升级?同事 B 果断地回答,这个版本太新了,我们还是别急着升级吧。同事 A 深以为然,刚出来的版本就升级,万一出个故障谁负责?何况现在这个软件跑得好好的,没事最好别折腾。后来 A、B 两人都忘了这件事,也就没有了下文。

 
再后来,同事 C 在另一处需要用到该软件,去官方网站上下载了“最新稳定版”(也就是前面那个“太新了”的版本),用着没问题。又过了一段时间,这个软件又出新版本,同事 D 问同事 E,我们要不要升级?同事 E 说,这个版本太新了,你懂的。于是同事 D 拈花微笑,信受奉行。
 
如此循环往复,同样一个软件,在开发/测试/生产环境里运行着无数个“太新了”的不同版本。
 
先不谈管理成本,“这个版本太新了”是否构成不升级的理由,颇值得解析一番。为什么要出新版本?不外乎安全漏洞 修补、bug 修正、新功能三者(或混合)。安全漏洞显然是要尽早尽快修补的,明知有安全漏洞而不及时修补,无异于后门洞开等待爆菊,有受虐倾向。整体或所调用部分相关 的 bug 也是要修补的,紧急程度视 bug 可能造成的损失大小而定。新功能则要看未来是否会用到,才决定要不要升级。
 
“这个版本太新了”之所以被接受,其中也有一定的合理成分。“太新了”指的是新版本没有经过完整的兼容性、稳定性和性能测试,也许会对现有应用造成影响。这个意思永远是对的,或者不客气地说,就是一句废话。任何一个新版本软件都一样,不去做测试你怎么知道有没有影响?
 
同一个软件,不同的版本,随意分布在多个环境中,这无疑增加了管理的复杂度,当然也有人认为,这体现了“个性 化”。复杂度也好,“个性化”也罢,都是效率的大敌。标准化的高效运维,应该是同一个软件、同一个版本,并且有统一机制进行追踪、测试、升级,保证安全漏 洞、bug 得到及时修补,新功能尽在掌握。

Tags: 版本

dedecms 笔记

不管怎么样,还是用到了dedecms。由于以前一直用supesite,对它不熟悉,所以做点笔记。

1、添加字段。如果你想增加自定义字段,但又不想修改数据库,可以尝试存成TAG。举例。在用户上传图片的时候,album_add,存到数据库里可能就是{dede:img xx}。代表了相册中的图片,每一张图片都是这样的一个标记。因此,我在这个最后增加了{dede:custom}类似的TAG,用来存放在这个页里涉及的増加的变量。偷懒的解决方法

2、读取数据显示到模版里。原来的我一直以为要写taglib,后来翻了手册才知道,原来还有{dede:loop }标签,可以指定表,排序字段和ifcause条件。比较方便。而且,如果你真的要写taglib,事实上也就可以参考这个函数来写了。

3、循环次数,发现循环次数是用全局变量来实现的。。。也就是说可以用[field:global.autoindex/]来显示。。很妖。。因此每个taglib都有将它置为0的用法。

4、针对2,其实还有一个更无耻的方法,那就是:{dede:sql sql=""}底层模板{/dede:sql},这样,你还可以更偷懒一点。

当然更多的还是需要看官方文档。在这里http://help.dedecms.com/v53/。虽然是5.3的不过还是可以做一些参考。。。

Tags: dedecms, 笔记

一些笔记

单独开个题目吧,觉得太小,所以以笔记的形式列出来,这样感觉会比较好一点
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: 图像识别