存档

‘也谈技术’ 分类的存档

iPhone/iPod/iPad中的开关按钮效果实现

2011年8月12日 2 条评论

我个人非常喜欢iOS系统中的开关按钮效果。相比于普通的checkbox,这种带有滑动效果的开关按钮显得更加美观,体验也更好。刚好最近在开发围脖贴,于是想在一些要用到checkbox的页面中使用类似iPhone/iPod/iPad中的开关按钮效果。

当然首先是寻找现成的实现,可能是我太土鳖了,不知道这个东西叫做 toggle switch,结果一直搜 toggle button,得到的结果都不是我想要的。于是索性自己实现了一个。(效果Github Repo

下面简单记录一下实现的思路。

背景动画

实现的重点在状态的切换过程,需要产生一个平滑的滑动效果。于是我想,制作一个左侧是开启,右侧是关闭的图片,作为背景,然后在切换的时候给背景做一个动画。于是产生了下图。

为背景作动画用到了Backgroud-Position Animation Plugin。仅使用一个开启/关闭联合起来的图是不够的,因为按钮有一个圆角,如果始终使用联合图的话,在一个开启状态下,右上角和右下角会显示灰色,在关闭状态下,左上角和左下角会显示蓝色,很不自然。所以,需要在动画结束后,把背景切换到单独的开启/关闭按钮的位置。

状态保存

考虑到这个开关按钮基本是放在一个form里面用的,因此使用一个hidden的input元素来保存它的状态。每次开关被单击,就改变input的值。这样以来,就很容易把开关状态通过表单提交到后台。

自定义事件

很多时候需要根据开关按钮的状态进行编程,因此添加了两个自定义事件 on 和 off,分别表示按钮被开启和关闭。可以使用jQuery的bind方法来添加事件处理函数。

成果

感兴趣的童鞋,可以 点击这里查看效果,或者在这里下载

用dompdf和pChart生成PDF报表

2011年5月16日 2 条评论

今天搞定了Proposal Tool v2.0的PDF报表生成模块。简单总结一下我所使用的解决方案。

需求

需求是要根据用户选择的历史数据,动态的生成一系列的折线图、饼图、柱状图,然后将这些图表整合到一个PDF文件中。PDF中的文本也是动态的和可修改的。

工具

开发语言使用PHP;图表生成工具使用了强大的pChart库;生成PDF的库选择了dompdf。

pChart将直接生成图片文件,很方便的就可以作多种用途。(pChart和jqPlot的比较,可参考我之前的文章:《图表生成工具pChart和jqPlot》)

dompdf简单易用,可直接将HTML转换成PDF。API十分简洁。不过dompdf有一些限制,它不支持position:relative/absolute, 不支持嵌套表格,不支持float等等(其他限制参考dompdf官方网站)。所以布局比较复杂的页面用它来处理会比较吃力。

解决思路

分3步解决

  1. 使用pChart将数据转换成图表,并存储为图片文件,保存在临时存储区中
  2. 使用PHP的模板引擎定制HTML,并在其中引用上一步中生成的图片文件
  3. 使用dompdf将上一步中的HTML转换为PDF文件,删除临时存储区中的图片文件

效果图

PDF Report Generated by pChart and dompdf

PDF Report Generated by pChart and dompdf

图表生成工具pChart和jqPlot

2011年5月10日 6 条评论

之前开发喜乐喜乐网的后台统计功能的时候,一直在用jqPlot,效果很不错,我挺喜欢的。最近手头的一个项目要求将生成的图表嵌入到PDF中,jqPlot就无能为力了。于是我不得不转而寻找其他的解决方案,这才发现了pChart。感觉只有一个,那就是相见恨晚啊。

下面简单对比一下这两个图表生成工具。

成像风格

先上两个图看看效果

pChart Showcase

pChart Showcase

jqPlot Showcase

jqPlot Showcase

在图像风格上,pChart更加倾向于秀气,线条比较纤细;而jqPlot则显得比较大气,线条结实稳重。pChart内置了边缘防锯齿的功能,阴影、透明等feature一应俱全,成像风格很漂亮,我个人比较偏爱之。

适用场景

当然,图像的风格只是外在的表象,这二者最重要的区别在于,一个是在服务器端渲染图像,另外一个则是在浏览器端。

因此,pChart要占用服务器的CPU资源,当然,也要占用硬盘空间,如果你要把图表通过web页面展示的话,还要占用带宽资源。因此,pChart并不适合于用在仅需通过web页面显示图表的情境下,在这方面,jqPlot要更有优势一些,因为它是完全通过Javascript在浏览器端作图像渲染,不需要占用服务器端的CPU和硬盘,带宽的消耗也偏小,因为仅需传输文本数据而不是图片。

反过来,当你的图片不仅仅是要在浏览器上显示,还要作其他用处,比如我现在面临的情境,需要把图表嵌入到PDF文件中,那么pChart就将是不二之选了。pChart还内置了缓存机制pCache,用以节约CPU资源。一定程度上减少了CPU的消耗。

API易用程度

由于图表中需要控制的元素特别的多,因此API不可避免的会比较复杂一点,总体上来看,由于jqPlot中可以使用json,API上相对会比较简洁一些。而pChart则略逊一筹。

pChart

  1. /* Create and populate the pData object */
  2.  $MyData = new pData()
  3.  $MyData->addPoints(array(-4,VOID,VOID,12,8,3),"Probe 1");
  4.  $MyData->addPoints(array(3,12,15,8,5,-5),"Probe 2");
  5.  $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
  6.  $MyData->setSerieTicks("Probe 2",4);
  7.  $MyData->setSerieWeight("Probe 3",2);
  8.  $MyData->setAxisName(0,"Temperatures");
  9.  $MyData->addPoints(array("Jan","Feb","Mar","Apr","May","Jun"),"Labels");
  10.  $MyData->setSerieDescription("Labels","Months");
  11.  $MyData->setAbscissa("Labels");
  12.  
  13.  /* Create the pChart object */
  14.  $myPicture = new pImage(700,230,$MyData);
  15.  
  16.  /* Turn of Antialiasing */
  17.  $myPicture->Antialias = FALSE;
  18.  
  19.  /* Add a border to the picture */
  20.  $myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
  21.  
  22.  /* Write the chart title */ 
  23.  $myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
  24.  $myPicture->drawText(150,35,"Average temperature",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
  25.  
  26.  /* Set the default font */
  27.  $myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>6));
  28.  
  29.  /* Define the chart area */
  30.  $myPicture->setGraphArea(60,40,650,200);
  31.  
  32.  /* Draw the scale */
  33.  $scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE);
  34.  $myPicture->drawScale($scaleSettings);
  35.  
  36.  /* Turn on Antialiasing */
  37.  $myPicture->Antialias = TRUE;
  38.  
  39.  /* Draw the line chart */
  40.  $myPicture->drawLineChart();
  41.  
  42.  /* Write the chart legend */
  43.  $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
  44.  
  45.  /* Render the picture (choose the best way) */
  46.  $myPicture->autoOutput("pictures/example.drawLineChart.simple.png");

jqPlot

  1. plot1 = $.jqplot('plot-area-daily'[s3, s1, s2],
  2. {
  3.         title : '总订单数、付款订单数按日统计 - 2011-04-10 ~ 2011-05-10',
  4.         legend:{show:true, renderer:$.jqplot.EnhancedLegendRenderer, location:'nw'},
  5.         series : [ 
  6.                 { label : '总订单数' },
  7.                 { label : '付款订单数' },
  8.                 { label : '未付款订单数' } 
  9.         ]
  10.         axes : { 
  11.                 xaxis : { 
  12.                         renderer : $.jqplot.DateAxisRenderer,
  13.                         tickOptions : { formatString: '%Y-%m-%d %a' }
  14.                         }
  15.                 yaxis : { min : 0, tickOptions : { formatString: '%d' } } 
  16.         }
  17.         cursor:{zoom:true, showTooltop:false}
  18. });

总结

pChartjqPlot
成像风格秀气,鲜亮大气,稍显暗淡
技术特点服务器端,基于PHP浏览器端,基于Javascript
优势生成图片文件,可用于多种用途在浏览器端渲染,节约服务器资源
适用场合图表有多种用途时图表仅需在浏览器中显示时

程序设计与实践2结课

2011年5月7日 2 条评论

曰:悠悠长路暂别过,漫漫征途再启程

程序设计与实践2顺利结课了。今天下午跟学生们唠叨了一下项目开发的一些琐事,估计学生们也是云里雾里的。以后这种不伦不类的说教得完全抛弃了,原本以为自己能真正的言之有物的,结果发现离开了代码和项目的土壤,扯这些闲淡实在是不给力。

总体上来讲这学期的课程效果还算是可以,几个参与项目的学生都还是令人满意的。而且还有王芳同学,这个所有作业全部完成的女生。应该说课程的基本目标是达到了。但是还是有很多的遗憾,在此罗列一下,下学期要有针对性的改进。

一、作业还不够精

我非常赞同sunner的“淡讲课,精作业”的理念,在这学期得课程里也在尝试去模仿,不过看起来现在还是有点蹒跚学步,不够老道。一共布置了3次作业,一个HTML+CSS的作业,一个算命程序,一个Mini WOW。前两次作业的提交情况还是让人满意的,效果也不错,不过最后一次的作业效果不好。

作业的几个问题:量小、难度低、没有体系。这些都要好好的加强一下。如果作业不够有挑战性,就无法显著的提升教学效果。本学期的作业还是侧重于让学生能够完成,免得太难吓跑了大家。下个学期应该适当的调整。目前在跟老杨讨论建立习题库的想法。

二、课堂讲授内容不够充实

有几节课的内容太过干瘪,言之无物。没有能够传达尽量多的信息量。课堂也显得枯燥无味,与我最开始“有意思”的定位相去甚远。在这一点上,可能还要多下一点功夫。课堂上的内容应该既有趣,又有代表性。下学期会考虑把本学期的学生遇到的问题整理汇总一下,作为素材用到下学期的讲授中。结合实例进行剖析,不能再这样光靠唾沫星子作战了。

三、知识缺乏系统性和条理性

原本计划本学期的课程要把Web开发的入门步骤整理一个有条理的系统出来,但是由于种种原因这件事情到现在还没有完成。尽管我自己已经在脑海中反复的构思过这个东西,但一直没能落实成文字和一个可执行的规划出来。这件事情一定得在下学期开学前搞出来。否则这个硬伤肯定会影响到下学期的教学效果。

PureWeber Blogs草稿

2011年5月3日 没有评论

曰:生前何必久睡,死后自当长眠

给PureWeber Blogs设计了一个简单的首页,计划明天把它上上去。

之前的计划没有彻底的执行,Proposal Tools的工作还剩下一大堆。惭愧的是今天下午又偷懒睡了一觉。勤奋还不够,毅力仍欠缺。

千里之行,始于足下

2011年4月1日 14 条评论

IBM技术中心11年4月1日分享会讲稿

关于学习

今天又来到IBM技术中心,我感到亲切又陌生,亲切的是我也曾经是这个集体的一员,陌生的是这个牛逼的集体现在都是一些陌生的脸。尽管各位已经坐在了这里,但我想有些人很可能在一边犯嘀咕,“上面这家伙谁啊”,一边迫于Cliff的淫威而不敢有所表示。好吧,那我就先从我与IBM技术中心的渊源说起吧。这样开头不仅恰当,而且必要。

那是在我大一下学期,我们寝室的比尔(也就是后来的大逼哥)嚷嚷着说要到什么IBM俱乐部去,尽管对这个神秘的黑帮组织不甚了解,但是看比尔那副认真的样子,我也就不由得产生了兴趣。后来我们一大帮人组团从二区杀到一区来面试。面试那叫一个牛逼,我记得是刘德超师兄面的我,拉着个脸,怪吓人的。反正我当时紧张得不行,也不知道自己吹了什么牛逼,总之用尽浑身解数。还提前拖了关系跟Cliff走后门。好歹算是通过了面试,到现在也不知道是面试表现还是后门起了作用,不过这已经不重要了。

我们一起加入的有后来非常知名的科学家于墨,大牛逼王超,科学怪人李震,娱乐圈人士王海平。当然还有先我们加入的大逼哥。

接下来的暑假,就是我人生中最为重要的时期之一,在这个暑假,我比较系统而全面的学习了一系列的知识,也培养起了我对技术的敏感和兴趣。一系列的新手任务让我抓心挠肝、绞尽脑汁,但同时也让我异常兴奋、充满斗志。

新手任务中有一个任务是vsftpd的配置,这个任务事实上没有什么复杂的,但是却把我们这一批newbie都给难住了,鼓捣了好久也搞不定,没办法了,向师兄求救。这一次求救对我的影响很大,它事实上将我对“提问”这个动作的观念提升了一个档次,也直接影响了我日后面对问题时的态度。

负责解救我们的是刘德超师兄,对,就是那个瘦了吧唧面试的时候拉个长脸那位。他首先自己闷头把vsftpd配置了一遍。然后让我们围坐一圈,开始讲评。依然是拉个脸,那讲评,真是能让一个有廉耻的猪都脸红。事实上我们屡屡无法成功的原因是,vsftpd用于做虚拟用户认证的一个库没有安装,而在几乎每一个教程中,都提到要安装这个库。我们也尝试安装了,悲剧的是,就像秀才识字认半边一样,我们草率的依据apt中的软件包名称进行判断,结果安装了错误的库。就是这么一个问题,困扰了我们好久好久,最后还不得不麻烦刘师兄出马。

其实之前我们一直都没怎么太提问,因为大家都憋着一股比赛的劲头,你不提问就能搞定,我也不能落后,我也不提问,自己搞定它。这一次是全军覆没的不得已之举,结果却是让我们都无比汗颜。所以,从此之后,我对提问就十分慎重了。轻易不发问。遇到问题自己找教程,查资料,泡论坛,反复尝试,不行就重头再来。总之就是不愿意去问师兄,怕又问出弱智的问题。结果证实,这种方法对于提高个人能力有着无比神奇的效果。后来我发现,大部分的问题都可以通过这种方式自己解决。

暑假结束后,大二正式开始,开学不久我就退出了俱乐部。说起来这个事情挺遗憾的。因为当时我刚刚当选了班级的学习委员,感觉自己的精力不够。各位可能觉得我应该是钙铁锌硒维生素样样都缺吧?不过我当时确实是这么想的。

接下来再给大家说几件有意思的小事,让大家充分的见识一下我到底有多么缺乏钙铁锌硒维生素。

我大一的时候疯狂迷恋上了网页制作,不过是很山寨的那一种,就是在某个提供个人主页的网站上注册个账号 ,然后四处搜集各类的HTML代码,拷贝过来堆到一起,再强行的加上一些超级华丽却毫无用处的js效果(像什么时钟、下雪、满天星斗)。就是这样的无聊事情,我疯狂到去网吧包宿。听清楚了,是去网吧包宿做网页!妈的还是用非常山寨的个人主页有木有!!天天在机房泡着,悉心经营自己的网站,到晚上机房关门了还不死心,去包宿!这是什么样的精神?

大一的寒假,对做网站的疯狂迷恋让我鬼使神差的借了一本ASP.NET回家。而我借这本书的原因是,我在一本计算机科普杂志上了解到了有ASP这么个东西,是用来做动态网站的,而我去图书馆的时候,看这本书的介绍,说ASP.NET比ASP牛逼多了。于是毫不犹豫,假期把这本600多页的大部头抱回家了,一并抱回家的还有一堆大部头著作。结果可想而知,我在抓心挠肝中度过了寒假,然后在开学的时候悲催的把各种大部头原封不动的搬回了学校。

大二的寒假,我终于有点脑子了,再加上知道的东西也照比大一的时候多了一些,我没有再做出特别悲催的事情。这个假期我的计划是开发一个类似百度知道的东西。因为那个时候我们班级的8个同学成立了一个学习组织叫做Cybery Studio,所以我给这个知道系统起名叫Cybery知道。我确实把它开发出来了,其中使用了我会的所有尖端技术,像什么面向对象,模板引擎,MVC,但是事实证明它啥也不知道,因为它根本就没有被使用过。尽管如此,我还是从中收获了很多东西,长进不少。

我们刚大二的时候,班主任孙大烈老师让我们学习拆装电脑,说实在的,我心里当时也犯嘀咕,咱这堂堂哈工大的本科生去学这玩意儿?但是看孙老师那意思,无比认真,仿佛这个事情是天经地义的,于是那点嘀咕就烟消云散了。然后就杀到了综合楼215,跟着王丕栋师兄去鼓捣一堆史前的老土计算机。嘿,还别说,也算是把个计算机的五脏六腑认了个全,而且这个技能确实解决了好多实际问题,因为后来有好几次亲戚朋友因电脑慢而找我排查的,都被我拆开机箱把机器大卸八块的表演震慑住了。其实我不过是给他们清了清灰而已。

说了这么多,并没有什么有营养的东西。如果非得要我总结一点我的学习心得的话,那就是:不问缘由的去学习。上面提到的事情,有些是非常有意义的,比如在俱乐部的那些经历,有些是没那么有意义的,比如包宿做网站和ASP.NET事件,但是,我都用心的做了。我庆幸自己当初用心的去做了这些事情,也庆幸自己没有去问“为什么”“有没有用”这类的问题。

为什么庆幸呢?因为后来我发现,大多数问这种问题的人,往往都会得很少。他们把大量的时间花费在犹豫、徘徊、等待上,他们最爱做的事情就是问老师、问师兄:“我应该学点什么好呢?什么东西对我最有用?”他们看起来很热爱学习,很上进,很渴望知识,但是,矛盾的是,面对着知识的浩瀚海洋,他们没有把自己的脚踏进去,而是选择在岸边踯躅和徘徊,为应该在哪个位置下水而烦恼万分,却忘记了,最重要的事情不是下水的位置。

其实生活就想魔兽争霸,满屏幕是一团战争迷雾,不同的是没有任何商店能让你买到望远镜,你必须得往前走才能看到黑暗中的地形。光站在原地可哪撒磨是没有用的。

没有人能够遇见未来,就像乔布斯说的“You can’t connect the dots looking forward; you can only connect the dots looking backwards”。所以,别过于心急的要在你的人生才刚刚开始的时候就给自己绘制一条固定的曲线,你完全可以先把一个个的点画出来,等到多年后你回头看的时候,把它们连接起来,成为一条美丽的曲线,是那么自然的事情。

关于实干

在我大三的时候,一次软件工程课上,由于临近期末了,好几门考试都结束了,所以大家都在底下嘀咕成绩的事情。有同学自制了一份成绩单,但是这份成绩单没有算出学分绩,所以排名是不准确的。当时我正好在学Java,于是,我就在课堂上用Java写了一个程序,把学分绩算出来,然后生成了一个按照学分绩排名的成绩单。其实就当是练个手,但是没想到周围好多同学都过来问自己的排名。看来大家都十分关心自己的成绩。我其实也关心成绩,但是此事对于我还有另外一重意义,那就是我写的程序真的有人需要,能够解决他们的问题,尽管这是一个非常简单的程序。

其实,我编写那个程序,还有一个原因是我是班级的学习委员,所以当同学们想知道自己的排名时,我自然就有义务帮助他们。提到这个,我得简单说说我的学习委员生涯。

当初冒出了想当学习委员的想法,是因为我觉得前任学委干的不好(恒哥请原谅),所以想自己去尝试一下。上位之后才发现其实学习委员也不是那么好当的。组织讨论会、讲座、学习小组、程序开发什么的,都挺费时费力的。而且这些做法的效果不是很好衡量,我不知道自己到底是比前任干的好一些还是差一些。总之心里没什么底。但是有一点我是很托底的,那就是我尝试了,我用心去做这件事了(为了它甚至放弃了IBM俱乐部的成员资格)。在对现状不满的情况下,我没有在原地打坐骂街,我行动起来,去尝试改变它。当然,后来有些我的同学看我没有功劳也有苦劳的份上恭维过几句,算是取得的一点点成果吧。

虽说没有什么惊天动地的震撼效果,但好歹我也算是能折腾,在一个班级27人的条件下开展了那老些个活动,折腾的也够劲了。也许正是因为这一点吧,大烈就把我给叫回来了,让我给师弟师妹开一门讲Web开发的课。

就我个人来讲,我挺乐意做这个事情的。光说乐意程度不够,我简直是求之不得。原因有几个,比如想趁机俯视一下孩子们,可以比较从容的教训教训新人,或者伺机把个妹子什么的,对吧?不过最为重要的原因是:小爷我终于可以做点什么来改变一下这操蛋的教育了。我充满热情的投入到这个事业中来。尽管可能在有些人看来这有点莫名奇妙(要知道,像灯泡、cliff这样的人,都是体制内啊,我这一个名不正言不顺的家伙跑回来开毛课啊)。但是我觉得我要做的事情是那么的理所当然,那么的符合逻辑,以至于我根本不需要去推理。

这是我想跟大家分享的第二个心得,那就是:在操蛋的现实面前,做点什么比任何牢骚都管用。光看到了,意识到了,埋怨了,骂了,那没用。或者至少作用微乎其微。但是如果你真能用心去做点什么以求改变现状的话,情况也许就会不一样。包括现在我们面对的各种社会问题,是同样的道理。我经常在网上看到犬儒青年的让人不能苟同的论调,说这些现实虽然不合理,可是你我根本就无法改变,能做的也不过是骂两句。我认为这些想法都太过消极了。事实上,真正用心去做,很多事情都是大有可为的。

下一次有同学抱怨paper work太多,很烦人的时候,你完全可以用心想一想,我能不能编个程序解决这个问题;当你看到班级学风不正的时候,也该用心的想一想,作为这个集体的一员,能够切实的做点什么。哪怕最后你真的无法改变什么,但最起码你尝试了。这比什么都重要。这就好像你喜欢一个妹子,怕她不喜欢你,那你也要勇敢的表白,万一她答应了呢?你要是不表白,那真是绝无可能成功的。

最大的失败不是屡屡尝试屡屡失败,而是在尝试之前就已经认怂服输。

关于生活方式

接下来我跟大家分享一下关于生活方式的思考。

每个人应该都有自己关于生活方式的思考,而我也坚信人的最大的自由就是选择自己生活方式的自由。所以,接下来我只是把我个人的一些思路和想法跟大家分享一下,并没有宣扬什么东西的意思。

在我刚刚进入大学的那段时间里,还非常懵懂,纯纯的一个红色小青年。对于未来,能想到的就是好好学习,保研,读博。我妈妈就希望我能一口气读个博士下来,我对此也没有什么特殊的想法,读就读呗,有啥的。

当然,这种所谓的理想是虚假的,因为我甚至都没有考虑过为什么要这么做。也没有想过读了博之后该干什么。那完全就是一种惯性思维。

有一件事情让我现在想来十分庆幸,那就是我并不是很在乎成绩。别误会,我的意思是我不会仅仅为了成绩而去学习。因此,尽管我有一个偏执的“一直读书”的理想,但是它并没让我变成一个书呆子。

从大一开始,我就不怎么经常去上自习,那时候我们寝室的4个人天天泡在专教,而我和大逼哥则天天泡在寝室,大逼那时候搞了个二手的笔记本,是T23还是T21来着,反正是一个古董。大逼哥在上面装了一个fedora linux,然后尝试各种对我来说十分新奇的东西。正是从那个时候起,我第一次感觉到了黑底白字的命令行之性感。

后来的IBM俱乐部的经历,给赵老师的实验室当网管的经历,都让我感觉到了动手编程的乐趣。也是在大二,我赚到了人生当中的第一笔钱,整整450块大洋。而且仅仅用了一个晚上。这让我对做项目产生了极大的动力(是的,是450块钱给了我动力,请尽情的嘲笑我吧)。于是我那个读博的目标动摇了。在实验室里面呆了一阵子,跟带我的朱师兄了解了一些实验室的生活。越发觉得自己不喜欢那样。尤其是我本身并不具备搞科研的天分。

于是,我把自己的目标从“牛逼的学历”调整到了“牛逼公司的雇员”。我要找工作!找好工作!让读博见鬼去吧。

后来的事实证明,男人也是嬗变的。因为到了大三的时候我的目标就已经从“牛逼的公司雇员”调整到了“牛逼的企业家”。因为我在看完了《越狱》之后又莫名其妙的看了一堆《赢在中国》的视频。于是,作为一个有志青年,我心动了,热血沸腾了。立志要走创业这条路。我要创业,我要创牛逼的业!让找工作见鬼去吧!

当然,这种想法是幼稚的,不成熟的,从我和老杨拉帮子开始自己干开始到现在,经历了很多问题和挫折,我知道创业并非容易的事情,但是,这并不影响我的信心和热情。因为我相信,只要我坚持下去,总有一天会变得牛逼。是的,我的追求又从“牛逼的企业家”变成了“牛逼的自己”。

前面都是铺垫,我真正想要说的是,我现在的目标。我也是最近才想明白这个问题,我要的,不是高学历,不是好工作,不是大企业,甚至也不是牛逼,而是按照自己的意愿去生活,享受生活带给我的乐趣。至于做什么,这是次要的事情了。有一期《面对面》节目,讲述志愿者卢安克的故事。这期节目对我的影响很大,他让我见识到了一种纯粹,一种淡泊,一种简单到不能再简单,却又华丽到无法再华丽的生活方式。我想我是开窍了。虽然我依然希望拥有体面的生活,但是那已经不是我的主要目标了。我追求的,不再是“牛逼的自己”,而仅仅是“自己”而已。我就是我,就算我不牛逼,那又有什么关系,我只要坚持做我自己喜欢做的事情,有意义的事情,开心快乐的活着,不就已经挺好的了吗?

也许这听起来有点消极和不求上进,但是我确信,这是最为积极和上进的思路之一。我会坚持这样走下去。

是的,我的追求,从对一个具体的目标的追求变成了对一种生活方式的追求。具体的目标会变,但是生活方式却相对更加稳定而不容易变。

我要跟大家分享的是:想一想你想要一种什么样的生活呢?这个问题,值得花时间思考。

结语

恭喜你们,能够耐心的把这么无聊的唠叨听完。我想与大家分享的也就是这三件事了:

  • 面对知识的海洋,别犹豫,一个猛子扎进去,享受那清凉的刺激吧
  • 世界不完美,这谁都知道,一味的强调它的不完美不如做点什么让它变得更完美
  • 找到属于你的那种生活方式,因为它很大程度上决定了你的生命质量

谢谢大家

(完)

Mysql按条件计数的几种方法

2011年2月24日 1 条评论

最近在给喜乐喜乐网的后台添加一系列的统计功能,遇到很多需要按条件计数的情况。尝试了几种方法,下面简要记录,供大家参考。

问题描述

为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景。

从前有一个皇帝,他有50个妃子,这些妃子很没有天理的给他生了100,000个儿子,于是,皇帝很苦恼,海量的儿子很难管理,而且,他想知道每个妃子给他生了多少个儿子,从而论功行赏,这很难办。于是,皇帝请了一个程序员帮他编了一个程序,用数据库来存储所有的儿子的信息,这样就可以用程序来统计和管理啦。

数据库的结构如下:

id皇子的唯一编号
mother皇子母亲的唯一编号

皇帝把妃子分成了两个等级,天宫娘娘(编号小于25)和地宫娘娘(编号大于等于25),他想知道天宫娘娘们和地宫娘娘们的生育能力孰强孰弱。于是,程序员开始写SQL Query了。

方法1:使用GROUP BY

SQL Query

  1. SELECT COUNT(*) FROM `prince` GROUP BY `mother` > 24;

执行结果

  1. count(*)
  2. 50029
  3. 49971

在100,000行数据上的运行时间:0.0335 秒

分析

这种GROUP BY方法的最大问题在于:无法区分所得到的结果。这两个数字哪一个是天宫娘娘们所生的皇子数,哪一个是地宫娘娘们所生的皇子数呢?不知道。所以,尽管它统计出了总数,但是没有什么意义。

因此,为了区分统计结果,必须要把条件 mother > 24 也作为一个字段在结果集中作为一个字段体现出来,修改后的sql如下:

  1. SELECT COUNT(*) AS `number`, `mother` > 24 AS `type` FROM `prince` GROUP BY `mother` > 24;

执行结果

  1. number type
  2. 50029 0
  3. 49971 1

条件表达式作为字段时,该字段的值就是该条件表达式的值,因此,对应我们的例子,type = 1 也就是表示 mother > 24 的值为1,因此,第二行中的数字代表地宫娘娘们所生的皇子数。

经过修改后,我们看出,天宫娘娘们略胜一筹。

优缺点

缺点是显而易见的,由于使用了条件表达式作为分组依据,它只能做二元的划分,对于要分成多类进行统计的情况不能够胜任。比如要分别统计1~10号、11~24号,25号~50号妃子的产子数,就无法实现了。

另外,由于使用了GROUP BY,因此涉及到排序,执行时间上要更长。

我暂时没有发现这种方法的优点。

方法2:使用嵌套的SELECT

使用嵌套的SELECT也可以达到目的,在每个SELECT子句中统计一个条件下的数据,然后用一个主SELECT把这些统计数据整合起来。

SQL Query

  1. SELECT 
  2.     ( SELECT COUNT( * ) FROM `prince` WHERE `mother` >24 ) AS `digong`,
  3.     ( SELECT COUNT( * ) FROM `prince` WHERE `mother` <=24 ) AS `tiangong`

执行结果

  1. digong tiangong
  2. 49971 50029

在100,000行数据上的运行时间:0.0216 秒

分析

这种嵌套SELECT的方法非常直观,就是分别统计各个条件下的数值,最后进行汇总,通俗易懂,跟自然语言没啥区别了。

优缺点

优点就是直观,而且速度也比GROUP BY要快。虽然是3条SELECT语句,看起来比GROUP BY的方案多了2条语句,但是它不涉及到排序,这就节省了很多时间。

缺点可能就是语句稍多,对语句数量有洁癖的同学可能会比较不舒服。

方法3:使用CASE WHEN

CASE WHEN语句的功能很强大,可以定义灵活的查询条件,很适合进行分类统计。

SQL Query

  1. SELECT 
  2.     COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END ) AS `digong`,
  3.     COUNT( CASE WHEN `mother` <=24 THEN 1 ELSE NULL END ) AS `tiangong`
  4. FROM prince

执行结果

  1. digong tiangong
  2. 49971 50029

在100,000行数据上的运行时间:0.02365825 秒

分析

此方法的关键在于

  1. COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END )

这里的COUNT和CASE WHEN联合使用,做到了分类计数。先使用CASE WHEN,当满足条件时,将字段值设置为 1, 不满足条件时,将字段值设置为NULL,接着COUNT函数仅对非NULL字段进行计数,于是,问题解决。

优缺点

优点嘛,此方法也不涉及到排序,因此运行时间上与方法2相当,SELECT语句减少到了 1 条。

缺点就是语句比较长,对语句长度有洁癖的同学可能会比较不舒服。

总结

对于确定分类的按条件计数,可以尽量不用GROUP BY,从而避免排序动作,加速Query的执行。

如果需要根据某个字段的值进行分类,而该字段的值是可变的,比如皇帝要统计每一个妃子的产子数,而他可能不停的再娶很多妃子,这种情况下,使用方法2和方法3就不太灵光了,还是使用一个GROUP BY来得简单便捷。

Apache中的ServerName和ServerAlias

2011年2月16日 没有评论

最近在向服务器上新添加一个网站的时候遇到了一个问题,症状是虚拟主机之间出现了混淆,用某个虚拟主机的域名却访问到了另外一个虚拟主机的内容。经排查发现是一个低级错误,特此记录。

问题出在ServerName和ServerAlias的设置上。先看有问题的配置:

ServerName sub1.domain.com
ServerName sub2.domain.com
DocumentRoot /var/www/sub/
# other settings

ServerName doc.domain.com
DocumentRoot /var/www/doc/
# other settings

导致问题的原因是第一个VirtualHost的ServerName出现了两次,使用ServerAlias替换第二个ServerName之后,问题解决。

ServerName sub1.domain.com
ServerAlias sub2.domain.com
DocumentRoot /var/www/sub/
# other settings

[转]:Ubuntu字体美化

2007年10月17日 没有评论

首先要说明的是,我也是一个新人。也是在论坛中看了不少贴子后才会了一些东西。然后将自己的一些心得发上来,希望对大家有所帮助。

首先是将系统装好。在字体中设置原到的10号全部成9号,效果不太理想。

然后按按照论坛中 Vstar达人的

引用:
[分享]我的字体美化方案(Dapper+WQY+MSfont)

http://forum.ubuntu.org.cn/viewtopic.php?t=18638进行。

这里我省略了他的第一个步骤,直接从第二步开始。
因为我不太喜欢文泉驿的字体,还是习惯MS的宋体+Thoma的字体组合,或是再加上Verdana字体。
如果有版权问题,还是请使用文泉驿的字体比较好,使用MS的字体还是会有版权方面的问题。这里只是给看习惯了MS Windows 操作系统界面的朋友提供一个美化方法。

1、安装MS字体
cd /usr/share/fonts
sudo mkdir zh_CN
然后将MS的字体文件(simsun.ttc tahoma.ttf verdana.ttf verdanab.ttf verdanaz.ttf tahomabd.ttf verdanai.ttf)复制到zh_CN目录下,然后

引用:
cd zh_CN
sudo mkfontscale
sudo mkfontdir
sudo fc-cache

注意,有不少朋友反映重启后,出现乱码,所以如果不以是root身份登录到系统进行修改的,而只是用sudo的方式建议再使用下面的命令,修改新增加的字体的权限
sudo chmod 644 /usr/share/fonts/zh_CN/
*

2、修改language-selector.conf文件

引用:
sudo cp /etc/fonts/language-selector.conf /etc/fonts/language-selector.conf_backup
sudo gedit /etc/fonts/language-selector.conf


使用下面的代码替换掉里面的全部内容 ,注意,我这里没有按照Vstar的把文泉驿字体放到第二位,而是直接把宋体(Siumu)放到第二位,因为没有用文泉驿的字体,所以把文泉驿的字体那个 family和string项都删除了。这样一来,如果系统中要使用中文字体,首先用到的就是宋体。

引用:
<fontconfig><alias>

<family>serif</family>

<prefer>

<family>Bitstream Vera Serif</family>
<family>SimSun</family>
<family>DejaVu Serif</family>
<family>AR PL ShanHeiSun Uni</family>
<family>AR PL ZenKai Uni</family>

</prefer>

</alias>

<alias>

<family>sans-serif</family>

<prefer>

<family>Bitstream Vera Sans</family>
<family>Simsun</family>
<family>DejaVu Sans</family>
<family>AR PL ShanHeiSun Uni</family>
<family>AR PL ZenKai Uni</family>

</prefer>

</alias>

<alias>

<family>monospace</family>

<prefer>

<family>Bitstream Vera Sans Mono</family>
<family>Simsun</family>
<family>DejaVu Sans Mono</family>
<family>AR PL ShanHeiSun Uni</family>
<family>AR PL ZenKai Uni</family>

</prefer>

</alias>

<match target=”font” >

<test name=”family” compare=”contains” >
<string>SimSun</string>
<string>Song</string>
<string>Sun</string>
<string>Kai</string>
<string>Ming</string>
</test>
<test name=”weight” compare=”less_eq”>
<int>100</int>
</test>

<test compare=”more_eq” target=”pattern” name=”weight” >

<int>180</int>

</test>

<edit mode=”assign” name=”embolden” >

<bool>true</bool>

</edit>

</match>

<match target=”font” >
<test name=”family” compare=”contains” >
<string>SimSun</string>
<string>宋体</string>
<string>宋体-18030</string>
<string>Song</string>
<string>Sun</string>
<string>Kai</string>
<string>Ming</string>
<string>黑体</string>
<string>新宋体</string>
<string>新宋体-18030</string>
<string>楷体_GB2312</string>
<string>仿宋_GB2312</string>
<string>隶体</string>
<string>SimSun-18030</string>
<string>SimHei</string>
<string>NSimSun</string>
<string>NSimSun-18030</string>
<string>KaiTi_GB2312</string>
<string>FangSong_GB2312</string>
<string>LiSu</string>
</test>

<edit name=”globaladvance”>

<bool>false</bool>

</edit>

<edit name=”spacing”>

<int>0</int>

</edit>

<edit name=”hinting”>

<bool>true</bool>

</edit>

<edit name=”autohint”>

<bool>false</bool>

</edit>

<edit name=”antialias” mode=”assign”>

<bool>true</bool>

</edit>

<test name=”pixelsize” compare=”more_eq”>

<int>12</int>

</test>
<test name=”pixelsize” compare=”less_eq”>

<int>24</int>

</test>
<edit name=”antialias” mode=”assign” >

<bool>false</bool>

</edit>
</match>

</fontconfig>

3、按Ctrl+Alt+Backspace重启X-windows,应该是这样的功能吧。呵呵。
然后再到“系统”“首选项”“字体”中进行设置,注意,设置中还是有一些重要的地方,不然效果还是不太理想。

注意1、在字体选项中
字体全部设置为9号,如果效果和MS Windows的效果不太一样,请全部选择使用THOMA字体,然后全部设置为8号,如下图
<!– –>
注意2、在字体渲染选细节中“平滑”要选“无”,这个很重要,不然英文字体会发虚。
如下图
<!– –>

4、这个是最终效果
<!– –>

另外,如果有兴趣,可以把Firefox中的字体也设置一下,网页的字体也会比较好看。
我设置的如下。
<!– –>
在“高级”中设置如下:
<!– –>

感觉超好的一次开发

2007年10月8日 1 条评论

从10月3号到昨天,我们俱乐部历时5天的项目开发完成了. 这次集中开发基本上完成任务. 更增进了我们成员之间的感情. 整个过程让每个人感觉都很好. 大家齐心协力, 虽然遇到很多的困难, 但都很顺利的解决了. 同时我们也得到了来自于孙大烈老师, BILL哥的大力支持, 以及佟达的女朋友的理解. 在这里表示感谢.

具体的细节在这里不多说了。以后再整理吧。这些天可累坏了,先休息了。

对了,忘了说,我们做的是一个聊天工具,暂时定名为KIT。

[code:cpp]
if($test == 1)
{
return 0;
}[/code]

Page optimized by WP Minify WordPress Plugin