Archive for the '我看技术' Category

git

Monday, April 14th, 2008

虽然git最近在rails社区被人说的耳朵长老茧了。。虽然我只是初入门,只是把git用在一个java项目上,但是我还是要说说,因为这玩意实在是太tmd好用了。。。
从参加工作开始,我经历了,每周末我收集项目成员更新的文件,合并升级(那个项目每周对在用系统进行升级),到vss ,cvs, svn,每一次的改变都然我感到非常兴奋,但是每一次的修改和提交我都需要小心翼翼,生怕做错什么。。如果网络不通或是速度太慢都会让我抓狂。。
用了git后,这些问题都不再是问题。。本地版本库,更小的负担(存储占用),快捷的分支和Tag,真是让人兴奋的东西。。即使你无法说服scm从svn转到git,但是你仍然可以试一试 git-svn,自己使用git来管理代码,再提交到svn中。试一试吧。。只要你受过压迫,只要你对现状不满,只要你不是非常讨厌命令行那么你一定会喜欢上它的。

这样开发WEB应用真的没问题吗?

Sunday, September 23rd, 2007

在之前的几年我所写的C/java程序在逻辑上基本不数据库打交道,所有参数加载到共享内存,所有的数据通过输入模块从数据库或文件中读取到内存(链表或二叉树)操作完后通过输出模块写回到数据库或是文件。因为数据库是非常慢的(比起内存或是写文件操作-指和insert相比),而且数据库是不可控的,在应用中应该把不可控的东西尽量限制在有限的地方(比如仅仅是输入输出),当然这样的系统比较多的是批处理系统,当然不全是,比如鉴权或是重单检查。
这几天在写代码和检查代码的时候发现所有程序几乎都是这样的

def some_method
@result = XXX.find(:all)
end

甚至连去一个数据的几个类别都是用几个find,比如不同类型的用户,当然了这可能只是我的个人问题。
User.find_by_user_type(type_a)
User.find_by_user_type(type_b)
猛然间发现,为什么我不一次性从数据库将这些用户取出来在对结果集进行过滤呢?反正这些数据都有用到至少一遍?
我这些年的学习和工作中得来的东西竟然在WEB开发上一点都用不上,甚至根本都没意识到这个问题?
想来想去可能是因为我对web开发的理解还停留在99年用php是形成的习惯和思想上吧。
这是个问题?
其实对于web这种要求快速反应的应用真的适合这种方式吗?
对于那种每次取10条数据取3次,和一次取30条数据循环3次(也可能是1次或是4次),应该使用哪种方式去操作其实是很明显的。
那么memcache吗?在遇到真正的性能问题前,使用memcache并不一定是什么很好的事情,那不是万金油,从程序逻辑抓起可能比什么都重要。
相关阅读(以前自己写的,现在看起来怎么感觉有点…):
节约内存是一种罪恶?
呵呵。记得这个当时还上了CSDN的首页,跟一个人在回复中大干了一天,也是我接触网络这么多年,唯一一次在网上和人家进行长时间的辨论。
数据库很慢?程序很快.

Rails cache机制和SSI结合实现高性能内容发布系统

Thursday, August 23rd, 2007

实践出真理。。(呵呵,也深沉一把)
灵活性和高性能是所有web(不只是web)开发者的共同追求。动态页面呢是灵活,可是效率太低。。生成静态页面呢效率高了又不够灵活,SSI(.shtml)机制是一个非常好的解决方案,这个已经不需要论证了看看主要门户就知道了。。
在开发CF-CMS的过程中我们使用了非常复杂的生成机制(包括取数、碎片,队列、生成管理、实时预览等)来生成.shtml文件和inc文件,之所以说它复杂是因为核心代码主要就是生成机制了(当然除了生成外还有取数模块),而我的主要工作也集中在这里。但是。。但是由于需要定时/不定时大批量的生成效率并不是很高(我已经很努力的优化了,而且服务器性能绝对不差),特别是初始化系统的时候需要将系统中的数据全量生成更是让人郁闷的事情。
在开发的后期(5月份)我想到了通过rails的cache机制和ssi结合的办法来实现。这样的好处是
1)系统不需要全量初始化。页面等到有访问的时候才生成(虽然不是用在这里但是这个想法已经被我发扬光大了^_^)。2)更新或是删除实体的时候不需要进生成队列不需要管理,只要简单的将cache失效就可以了。3)不需要实现预览机制。4)不需要第四了,前面3点足够了。
比如一个博客程序(生成静态文件的实现):
原来的实现方式是:发表篇文章则需要,1)重新生成列表数据。2)生成发表的post的文件。3)如果你的模板的sidebar里面有”最新文章”列表这需要从新生成所有实体的文件。(当然了你可以用javascript,你喜欢吗?还有seo问题呢)
cache+ssi实现:发表文章,1)清除列表数据的cache,2)发表的post有人访问的时候自动生成,3)sidebar里面的”最新列表”我们可以在模板里面把最新列表定义为一个inc,这样写inc文件就好了.
这样比较下来 1)实现非常容易,不需要什么生成啊队列啊. 2)系统效率应该是高非常多的(具体数据没测试过)。而且不会发生突发的大批量生成的任务。对系统处理能力的压力减小很多。
关于生成队列:这个东西还是可以保留的,比如在你为文章加上统计啊,热点的时候每次访问重新生成一次是不合理的。可以有一个延迟规则,符合这个规则的时候触发cache的清除。
如何实现:实现起来很简单了。1)把mapping中的url全部改为.shml结尾。2).设置controller的cache和cache失效规则(Sweeping).
打字很累。。upulife.com保留所有权利。。转载请注明出处:http://www.upulife.com
关于CF-CMS:这个项目已经完成。但是我觉的可能刚开始的时候目标定的太高了虽然大部分目标都实现了。但是系统复杂性太高,可能不大适合个人用户或是小团队使用。所以在后来的一些空闲时间(大概2天)我又实现了一个简化版本基本符合个人要求(比如实现个新闻系统,博客系统啊,下载站啊游戏站啊)是没问题了。而且基本使用cache+ssi的方式,最近比较忙,还未完全实现,等整理一些准备开源(考虑中…)

开源不是件容易的事情,坚持不倒更是不容易。

Wednesday, July 25th, 2007

今天看到这个David Heinemeier Hansson says No to Use of Rails Logo觉的并不是什么好事,DHH他们的做法没什么好说的,按DHH在评论中说的如果只是说源代码以外的东西倒是无所谓了,反正我不写书什么的。
只是我在担心DHH他们在被无数人F**K以后,是否还有那么大的激情继续rails?
其实开源真不是件容易的事情,特别是长久之后很可能失去心理平衡。
我很自大的认为我曾经对开源有过很大的兴趣,但是看到人们用自己的代码做种种事情的时候又不对你的工作做什么肯定(违反权利条款等等)的时候确实不是什么很好的感觉,“我花那么多时间为了什么?”,当然了那时候还小,而且所做的事情又不能称之为梦想。(也有自己去工作阿,以及多发展方向的选择问题了)
那时候国内还有个open source online(oso.com.cn),那简直就是Web2.0的先行者,不过02年的时候这面大旗也倒了。。
hehe,所以现在对于那些开源程序我始终抱着一刻感恩的心(每当用的时候都会感谢一下作者,真的,呵呵),特别是那些改变生活方式的东西象vim,rails,linux等等。。
update:
刚才打开oso.com.cn发现现在变成一个dedeCms建成的垃圾站了,悲哀。。。

从贝壳关闭开始说起。

Sunday, April 22nd, 2007

贝壳(Buykee.com — 贝壳·您身边的数码顾问),我是去年从朋友处听到这个网站的,但是并不太在意,今天看到其他博客看到贝壳说“2007年,我们平静的离开……”,我不知道它为什么要离开,在这说这个也没别的任何意思,只是这个事情勾起了我很久以来想写的内容:比价购物,比较购物对于消费者有什么意义?
我特意看了看pcpop,buykee和大拿网对于我购买电子产品的有什么帮助,可是没有,对于我买显示器的想法没有任何帮助。
那大拿网来说(为什么是大拿网?没什么就是原来有一个它的相关人员加我MSN讨论了几句技术问题,由此知道这个网站,如果没猜错的话这个网站还和某位大牛有关。)
我一直想买个液晶显示器,但是到现在还没下定决心买那个:
目标价格:2000块左右。
我的资料:程序员(C/java/脚本语言等),偶尔玩游戏(不玩3D,主要是帝国时代和星际争霸),偶尔看看片子。
对于硬件的了解:硬件盲
OK,我来到大拿网的LCD专区,我能的到什么?
一堆的显示器列表,一排的参数….
参数中我除了明白尺寸(英寸)是什么意思外,其他的点距(mm),平均亮度, 对比度,响应时间又是什么呢?对于消费者的我来说有什么影响呢?我得不到这个结果。
在这个地方我能得到的真正有价值的东西是什么呢?
价格区别…
pcpop上卖1980元
it168上卖1960元
但是这个价格对于我来说真的有意义吗?既然我愿意花2000块买个东西,我真的会很在乎这几十块钱的差别吗?不。
而我要的是对于我的情况来说哪一款显示器是适合我的?要买宽屏的吗?还是什么?要买什么样参数的?最好是具体到买个品牌的某个型号的,而且是过滤过我的喜好的(我愿意起初进行一些喜好配置)(比如,我不买日货,我喜欢黑色等)
可能就是希望得到一个:(贝壳·您身边的数码顾问)
但是很遗憾在这些网站中我都没有看到。
如何做到这个呢?
呵呵。涉及到后面我们要做的事情(当然了我对于比较购物没兴趣),改天再说。。。(回头看看似乎已经说的足够多了。)
其实相信很多人遇到过类似问题,也明白怎么解决,不是吗?

lisp及函数式编程资料收集

Saturday, March 10th, 2007

最近再一次对函数式编程发生兴趣看了些资料,列一下。
Lisp的本质(The Nature of Lisp) 原来在blog中推荐过的,现在有翻译版本了,看着舒服多了。
函数式编程另类指南(Functional Programming For The Rest of Us) 上文作者的另一好文。。。
Learning Lisp for CMPT 310 相当不错的教程,至少让我看懂了,并对于lisp有了一些了解。
Common Lisp Tutorial
Lisp Primer
Scheme 语言概要(上)
Scheme 语言概要(下)
跨越边界: Lisp 之美
还有:为什么函数式编程至关重要?(Why Functional Programming Matters) 呵呵,可惜当年因为沉迷计算机数学挂科了,有些公式、推理看着有些辛苦。

Technorati : lisp scheme

我看计费、结算(一)

Saturday, December 23rd, 2006

怕日子久了会忘记,写写自己的理解和看法。
声明:本系列所有文章只是本人这些年从事这方面工作的一些想法,而不是对于任何现有系统的描述和说明,而且很多内容只是个人的一些想法,未看到或听说过在任何已有系统的实现,不涉及任何公司的机密问题,由于计费、结算系统的结构相对来说比较固定和简单如果雷同实属正常或是巧合。本系列文章不得以任何形式进行转载转贴,本人保留所有权利。
第一天,先贴个图。

网站数据抓取与分析

Sunday, October 22nd, 2006

前几天参考了网络上的一篇关于网络数据抓取与分析的文章,于是自己就动手写了一下,效果还可以基本上能实现初步的功能,先贴几张图片上来:

程序 or 系统

Tuesday, April 25th, 2006

在计算机技术如此发展的今天,除了各大中小学校纷纷开设计算机专业外,各种各样的计算机书籍也在充斥着读者的眼球,但是这两者都有一个共同的毛病–太注重实际结果,而忽略了最为重要的规范和准则.
就那计算机软件业来说吧,如今我国每年通过各种培训和教育培养的软件人才是大大超出市场需求的,但是为何软件产业人才的需求量仍然很大的,很大一个原因就是教育的严重脱节.就拿我们今天的主题来说把,或许大部分的人都会认为”程序” 和 “系统”这两者是一样的,写一个程序或者代码你可以自由发挥,不必考虑任何效率和结构,更不用去理会它的可维护性,只要能够运行就ok,这也是当今大部分的参考书所提供的所谓参考,如清华 邮电等重点出版社出版的< **项目案例导航>等等,不能说他们代码写得不好,的确写的很好,有写小技巧也很不错,但是却缺乏了整体的规范,例如可以直接在代码里面进行数据库的连接设置和大量的数据库操作,(其实可以用config.ini去配置一些基本设置),有好的方法为什么不去积极的引导大家共同学习呢,老是用不好的方法来”教育”我们呢? 架构对于一个软件系统也是很重要的,但是教育对这方面的力度还是远远不够的,也很少作者能够透彻的分析和引导我们去学习(或许他们也没真正做过什么和架设过大型系统的框架吧.)
曾经看过一个这样的Sql代码是这样写的 select * from student,tab1,tab2,tab3 where …..
我想,很多人现在都在这么做,因为他们的参考书上是这样写的,想象一下如果一个表有10万条记录,这样全连接的效果将是很可怕的,虽然后面有where语句,但是这样做的效率将是非常的低.
上面的例子可以写成 […]

做一个独立的学习和工作者

Wednesday, February 22nd, 2006

“做一个独立的学习和工作者”,这是我长期坚持的一个原则,甚至于我离开第一份工作的原因也是因为老板和领导们不停的在我耳边鼓吹”公司是如何如何培养谁谁谁的”,是吗?我觉得我是一个独立的工作者,当企业文化与我的原则严重不符时我选择了离开。
如果你在工作或是学习过程中过度的依赖别人最后凡是遇到问题首先想到的是找别人帮你而不是自己想办法解决,日子久了以后你将失去解决问题的乐趣、能力和自信,将会成为问题与解决问题的人之间的一个传话机。形像一点的说就是一个中继器了? 那么你对于团队、企业还有什么价值呢?
现在的企业强调员工要有解决问题能力和学习能力。出现问题时应该怎么做呢?
0.发现问题时先镇定自己的心情,先不要管这个问题或是故障会给你的公司或是你自己带来多大的影响,否则你根本没办法静下心来解决问题。
1.先搞清问题的现象、影响、问题对于环境的依赖,以及问题的重现过程。
2.根据自己以往的经验寻找问题可能的原因。找出解决问题的大方向。
3.对您认为可能的原因进行排查。
4.查找网上资源、手头上的资料及自己的知识库,看看是否有相关的内容或是相似的历史。
5.如果以上过程都不能解决问题,那么就离开电脑出去吹吹风,或是抽根烟,让自己清醒一下,认真梳理一下自己的思绪以及可能遗漏的地方,在心里从头到尾描述一下现在的情况。切莫在那钻牛角尖,问题解决不了往往是因为你急于求成忘记了相关的事情造成的。
6.如果上述办法都没办法奏效,那么现在开始准备提问了,想想应该问什么人,而这个人是否合适、他对你所遇到的问题的领域是否熟悉,如果很是熟悉那么你们的交流可能方便些,否则你就应该规划一下自己应该如何提问才能让人家快速的明白你所遇到的问题,并给你准确的答复。记得我很喜欢的Chinaunix的C语言版主flw兄的签名是:如果你自己都不知道问题是什么,我能对你说的只是抱歉(大意)
7.现在你觉的应该问的人已经确定了,并且已经把如何提问想好了。 那么现在就问?不,你应该综合考虑一下提问的时机,首先确定一下你遇到的问题是不是很紧急不解决它会出现更大的故障或是工作无法继续进行,然后考虑一下被提问的人现在是否很忙,是否有足够的时候来了解你的问题以及帮你想解决方法。这一点很重要,如果你的问题不是很紧急那么请不要在上班时间或是人家很忙的时候去问题人家,因为据研究一个人从开始做一件事到进入状态至少需要15分钟的时间,你这么一打搅至少浪费人家半个小时的宝贵时间,即使他回答你的问题只需要10秒钟。其次如果他很忙而你的问题又稍微的复杂需要超过两分钟的时间才能解决,那么很可能他就会告诉你:”我也不知道”(不好意思,我自己也经常这样)。
8.如果还是解决不了那就先把问题搁下,先处理一些善后工作,过一些时间再想很可能就会解决了。。。或者上你喜欢的论坛或是讨论组去碰碰运气吧。
以上基本是我处理问题的过程,我觉得
首先应该冷静,当然这需要很多的锻炼,刚开始肯定会慌,经过这几年的工作以及工作中所遇到的问题现在遇事基本不会很慌张了。A:不好了,有20万元的错单。B:20万?才20万你慌什么我TMD的2000万的错误都见过了。当然我并不是要你无视错误,只是现在不是慌张的时候。
其次要找到问题的大方向,如果网络都不通的话,你就不应该去查进程状态。大方向没找对的话那么基本上找不到问题所在。一方面这个需要经验,另一方面需要认真的分析环境对于错误的影响。
最后要学会总结,特别是别人帮你解决问题的时候,你不能只是因为问题解决了就算了,而应该分析一下自己为什么没能解决是由于自己的知识不够还是自己的做事方法有问题,在别人解决问题的时候要顺着人家的作法去思考,对比他的做法和自己的做法有什么不同,有什么好处以及如何改变自己。问题解决后应该让自己知道问题的真正原因。深入再深入一点(别想歪了,这里不写黄色小说。)。然后把这些记录下来(如果值得的话)写成日记或是发布到blog,这样慢慢的你就拥有一个自己的问题库和知识库了,按照”事件总是重复”发生的理论,那么你的知识库就是你以后遇事时的锦囊了。
而当你帮别人解决问题的时候应该想到:”授人予鱼,不如授人予渔”。你给人家的应该是解决方法而不是解决做法更不能你直接帮人家处理,很长一段时间里我都陷在接收问题->解决问题的焦油坑里以致于性情爆燥、根本无法静心工作,几乎成了救火员了,即使我掐断了所有的即时通信、电子邮件联系都无法明显的改善问题,最后当我静下心来,发现我错了。问题总是有万万千千你解决一个问题并告诉别人做法,那么别人就只会处理这么一个问题当类似问题以稍微不同的方式展现出来的时候他就不知道处理了就又要来”请教”你了,所以要改变自己的做法啦。现在即使别人提一个很简单的问题,我也不会由于看他们处理的慢或是跟他们交流不畅而自己动手处理了,而是耐着性子一点点的跟他们分析原因,以及可能的处理路径,最后再怎么确认是一个什么样的问题,应该如何处理…….我想慢慢的他们也会形成自己的做事风格和处理事情的方法了。
如果你还不是一名独立的工作都那么试着照着上面的方法或是您自己可以接受的做来开始自己处理一些简单的问题吧,那么慢慢的你就会形成自己的思考方式和处事风格,而自那以后你就再也不会”低声下气”的去求人或是看别人的脸色了(我想应该没人喜欢这么做吧).
我从头开始到这里为止没有任何字句不让你去问别人问题,只是想说应该自己尽力去做,更多的自己解决问题。

为领导分忧:这些年来我一直在比较简单的工作环境中工作,几乎从来没有想过或是学习过所谓的”公司政治”,接触这个词语是在一次聚会上,才发现自己离他们是那么遥远,而这一段讨论的东西也不是告诉你如果把玩公司政治,而是说说我自己觉得一个员工应该怎么做自己的事情,也只是一些自己的简单想法不具通用性也不一定正确。作为IT业大家都知道没有BUG的程序是不可能的,没有问题的系统也是没有的,而出现问题或是发现BUG时我们应该怎么做呢?
1.报告领导:这种情况是我在很多运营商的分公司看到过,员工们事无巨细,只要有问题第一个想到的不是如何解决而是报告领导,即使是夜里3点半。(因为一般电信业的出帐都在夜里,而出帐又是最容易发生问题的时候),担责任真是很可怕的事情啊。
2.大哥啊,这个问题是我引起的我们把它给灭了吧。千万别告诉领导,而不我死定了。
3.别的不说先把问题给处理了,等合适的时候告诉领导或是写一份报告上去。
要我选择呢我肯定是选择第3个,赫赫,别说我自己吹嘘啊。让我们来分析一下吧。
做第一种情况的领导肯定很累,事必恭亲。”我tmd的养着你们就这样给我干活的啊?”任何人在夜里吵醒都是不爽的,何况员工们只是为了证明错误与我无关,不愿负这个责任。做第二种情况的领导可能也会很不爽,至少不会有人愿意做一个半瞎。可能他自己也有问题”是不是我太过严厉了”,而对于员工来说一旦事情暴露,我想不但没保住自己能干的假象,更可能的情况下还会损害自己的形像和利益。而如果工作是如此的让你无奈,又何必再做下去呢,人生是如此的短暂做些别的去吧。何必呢?而第三种情况呢,对于员工来说,首先我把问题解决了,事情的严重程度就降了一级,而且你有更多的时候来潜词造句来写一篇或者不是那么真实的故障报告给领导或是用户,而领导或是用户由于事情已经解决了,不会因为听到这个事情而着急翻脸,更多的只是会说:”下次多注意,现在去检查一下系统的其它部分有没有类似的问题”,而且很可能因为你的做事方法和解决问题的能力而留个好印象。真是一个会替人分忧的好员工哪。哈哈哈哈.
再重复一遍:对于我所说的所有非技术问题请勿当真。
http://www.upulife.com H.J.Leochen 2006.02.21 于甘肃兰州.
相关阅读:
30天走向成功 - http://chn.blogsome.com/2005/06/22/39/ (关于尝试新做法的方法)
动网论坛入侵之插件篇 - http://www.upulife.com/leo/?p=6 (关于责任的说教)
CIO故事之十一:救火 - http://blog.donews.com/peiyf/archive/2006/02/22/737666.aspx
JOEL测试 中 8.程序员拥有安静的工作环境吗?的详细说明.