推荐一款开源的flashchart生成柱状图

2011年6月27日 没有评论

最近项目中需要生成类似excel的柱状图、饼图、趋势图等等。。。

网上google了一番,发现了 Open Flash Chart   地址:  http://teethgrinder.co.uk/open-flash-chart-2/

非常好用的一款开源工具。目前最新版是2.0

——————————————————————————–

http://ofcgwt.googlecode.com/svn/demo/Demo.html 这里有很多示例可供参考。

不过不太推荐使用 googlecode上的这个示例代码,建议采用官方的示例代码和flash chart 。

flash chart的使用很简单。

如下示例:

//url形式
function embSwfWithUrl(dataurl,divcon){
     var params = {
        "wmode": "transparent",
        "menu": "false",
        "scale": "noScale",
        "allowFullscreen": "false",
        "allowScriptAccess": "always",
        "bgcolor": "#c0c0c0"  //背景
    };
    var flashvars = {
        'data-file' : dataurl
    };
    swfobject.embedSWF("/swf/open-flash-chart.swf?timestamp=" + Math.random(),divcon, "450", "300", "10.0.0", "./swf/expressInstall.swf" ,flashvars,params);
}

embSwfWithUrl('http://xxx.com/xxx.html','swfCon');

这里的http://xxx.com/xxx.html返回的是相应的json格式的数据。

swfCon是放flash的div容器。

swfobject是开源的js处理flash的类。http://code.google.com/p/swfobject/

——————————————————————————–

注意下,flash chart 获得数据的方式有两种,

一种是   data-file  一种是 get-data

data-file 正是如上示例,值必须是个 url地址,里面返回的是 json数据。

而get-data的值则是一个函数名称。 函数返回 json 数据。

如下示例:

//get-data
function embSwfWithData(divcon,getdataFn){
    var params = {
        "wmode": "transparent",  //窗口模式
        "menu": "false",  //菜单显示
        "scale": "noScale",  //缩放
        "allowFullscreen": "false", //允许全屏
        "allowScriptAccess": "always",  //允许脚本
        "bgcolor": "#c0c0c0"  //背景
    };
var flashVar = {
 "get-data":getdataFn
};
    swfobject.embedSWF("/swf/open-flash-chart.swf?timestamp=" + Math.random(), divcon, "450", "300", "10", "/swf/expressInstall.swf",flashVar  ,params);
}

function getJsonData(){
return 'json data';
}

这里 “get-data”:getdataFn 需要传递的就是一个函数名称。函数中返回json数据。

还有一点需要注意下,/swf/open-flash-chart.swf?timestamp=+Math.random() .

这里之所以加随机数,是因为有的浏览器在缓存flash后,使其flash参数失效了。加上随机数后,每次浏览器会重新加载flash。

PHP导出excel

2011年6月27日 没有评论

最近做一个项目,其中涉及到了数据导成excel的功能。

后来使用了 开源的 PHPExcel  http://phpexcel.codeplex.com/ 目前最新版是1.7.6

PHPExcel 可以生成 .xls 和 .xlsx (office2007)。其封装的方法很全了。

比如设置 excel的title,keywords,description

获得某个sheet,某个列的数据 等等。

具体的文档,查看这里,http://phpexcel.codeplex.com/releases/view/45412 非常详细。

下面是一段简单的示例。

//这里要 include进来 phpexcel类
include ROOT_PATH . 'library/PHPExcel-1.7.6/PHPExcel.PHP';
include ROOT_PATH . 'library/PHPExcel-1.7.6/PHPExcel/Writer/Excel2007.PHP';

class MyExcel {

    public static function makeExcel($title, $data, $excle_name) {
        $exclefile = 'excel/' . date('Y-m-d') . '/' . md5($excle_name) . '.xlsx';

        $Excel = new PHPExcel();
        $Excel->setActiveSheetIndex(0);
        $Excel->getSheet()->setTitle($title);

        $cell_one = $data[0];
        $j = 0;
        foreach ($cell_one as $k => $v) {
            $Excel->getSheet()->setCellValue(self::getCharByNunber($j) . '1', $k);
            $j++;
        }

        $x = 2;
        foreach ($data as $value) {
            $y = 0;
            foreach ($value as $k => $v) {
                $Excel->getSheet()->setCellValue(self::getCharByNunber($y) . $x, $v);
                $y++;
            }
            $x++;
        }

        $objwriter = new PHPExcel_Writer_Excel2007($Excel);
        $objwriter->save($exclefile);
        TMDebugUtils::debugLog('make ' . $exclefile);
        return $exclefile;
    }

    protected static function getCharByNunber($num) {
        $num = intval($num);
        $arr = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',);
        return $arr[$num];
    }

}

//导出用户基本信息
function exportUserBaseInfo() {
    $excelTitle = '用户基本信息';
    $excelFileName = 'userbase';
    $data = array();
    // $rs = ....  这里rs是从db读取的数据
    for ($i = 0; $i < count($rs); $i++) {         $data[$i]['姓名'] = $rs[$i]->name;
        $data[$i]['年龄'] = intval($rs[$i]->age);
        $data[$i]['日期'] = $rs[$i]->date;
    }
    MyExcel::makeExcel($excelTitle, $data, $excelFileName);
}

//导出新闻资讯信息
function exportUserBaseInfo() {
    $excelTitle = '新闻资讯信息';
    $excelFileName = 'news';
    $data = array();
    // $rs = ....  这里rs是从db读取的数据
    for ($i = 0; $i < count($rs); $i++) {         $data[$i]['标题'] = $rs[$i]->title;
        $data[$i]['作者'] = $rs[$i]->author;
        $data[$i]['日期'] = $rs[$i]->date;
        $data[$i]['浏览数'] = floatval($rs[$i]->view_count);
        $data[$i]['被评论数'] = floatval($rs[$i]->comment_count);
    }
    MyExcel::makeExcel($excelTitle, $data, $excelFileName);
}

//end

这里只是简单的生成的xlsx,其他需要读取更复杂的,可以阅读官方的手册,有很详细的说明。

如果不需要保存,直接输出到浏览,如下:

//不用保存,直接输出到浏览器
$objwriter = new PHPExcel_Writer_Excel2007($Excel);
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition:inline;filename=temp.xlsx');
        header("Content-Transfer-Encoding: binary");
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Pragma: no-cache");
        $objwriter->save('php://output');

The End

分类: PHP开发 标签: ,

怀念一位老革命–潘远志

2011年6月10日 没有评论

他,像很多被遗忘的老革命一样,曾为了那红色的理想,奋斗一生。

他,曾在与刘志丹一起杀敌。

他,曾与习仲勋(习近平之父)并肩作战。

他,曾因革命入狱七年。

他,像很多被遗忘的老革命一样,不该被遗忘。。。。。。

他,就是 潘远志 同志。

—————————————————————————-

以下是他的个人简介:

我叫潘远志,1910年出生在陕西省咸阳市旬邑县张洪镇上黄楼村一户农民家庭。家境贫寒,10岁便向人学习石匠技术,16岁靠石匠手艺养家糊口。经常在外漂泊,流浪,备受艰辛。当时正直国民党统治,社会动荡,穷人生活艰苦。受到中国共产党进步思想的影响,1929年,19岁的我毅然决定加入了共产党,树立的崇高的革命理想,立志为革命事业奉献终身。

1931年,我在刘志丹部队当兵,先后担任过班长,排长,连长。后来,因为有石匠身份掩护,我便承担了当的地下工作。由于常年在外,家中一切杳无音信,十分担心父母,可当回到家中的时候,门上已经挂上了共匪的牌子。

记得有一次,下山为父母挑水,当回来时,刚走到半山腰,我发现了国民党反对派已经在山顶守候,枪口直对着我。我放下扁担,立刻往山下跑,谁知却被他们发现了,枪声在我身后不断,所幸的是,那次我逃脱了。

回忆起来,地下工作也是非常艰苦的。一次,我以石匠的身份,在XX村帮人干活,同时非常谨慎的完成党的任务。在做完的时候,天色已晚,我便留宿在了XX村,但却有反动派告密,我不得不连夜逃走。还好,有惊无险。

那时候,我们常以树皮,草根,野菜充饥,大小战斗不计其数。有一次国民党反动派围攻耀县,在刘志丹同志的指挥下,我们经过了两天两夜的艰苦奋战,歼灭了敌军,缴获了大量军备。机枪有六挺,步枪60多支,活捉敌军30多人,军心大受鼓舞。然而1936年刘志丹同志在战斗中英勇牺牲,我们悲痛万分,全军战士都痛哭流涕。

1936年4月,关中机会设在马兰(马堡村)。有一次,我们获得消息,国民党有一批军火会从马兰经过,于是,在中共特区委及游击队组织的领导下,经过艰苦奋战,我军大获全胜,缴获了国民党的全部军火。但我在那次战斗中腿部受伤了,特区委把我安排到后掌村疗伤修养。记得当时贺明珠弟妹多次看望,让我感激不尽。

1937年3月,关中特区机关迁至马家堡村,10月更名为关中分区。38年7月,撤销了新正县委,由关中分区党委领导。 1939年底迁至阳坡头村,后又迁往马兰。1941年7月,习仲勋同志担任关中分区党委书记,习仲凯同志任工委书记,我任宣传部长,赵铁娃任组织部长。郭清帆任保安部长,任应斌任秘书。我们亲如兄弟,并肩作战,建立了深厚的战斗友谊和感情。每次战斗间隙,我和习书记总要拉拉话,下下棋,有时秉烛谈至深夜。

为了提高工作能力,更好地为党工作,1938年经过关中分区委民同意,我到陕北公学看花宫分校学习文化,当时李维汉任校长,记得当时有蔡畅、肖劲党、蒙定军、王秉祥、王天太、吕世玉。毕业后、任正宁县委宣传部长,搞地下抗日宣传工作。

1937年纪月,红一军团驻正宁、宁县一带。我们打了无数胜仗,大家人心鼓舞,唱戏欢庆。然而,在上1939年甘肃九县战斗中,情报得知国民党有一个团将来袭击,谁知竟然有两个团的兵力,我们被捕围困了三天,没吃没喝,坚苦奋战,最后兵分三路突破了他们的围攻。当时我便率领着一支部队,记得的有汪峰,赵铁娃,郭清帆等。1940年解放宁县,正宁时参战 的有赵铁娃,吕世玉,周存善。1941年习仲凯同志任正宁县委书记,我任副书记,任应斌任部长。

1946年患心脏病,在内蒙苏联医院多次治疗,没能好转,后经红一团党委批准,回家休养。

1964年反西北派,习仲勋同志遭四人帮迫害,我也感觉到灾难必将降临到我的头上,便把老婆孩子叫到跟前,将身上的几元钱分给他们。叮嘱孩子们要好好学习文化,好好生活,好好劳动。1965年我便被捕打成“现行反革命”,入狱七年。

年幼的儿子,10岁便承受着家破人亡的现实压力,精神受到极大的伤害,流浪为生,流落街头,吃穿无着,妻子瘫痪在床,家不成家……

1971年出狱后,妻子已不在人世,家中只乘几口破烂窖洞,儿子精神受到打击,疯疯颠颠,看到这些我心如刀割,自己受罚也就罢了,还给孩子带来伤害,让家人和我一起受罚……村里却把我当成“四类分子”对待。劳动之余,偷着在沟里挖草药凑钱给孩子看病,生活不堪设想。粉碎“四人帮”后,我向甘肃提出解决我的问题甘肃和陕西想到推托,直至龄1980年8月在习仲凯兄弟的帮助下,才得以平反,虽然当时国家困难,子女不做安排,工资不予补发,可是我还掩饰不住内心的的喜悦,写了一首诗下来:

冬去春来百花开,

红花绿叶枝杆壮。

鲜花放香人人戴,

定能结成太平果。

平反后,习仲勋兄弟常来家中看望,关切地问:“老哥,您辛苦了!”我思绪万千,老泪纵横:“当年的苦还算苦吗?庆幸的是我们兄弟们都活着啊!”他还帮助我联系医院治病,在西安人民医院治疗期间,我见到了不少老同志,贺明珠弟妹与孙女前来看望,叫人倍感亲切,我们亲切交谈,回忆当年的往事。从医院回来,我身体一天不如一天,虽然吃了苦,受了罚,总算看到了今天,死也瞑目了!

潘远志

1986年3月

分类: 杂七杂八 标签:

LAMPER五月盛会 – 数据存储

2011年5月10日 1 条评论

由于工作太忙,LAMPER休息了好久了。

最近终于能抽出些时间来组织了。

——————————————————————————

五月主题为   “数据存储”

主题一、NOSQL带来了什么
嘉宾:孙立 高级系统架构师

主题二:OceanBase—千亿级海量数据库
嘉宾:杨传辉(日照)存储系统专家

主题三:redis修改源码的艺术
嘉宾:杨海潮:新浪首席DBA

主题四:深入SAE云计算架构
嘉宾:丛磊: 新浪SAE技术经理

—————————————————————————–

活动时间:2011年5月21日(周六),09:30~5:00
活动地点:北京市海淀区北四环中路理想国际大厦 15层
所需费用:免费
活动日程:
09:30-10:00:签到、入场
10:00-11:00:NOSQL带来了什么
11:00-12:00:OceanBase—千亿级海量数据库
12:00-13:30:休息,午餐
13:30-14:30:redis修改源码的艺术
14:30-15:30:新浪—深入SAE云计算架构
15:30-16:30:Q & A,合影,自由交流

详情查看: http://lamper.cn/

—————————————————————————–

分类: LAMP分享 标签:

NoSQL – Redis几个认识误区

2011年1月15日 1 条评论

转自 http://timyang.net/data/redis-misunderstanding/

前几天微博发生了一起大的系统故障,很多技术的朋友都比较关心,其中的原因不会超出James Hamilton在On Designing and Deploying Internet-Scale Service(1)概括的那几个范围,James第一条经验“Design for failure”是所有互联网架构成功的一个关键。互联网系统的工程理论其实非常简单,James paper中内容几乎称不上理论,而是多条实践经验分享,每个公司对这些经验的理解及执行力决定了架构成败。

题外话说完,最近又研究了Redis。去年曾做过一个MemcacheDB, Tokyo Tyrant, Redis performance test,到目前为止,这个benchmark结果依然有效。这1年我们经历了很多眼花缭乱的key value存储产品的诱惑,从Cassandra的淡出(Twitter暂停在主业务使用)到HBase的兴起(Facebook新的邮箱业务选用HBase(2)),当再回头再去看Redis,发现这个只有1万多行源代码的程序充满了神奇及大量未经挖掘的特性。Redis性能惊人,国内前十大网站的子产品估计用1台Redis就可以满足存储及Cache的需求。除了性能印象之外,业界其实普遍对Redis的认识存在一定误区。本文提出一些观点供大家探讨。

1. Redis是什么

这个问题的结果影响了我们怎么用Redis。如果你认为Redis是一个key value store, 那可能会用它来代替MySQL;如果认为它是一个可以持久化的cache, 可能只是它保存一些频繁访问的临时数据。Redis是REmote DIctionary Server的缩写,在Redis在官方网站的的副标题是A persistent key-value database with built-in net interface written in ANSI-C for Posix systems,这个定义偏向key value store。还有一些看法则认为Redis是一个memory database,因为它的高性能都是基于内存操作的基础。另外一些人则认为Redis是一个data structure server,因为Redis支持复杂的数据特性,比如List, Set等。对Redis的作用的不同解读决定了你对Redis的使用方式。

互联网数据目前基本使用两种方式来存储,关系数据库或者key value。但是这些互联网业务本身并不属于这两种数据类型,比如用户在社会化平台中的关系,它是一个list,如果要用关系数据库存储就需要转换成一种多行记录的形式,这种形式存在很多冗余数据,每一行需要存储一些重复信息。如果用key value存储则修改和删除比较麻烦,需要将全部数据读出再写入。Redis在内存中设计了各种数据类型,让业务能够高速原子的访问这些数据结构,并且不需要关心持久存储的问题,从架构上解决了前面两种存储需要走一些弯路的问题。

2. Redis不可能比Memcache快

很多开发者都认为Redis不可能比Memcached快,Memcached完全基于内存,而Redis具有持久化保存特性,即使是异步的,Redis也不可能比Memcached快。但是测试结果基本是Redis占绝对优势。一直在思考这个原因,目前想到的原因有这几方面。

  • Libevent。和Memcached不同,Redis并没有选择libevent。Libevent为了迎合通用性造成代码庞大(目前Redis代码还不到libevent的1/3)及牺牲了在特定平台的不少性能。Redis用libevent中两个文件修改实现了自己的epoll event loop(4)。业界不少开发者也建议Redis使用另外一个libevent高性能替代libev,但是作者还是坚持Redis应该小巧并去依赖的思路。一个印象深刻的细节是编译Redis之前并不需要执行./configure。
  • CAS问题。CAS是Memcached中比较方便的一种防止竞争修改资源的方法。CAS实现需要为每个cache key设置一个隐藏的cas token,cas相当value版本号,每次set会token需要递增,因此带来CPU和内存的双重开销,虽然这些开销很小,但是到单机10G+ cache以及QPS上万之后这些开销就会给双方相对带来一些细微性能差别(5)。

3. 单台Redis的存放数据必须比物理内存小

Redis的数据全部放在内存带来了高速的性能,但是也带来一些不合理之处。比如一个中型网站有100万注册用户,如果这些资料要用Redis来存储,内存的容量必须能够容纳这100万用户。但是业务实际情况是100万用户只有5万活跃用户,1周来访问过1次的也只有15万用户,因此全部100万用户的数据都放在内存有不合理之处,RAM需要为冷数据买单。

这跟操作系统非常相似,操作系统所有应用访问的数据都在内存,但是如果物理内存容纳不下新的数据,操作系统会智能将部分长期没有访问的数据交换到磁盘,为新的应用留出空间。现代操作系统给应用提供的并不是物理内存,而是虚拟内存(Virtual Memory)的概念。

基于相同的考虑,Redis 2.0也增加了VM特性。让Redis数据容量突破了物理内存的限制。并实现了数据冷热分离。

4. Redis的VM实现是重复造轮子

Redis的VM依照之前的epoll实现思路依旧是自己实现。但是在前面操作系统的介绍提到OS也可以自动帮程序实现冷热数据分离,Redis只需要OS申请一块大内存,OS会自动将热数据放入物理内存,冷数据交换到硬盘,另外一个知名的“理解了现代操作系统(3)”的Varnish就是这样实现,也取得了非常成功的效果。

作者antirez在解释为什么要自己实现VM中提到几个原因(6)。主要OS的VM换入换出是基于Page概念,比如OS VM1个Page是4K, 4K中只要还有一个元素即使只有1个字节被访问,这个页也不会被SWAP, 换入也同样道理,读到一个字节可能会换入4K无用的内存。而Redis自己实现则可以达到控制换入的粒度。另外访问操作系统SWAP内存区域时block进程,也是导致Redis要自己实现VM原因之一。

5. 用get/set方式使用Redis

作为一个key value存在,很多开发者自然的使用set/get方式来使用Redis,实际上这并不是最优化的使用方法。尤其在未启用VM情况下,Redis全部数据需要放入内存,节约内存尤其重要。

假如一个key-value单元需要最小占用512字节,即使只存一个字节也占了512字节。这时候就有一个设计模式,可以把key复用,几个key-value放入一个key中,value再作为一个set存入,这样同样512字节就会存放10-100倍的容量。

这就是为了节约内存,建议使用hashset而不是set/get的方式来使用Redis,详细方法见参考文献(7)。

6. 使用aof代替snapshot

Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是Redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。

其实aof目的主要是数据可靠性及高可用性,在Redis中有另外一种方法来达到目的:Replication。由于Redis的高性能,复制基本没有延迟。这样达到了防止单点故障及实现了高可用。

小结

要想成功使用一种产品,我们需要深入了解它的特性。Redis性能突出,如果能够熟练的驾驭,对国内很多大型应用具有很大帮助。希望更多同行加入到Redis使用及代码研究行列。

分类: PHP开发 标签: ,

拓展职业发展之路 – 技术人员的产品观

2011年1月7日 没有评论

我勒个去,时间转瞬即逝,已悄然步入不知会是杯具或洗具的2011年。神马都是浮云,2010已经过去。让我们把更多的精力放到2011,顺便迎接2012。言归正传,不瞎扯了。今天想与大家分享和讨论下“技术人员的产品观”。

曾经,在我的周围经常发生着这样一幕:

“这里用户体验不好,麻烦修改下。”P说。

“这里也不不好,麻烦修改下。”P说。

“还有这里…这里…这里…这里……”P说。

产品同事总有一堆堆的问题找我们修改。头都爆炸了。

这只是一个例子,实际中,还有很多。对于这一幕,我们不用纠结产品同事是否如何,我们站在技术人员的角度来看看这个问题。

在我们开发产品的过程中,我们是否考虑过产品是否易用呢?是否考虑过用户群是谁呢?是否考虑过产品目标是什么呢?是否考虑过产品的商业模式?是否考虑过产品的运营?是否考虑过产品的优化?是否考虑过产品数据的深度挖掘?…

站在肯定的立场,我们如何思考和实施呢?

首先我们来看看做产品前,都要考虑的几个问题。

(一) 产品定位。

我们要做什么产品?核心竞争力是什么?

(二) 行业分析。

该行业有没有比较成功的案例?是否有竞争对手?竞争对手的商业模式是怎样的?

(三) 用户分析。

我们的用户群都有哪些?分别都有什么特性?

(四) 产品分析。

产品有什么核心功能?分别可以满足用户的哪些核心需求?产品有哪些内容?产品的哪些内容最能吸引用户?

(五) 商业模式。

产品如何盈利?如何长远发展?

在这五个方面之前,还要考虑用户需求调研,可行性分析等。

我们再来看下,产品开发过程中,主要都关注些什么?

(一) 交互设计。

产品所要传达的信息,如何能更好的传递给用户?不同的用户群是否要需要不同的展现和交互方式?

(二) 用户体验。

如何给用户以最好的feeling?

当然,在开发过程中,还会关注开发过程,测试等等。

最后我们来看下,开发完成后,都关注些什么呢?

(一) 产品推广。

产品如何推广?广告?联盟?微博?SEO ……

(二) 产品运营。

产品如何运营?如何拉来用户?如何留住用户……

(三) 数据挖掘。

运营数据需要监控哪些?如何分析?根据分析结果如何优化产品……

在这些过程中,我们技术人员,需要关注和考虑什么呢?如果你全部关注,最好不过了。

为什么需要关注这些呢?

技术固然重要,但体现技术价值的,将技术转化为生产力的产品也同样重要。在关注技术的同时,关注产品,创造更好的产品,创造更高的价值。

Google wave 、 google TV 从技术角度而言,很给力。但从产品角度而言,却Ungelivable,最终走向失败。

不要把我们的视野仅仅停留在coding,不要两耳不闻窗外事,一心只做coding活。

腾讯CEO马化腾,是个技术达人,但也非常关注产品。几乎每一款产品出来第一个体验的就是他。

百度CEO李彦宏,也是个技术牛人。其也非常之关注产品。百度的诸多产品也都经历其手。

关注这些有什么用呢?

也有很多技术人员在迷茫,难道要coding到七老八十?于是大家都在讨论发展方向和转型的问题。至于具体转型到哪个方向?是否要转型,暂不做讨论。但有一点是要提及的,就是可转型方向之一便是产品。

当你站在用户使用的角度去开发产品,那必定是较为好用的产品;当你站在老板的角度开发产品,那必定是较为成功的产品。

再说的实在一些,关注产品,对于技术人员的职业素质的提高,大有裨益。关注产品,来年的加薪可能就是你,来年的升值可能就是你。

2011新年伊始,抬起头看看,做个不是非常艰难的决定,关注产品,培养你的产品观,拓展你的职业发展之路,成就你的职业旅程。

本文已经首发于InfoQ中文站,版权所有,原文为 技术人员的产品观——暨2011年展望,如需转载,请务必附带本声明,谢谢。


分类: 我的日记 标签: ,

推荐一款PHP调试工具 — FirePHP

2011年1月1日 2 条评论

PHP调试工具之 — FirePHP

PHP调试有很多中方法。今天给大家推荐的是 FirePHP(http://www.firephp.org/)。

这个工具,是基于firefox的一个组件。Firephp组件安装地址。使用之前需要先安装下这个组件。完了还需要down一个FirePHP的包。下载地址

下载完成后可以看到包里的文件如下:

我们现在来写个例子测试下。(需要include 进来fb.php文件哦)代码如下:

我们在firefox下运行。结果如下:
firephp - 3

在这里就可以看到$str的值了。

接下来来介绍下FirePHP的几个常用方法:

1、  fb($para) 该方法就是如上示例。可以监测某个变量的值。该方法等同于FB::log($para)。

2、  FB:: info ($str);   该方法和fb()方法类似。不同的地方在于其运行结果在firefox中会有个不同的标志。(见图三)

3、  FB::warn($str);   同上类似。

4、  FB::error($str);   同上类似。


图三

5、  FB::trace($str); 该方法用于监控变量的调用栈。如下图示例。

我们也可以在类中使用FB。如下示例:

运行结果如下:
firephp

在fb.php中,我们可以看到有如下多的方法,在这里就不一一介绍了。主要常用的就是上面五个。有兴趣的同学可以仔细去研究测试下其他方法。

firephp

分类: PHP开发 标签: ,

腾讯(QQ)最新招聘信息

2010年11月19日 没有评论

申请方式:

请将简历发至邮箱:panshaoning# vip.qq.com 或  75251773#qq.com(发邮件时,请将#修改成@)

招聘岗位:

1、客户端开发工程师:(10人,深圳或北京)

任职要求:

深刻理解windows操作系统的内存管理、文件系统、进程线程调度;

了解MFC/windows界面实现机制,有一定的Windows下网络编程经验;

熟练使用VC,精通C/C++,熟练使用STL;

熟悉系统内核,有过架构设计和性能优化的实际工作经验

2、数据分析与挖掘:(5人,深圳或北京)

任职要求:

有扎实的统计和概率学基础,在海量数据分析、建模方面有丰富经验,数学系或计算机系相关专业,研究生以上学历;

2年以上的数据挖掘、分析、算法设计经验,参与过大型数据挖掘方面的系统建设,算法设计;

具有深厚的计算机算法基础,对算法设计和优化有丰富的经验,熟练使用C/C++语言以及数据分析,统计软件;

了解Linux/UNIX操作系统,了解Linux/Unix平台的C/C++编程;

致力于数据分析方面的研发工作,责任心强,良好的沟通能力和团队合作精神;

有木马,恶意web页面,病毒行为分析经验,优先

3、Web运营开发:(10人,深圳或北京)

任职要求:

2年以上HTML/CSS/JAVASCRIPT开发经验,熟悉JAVASCRIPT和CSS跨浏览器方面的技巧,了解HTML重构;有PHP项目开发经验者优先;

全面的软件知识结构(操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全);

熟悉mysql以及linux开发者优先;

4、后台开发工程师:(5人,深圳或北京)

任职要求:

2年以上linux后台开发经历,linux系统熟悉者优先,熟悉网络开发

精通C/C++,熟悉多进程编程和进程间通讯 ,对安全、高性能有深入了解

基础扎实,精通常用算法和结构

熟悉tcp/ip,http,熟悉mysql或其他大型数据库,了解shell脚本编程

具有两年以上互联网业务开发经验者优先,有大型分布式系统的开发经验者优先

5、产品策划:(3人,深圳或北京)

任职要求:

本科学历,互联网产品工作经验2年以上;

优秀的产品策划能力;

良好的用户感和运营数据分析能力;

优秀的自我激励意识,能不断地学习和进步;

良好的沟通技巧,具备一定的客户谈判能力;

较强的执行力,能承受一定压力并高效工作。

6、产品运营:(3人,深圳或北京)

任职要求:

大学本科以上学历,两年以上互联网工作经验,有互联网产品运营经验者优先;

对产品和服务的缺陷敏感,善于倾听用户声音;

熟悉和热爱社区管理工作,有知名论坛或大型社区运营或管理经验,富有创意;

有很强的责任心和合作精神良好的文字表达能力

良好的沟通能力、学习能力和团队协作能力,富有激情、能适应工作压力;

强烈的市场导向和创新意识;

7、客户端安全开发工程师:(5人,深圳或北京)

任职要求:

熟悉windows系统架构,了解系统核心机制

精通汇编语言,有一定逆向功底,能熟练使用静态反汇编,动态调试器进行程序分析

精通C/C++开发

有实际安全软件相关工作经验优先

8、驱动开发工程师:(5人,深圳或北京)

任职要求:

熟悉windows系统架构,了解系统核心机制

熟悉windows驱动开发原理和基础技术,可以独立开发完整的驱动程序

精通C/C++开发

有实际安全软件相关工作经验优先

9、测试开发工程师:(5人,深圳或北京)

任职要求:

计算机或者相关专业本科以上学历,工作三年以上,熟悉软件测试流程和规范

深入了解C/C++语言,熟悉window编程和网络编程,熟练使用shell/perl/python脚本

熟练掌握自动化测试和白盒测试的工具和方法,有较多测试工具开发和使用经验

了解常见的开发技术,有较宽的视野,接收新事物快,有团队能力

10、系统测试工程师:(5人,深圳或北京)

任职要求:

计算机或者相关专业本科以上学历,工作三年以上,深刻认识测试工作和研发过程,有良好的质量意识和客户意识

基础扎实,测试经验丰富,有较多测试工具使用经验,广泛了解开发技术;有安全软件测试经验优先

沟通能力强、能带领小规模团队

熟悉互联网行业,有较宽的视野,接收新事物快

分类: 杂七杂八 标签: ,

VI命令整理

2010年10月28日 没有评论

Vi共分三种模式,分别是“一般模式”、“编辑模式”与“命令行命令模式”。

l         一般模式:vi处理文件时,一进入该文件就是一般模式。在这个模式中,可以使用“上下左右”键来移动光标,可以使用“删除字符”或“删除整行”来处理文件内容,也可以用“复制、粘贴”来处理文件数据。

l         编辑模式:在一般模式中可以进行删除、复制、粘贴等操作,却无法进行编辑操作,要等到按下“i、I、o、O、a、A、r、R”等字母后才会进入编辑模式。注意,通常在Linux中,按下上述字母时,画面左下方会出现“INSERT或REPLACE”的字样,才可以输入字符到文件中。回到一般模式时,则按下ESC键即可退出编辑模式。

l         命令行命令模式:在一般模式中,输入“:或/或?”就可以将光标移到最下面的一行,在这个模式中,你可以搜索数据,而且读取、存盘、大量删除字符、离开vi、显示行号等操作都是在此模式中实现。

1、 使用vi进入一般模式

[root@linux]# vi test.txt

直接输入“vi+文件名”即可进入vi一般模式

2、 按下i进入编辑模式

在编辑模式中画面左下方会出现“INSERT”的字样。

3、按下【ESC】键回到一般模式

按下【ESC】键后马上就会发现画面左下角的—INSERT—不见了。

4、 退出vi编辑器

在一般模式中按下“:wq”为存储后离开vi,按下“:q”为不保存编辑离开vi。注退出时出现“只读”类的提醒时,可以在命令后加上“!”表示“强制”的意思。

常用命令

一、移动光标

1)        h 或 向左方向键(←) → 光标向左移动一个字元

2)        j 或 向下方向鍵(↓) → 光标向下移动一个字元

3)        k 或 向上方向鍵(↑) → 光标向上移动一个字元

4)        l 或 向右方向鍵(→) → 光标向右移动一个字元

5)        [Ctrl] + [f] → 屏幕『向下』移动一页,相当于 [Page Down]按键

6)        [Ctrl] + [b] → 屏幕『向上』移动一页,相当于 [Page Up] 按键

7)        n<space> → n 表示『数字』。按下数字后再按空白鍵,光标会向右移动这一行的 n 个字元

8)        0 → 数字『 0 』:移动到这一行的最前面字元处

9)        $ → 移动到这一行的最后面字元处

10)     G → 移动到这个文件的最后一行

11)     nG → n 为数字。移动到这个文件的第 n 行(可配合 :set nu)

12)     gg → 移动到这个文件的第一行,相当于 1G

13)     n<Enter> → n 为数字。光标向下移动 n 行

二、查找与替换

1)        /word → 向光标之下查找一个名称为 word 的字符串。如想查找 eric4ever 字符串,输入 /eric4ever 即可

2)        ?word → 向光标之上查找一个名称为 word 的字符串

3)        n → 『重复前一个查找的动作』

4)        N → 与 n 刚好相反,为『反向』进行前一个查找动作

5)        :n1,n2s/word1/word2/g → n1 与 n2 均为数字。在第 n1 与 n2 行之间查找 word1 字符串,并将该字符串替换为 word2。如:在 1 到 9 行之间查找 eric4ever 并替换为 ERIC4EVER 则:『:1,9s/eric4ever/ERIC4EVER/g』

6)        :1,$s/word1/word2/g → 从第一行到最后一行查找 word1 字符串,并将该字符串替换为 word2

7)        :1,$s/word1/word2/gc → 从第一行到最后一行查找 word1 字符串,并将该字符窗替换为 word2,替换前显示提示对话框是否确认替换

删除、复制与粘贴

1)        x, X → 在一行字当中,x 为向后刪除一个字元 (相当于 [del] 按键), X 为向前刪除一个字元(相当于 [backspace] 按键)

2)        dd → 刪除光标所在的那一整行

3)        ndd → n 为数字。刪除光标所在的向下 n 列

4)        yy → 复制光标所在的那一行

5)        nyy → n 为数字。复制光标所在的向下 n 列

6)        p, P → p 为将已复制的内容粘贴在光标下一行上,P 则为粘贴在光标的上一行

7)        u → 还原前一个动作

8)        [Ctrl]+r → 重做上一个动作

9)        . → 小数点,意思是重复前一个动作

★编辑模式

1)        i, I → 插入:在目前的光标所在处插入输入的文字,已存在的文字会向后退; 其中, i 为『从目前光标所在处插入』, I 为『在目前所在行的第一個非空白字元处开始插入』

2)        a, A → a 为『从目前光标所在的下一个字元处开始插入』, A 为『从光标所在行的最后一个字元处开始插入』

3)        o, O → o 为『在目前光标所在的下一行处插入新的一行』, O 为『在目前光标所在处的上一行插入新的一行』

4)        r, R → r 为『取代光标所在的那一个字元』, R 为『一直取代光标所在的文字,直到按下 ESC 为止』

5)        Esc → 退出编辑模式,回到一般模式中

★末行指令模式

1)        :w → 将编辑的文件写入到硬盘上

2)        :q → 退出 vi

3)        :wq → 保存后退出,若为 :wq! 则为强制保存为退出

4)        :set nu → 显示行号

5)        :set nonu → 取消显示行号

分类: linux开发 标签:

房产与互动营销

2010年10月22日 没有评论

纵览目前房产行业互联网广告,大都集中在传统的硬广(比如门户网站的banner广告),链接进去,大多是专题性质的广告展示,有的则直接链向了开发商的企业网站,鲜有采用互动营销模式的形式。

互动营销是指企业在营销过程中充分利用消费者的意见和建议,用于产品的规划和设计,为企业的市场运作服务。企业的目的就是尽可能生产消费者需求的产品,但企业只有与消费者进行充分的沟通和理解,才会有真正适销对路的商品。互动营销的实质就是充分考虑消费者的实际需求,切实实现商品的实用性。互动营销能够促进相互学习、相互启发、彼此改进,尤其是通过“换位思考”会带来全新的观察问题的视角。

来看几个互动营销的例子,通过该例子,可以更明确互动营销的概念:

http://nv200.act.qq.com/ 汽车行业, http://hpg.act.qq.com/ 消费电子行业,

http://ruready.qq.com/ 日化行业, http://citic.qq.com/ 金融行业

那么房产行业如何来互动营销呢?

房产,是个特殊的行业。每个房子的销售价格,动辄几十万,甚至上百万,上千万。人们的购买力又非常之弱。通过互动营销,直接来销售房子,难如上青天。此时,营销的方向可以转向品牌营销,通过品牌的影响力,来提高销量。

接下来我们来模拟策划一个房产互动营销的 简单案例。

开发商:万科。

预售楼盘:万科公园。

目标:通过互动营销,提高万科品牌影响力,同时带动万科公园楼盘销售。

互动形式:

1、  答题。题目为万科品牌相关问答,万科公园相关介绍等。比如万科曾获得的荣誉,万科公园的优势、万科的容积率、绿化率等。

2、  抽奖。通过答题,可以获得抽奖机会。这样可以让用户多多答题,多多了解万科。达到品牌建设的效果。(较多的奖品会带来更多的用户参与,也可以加入购房券,带动楼盘销售)

3、  邀请好友。通过邀请好友来参加活动,同时可以获得抽奖机会。提高用户参与数。

通过此种互动营销的方式,定会比目前传统的营销更具效果。况且,实践已经证明,互动营销的效果远好于传统营销方式。

分类: 杂七杂八 标签: ,