2007-12-26

一个猎头的感悟


摘几句加深印象:

如果有些人又不想放弃技术,又不想一心搞技术, 那么技术支持就不错, 技术支持分pre-sales, and post sales, 我的建议如果你外向一点选择pre-sales, 那边很锻炼人,不仅要技术,还要很多的和人大交道, 而且多数薪水比post sales要高 这那边滚打5-6年薪水都会到20-30万,以后跳槽的机会比较多,而售后这块薪水不是很高, 但技术含量比较高点, 以后跳槽也不容易。

无止境地追求卓越,这种人要求自己是英雄,这样也是给别人尊重和自己信心的唯一方法。 也严格要求别人达到他的水准。在工作上,他们会要求自己与部属"更多、更快、更好 IT行业大家都在和时间赛跑, 不管是技术还是市场。

中国经济的巨大磁场作用, 好多IT公司都来开办事处, 去那些办事处比去大公司有前途,他们设办事处一旦发觉中国市场巨大,就都会大举进入中国市场, 那个时候你就是元老了, 一般公司都是设2年办事处, 然后大举进攻。


面试需要准备, 但不需要包装, just be yourself, 你的包装在有经验的HR和部门经理面前, 很容易被看穿, 而且他们,包含我都会反感包装后的candidate, 当然强调自己的优点, 淡化自己的缺点是必要的。

高年薪阶层人士的经历,都有一个共同点就是跳槽经历非常少,一般5到8年才跳一次,甚至要10年以上才跳一次,而关键在于其最初择业的时候非常清楚自己要选择什么行业,而不是像现在的大学生频繁的跳槽。


从来没有想过自己会加入这一行, 从开始自己喜欢的专业通讯, 到后来喜欢的管理, 幻

想过是专业高手, 幻想过管理专家, 却从来没有想过进入这一行,但 真的在我刚刚离开

校园的时候发生了,短短几天, 对这个行业有了一个感性认识, 其实最让自己伤感的不

是自己没有干这一行的经验, 而是代理的人, 要找的人都是薪水100万, 现在才发觉IT

一行,有钱人真多, 想想大家都在讨论一个月3000还是4000的时候, 别人都是100万,

而且多数都是没有结婚的28-29岁的年轻人,, 我在感叹做人的差距好大啊,最让人伤心

的是, 当代理100万的CASE打个电话过去, 很自豪的说帮你推荐职位, 年薪100万, 那

边传来的是,轻蔑的笑声:我现在都150万, 你认为我会去考虑100万?收集300个人资料

, 查他们的经验背景, 更让我接受不了的, 里面只有一个清华, 一个北邮,我还熟悉

, 其它的都是很烂的大学, 而交大一个也没有,, 和经理聊这个, 他说如果你要找好

大学的, 在搞技术的20-30万的很多好大学, 不解。。。

同志们,,,,有钱人很多啊

-------------------------------------------------------------

继续昨天的讨论,,


看到昨天我发关于猎头的文章,好多人在讨论, 有的怀疑, 有的感叹。

其实我开始也不相信, 开始经理拉我去那边的时候说他们都代理百万的职位, 我还以为

他吹牛,因为我们刚离开大学的时候大家都在为多拿几百快钱的时候,别人的薪水怎么能

数量级上升。

有位网友让我拿出证据, 其实还需要拿嘛, 今天我特地又把大概的资料翻了一下, 更确

信我昨天的说法。给大家讲今天的一个笑话,每次约condidate 过来的时候, 他们都开车

过来,而今天收到一个清华的GG的简历, 感觉他技术基础很扎实,想把一个技术主管的位

置介绍给他, 让他来我们OFFICE,我打听到他住的地方和我们的OFFICE 大概开车10分钟

的路程, 我说我们半个小时后见, 他说可能赶不到, 这位哥们一句话差点把我喝在口中

的氺喷出来,他说, 我骑自行车过去怕赶不上。。。老兄你花10块钱打个车不行嘛, 你

应聘的可是70万的职位啊。。。。

其实大家都认为猎头就是中介, 那可大错特错, 猎头的信息;量大的让我刚刚进去的时

候吓了一跳, 他们几乎有所有IT公司的人员联系方式, 而且是手机号码。 我在想(我现

在都不明白他们是怎么搞到的)

兄弟们, 大家想赚大钱的话, 那么自己创业把, 要么去去那些高端技术企业的销售(想

想EMC高端storage一台1million, 你认为利润是多少呢?), 在大公司里面搞科研, 可

以让你不饿着, 但永远富不起来(当然有例外的)。

真的, 我也想不明白怎么我看拿百万的好大学少的可怜, 原来我想有点少, 但至少不会

少到我看一百份只有2--3份是好大学的吧??我同意好大学出来的素质高, 但竞争能力怎

么那么差呢?

还有现在国外大IT来中国的企业一般都是扁平管理, 只有四层, 最上面2层, 80%是香港

和台湾人, 我就想不明白了, 我们已经开放20多年, 怎么老美还是不愿意来雇用本地人

呢? 而我们只能在最下边2层徘徊。
唉。。

明天继续。。。。

-------------------------------------------------------------

今天休息, 继续和大家讨论, 看大家讨论的很热烈。本来打的很多, 可惜要发的时候不

小心关了窗口,,唉!我打了一个早上。
不知道大家感兴趣的是猎头的工作还是那一群拿高薪的人?
原来也接触过一些有钱人, 但每次都告诉自己每个社会都有一些暴发户来聊以自慰, 可

第一次而且是天天都在和这一群高收入者接触, 暴发户的现象完全消失,自卑感可想而知

, 其实这种自卑不是来自他们的高收入, 而是他们对行业的理解, 对市场的嗅觉,对整

个行业食物链的把脉, 他们和我们理 解的单片机, MOS逻辑电路完全是不同的概念, 我

们都知道一个公司要发展, 市场和技术缺一不可, 问题是技术方面有我们这些好大学的

学生来填补这些空缺而弱化了技术人员的薪资,而使搞技术的处于饿不着也富不起来的尴

尬境地, 而对公司来说,来钱的地方只有市场, 我们当然知道这没有技术支撑都是扯谈

, 这没有错, 错的是我们认为大家都这么想,其实也只有我们搞技术的会这么想,
,想想, 一个卖通讯计费软件的销售人员2个月搞定的一个单子是2000万, 而利润是100

0万(这完全是真实的事情, 如果有些人还让我拿出论据,我只能笑你对这一行太不了解

), 你说这个销售人员是应该拿300万还是400万的年薪呢? 而他手下没有管理一个人,

而只是一个一线销售人员。 我们搞通讯的都知道CDMA比GSM优越的多, 而且都在预计它会

取代GSM,CDMA的技术早就成熟, 以前MOTOTROLA(中国)匆匆上马CDMA, 最后失败

, 引起MOTOROLA高层的震荡, 而血洗了一片决策高层。 每个公司都投入大量资金给科研

,如
果你以为是为了给科研人员的薪水,那又错了, 那些钱都是做实验的, 而投入到市场上

面的钱, 那都是进入老板的腰包,面谈一个在著名IT公司搞 Marketing 的福州大学的2

9岁的很干练的经理人, 我们不知怎么聊到SUN的, 他的公司代理的和SUN的产品几乎完全

不同, 我以前也读了很多关于SUN的
文章, 从它的发家到成长, 到丑闻,,而这位仁兄的了解让我直冒冷汗, 他连当天美国

SUN的股价都说的很清楚,更别提SUN的系列产品和对它未来的预测。而他仅仅是福州大学

的小本。 上面有个网友让我描述一下他们的背景, 这个统计起来有点难度, 不过我可

以肯定的告诉你们, 他们有一个共同的东西, 那就是人格魅力。

大家一谈创业都在犹豫, 其实你犹豫的时候你已经失败一半了, 不信你去清华BBS上面的

创业版看看, 那里面多数人都在问:有谁创业成功的吗? 怎么搞第一桶金? 你们问的时

候你已经失败了, 我肯定的告诉你, 你问的同时,好多人已经开始做了, 创业成功的人

不会来这儿的。

明天继续。。。

-------------------------------------------------------------

没想到能这么多人讨论, 那天写那点东西只是干了这行的一点感触和不平衡, 不过大家

都很感兴趣, 我自己也有想写下来的欲望,不知道一天一篇能坚持多久。 (昨天住的地方

网挂了, 没有发)对于那些拿高薪的人除了, 他们的共性,人格魅力外,还有就是他们

都有完整的职业规划,这是他们成功的先决条件, 如果一个人开始的希望都在为能不能找

到工作, 那么他也don't have长远的规划。猎头们看简历candidate的时候首先看的是他

们工作的公司和跳槽的经历, 如果你每年都跳一次,那么我告诉你被猎头看上去的机会很

少,专业的猎头公司清楚的明白在代理这一行那个公司的员工最有竞争力,有些同学都认

为去大公司为以后的工作有好处, 这不竟然, 大家喜欢去四大,那是因为四大会帮你综

合培养的很有竞争力,所以很少有猎头去IBM挖人, 那边出来的人没有太大的竞争力, 这

个庞大的组织里面分的太细, 出来的员工基本不会是多面手, 这可能也是IBM高明的

地方, 所以IBM相对员工比较稳定, 但对于一个员工的职业规划,IBM不是一个好的去处

。关键是对人综合素质的培养,同时我们应该知道公司永远都是市场驱动而不是产品驱动

, 这个先决条件决定搞管理, 销售的人拿高薪的可能性大的多,有好多人都说, 先搞两

年技术在转管理OR销售, 其实你错了, 你两年的技术对你将来的管理和销售有点帮助,

毕竟你花了两年的时间在技术上面,而别人已经直接在管理和销售上面干了两年, 所以

我刚刚在电脑上面大概统计了一下,高薪中管理和销售方面的人才开始做技术转过来的年

龄都偏大,所以如果你致力于搞管理和销售, 那么直接去找这方面的工作, 而不要浪费

时间去搞2年技术,一到管理层和销售对技术背景就会淡化很多,而且愈高愈明显。当然你

的工科背景对你以后的管理和销售绝对是个很大的帮助, (现在我们那个几个专业猎头,

他们都是很有经验的专业顾问, 但他们都不是工科背景, 我的工科背景在那边做的就很

占优势,而且猎取的成功率高的多),
如果有些人又不想放弃技术,又不想一心搞技术, 那么技术支持就不错, 技术支持分pr

e-sales, and post sales, 我的建议如果你外向一点选择pre-sales, 那边很锻炼人,不

仅要技术,还要很多的和人大交道, 而且多数薪水比post sales要高 这那边滚打5-6年

薪水都会到20-30万,以后跳槽的机会比较多,而售后这块薪水不是很高, 但技术含量比

较高点, 以后跳槽也不容易。
当然想搞技术的, 研发部门最好的啦, 每个人都有自己的喜爱, 而且钱不是衡量个人

成功唯一标准,反正研发部里面高薪的情况很少, 除非是那种很核心技术的, 不过国外

IT公司的核心技术都放在总部研发, 不过研发主管的薪水都比较可观,不过研发部里面都

是牛校的PHD, 一个MASTER和小本在那边爬上去的可能性太小。

明天继续。。
-------------------------------------------------------------

本来今天想写点猎人的程序方面的, 不过下午发生的事情让我really shock, 我想把她

写下来,也许今天不会好看, 但我还是想记下今天的故事,她35, 工学研究生,北大EM

BA工商硕士,一个本土IT公司总经理,年营业额4亿。 本来她把简历投过来的时候,她告

诉我因为和董事长经营理念不是很相同, 想走。手头没有和她很区配的职位,主要是开始

很重要的职位(AP, CM)老板都没有给我做,其实我是个新手,什么东西都在学, 但她

希望和我保持联系, 今天早上,她打过来电话说下午会路过我们公司这边,希望和我见个

面,本来我下午3点约了一个客户经理,后来我说3点半吧, 3点半到的时候,她很准时,

我约的那个人还没有走, 让她等了10分钟, 会客厅被其它同事用着,我们就一起去了公

司下面的一个咖啡厅, 开始聊的很投机, 因为我手里现在sales mgr 职位比较多点, 她

想要CEO COO的位置, 然后我们一起聊她现在的公司,她从助理做起到最后总经理, 给我

讲她出去拿单的经历, 说和员工的沟通, 和老板的交流,说的很感性, 语速很慢, 我

们都要了冷咖啡, 她告诉我不喜欢加糖, 她喜欢慢慢品尝,当讲到她陪客户喝酒, 陪客

户疯狂, 她声音变的很小, 她说起她读EMBA的时候的抱负,还有自己的经营理念, 她突

然问我:我们活着为了什么?然后哭了,对于她的突然变化, 我有点出手不及, 不知道

怎么办, 我很坦诚的告诉她,我每天都在面对比自己优秀的多人中间, 我很康奋,甚至

有点紧张, 不过我很少和candidate 从心理去沟通过,我都是想用最专业的眼光和规划和

他们交流,因为我一直想使自己变的更professional, 我说我的缺点很明显,我普通话不

怎么好, 但我尝试和用不同方式与别人交流, 让别人认可我, 我是一个从不放弃的一个

,我的努力让我踏实, 对事业方面, 我们没有可比性,你很成功, 你开的是宝马, 如

果不是工作的关系, 这么高档的咖啡厅我要等几年后才可以光顾。

这个时候她平静了许多, 她告诉我, 她很少流泪,甚至在丈夫面前, 让她苦恼的是,这

个多变的社会大家都不按理出牌, 你永远不知道别人下一张出什么牌。前面大家都是正人

君子,背后刀光键影。 她说不是因为压力, 每个行业都有压力, 普通的engineer 也有

压力,而是在思考选择什么样的生活方式。只是觉得工作里面有很多恶心的地方。 女性在

IT这个群体里面还处于弱势群体, 而且永远会是这样。最后她告诉我希望她不是我的can

didate,而是她的朋友。咖啡厅里放着轻音乐, 相差一个轮回的两个人就在那边无语的座

了半个小时。

学生真的太单纯了, 我们大家都没有了解社会恶心的事情, 我以后会专门写一些从我的

candidates口里听到高层恶心的事情。 其实很有趣, 我是感觉每天我都在拍电影, 我终

于明白电影来源于生活这句话了。


和网友的交流让我很感动, 大家对这群人的陌生, 对他们的好奇, 还有我们这个不够专

业的猎头公司代理的却是最高的职位, 唯一的理由是他们和每个IT公司的高层都很熟,这

也是本土猎头公司没发竞争的地方。

明天继续
-------------------------------------------------------------

今天上午比较忙, 连续约了好几个candidate 谈,下午有点困就没有约人过来,老板那边

又接到一个单子,180万的年薪, 唉!我自己要开公司能接到这样的单子就爽死了, 一般

一个月就可以搞定,就可以拿到他们年薪的30%, 就是54万,,而一个公司10个员工总的

开支包含office 电话费也就3万, 每月平均可以10个case, 当然一般都是60-100万的,赫

赫,钱基本被老板拿去, 唉, 不平衡, 我信有多职位都很有压力, 但也有好多职位每

天就是数钱, 例如我的老板, 资本家啊, 不平衡。 今天就谈一下猎头的程序吧,因为

我也是新手,了解的也只是很小的一个部分, 不过这样我更会真实的记录下来。

猎头英文是headhunter, 专门找head(头)的行业, 这里面的头有两方面的意思, 一个是

智慧, 就是那些有才华的人, 一个就是头目,一般都是经理,总裁级的人,所以大家会

误会猎头公司只是高级中介, 其实有点错误, 我开始想尝试找一个确切的猎头公司的定

义,不过比较难, 这个行业一直都是很模糊的定义。猎头找的是那些永远不愁没有工作的

人, 而中介只是帮那些在找工作和找不到工作的人找工作。 美国发展最规范, 而中国只

停留在很狭小的范围, 而美国, 正规的都会包含人员的科学测试和培训,公司机构和人

力的咨询等,中国的相对粗造的多, 象上海这类公司有400多家, 于是就导致好多公司很

底的职位都会去代理,而沦落为简单的中介, 几个月都拿不到一个大的单子。
好多人都想刚刚毕业就进入这一个行业, 几天粗造的了解给我的印象是一个专业的猎头人

, 要具备Knowledge, Professional, and discernment. 这个行业对猎头的知识的要求

是对整个行业的了解, 给你一个case, 你要在半个小时内就要确定搜寻的范围, 包含那

些公司,那些部门,可以挖到相关的人, 然后是professional, 这个不仅仅是猎头这行业

, 其它所有行业都这样, 外在要穿着方面, 内在沟通方式, 你的职业性会让公司对你

有信心, 给你更多的单子,让你的candidate更愿意把自己托付给你。 最后的discernme

nt是出成果最重要的一环, 你要对你推荐的candidate给出至少70%以上的判断, 这方面每

个人用的方法不同,有的喜欢打听candidate 的身边的人, 有的喜欢用test, 而我个人比

较喜欢面视时的聊天, 当然有些人很会谈, 很会包装自己, 不过猎头都比较喜欢没有包

装的真实的你, 其实这样对公司也是对个人负责,因为工作是长期的, 所以我一般都会

选择那些just be yourself的人。所以刚刚毕业的学生可以做这一行,但很有难度,例如

我, 几乎每天都在学习, 和每个经理人聊天都是在给自己上课, 只是我适应的比较快。


还有我特地想提到的是大家不要频繁跳巢,昨天我推给公司的两个人都是每年跳一次的理

由被公司退了回来, 越到高层对频繁跳越敏感。 上次有些人问我给大家建议的直接去做

销售和管理,怀疑刚开始去做管理不可能, 其实你错了, 我最近就接触好几个刚刚毕业

的本本去做项目主管, 这太有可能了, 一般的工程项目, 技术含量要求不高, 有一定

的组织能力完全可以胜任,做项目灰色收入也可管哟,,上次有人提到销售淘汰很高, 这

是事实, 本来人生就是金字塔,你要想在上面就要接受残酷的淘汰, 而做技术淘汰低是

因为你在好大学, 本身就是在金字塔的上面,销售只不过是不同大学刚刚毕业重新洗牌而

已。而对于管理,天赋占很大比重, 对资源的调配,对市场的灵敏度,对员工的沟通,

这方面的要求是全面的。


明天继续。。。
-------------------------------------------------------------

今天有点累,本来上午想统计一下, 这群上层人物的工作经历, 统计一半,后来接连面

了好几个人, 就没有统计完, 希望明天可以搞定,给大家看看他们的工作历程, 怎样在

短短几年可以拿那么多:下午和一个microsoft 的经理级人物面谈, 然后就一起吃了饭,

一个很魅力型的人, 两个人点了那么多菜, 喝了点红酒。当时直犯愁, 钱包里面只有3

00块钱, 最后他很礼貌的买单,我强烈要求我买, 他拿出信用卡,说这是Gates 的钱,

我们大笑,920快, 我现在还后怕, 他如果真让我付, 我可怎么收场啊,钱包只有300

快啊。

其实和公司几个很有经验的consultant比我的能力只会比他们强,但他们面试时表现出来

的老道却是我让我甘拜下风,因为做IT行业就那么几个人(我说的那几个牛人), 每次面

试的时候很少涉及到技术方面的, 都是在讨论, 那个公司(管理)重新洗牌,那片战场

(销售)还有打的可能, 哪个人从那个公司跳到另一个公司带走一班人马, 他的那个朋

友在那个部门可以给他第一单, 那个公司更有挑战性, 那个公司可以让你折寿几年,Or

acle 的单打独斗和霸道, IBM的team work, HP游离于中间,SUN 的日啦西山,EMC的坟场

,DELL的嘟嘟逼人,Hitachi的教条, 就那么点人在IT公司之间不停的换位,几句聊天中

, 你就可以知道candidate 的人脉关系和管理和营销理念。因为我们代理的都是经理级的

人, 所以不管挖他们去做技术主管还是公司主管还是销售主管, 技术都不是我们问的范

围。

我现在在写的时候收到一个网友很诚恳的探讨,这位朋友, 原谅我没有得到你的容许就直

接应用你的话, 原话:以前在学校找工作面试的时候,有幸跟东芝的中国区经理谈了

个多小时。当时记得比较清楚的就是,这位经理告诉我,工作之后,有一个高质量的朋友

圈相当重要。因为这样就可以更有效地交流和学习。

自己交往的人真的可以决定你成功多大, 不仅是给你的帮助还是给你的资讯, 更重要的

是给你潜移默化的影响, 我敢说干这么短时间的猎头,以后我不管做什么都是我一生巨大

的财富希望明天给出的是真实的case 和数据, 以前写的都很泛。。。。
-------------------------------------------------------------

今天来点数据吧, 不过我觉得收集数据确实是枯燥无味的工作, 我看资料的时候, 经理

过来问你今天打的电话好少哟。。。无语,本来拿了一百份,不过到现在统计了80份, 实

在坚持不下去了, 算了, 就拿这80份做sample 吧, confidence level 肯定比100份少

, 赫赫,我主要是从他们的薪水(年薪), 学历, 年龄,工作年龄方面统计的。因为这

是对那个阶层的,不具有代表性(而且只是IT 行业), 只是给大家看一下, 给大家一个

现象, 评论是大家的事, 而且最近我也在想自己的职业规划, 所以不知道哪一天就会改

变自己的职业。 不过还是希望坚持多写点, 毕竟做高端猎头的人不多,有这个机会了解

他们也
不容易薪水:40-60万, 60-80万 80-100万, 100万 以上
人数 19 22 23 16

80人中, 女性16, 男性64
公司管理人员,32 人, 销售经理 40 技术主管 8
学历: 本科 56, 研究生18才人 (其中MBA 8人) PHD 6 人

没有人是本科以下的, 可见 本科还是大家成功的窍门砖。
好大学(我说的好大学就是我们大家心理明白的那几所:)7, 其他的:73。
工科: 62 人, 非工科方法18人,工科是压倒性多数平均年龄(这个开始我还用计算机算

,很笨的说, 后来用excel 直接就可以拿到)31,最小的25, 最大的42,跳槽的频率是

3次, 也就是平静3年半跳一次, 一般IBM, HP 的时间都有7-8的, 不过其它的2年多的

, 2年以下的很少,到经理级别的26-29最多,所以27(一般工作2-4年)是大家的一道坎

,这个时候跳一下, promote 到经理级, 以后机会就不多了, 然后是32—35 又一到坎

能promote 到direc
tor, 这关过不去, 那么你在小经理这边呆着吧。。。慢慢熬时间拿点福利, 35 也是一

个Promote 到 VP, GM 的最好时间, 一般过了40猎头不会推荐你的, 除非你特牛(特牛

的人年纪对他没有障碍。上次有人问我,魅力究竟是什么, 其实我也说不明白, 魅力究

竟是什么, 我的理解是他散发那种气质, 那种素养, 让你不自觉的想去学习, 模仿。



今天都在搞这个数据, 被老板批评了,不爽,

另一家公司也不停打电话让我去签, 矛盾中,,祝大家快乐,

明天继续。。。。
-------------------------------------------------------------

因为代理的是高端职位, 对普通人比较遥远, 可是我们每个人不都是一直向往吗? 当然

钱不是衡量成功的唯一标准, 但我描述的是那一群职业的经理人,职业的销售人员, 而

不是暴发户, 他们身上迸发出来的是一种力量, 一种信心, 我不知道大家爱不爱看中央

台的《《对话》节目, 其实每天我都在一群人对话, 所以我每次晚上回来的时候都在想

,那些主持对话节目的人,他们每次谈话结束后也会有和我一样的失落感吧,用一句人格

魅力去描绘这群人太虚, 我也一直在寻找他们成功的理由, 我们知道一个成才无非是实

力加运气, 这样的描述对于我们普通人没有如何意义。星期四上午在coffee bar 面试了

一个IT元老, 原来他已经隐退,不过最后那个职位没有其他人合适, 和同事商量还是决

定挖他, 约他出来的时候没有什么难度, 他驾车带我们去他认为是最好的coffee bar,安

静而且优雅, 他说以前每次累的时候都会一个人来这儿, 聊起现在的IT市场, 他说他还

是很怀恋以前,可惜中国最早搞IT的那批人基本隐退了, 而现在市场竞争激烈, 利润


下滑,大量的新人出现。 最后他还是没同意出山, 我们代理的那个位置还空着, 也许他

同意和我们见面,只想聊个天吧。最后我要他给我点建议,我他问我什么方面的建议, 我

说职业经理人成功方面的, 他想了想说: 无止境地追求卓
越,这种人要求自己是英雄,这样也是给别人尊重和自己信心的唯一方法。 也严格要求别

人达到他的水准。在工作上,他们会要求自己与部属"更多、更快、更好 IT行业大家都在

和时间赛跑, 不管是技术还是市场。

说实在的,我们这边代理的销售方面的人才多点, 主要是销售方面的 mobility高点,好

多人不喜欢销售, 可是不菲的薪酬终究还是有很大的吸引力。当然,除此之外,销售这份

具有挑战性的职业也让人有很多其它方面的收获:眼界开阔了,能力提高了,而且激发了

不少自己原来没有发现的潜能。

最近公司的单子很多, 并不是IT市场好转, 而是几大IT公司都在洗牌, 我知道几家著名

的IT公司 上半年都在震荡, 所以有经验的人, 最近一段时间出手是很好的时机,过了这

段时间想对会清淡些, 但中国经济的巨大磁场作用, 好多IT公司都来开办事处, 去那些

办事处比去大公司有前途,他们设办事处一旦发觉中国市场巨大,就都会大举进入中国市

场, 那个时候你就是元老了, 一般公司都是设2年办事处, 然后大举进攻。
-------------------------------------------------------------

星期天, 没面candidate, 也没有新的case 和大家分享,

有人在风中哭泣,有人迎风放屁,对于没有工作经验的我们来说,你最需要适应的,一是

听别人的声音,二是闻别人的味道。其实好多公司不招应届的原因除了没有工作经验,就

是跳槽频繁, 我们公司内部的一份数据也可以清楚的看出刚刚工作的人跳槽频率最高,这

也可能和大家开始对职场的模糊认识有关, 太多的是关注薪水而不是长远发展, 所以我

建议大家找工作的时候尤其花很多时间在找面试技巧,谈判技巧, 不如花多点时间考虑自

己的工作的切入点。和大公司的HR经理聊的时候,他们多数也都喜欢真实的你, 我上次也

提到,面试需要准备, 但不需要包装, just be yourself, 你的包装在有经验的HR和部

门经理面前, 很容易被看穿, 而且他们,包含我都会反感包装后的candidate, 当然强

调自己的优点, 淡化自己的缺点是必要的。

高年薪阶层人士的经历,都有一个共同点就是跳槽经历非常少,一般5到8年才跳一次,甚

至要10年以上才跳一次,而关键在于其最初择业的时候非常清楚自己要选择什么行业,而

不是像现在的大学生频繁的跳槽。跳槽如果跳得有系统,能够反映出毕业生有系统的规划

,有明确的目标,还是会获得企业的青睐。如果毕业生一直在追求自己的理想,虽然不停

地跳槽,但如果是执著地向自己的目标在前进的话,公司还是会考虑这样的人才。但如果

毕业生工作一年半以内就频繁换工作,一般公司也坚决不会考虑。

所以我们猎头挑人的时候, 第一眼看简历就是看跳的频率, 这也在猎头行业达成的共识

。 虽然我们的存在, 也在促使跳槽的发生,那只是人才的合理条配,我承认好多猎头公

司不负责的挖人, 好的猎头公司不仅为公司找到合适的人, 也要为我们的candidate 定

下长远的职业规划,不是为了挖人而挖人, 相反有时候我和他们面试的时候, 我会建议

他不要跳,,嘻嘻, 虽然我也是新人, 不过在他们面前还是要装的professional 一点。



小常识: 高级蓝领"是蓝领人才的较高层次,其最重要的特点在于它不以理论和管理方面

的综合素质为判定标准,而以实际动手能力为判定标准,一个合格的"高级蓝领"应当具备

相当丰富的实际动手经验,应该属于操作型人才。"低级白领"主要指办公室行政人员,他

们从事的是单纯的脑力劳动,不同的是他们的脑力劳动技术、知识含量比较低,可替代性

比较大。所以小白领可替代性强,但每天川行于商业大楼, 过着小资一样的生活让他们很

自我,这也是我为什么想
离开现在的猎头去另一家做项目主管。。。。
明天要面试几个人, 应该有的写。。。

其实今天遇到的case很典型, 在我犹豫想离开猎头职位的时候, 遇到一个2年前IT很红的

一个人,我很想分析这个case, 不过如果我分析细节, 大家都会知道是谁, 也是我目前

遇到行内的最牛的人吧, 很nice, 他笑着告诉我: 我是他遇到最年轻的猎头。本来这行

要很confidential, 有些东西太敏感,职位和薪水。。。实在没办法写出来。

我开始仅仅是为了记下自己的点滴, 不是每个人都有机会窥视那一群人,在交大上面发大

家都很诚恳在一起探讨, 现在发觉这个系列已经变成我的责任,也许是我的荣幸和也是我

新的压力吧, 感激比那些CM, director聊还有压力, 毕竟网友是更大的群体, 看看今

天清华BBS的讨论吧。 我尽量想描述一群职业的经理人,而不是一群暴发户, 我描绘的只

是表面的,由于代理的单调性(IT行业), 高层性(高端)本来就不具有统计的科学性,

我开始的目的也不是为了科学的统计,感性的认识和理性的分析毕竟有很大差别。

今天有网友把这个系列转到清华BBS, 我根本没想到会有那么大的反响和震动,今天在我

面视的时候, 不停的有朋友打电话给我说:你的文章在那边已经引起很大的讨论,让我欣

慰的是10大上面不要总是花前月下的故事,也有一些值得我们思考的问题, 我承认是个新

手, 但我对这个行业的悟性, 我心理还是自信,自信是自己给的, 如果每个行业都是资

深的人在做, 这个行业就失去了活力,毕竟长江后浪推前浪, 成功与否和一个人的切入

点有很大关系, 搞技术和销售, 管理方面没有谁卑谁劣的问题,我们代理的销售方面是

多点, 管理, 技术也都有, 150万的CTO也代理,我想告诉大家不是谁更优秀, 不过那

个方向更有挑战性, 大家都是受过高等教育的人,不说大家也都明白。

有几个SJTU的网友和我联系, 也聊的很开心, 他们的讨论很让我感动,感谢他们给我的

feedback, 我也希望和他们几个保持长远联系, 每次看你们的回复都让我有写下去的冲动

和勇气,如果说大家认为我是因为压力而停止写下去, 我不反对, 毕竟我要为自己的职

业进行规划。

我不批判任何人, 每个人都有自己看待成功的角度, 但无须认为那些不可理解, 存在的

就是合理的,不过文章是真实的, 片面的,我自己也承认这点,解读是大家的事。至于每

个成功的人的家庭背景, 不是我考证的范围, 再说, 每个社会都有不平等, 成功有成

功的理由, 方式不同, 大家在羡慕嫉妒的时候,为什么不能踏实的去做?我们要学着适

应社会, 而不是社会适应我们。

我没有太多的建议给大家, 唯一的就是规划, 系统的规划, 道理大家都懂, 可惜有几

个人真正去规划过?好多人还不是盲目的找工作?猎头找有经验的人可以不理会他的大学

教育, 但对应届的大学生还是看重大学, 那么好大学的学生更有可能有系统的规划, 因

为选择的余地大, 而差点的大学, 刚刚毕业也许仅仅为找到一份工作而奔波。

我想就写到这儿了, 不能再写下去了, 有太多的商业秘密, 职业道德方面, 继续写下

去会有好多东西将会无法控制, 最后再次感谢和我交流的网友,我愿意和你们成为永远的

朋友, 一个朋友告诉我, 建立在朋友上的利益比建立在利益上面的朋友可靠的多。 也恳

请知道我个人信息的,帮我保密。 手机号码也好, email 也好。

外面传来的歌声是: "为了生活, 人们四处奔波", 现在心里有些伤感, 我也想坚持写

下去, 写到我离开的那一天, 对于自己想捅第一笔金的我来说, 每天和candidate聊天

都让我很失落。重要的是我们都年轻, 这是我们最大的资本, 房子, 车子,女朋友,

什么都没有, 哪又怎么样? 调整自己的平台, 站得高就可以望的远。因为我们年轻。



大家再见, 有点虎头蛇尾,想流泪的冲动。
一个好用的flash图表生成工具 Swiff Chart。
flash图表具有很好外观和动态性,在展示图表的时候可以让你的听众很享受的了解你所要表达的东西。不过如果要掌握flash的制作可能需要一番功夫。
下面介绍一个能够根据数据帮你生成flash图表的工具,使用非常简单,而且还能够生成动画效果,他就是Swiff Chart。
首先可以去这里下载一个Swiff Chart的试用版,http://www.globfx.com/downloads/swfchart/ ,有标准版和专业版,具体区别看这里 http://www.globfx.com/products/swfchart/compare.php
下载完后安装一下,ok。运行
1.点击新建图表向导
2.选择图表类型
3.设置图表数据源(有手动填写的也有通过数据文本导入的)
ok看看你的flash图表吧,是不是非常的漂亮。还有动画效果哦。


2007-12-06

推荐一个很好用的正则表达式工具RegexBuddy。


功能:

测试正则表达式,提供图形化的表达式拼装,表达式调试,内置常用表达式库,生成各种语言的表达式运用,还集成了论坛功能。太强大了。目前最新版本3.05。提供一个破解的下载,可以直接解压使用,也可以先安装原版,然后覆盖。下载地址:点击


以前一直觉得.net下的Regulator(开源)很好用,不过感觉RegexBuddy更强大,Regulator 是sf上的一个开源项目可以去 http://sourceforge.net/projects/regulator/ 下载,这个工具最大的好处是会自动搜索 http://www.regexlib.com/ 网站的表达式库。非常方便,当然你也可以自己登录这个表达式库去查看。

2007-11-26

quartz cron 表达式详解

字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /

“*”字符被用来指定所有的值。如:”*“在分钟的字段域里表示“每分钟”。
“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。
月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号(?)来表明不想设置那个字段。

“-”字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。

“,”字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”。

“/”字符用于指定增量。如:“0/15”在秒域意思是没分钟的0,15,30和45秒。“5/15”在分钟域表示没小时的5,20,35和50。符号“*”在“/”前面(如:*/10)等价于0在“/”前面(如:0/10)。记住一条本质:表达式的每个数值域都是一个有最大值和最小值的集合,如:秒域和分钟域的集合是0-59,日期域是1-31,月份域是1-12。字符“/”可以帮助你在每个字符域中取相应的数值。如:“7/6”在月份域的时候只有当7月的时候才会触发,并不是表示每个6月。

L是‘last’的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天。如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五。

字符“W”只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的。

“L”和“W”可以在日期域中联合使用,LW表示这个月最后一周的工作日。

字符“#”只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三。

字符“C”允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历”关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)。

表达式举例:

"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
0 6 * * * 每天早上6点
0 */2 * * * 每两个小时
0 23-7/2,8 * * * 晚上11点到早上8点之间每两个小时,早上八点
0 11 4 * 1-3 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 4 1 1 * 1月1日早上4点

2007-11-06

对于IBatis应用最烦人的重复工作就是不停的写DAO,DTO,和xml文件里面的sqlmap,其实很多时候这些工作是重复而且无聊的。好在我们还有abatorhttp://ibatis.apache.org/abator.html ),一个IBatis自动生成工具,他可以帮助你生成大量的DAO,DTO和sqlmap。
如果你使用eclipse作为IDE那么事情就很简单了(相信没有几个人不在用):
安装Eclipse插件
1. 要求eclipse3.1,jdk1.4以上
2. 在eclipse上安装abator插件
eclipse菜单栏 --> help --> Software Updates --> Find And Install...
在弹出的对话框中选择 “Search for new features to install” 然后点击 “next”
在对话框中点击按钮 New Remort Site... 在弹出的对话框中的URL输入框中填写 http://ibatis.apache.org/tools/abator ,Name输入框就随便写些什么了。
点击Finish,安装插件,然后重新启动eclipse

下面测试一下功能
1. 新建一个java工程
2. 在eclipse菜单栏中兴建一个 abator 配置文件
File --> Abator for iBatis Configration File

好的,我们完成了创建配置文件,下面打abator配置文件,看看里面怎么去配置
打开后内容基本上是这样
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE abatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Abator for iBATIS Configuration 1.0//EN"
"http://ibatis.apache.org/dtd/abator-config_1_0.dtd">

<abatorConfiguration>
<abatorContext> <!-- TODO: Add Database Connection Information -->
<jdbcConnection driverClass="???"
connectionURL="???"
userId="???"
password="???">
<classPathEntry location="???" />
</jdbcConnection>

<javaModelGenerator targetPackage="???" targetProject="???" />
<sqlMapGenerator targetPackage="???" targetProject="???" />
<daoGenerator type="IBATIS" targetPackage="???" targetProject="???" />

<table schema="???" tableName="???">
<columnOverride column="???" property="???" />
</table>

</abatorContext>
</abatorConfiguration>
你需要做的是替换一些???:
1. 填写driverClass(jdbc驱动,例如oracle的就是oracle.jdbc.driver.OracleDriver)
2. 填写connectionURL(连接字符串,例如oracle的就是jdbc:oracle:thin:@192.168.0.246:1521:test)
3. 填写classPathEntry的location(jdbc驱动jar包的位置,例如E:/project/ibatistest/WebContent/WEB-INF/lib/ojdbc14.jar)
4. 填写javaModelGenerator,生成的DTO(java model 类)
targetPackage:目标包的位置,如 com.test.dto
targetProject:目标工程名称,填写配置文件所在的eclipse工程名
5. 填写sqlMapGenerator ,生成的xml sqlmap的相关配置
targetPackage:目标位置,如 com.test.sqlmap
targetProject:目标工程名称,填写配置文件所在的eclipse工程名
6. 填写daoGenerator ,生成的DAO的相关配置
type:生成的dao实现的类型,如果你使用spring的话写SPRING,否则写IBATIS
targetPackage:目标位置,如 com.test.dao
targetProject:目标工程名称,填写配置文件所在的eclipse工程名
7. 配置相关数据库的表
schema:数据库schema,oracle就是填写数据库的用户名
tableName:表名
<columnOverride column="???" property="???" /> 可以先不用配置,删除就可以了

下面开始生成:
在配置文件上点解右键,选择 “Generate iBatis Artifacts”
OK,看看生成了什么吧!

2007-11-05

对于某些应用需要实时读取配置文件,但是读取的频率非常高,比如1秒100次以上,修改配置文件的频率远远低于读取频率。此时如果当程序执行的时候每次都读取配置文件,那么系统的io可能会有些压力,因此可以做一个守护线程每隔一段时间(例如1分钟)读取一次配置文件,代码直接取最新的配置文件的值来执行,这样既降低了读取配置文件的频率又获得了较好的实时性。
代码如下:
import java.io.InputStream;
import java.util.Properties;

/**
* 系统配置文件类
* @author sunbin
*
*/
public class Configation extends Thread {

//静态属性类
private static Properties p;

/**
* 默认构造方法
*/
public Configation(){
//
}

/**
* 继承Thread必须要实现的方法
*/
public void run(){
while(true){
//获取classpath中配置文件
InputStream in = Configation.class.getClassLoader().getResourceAsStream("config.properties");
if (p == null){
p = new Properties();
}
try{
p.load(in);
Thread.sleep(10000);//休眠10秒后重新读取配置文件
}catch(Exception e){
e.printStackTrace();
}
}
}

/**
* 获取配置文件的实例
* @return
*/
public Properties getProperties(){
return p;
}

/**
* 测试主程序
* @param args
*/
public static void main(String[] args){
Configation c = new Configation();
c.setDaemon(true);//设置线程为守护线程
c.start();//启动线程
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//重复打印配置文件的值,当修改配置文件后1秒立即生效
while(true){
Properties p = c.getProperties();
System.out.println(p.getProperty("com.test.a"));
}

}

}
其中c.setDaemon(true)设置线程为守护线程,关于守护线程可以参考http://www.google.cn/search?complete=1&hl=zh-CN&q=java+%E5%AE%88%E6%8A%A4%E7%BA%BF%E7%A8%8B&meta=&aq=t&oq=java+%E5%AE%88%E6%8A%A4

2007-10-26

买房了!在我认为北京的房价处于最高点的时候,在各种政策显示房价即将面临调控的时候我买了。
其实算算真的挺划不来的,租房也不是说真的那么难过,况且要奥运的时候才能入住。
但是还是买了,为什么?
因为这样做是某个人的梦想,实现她梦想的意义对我来说,远远大于一套房子。
梦想是什么,现实是什么,如果说只能选择其一,那么生活根本没有意义。我们生活在现实中,但梦想鼓舞我们前进。
人生应该是一个个梦想实现的过程,而不是破灭的经历。
希望每个人都能够充分享受梦想变成现实的这个过程。

2007-09-17

有意思的firefox功能,美国的信用卡欺诈网站很多啊
由于我用我的信用卡消费了一笔美元,最近在我的邮箱中发现这样两封邮件
第一封:
from Bank Of America <update@gmail.com>
hide details Sep 15 (2 days ago)

date
Sep 15, 2007 5:51 AM

subject
Bank of America Account Review Department !
We recently have determined that different computers have logged onto your Online Banking account, and multiple password failures were present before the logons. We now need you to re-confirm your account information to us.

If this is not completed by September 18, 2007, we will be forced to suspend your account indefinitely, as it may have been used for fraudulent purposes. We thank you for your cooperation in this manner.


To confirm your Online Banking records click on the following link:
http://home.graffiti.net/lanashpa/index.html


Thank you for your patience in this matter.

Bank of America Customer Service

Please do not reply to this e-mail as this is only a notification. Mail sent to this address cannot be answered.



© 2007 Bank of America Corporation. All rights reserved.
第二封:
Bank Of America <pp-verify@yahoo.com>

show details
5:36 am (5 hours ago)
Dear Bank of America client,

You have received this email because you or someone had used your account from different locations.For security purpose, we are required to open an investigation into this matter.

In order to safeguard your account, we require that you confirm your banking details.

The help speeed up to this process, please access the following link so we ca complete the verification of your Bank of America Online Banking Account registration information.

http://031327447202/online/sslencrypt218bit/online_banking/


If we do no receive the appropriate account verification within 48 hours, then we will assume this Bank of America account is fraudulent and will be suspended.

The purpose of this verification is to ensure that your bank account has not been fraudulently used and to combat the fraud from our community. We appreciate your support and understanding and thank you for your prompt attention to this matter.
当你在浏览器打开后会看到这样的提示
firefox

ie7

大家以后要小心了,尤其是国外的不明邮件
P:其实我早知道这个是欺诈的,看发件人,和地址就知道,只是想验证一下。

2007-09-13

gigix,ThoughtWorks咨询师,转贴一篇他的文章,原文地址:http://www.javaeye.com/topic/122616

风险对冲

先做个练习。假如你在10元价位买了一支股票,这个股票未来有可能涨到15元,也有可能跌到7元。你对于收益的期望倒不是太高,更主要的是希望如果股票下跌也不要亏掉30%那么多。你要怎么做才可以降低股票下跌时的风险?

一种可能的方案是:你在买入股票的同时买入这支股票的认沽期权——期权是一种在未来可以实施的权利(而非义务),例如这里的认沽期权 可能是“在一个月后以9元价格出售该股票”的权利;如果到一个月以后股价低于9元,你仍然可以用9元的价格出售,期权的发行者必须照单全收;当然如果股价 高于9元,你就不会行使这个权利(到市场上卖个更高的价格岂不更好)。由于给了你这种可选择的权利,期权的发行者会向你收取一定的费用,这就是期权费。

原本你的股票可能给你带来50%的收益或者30%的损失。当你同时买入执行价为9元的认沽期权以后,损益情况就发生了变化:可能的收益变成了
(15元-期权费)/10元
而可能的损失则变成了
(10元-9元+期权费)/10元
潜在的收益和损失都变小了。通过买入认沽期权,你付出了一部分潜在收益,换来了对风险的规避。这就叫风险对冲

(不难看出,如果加以精心安排,你可以用股票和期权构造这样一个投资组合:不论股价朝向哪个方向变化,投资组合在期末的价值必定相等。黑话这个就叫套期保值。由于套期保值组合的存在,期权的定价只由股票的期初价格、期末价格、期权时限、执行价和无风险利率——例如国债利率——这几个因素决定,与股票涨跌的概率无关。Black-Scholes模型等期权定价公式也表明了这一事实……扯远了,打住。)

另一种常见的风险对冲则是外汇的套期保值。比如说以人民币为会计本币的企业和外国公司做生意,不得不接受一笔为期三个月的美元应收帐款,老板就心里 发毛:人民币升值多猛啊,三个月以后没准美元又大跌了,害我平白无故少收5%我找谁哭去?这时候他就可以同时买入美元的看跌期权(也就是认沽期权),把原 本5%的外汇风险变成只有1%,甚至多付一些期权费从而完全规避掉外汇风险。这时候的期权,其作用就像是一张保单,给自己买了一份外汇风险保险。

(风险对冲的原则:对冲你不精通的、不想打理的、不是你主营业务的风险。风险总是和收益成正比,要是把主营业务的风险给对冲掉,稳妥倒是稳妥了,公 司离倒闭也就不远了。对于个人也是一样,你弄清楚自己想要从什么地方赚钱,就去承担这个方面的风险;别的方面的风险,就想办法对冲掉吧。)

如今说起来就满脸威风的对冲基金,其实一开始就是干这类“保险”业务的保险精算师。一帮大富翁挖铁矿、挖石油赚了钱,却不知道该怎么理财。老话说创 业容易守业难啊。于是就有了这些专门从事风险对冲业务的基金,帮大富翁们投资适当的金融产品,花不多的一些钱,把“一夜回到解放前”的风险给对冲掉。这些 个土财主,也不求变成世界首富,只要能保住自己的钱留给儿孙,还能适当的跟着无风险利率小增点值,他们就心满意足了。所以对冲基金在最开始的时候,是不折 不扣的风险规避者——从“风险对冲”这个词,就能看出来。

是不是越看反而越不明白了?以稳妥为目的、以规避风险为主业的对冲基金,怎么到现在变成在全球金融业兴风作浪的角色了?这个,要留待下一部分:套利。


2007-09-12

jsp include 乱码问题的解决
jsp include 的文件有时候会出现乱码,经过测试发现如下方法可以修改。
第一种情况可以修改被include的文件:
1.当jsp include动态文件时(jsp文件)可以在被include的jsp文件头部加上代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
可以解决。

2.当jsp include静态文件时(html文件)可以在被include的html文件的<head></head>标签内加上代码:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
同样可以解决。
第二种情况不能够修改被include的文件:
此时可以修改tomcat的web.xml达到目的

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<jsp-config>
<jsp-property-group>
<description>
Special property group for JSP Configuration JSP
example.
</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
<page-encoding>UTF-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude></include-prelude>
<include-coda></include-coda>

<description>
Special property group for JSP Configuration JSP
example.
</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>*.html</url-pattern>
<el-ignored>true</el-ignored>
<page-encoding>UTF-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude></include-prelude>
<include-coda></include-coda>
</jsp-property-group>
</jsp-config>

</web-app>

其中
jsp-config一段是用来说明你要将包含的页面默认按照什么编码格式包含。web-app 标签的version必须是2.4的。
具体可以参见
http://www.javaworld.com.tw/jute/post/view?bid=9&id=44041&sty=1&tpg=1&age=-1


2007-07-05

如何指定tomcat中session过期时间

1. 在server.xml中定义context时采用如下定义:

<Context path="/livsorder" docBase="/home/httpd/html/livsorder"
  defaultSessionTimeOut="3600" isWARExpanded="true"
  isWARValidated="false" isInvokerEnabled="true"
  isWorkDirPersistent="false"/>

2. 在web.xml中通过参数指定:

<session-config>
<session-timeout>30</session-timeout>
</session-config>

其中30表示30分钟

3. 在程序中通过servlet api直接修改
HttpSession ses = request.getSession();
ses.setMaxInactiveInterval(10);
设置单位为秒,设置为-1永不过期。

2007-07-03

Blog搬家了!
终于受不了my.donews.com的blog服务了,现在简直是垃圾,不明白为什么换成WordPress2.0后总是出这样那样的错误,提交文章不成不说,最重要的是还会丢失文章。一个字——搬!
考察了一下三大门户的blog发现都差不多,不过看起来好像sohu的好些,但是由于一些注册名的原因,不采用他们的,至少,不作为主要的发布blog(做备份还行)
---------------------------------------------
sina的rainbow686和niarevl都被注册
163的niarevol被注册,rainbow686是以前注册的还好被保留下来
sohu的rainibow686都被注册,只有niarevol没有被注册,因此幸存niarevol@sohu.com帐号
百度的niarevol在最开始就没有了,只剩下rainbow686
---------------------------------------------
索性现在同步更新csdn,javaeye,msn,hi百度的blog,其中主要是CSDN的blog,当初离开是觉得他的blog不好用,不过现在不错,毕竟是技术社区啊。javaeye的也不错,msn和hi百度的作为blog镜像。
FeedSky的订阅地址(http://feed.feedsky.com/niarevol)我将转向CSDN的blog,今后的订阅用户看到的就是我在CSDN上发布的blog了。
CSDN : http://blog.csdn.net/rainbow686/
MSN : http://rainbow686.spaces.live.com/
javaeye: http://rainbow686.javaeye.com
hi百度 : http://hi.baidu.com/rainbow686/

:P 其中google的blogger有两个blog分别是中文和英文的。中文做为blog存档,英文作为自己没事写英文的玩。
为了宣传在凤凰(www.phoenixtv.com)也开一个blog :)

Javascript Error: submit is not a function
有时候需要用javascript提交表单,这个时候我们会用javascript:userform.submit();可是我在这样做的时候怎么也提交不成功,报出javascript错误Javascript Error: submit is not a function。百思不得其解,后来查阅资料才发现,在用userForm.submit()提交表单的时候,表单里面不能有name="submit"的元素,否则在提交的时候,该对象会和submit();方法发生混淆造成该错误!! 切记,切记!

2007-06-29

在Ibatis中调用存储过程或存储的函数。
和调用sql语句不同的是需要设置入参和出参
这篇文章已经说的很详细了。
http://www.delphibbs.com/keylife/iblog_show.asp?xid=28107
可是我配置的时候确怎么也得不到正确的结果,错误大致是“记录数太多”,查询了很多资料才发现原来Ibatis2.2之前是不支持存储过程返回CURSOR,所以请需要使用Ibatis调用存储过程并且获取记录集游标的同学注意了。下面帖一个我的配置:
-----------------------------------------------
<!-- 获取用户列表 -->
<resultMap id="rm_out_getUserList" class="java.util.HashMap">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="gname" column="gname" />
<result property="cname" column="cname" />
</resultMap>
<parameterMap id="pm_in_getUserList"
class="java.util.Map">
<parameter property="result" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="rm_out_getUserList" />
<parameter property="p_name" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN" />
<parameter property="p_gname" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN" />
<parameter property="p_cname" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN" />
</parameterMap>
<procedure id="getUserList"
parameterMap="pm_in_getUserList">
{? = call PCK_USER.F_GET_USER(?,?,?)}
</procedure>
----------------------------------------------
绿色部分要注意(配置的第一行),如果是要将结果集以map形式返回,一定要写HashMap。
google的document又变样子了.
左侧是一个树形的文件管理,右侧的主要部分列出了已有文件,顶部是一条菜单,越来越像一个资源管理器了!

2007-06-22

Ibatis中如何调用oracle存储的函数
如在oracle中有个package叫做PCK_VIEW,在PCK_VIEW里面有个F_GET_SITESNAPSHOT_TIME的函数有一个varchar2参数
-------------------------------------------
function F_GET_PARTNER_LIST(p_tmp varchar2)
return RecordSet
is
l_rs RecordSet;
begin
open l_rs for select partner from T_PARTNER order by UPPER(partner) asc;
return l_rs;
end F_GET_PARTNER_LIST;
-------------------------------------------
在ibatils里面配置调用是{ call PCK_VIEW.F_GET_SITESNAPSHOT_TIME(?) }
我确定参数都配置好了,但是调用的时候还是报错啊
-------------------------------------------
--- The error occurred in com/phoenixtv/stat/dao/ibatis/sql/realtime.xml. --- The error occurred while applying a parameter map. --- Check the stat.realtime.pm_in_getSiteSnapshotTime. --- Check the statement (update procedure failed). --- Cause: java.sql.SQLException: ORA-06550: line 1, column 7: PLS-00221: 'F_GET_SITESNAPSHOT_TIME' is not a procedure or is undefined ORA-06550: line 1, column 7:
-------------------------------------------
怎么回事,明明数据库有这个函数啊?
但是我在jdbc中这段代码确可以调用
-------------------------------------------
Class.forName("oracle.jdbc.driver.OracleDriver");
conn =DriverManager.getConnection("jdbc:oracle:thin:@111.111.111.111:1521:stat","pass","pass");



//conn = DBConnection.ins.getConn("jdbc/StatDB");sdf.format(new Date())+1
//conn = DBConnection.ins.getConn("statistic");

cs = conn.prepareCall("{? = call PCK_VIEW.F_GET_SITESNAPSHOT_TIME(?)}");
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.setString(2,"");
cs.execute();
rs =(ResultSet) cs.getObject(1);
--------------------------------------------

2007-05-18

gmail中又添新服务了

gmail中又添新服务了。


在more下面列出了更多的服务,可以尝试一下哦。

2007-05-11

如何在IBatis中使用BLOB和CLOB

下面有一个例子在Ibatis中使用Custom Type Handler (CTH)操作BLOB(二进制字节)和CLOB(字符类型)数据类型。Ibatis2.09后提供了对BLOB和CLOB的支持,下面的例子是oracle上的但也可以用于任何支持Jdbc的数据库。如果用oracle你需要使用最新的ojbc14.jar。

创建表:
Report.sql
REPORT {
id varchar2(5),
name varchar2(25),
description varchar2(1000),
data BLOB
}

创建表对应的POJO:

Report.java
/*
* Report.java
*
* Created on March 23, 2005, 11:00 AM
*/
package reporting.viewer.domain;

/**
*
* @author Nathan Maves
*/
public class Report {

/**
* Holds value of property id.
*/
private String id;
/**
* Holds value of property name.
*/
private String name;
/**
* Holds value of property description.
*/
private String id;
/**
* Holds value of property data.
*/
private byte[] data;


//Standard accessors and mutators

public byte[] getData() {
return this.data;
}

public void setData(byte[] data) { this.data = data; }
}

iBatis配置文件:

Report.xml
<typeAlias alias="Report" type="reporting.viewer.domain.Report"/>

<resultMap class="Report" id="ReportResult"> <result column="id" property="id" /> <result column="name" property="name" /> <result column="description" property="description" /> <result column="data" property="data" jdbcType="BLOB"/> </resultMap>

<select id="getReportById" parameterClass="string" resultMap="ReportResult">
SELECT
*
FROM
REPORT
WHERE
id = #value#
</select>

<insert id="insertReport" parameterClass="Report">
INSERT INTO
REPORT (
id,
name,
description,
data
)
values (
#id#,
#name#,
#description#,
#data#
)
</insert>

<update id="updateReport" parameterClass="Report">
UPDATE REPORT set
name = #name#,
description = #description#,
data = #data#
WHERE
id = #id#
</update>
就这么多ok。
更多请看http://opensource.atlassian.com/confluence/oss/display/IBATIS/How+do+I+use+a+BLOB+or+CLOB

svchost.exe占CPU 100%的解决方法


现象:

  1. 机器启动运行几分钟后 svchost.exe就会占系统cpu资源的100%
  2. 拔掉网线就好了,重连上网后一会儿:svchost.exe又占cpu资源的99%;

解决:

假设你已经使用了免费杀毒软件排除了病毒和已经使用防间谍软件排除了恶意软件的影响:
想办法清空C:WINDOWSSoftwareDistribution 目录下所有的文件重启机器即可

如果机器提示文件正在使用("Automatic Updates"服务正在运行)无法删除相应目录:

  • 则想办法打开控制面板==>管理工具==>服务,找到"Automatic Updates",设置成手动启动,
  • 重启后再删除 C:WINDOWSSoftwareDistribution。问题就解决了。
  • 然后再打开控制面板==>管理工具==>服务,找到"Automatic Updates",恢复成自动启动重启。

注意:重启后最好在上网条件比较好的地方让系统顺利完成一次系统自动更新。

推广: 遇到类似问题的应该挺多的,如果你也发现这个方法有用,请将 http://www.chedong.com/blog/archives/001286.html
这个链接加到你的blog里。
html代码: <a xhref="http://www.chedong.com/blog/archives/001286.html">svchost.exe</a>

原因分析:

先说说什么是svchost.exe:简单的说没有这个服务机器几乎就上不了网了。很多应用服务都是以来于这个接口RPC的,如果发现这个进程占了太多的CPU资源,

直接把系统的RPC服务禁用了会是一场灾难:因为连恢复这个界面的系统服务设置界面都无法使用了。恢复的方法需要使用注册表编辑器,找到 HKEY_LOCAL_MACHINE >> SYSTEM >> CurrentControlSet >> Services >> RpcSs, 右侧找到Start属性,把它的值改为2再重启即可

造成svchost占系统CPU 100%的原因并非svchost服务本身:以上的情况是由于Windows Update服务下载/安装失败而导致更新服务反复重试造成的。而Windows的自动更新也是依赖于svchost服务的一个后台应用,从而表现为svchost.exe负载极高。 常发生这类问题的机器一般是上网条件(尤其是去国外网站)不稳定的机器,比如家里的父母的机器,往往在安装机器几个月以后不定期发生,每个月的第二个星期是高发期:因为最近几年MS很有规律的在每个月的第二个星期发布补丁程序)。

上面的解决方法并不能保证不重发作,但是为了svchost文件而每隔几个月重装一次操作系统还是太浪费时间了。

教训:spoolsv.exe和svchost.exe的问题都是应用遇到失败/例外情况后自动重试造成的,本想为用户节省时间的设计,但是重试的频度过高反而导致了和病毒一样的效果。

参考资料:

2007-04-28

股票&烧饼

先帖一段

------------------------------------

假设一个市场,有两个人在卖烧饼,有且只有两个人,姑且称他们为烧饼甲、烧饼乙。
假设他们的烧饼价格没有物价局监管。
假设他们每个烧饼卖一元钱就可以保本(包括他们的劳动力价值)
假设他们的烧饼数量一样多。
——经济模型都这样,假设需要很多。
再假设他们生意很不好,一个买烧饼的人都没有。这样他们很无聊地站了半天。
甲说好无聊。
乙说好无聊。
看故事的你们说:好无聊。
这个时候的市场叫做很不活跃!
为了让大家不无聊,甲对乙说:要不我们玩个游戏?乙赞成。
于是,故事开始了。。。。。。
甲花一元钱买乙一个烧饼,乙也花一元钱买甲一个烧饼,现金交付。
甲再花两元钱买乙一个烧饼,乙也花两元钱买甲一个烧饼,现金交付。
甲再花三元钱买乙一个烧饼,乙也花三元钱买甲一个烧饼,现金交付。
。。。。。。

于是在整个市场的人看来(包括看故事的你)烧饼的价格飞涨,不一会儿就涨到了每个烧饼60元。但只要甲和乙手上的烧饼数一样,那么谁都没有赚钱,谁 也没有亏钱,但是他们重估以后的资产“增值”了!甲乙拥有高出过去很多倍的“财富”,他们身价提高了很多,“市值”增加了很多。
这个时候有路人丙,一个小时前路过的时候知道烧饼是一元一个,现在发现是60元一个,他很惊讶。
一个小时以后,路人丙发现烧饼已经是100元一个,他更惊讶了。
又一个小时以后,路人丙发现烧饼已经是120元一个了,他毫不犹豫地买了一个,因为他是个投资兼投机家,他确信烧饼价格还会涨,价格上还有上升空间,并且有人给出了超过200元的“目标价”(在股票市场,他叫股民,给出目标价的人叫研究员)。
在烧饼甲、烧饼乙“赚钱”的示范效应下,甚至路人丙赚钱的示范效应下,接下来的买烧饼的路人越来越多,参与买卖的人也越来越多,烧饼价格节节攀升,所有的人都非常高兴,因为很奇怪:所有人都没有亏钱。。。。。。
这个时候,你可以想见,甲和乙谁手上的烧饼少,即谁的资产少,谁就真正的赚钱了。参与购买的人,谁手上没烧饼了,谁就真正赚钱了!而且卖了的人都很后悔——因为烧饼价格还在飞快地涨。。。。。。
那谁亏了钱呢?
答案是:谁也没有亏钱,因为很多出高价购买烧饼的人手上持有大家公认的优质等值资产——烧饼!而烧饼显然比现金好!现金存银行能有多少一点利息啊?哪比得上价格飞涨的烧饼啊?甚至大家一致认为市场烧饼供不应求,可不可以买烧饼期货啊?于是出现了认购权证。。。。。。
有人问了:买烧饼永远不会亏钱吗?看样子是的。但这个世界就那么奇怪,突然市场上来了一个叫李子的,李子曰:有亏钱的时候!那哪一天大家会亏钱呢?
假设一:市场上来了个物价部门,他认为烧饼的定价应该是每个一元。(监管)
假设二:市场出现了很多做烧饼的,而且价格就是每个一元。(同样题材)
假设三:市场出现了很多可供玩这种游戏的商品。(发行)
假设四:大家突然发现这不过是个烧饼!(价值发现)
假设五:没有人再愿意玩互相买卖的游戏了!(真相大白)
如果有一天,任何一个假设出现了,那么这一天,有烧饼的人就亏钱了!那谁赚了钱?就是最少占有资产——烧饼的人!
----------------------------------------------

2007-03-05


每天上班下班,每天重复的生活,每天不算紧张的工作,按月领着薪水。这是我最近的生活,可能也是大多数人的生活。无聊但又必须。


我不是一个喜欢平淡的人,但很多时候我又不想为我不平淡的理想付出。也许这就是矛盾,也许这也是大多数人的一个问题。


前进,也许有时候不是因为他懒惰而不去前进,有时候是不知道该如何去迈出前进的一步。


回想起在学校我对这个世界的看法,和现在的看法,差别很大,太大。而我现在的看法又和真实的世界有多大距离呢,我无从得知,可能没有人知道。


现实使人们学会如何去面对他,去接受他,或者去改变他。我属于哪一种呢?说实话我很迷惑,也许都有吧,生活就是学会在现实中去斡旋。


很想有些一步到位的想法,可是想法却几乎是每天都在改变,也许这就是在进步。一成不变是不可能的。


希望几年后我对这些问题有不同的看法和更加精彩的解释。





2007-02-05

方向:转贴


很有意思,原文地址http://www.javaeye.com/topic/52335




方向


(2006年9月26日 写在废纸上的胡思乱想)


现在的我没有方向?真的没有方向。
"再就业"快两个月了,两个月里面我做了些什么?工作,轻松的工作。
工作异常的轻松,没有加班也没有太严格的时间限制。
真的很轻松,真的轻松吗?轻松的工作,心为什么这么累。
心为什么这么累?
人说:书写是自己与自己的对话。
此时,我问我的心:为什么这么累?
心说:没有方向
我问:我的方向在那里?
心说:不知道,但是我本着心的职责告诉你--你真的没有方向
混乱、迷失...
在我与我的心的对话中都得不到一个确切得答案。
似乎...有些逻辑错误...
看来,我真得没有方向。
"我的方向在那?"
我把问题告诉我正在敲打键盘的手。
手说:肯定不在上面那些无里头的文字里。
我问:我的方向在那里?
手,有点不听使唤。近似疯狂的速度敲击键盘。
我呵斥道:嘿!伙计,我的方向在那里?
手,沉默!
注视着我的手,手依旧沉默。
我无趣的抬头,短暂晕眩,密密麻麻的一片。
整屏的System.out.println(#$%^&*);
达芬奇秘密,我清醒时的第一反映。
我问手:这是什么意思?
手说:你的工作
我强调:我的方向在那?
手,又一次沉默。
我有些沮丧,想哭...
喃喃:轻松的工作,心累?心,为什么会累?
我感性的心和我赖以为生的手没能给我答案。
谁?谁能给我答案?
筋疲力尽,眼皮开始亲热...
似乎是梦。
梦中,好多人和我说话。
他们把我围在里面,喃喃的和我说话。
看不清是谁,却一刻不停
我有些浮躁,想努力的摆脱他们的包围。
徒劳,一次一次的徒劳...
我有些愤怒,大声的喊:Quietly!
不知是我声音太小,还是底气不足,他们依旧喃喃
我近乎绝望,又无力抗拒,他们依旧喃喃
心,我的心。越来越重...越来越累...
渐渐迷睡。
我也喃喃:心,怎么会累?
猛的醒来,他们依旧喃喃。话语却清晰可辩.
...
"...不会C,我觉得就像手里面少把刷子...;不过没关系,就你应该学起来快..."
"...Hibernate就是好用,多对多的表操作一条语句就可以搞定..."
"...小伙,有前途啊,好好学。Linux很有前途的"
"...怎么还在用JB啊,现在是Java程序员都会用Eclipes了..."
...
"...你们项目用什么架构啊?什么,什么也不用... 晕!..我们现在的项目用Struts+Spring+
Hibernate+EJB ^_^"
"...你们也用WebService啊?用Apache Soap那只能说才入门 ... 呵呵"
...
"...要想考研的就要好好看书,特别是英语。你什么时候开始复习高数啊..."
... ...
话语如风,轻抚而过。心如海洋,波澜涌动。风四方起,海水无方向。
我似有触动问:我的方向在那里?
四周寂静,他们不见了。
手和心强烈抗议道:没见眼皮如漆似胶了吗?你忍心吗?
该睡觉了,梦里我喃喃道:我的方向在那里?
我的朋友请告诉我。




方向:转贴


很有意思,原文地址http://www.javaeye.com/topic/52335




方向


(2006年9月26日 写在废纸上的胡思乱想)


现在的我没有方向?真的没有方向。
"再就业"快两个月了,两个月里面我做了些什么?工作,轻松的工作。
工作异常的轻松,没有加班也没有太严格的时间限制。
真的很轻松,真的轻松吗?轻松的工作,心为什么这么累。
心为什么这么累?
人说:书写是自己与自己的对话。
此时,我问我的心:为什么这么累?
心说:没有方向
我问:我的方向在那里?
心说:不知道,但是我本着心的职责告诉你--你真的没有方向
混乱、迷失...
在我与我的心的对话中都得不到一个确切得答案。
似乎...有些逻辑错误...
看来,我真得没有方向。
"我的方向在那?"
我把问题告诉我正在敲打键盘的手。
手说:肯定不在上面那些无里头的文字里。
我问:我的方向在那里?
手,有点不听使唤。近似疯狂的速度敲击键盘。
我呵斥道:嘿!伙计,我的方向在那里?
手,沉默!
注视着我的手,手依旧沉默。
我无趣的抬头,短暂晕眩,密密麻麻的一片。
整屏的System.out.println(#$%^&*);
达芬奇秘密,我清醒时的第一反映。
我问手:这是什么意思?
手说:你的工作
我强调:我的方向在那?
手,又一次沉默。
我有些沮丧,想哭...
喃喃:轻松的工作,心累?心,为什么会累?
我感性的心和我赖以为生的手没能给我答案。
谁?谁能给我答案?
筋疲力尽,眼皮开始亲热...
似乎是梦。
梦中,好多人和我说话。
他们把我围在里面,喃喃的和我说话。
看不清是谁,却一刻不停
我有些浮躁,想努力的摆脱他们的包围。
徒劳,一次一次的徒劳...
我有些愤怒,大声的喊:Quietly!
不知是我声音太小,还是底气不足,他们依旧喃喃
我近乎绝望,又无力抗拒,他们依旧喃喃
心,我的心。越来越重...越来越累...
渐渐迷睡。
我也喃喃:心,怎么会累?
猛的醒来,他们依旧喃喃。话语却清晰可辩.
...
"...不会C,我觉得就像手里面少把刷子...;不过没关系,就你应该学起来快..."
"...Hibernate就是好用,多对多的表操作一条语句就可以搞定..."
"...小伙,有前途啊,好好学。Linux很有前途的"
"...怎么还在用JB啊,现在是Java程序员都会用Eclipes了..."
...
"...你们项目用什么架构啊?什么,什么也不用... 晕!..我们现在的项目用Struts+Spring+
Hibernate+EJB ^_^"
"...你们也用WebService啊?用Apache Soap那只能说才入门 ... 呵呵"
...
"...要想考研的就要好好看书,特别是英语。你什么时候开始复习高数啊..."
... ...
话语如风,轻抚而过。心如海洋,波澜涌动。风四方起,海水无方向。
我似有触动问:我的方向在那里?
四周寂静,他们不见了。
手和心强烈抗议道:没见眼皮如漆似胶了吗?你忍心吗?
该睡觉了,梦里我喃喃道:我的方向在那里?
我的朋友请告诉我。




2007-02-02

居然还有9个人订阅我的blog


早晨一来不小心看到了我的blog,居然还有9个人订阅哈哈,值得庆贺,以前最多的时候可是有50个人啊。不过那个时候的数据多半是错误的,rojo占据的大部分,而现在的9个人中有6个来自抓虾,2个bloglines,1个google reader,不过我敢肯定的是用google reader订阅我的一定不止一个,呵呵9个人的订阅数可是含金量很高的哦。


2007-02-01

苦闷 差距 梦想


每当我发现我和别人的差距的时候我总是会去思考,可是结果往往是苦闷。


每当我发现差距是如此之大的时候,我会越发的苦闷。


梦想使我阿Q式的告诉我自己,有一天我会填补这个差距,甚至让这个差距变成负数。然后我心情好了一些。


可是一些时间过去了,差距依然在拉大,苦闷也就越发的变大。


这是一个及其不好的循环。


怎么解决这个问题呢?



2007-01-30

Blogger们都怎么了?


最近发现很多bloger们写作的速度都明显慢了下来,甚至有些bloger们很久都没有更新他们的blog了,有些blog更多的是充满着



links for 2007-01-28


某某某昨日关注



可能是我关注的面比较窄,互联网,开发类占据了绝大多数。但是比起国外的一些bloger们,我们的速度和热度明显的下降了,难道是股市热潮把bloger们也吸引过去了?


在中国互联网也许不是2007最关注的话题了,也许,股市是大家更加关注的话题,也许股市让你觉得更加赚钱,但是我希望中国互联网积攒下来的这些优秀的bloger们不要再流失了。毕竟我们不是为了利益才去写blog。


update:就连前一段时间在中国极火的RoR最近也销声匿迹了。难道在中国什么东西就只能这样?昙花一现?


2007-01-25

关于DB2的JDBC驱动


昨天在用java链接db2的数据库时发现以前没有注意的一些问题,之前链接db2的jdbc通常是:





JDBC Driver:COM.ibm.db2.jdbc.net.DB2Driver


JDBC URL:jdbc:db2://127.0.0.1:6789/sample


组合后也就是:


Class.forName( " com.ibm.db2.jdbc.net.DB2Driver " );
String url = " jdbc:db2://192.9.200.108:6789/SAMPLE "
Connection conn = DriverManager.getConnection( url, sUsr, sPwd );



这是我们通常意义上所说的type3纯java驱动,这类驱动程序使用纯 JAVA 客户机,并使用独立于数据库的协议与中间件服务器通信,然后中间件服务器将客户机请求传给数据源。这个中间件服务器就是安装DB2后在服务中显示为"DB2 JDBC小应用程序服务器--对DB2应用程序提供JDBC服务支持"(当然我是在windwos上安装DB2的),务必使这个服务启动,否则type3型的JDBC是链接不上的。


此外用的比较多的是type4型的纯java驱动





JDBC Driver:com.ibm.db2.jcc.DB2Driver


JDBC URL:jdbc:db2://127.0.0.1:50000/sample



下面是一段IBM网站的引用:





依照 JDBC 规范,有四种类型的 JDBC 驱动程序体系结构:


Type 1:这类驱动程序将 JDBC API 作为到另一个数据访问 API 的映射来实现,如开放式数据库连通性(Open Database Connectivity,ODBC)。这类驱动程序通常依赖本机库,这限制了其可移植性。JDBC-ODBC 桥驱动程序就是 Type 1 驱动程序的最常见的例子。
Type 2:这类驱动程序部分用 JAVA 编程语言编写,部分用本机代码编写。这些驱动程序使用特定于所连接数据源的本机客户端库。同样,由于使用本机代码,所以其可移植性受到限制。
Type 3:这类驱动程序使用纯 JAVA 客户机,并使用独立于数据库的协议与中间件服务器通信,然后中间件服务器将客户机请求传给数据源。
Type 4:这类驱动程序是纯 JAVA,实现针对特定数据源的网络协议。客户机直接连接至数据源。
对于DB2 UDB V7.2来说,它不支持 Type 1 和 Type 4 的驱动程序,但是提供了分别支持 Type 2 和 Type 3 的驱动程序。


示例如下:


两种驱动程序均随产品安装由 db2java.zip 提供。


COM.ibm.db2.jdbc.app.DB2Driver
这是一种 Type 2 的 JDBC 驱动程序,它通过 DB2 本地客户机库的帮助建立和 DB2本地数据库或是远程数据库的连接(事先将远程数据库编目到本地)。因此,我们必须在应用系统所在的机器上同时部署 DB2 本地客户机库,这也许是它最大的一个不足之处。


使用格式如下:


Driver Name:COM.ibm.db2.jdbc.app.DB2Driver


URL Pattern:jdbc:db2:databasename


databasename: 需要访问的数据库名


COM.ibm.db2.jdbc.net.DB2Driver
这是一种 Type 3 的 JDBC 驱动程序,它通过与一台已经部署了 DB2 本地客户机库的机器通信来建立和 DB2 远程数据库的连接。


使用格式如下:


Driver Name:COM.ibm.db2.jdbc.net.DB2Driver


URL Pattern:jdbc:db2:ServerIP:databasename


ServerIP: 需要访问的数据库所在机器IP地址


databasename: 需要访问的数据库名


(目标DB2系统侦听该服务于默认端口6789,否则还需要在 URL Pattern 中指定目标端口号)


对于 DB2 UDB V8.1 来说,它仍然不支持 Type 1 的驱动程序。同时,它在 DB2 UDB V8.1的基础上,新增加了对 Type 4 驱动程序的支持。


示例如下:


DB2 UDB V8.1 仍然支持上面所述 V7.2 支持的两种驱动程序,随产品安装由 db2java.zip 提供,但具体实现上和 DB2 UDB V7.2 产品发布的包有所不同,所以可能存在下文所要进行实验验证的兼容性问题。


除了 COM.ibm.db2.jdbc.app.DB2Driver 之外,DB2 UDB V8.1 还提供了另外一种 Type 2 的驱动程序,随产品安装由 db2jcc.jar 提供。其实现包名是 com.ibm.db2.jcc.DB2Driver,在DB2 UDB V8.1 最初的实现中,此驱动程序只用于使用 Type 4 驱动程序体系结构与 DB2 服务器进行直接的 JAVA 连接,这类驱动程序由于不需要另外部署 DB2 本地客户机库以及性能相对较好而收到开发人员的欢迎。自从 DB2 UDB V8.1.2(安装了 FixPack 2)之后,开发人员还可以在 Type 2 体系结构中使用该驱动程序,以提高本地应用程序的性能。


这里,两种驱动程序具有相同的实现类名称,有两种不同的方法可以区分 DB2 系统在内部最终会实例化哪个驱动程序:


使用不同的 URL Pattern 来区分两种不同的驱动程序
Type 2 Driver URL Pattern:jdbc:db2:databasename


这当中 databasename 是需要访问的数据库名


Type 4 Driver URL Pattern:jdbc:db2://ServerIP:50000/databasename


这当中 ServerIP 是需要访问的数据库所在机器IP地址,databasename 是需要访问的数据库名,DB2 服务器会在默认端口 50000 上进行侦听。


使用连接特性来区分数据库连接是否会使用 DB2 本地客户机库,或者是使用JAVA 直接连接。
DB2 UDB V8.1 新增加支持的这种 Type 4 驱动程序,常被称为"通用 JDBC 驱动程序",是一种与驱动程序类型连通性或目标平台无关的抽象 JDBC 处理器,因此常用于进行分布式和本地 DB2 UDB 访问。因为"通用 JDBC 驱动程序"独立于任何特定 JDBC 驱动程序类型连通性或目标平台,所以它在一个 DB2 UDB 驱动程序实例中同时支持所有 JAVA 连通性(Type 4 驱动程序)和基于 JNI 的连通性(Type 2 驱动程序)。该驱动程序可以用于独立 JAVA 应用程序或多层应用程序,是开发人员一个不错的选择。



关于DB2 JDBC驱动的jar包:



db2java.zip包含两个驱动类COM.ibm.db2.jdbc.app.DB2Driver.class(第二类驱动,现在不推荐使用),另一个COM.ibm.db2.jdbc.net.DB2Driver.class(第三类驱动,也叫applet驱动,网络驱动)
db2jcc.jar是IBM推荐使用的,其包含一个新的第二类驱动和一个第四类驱动,二者通过uril来区分




参考信息:



http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512kokkat/


http://www.ibm.com/developerworks/cn/db2/library/techarticles/0402chenjunwei/0402chenjunwei.html






2007-01-23

充足的带宽


看到keso的文章东拉西扯:当每个人都有充足的带宽,有了下面一些想法。


1.Microsoft Office和Visual Studio不是因为带宽的增长就不需要购买了,这个和音乐,电影这些数据不一样。带宽可以解决数据传输的问题,但是你需要的不仅仅是数据,你需要的是服务。


2.如果没有Box.net这样的网络资源的存储地,或者是下载网站这些类似的存储地,恐怕你需要把所以的东西都要备份在硬盘上了,带宽更加没有用了。


3.BitTorrent、eMule、P2P的价值不在于缓解带宽的不足,带来下载的速度。他们的意义是一种资源的交流和共享。


4.个人认为充足的带宽带来的是服务的多样话,多元化,和分散,也许以后没有像google,微软这样的巨无霸的,我们需要的服务都分散在各地,各人。也许以后连上班都不用了,每个人提供一种服务,用自己提供的服务,去换取别人的服务。呵呵,希望有这么一天。


5.随着互联网的发展,人们似乎越来越倾向于把应用都搬到互联网上了,可是似乎人们都走上了浏览器这个方式,当然目前你需要上网就必然需要浏览器,以至于人么在浏览器中做出各种各样的应用,以至于OS。我总觉得大家似乎走了弯路,难道没有浏览器互联网就不是互联网?那天大家都没有浏览器的概念,一开电脑什么都有了,音乐从音乐的服务商那里取得,新闻从专门提供新闻的服务商那里获取。让互联网服务想用自来水一样,打开电脑想要什么就有了,而不是现在,大家首先要开一个浏览器。


google.cn有意思的变化

今天在搜索时发现google.cn的有趣变化(也许早变化了,我没有发现)









google.com









图片可以看出google.cn多出了搜索建议和相应的结果数。记得以前iask.com(新浪的爱问)好像有这个功能,现在没有了。不过有道似乎一开始就提供了这个功能。回头在看看google.com却发现并没有这个功能,呵呵,很有意思,这意味着什么?难道谷歌又有什么新动作了?

2007-01-09

CakePHP Manual翻译2.5:基础概念


基础概念


第一节



介绍


这一节很短,只是介绍一下MVC在Cake中的实现。加入你刚刚得知MVC模式,那么这一节将非常适合你。下面我们通过CakePHP里面的一些MVC应用来讨论基础的MVC概念,然后展示一些简单的CakePHP中使用MVC模式的例子。


第二节



MVC模式


Model-View-Controller(模型-视图-控制器)是一种软件设计模式,他可以帮助你分离一些逻辑代码,使他们可以复用,更加易于维护,从而变得更好。MVC是有author group Gang of Four(译者注:《设计模式》那本书的四位作者,简称四人组)首先提出的。Dean Helman写到(从Objective Toolkit Pro white paper截取):




"The MVC paradigm is a way of breaking an application, or even just a piece of an application's interface, into three parts: the model, the view, and the controller. MVC was originally developed to map the traditional input, processing, output roles into the GUI realm.


Input -> Processing -> Output


Controller -> Model -> View


"The user input, the modeling of the external world, and the visual feedback to the user are separated and handled by model, view port and controller objects. The controller interprets mouse and keyboard inputs from the user and maps these user actions into commands that are sent to the model and/or view port to effect the appropriate change. The model manages one or more data elements, responds to queries about its state, and responds to instructions to change state. The view port manages a rectangular area of the display and is responsible for presenting data to the user through a combination of graphics and text."



在CakePHP中,Model描述了一条数据库表中的记录,并且它可以关联其他表的记录。Model中还包含数据的验证规则,这些规则将在model中的数据向数据库插入和更新的时候起作用。View描述了CakePHP的展现文件,这些文件是一些嵌入了php代码的规则的HTML文件。Cake (CakePHP)的Controller从服务器处理请求。他们获得用户输入(从URL和POST数据中),运行业务逻辑,使用Model从数据库读写数据,然后输出数据到对应的展现文件。


为了尽可能简单的组织你的应用,Cake使用这种模式(当然不是仅仅使用MVC)管理object(对象)如何同你的应用交互,同时也管理你的文件,我们在下一节将详细讨论这个。


第三节



Cake文件布局概览


当你解压Cake后在你的服务器上你会看到下面一些文件夹




app
cake
vendors

cake文件夹放置了Cake的核心库,一般情况下不需要做修改。


app文件夹是你应用的文文件存放的地方。cakeapp文件夹分开可以使你的多个应用共享一个Cake库。这样也使你升级CakePHP更加便捷:你只需要下载最新的Cake覆盖你现有的Cake库,而不需要担心这样会覆盖你写的应用程序。


vendors目录用于存储第三方的类库。你可以通过Cake的vendor()函数来访问你放置在vendors目录中的类。关于vendors在后面我们会详细介绍。


让我们看看整个文件的布局:




/app
/config - 包含数据库、ACL等的配置文件.

/controllers - Controllers放在这里
/components - Components放在这里

/index.php - 可以部署cake和/app为服务器的DocumentRoot

/models - Models放在这里

/plugins - Plugins放在这里

/tmp - 用于存储缓存(cache)和日志(logs)

/vendors - 应用程序中用到的第三方库放在这里

/views - Views放在这里
/elements - Elements,和少量的views放在这里
/errors - 自定义的错误页面放在这里
/helpers - Helpers放在这里
/layouts - 应用程序布局文件放在这里
/pages - 静态的展现页面放在这里

/webroot - web应用的根目录(DocumentRoot)
/css
/files
/img
/js

/cake - Cake的核心库。不要编辑这里的文件

index.php

/vendors - 用于服务器端的第三方类库。

VERSION.txt - 你运行的CakePHP的版本信息文件。




CakePHP Manual翻译5:脚手架(Scaffolding)


脚手架(Scaffolding)



第一节



Cake的Scaffolding非常的优美并且酷毙了


它非常酷,你会想在你的应用中应用它。现在,我们都认为它非常的酷,但是脚手架是……哦,……它仅仅是一个脚手架。在项目的开始他能够快速的为你的项目创造原型。这也就是说他不是很灵活。所以,如果你想真的自定义你的业务逻辑和试图(views),那么是时候放下脚手架,写一些代码了。脚手架是在开发 web应用开始阶段,获得早期版本的非常好的方式。早期的数据库定义会时常发生变化,脚手架非常适合早期的设计过程。一个web开发人员非常讨厌创佳一些不会真正使用的表单,脚手架可以减少这些表单的创建。为了减少开发人员的变化,Cake提供了脚手架。脚手架分析数据库中的表,为数据库的每一条记录创建标准列表的增加,删除和编辑按钮,标准的编辑表单和标准的视图(view)。为应用添加脚手架只需要在controller中添加$scaffold变量:





<?php
class CategoriesController extends AppController
{
var $scaffold;
}
?>


关于脚手架要注意非常重要的一条:它假设 _id 结尾的字段为外键,并且_id前是外键表的名称。例如,有一个嵌套的类别,你可能有一个列,列名叫parent_id。当他发布,他会调用他的parentid。同样,当你有一个外键在表中(例如titles表中有category_id),他会关联一个正确的model(参见《理解关联》6.2),一个查询会自动从外键表对应的model中组装结果。title类中代码如下:




<?php
class Title extends AppModel
{
var $name = 'Title';

var $displayField = 'title';
}
?>




第二节



自定义脚手架视图


如果你想脚手架有一些不同,你可以自己创建他们。我们仍然不建议在成型的产品中使用这中技术,但是这样的定制对于原型的迭代非常有效。


如果你想改变脚手架的视图,你需要自己提供:


为单个的Controller定制视图



在下面这些地方为PostsController定制脚手架视图:


/app/views/posts/scaffold/index.scaffold.thtml
/app/views/posts/scaffold/show.scaffold.thtml
/app/views/posts/scaffold/edit.scaffold.thtml
/app/views/posts/scaffold/new.scaffold.thtml

为整个应用定制脚手架视图



在下面这些地方为整个应用定制脚手架视图:


/app/views/scaffold/index.scaffold.thtml
/app/views/scaffold/show.scaffold.thtml
/app/views/scaffold/edit.scaffold.thtml
/app/views/scaffold/new.scaffold.thtml

如果你想自己定义controller的逻辑,那么是时候让从脚手架上下来,自己创建他们了。


有一个特性可能会非常有用,那就是Cake的代码生成器:Bake。Bake可以生为脚手架生成一个代码版本,然后你可以修改这些代码,按照需求去定制你的应用。




2007-01-08

CakePHP Manual翻译4:配置




配置


第一节


数据库配置


所有的数据库配置都在 app/config/database.php 文件中。 新安装的Cake中没有 database.php, 所以你需要拷贝一份 database.php.default 将它重命名为database.php你会看到如下内容在app/config/database.php 文件中:





app/config/database.php




var $default = array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'project_name',
'prefix' => '');



为你的应用配置数据库链接信息,只需要替换一些默认的配置。


关于前缀:输入的这些配置将会在应用执行SQL之前配置数据库。你只需要在这里定义一次。如果你的主机只有一个数据库可以使用(译者注:在一个数据库上跑多个应用),同样也要遵循Cake的表命名约定。注:对于HABTM(hasAndBelongsToMany,参见Model章节)连接表,你只需要增加前缀一次,如:prefix_apples_bananas,而不是 prefix_apples_prefix_bananas(apples和bananas是两张关联表)。


CakePHP提供如下数据库驱动:




  1. mysql




  2. postgres




  3. sqlite




  4. pear-drivername (so you might enter pear-mysql, for example)




  5. adodb-drivername




$default中的'connect'链接允许你指定要做持久化的数据库链接。database.php.default中的注释详细说明了数据库配置中的连接类型。


数据库的表必须遵循如下约定:




  1. 表名习惯用英文单词的复数形式组成,如:"users", "authors" 或 "articles"。对应的models用单数形式,如:"user", "author" 或 "article"。




  2. 表必须要有一个主键,名称为id。




  3. 如果表需要做关联,则外键必须看起来像这样: article_id,关联表名的单数形式后面接下划线(_)后面接id。




  4. 如果表中包含'created' 或者 'modified' 列,Cake将自动向改列中写入和修改其值。




在database.php文件中有$test连接设置,在models中添加如下语句:


var $useDbConfig = 'test';


你就可以运用$test中的连接设置。


你可以用这种添加多个连接设置。



第二节



全局配置


CakePHP的全局配置在文件app/config/core.php中。我们不喜欢配置文件,它仅仅是一些必要的配置。这里只有一些内容,你可以改变,每一个配置你都可以在 core.php 的注释中找到说明。


DEBUG:设置它为不同的值,将会帮助你调试你的应用。将他设置成一个非0的值,Cake将会打印出pr()debug()函数的调用结果,并且自动停止页面的跳转。将他设置成2或者更大将作用鱼SQL语句,SQL语句将被打印在输出页面的底部。同样,当处于调试模式(DEBUG被设置成0或者更大),Cake将提示一些页面生成的错误,如"Missing Controller","Missing Action",等待。尽管在产品模式(DEBUG被设置成0),Cake显示的"Not Found"页面,也可以在 app/views/errors/error404.thtml 中被重写。


CAKE_SESSION_COOKIE:设定在Cake应用中使用的用户session的cookie的名字。


CAKE_SECURITY:这个值设定你的sessions检查级别。Cake中的sessions过期时间,生成新sessions的id,删除旧sessions文件,会依赖你在这里的设置。设置的值如下:




  1. high: sessions将在处于不活动状态10分钟后过期,并且为每一个请求重新生成一个新的session id。




  2. medium: sessions将在处于不活动状态20分钟后过期。




  3. low: sessions将在处于不活动状态30分钟后过期。




CAKE_SESSION_SAVE:设定保存session数据的保存方式. 设置的值如下:




  1. cake: Session数据保存在应用中的 tmp/ inside 下。




  2. php: 按照 php.ini 中设置的方式保存Session数据。




  3. database: Session数据保存在数据库连接设置中'default'关键词设置的数据库中。





第三节



路由配置


路由(Routing)是一个纯PHP的类似mod_rewrite的功能,它可以映射URL到controller/action/params这样的模式,并且返回数据。它可以美化URL而不需要mod_rewrite,并且可配置。尽管如此,使用mod_rewrite,可以使地址栏看起来非常整洁。


路由有独立的规则将URL映射到指定的controllers和actions。在app/config/routes.php配置路由。设置如下:




路由模式



<?php
$Route->connect (
'URL',
array('controller'=>'controllername',
'action'=>'actionname', 'firstparam')
);

在上面代码中:




  1. URL 是一个你希望在Cake中映射的URL的正则表达式,




  2. controllername 是你希望调用的controller的名称,




  3. actionname 是你希望调用的action的名称,




  4. and firstparam 调用action的第一个参数.




任何在firstparam 后的参数同样被当作参数传递给controller action.


下面的例子演示将所有的在/blog后的URL映射到BlogController。controller中默认的action是BlogController::index()。



路由示例



<?php
$Route->connect ('/blog/:action/*', array('controller'=>'Blog', 'action'=>'index'));
?>

像 /blog/history/05/june 的URL将被捕获:


Controller中的路由捕获



<?php
class BlogController extends AppController
{
function history ($year, $month=null)
{
// .. Display appropriate content
}
}
?>




在Blog的路由中'history'将匹配:action(也就是'history'做为controller的action)。匹配*的URL中的元素将被作为参数传递给当前活动controller(如上面代码的BlogController)的方法,上面的代码中就是参数$year 和 $month。请求URL /blog/history/05 只传递一个参数05给history()方法。


下面的示例是CakePHP中默认的路由,它用于PagesController::display('home')。Home是一个可以在/app/views/pages/home.thtml中重写的view(视图)。


默认路由设置



<?php
$Route->connect ('/', array('controller'=>'Pages', 'action'=>'display', 'home'));
?>




第四节



高级路由设置: Admin 路由和 Webservices


你可以利用/app/config/core.php文件中的一些设置,组织你的应用,优化URL,使用户获得更好的体验。


第一个是admin路由。假如在你的应用中有ProductsController和NewsController两个controller,也许你希望有管理权限的用户能够访问这些controller中某个特别的action。为了保持URL的美观和易读,人们希望URL是 /admin/products/add 和 /admin/news/post 这样,而不是/products/adminAdd and /news/adminPost。


如果你想这样,首先,取消/app/config/core.php文件中CAKE_ADMIN行的注释。CAKE_ADMIN的默认值是'admin',你也可以把它改成你想要的任何值。


记住这个值,因为你需要根据这个值,对管理权限的用户能够访问的action做一些预处理。所以,在这种情况中admin action可能命名为admin_actionName()。下面的例子,是一些你希望看到的URL,CAKE_ADMIN相应的值,和 controller中相应action的设置。



/admin/products/add CAKE_ADMIN = 'admin'
name of action in ProductsController = 'admin_add()'

/superuser/news/post CAKE_ADMIN = 'superuser'
name of action in NewsController = 'superuser_post()'

/admin/posts/delete CAKE_ADMIN = 'admin'
name of action in PostsController = 'admin_delete()'


使用admin路由能够更有效的组织你的逻辑。
请记住一点,admin路由不等同于任何类型的认证和安全机制。你需要自己去实现他们。
同样,你也可以这样使用Cake的webservices路由。你想将一个controller的action作为webservice暴露出来么?首先,将/app/config/core.php文件中的WEBSERVICES的值设置成'on'。在设置了路由前缀后,这些设置可以做一些如同 admin的路由,路由前缀如下:


  1. rss




  2. xml




  3. rest




  4. soap




  5. xmlrpc




这些前缀可以提供一个可选的view(视图),当访问 /rss/controllerName/actionName 或 /soap/controllerName/actionName 时会自动应用这些view。这样可以创建一个action并且拥有两个表现的view:如一个为普通的HTML浏览者,另外一个提供给 webservices用户。通过这些你可以轻松的将应用中的功能以webservices的方式暴露出来。例如,我的应用中有一些逻辑告诉用户我办公室中谁在打电话。对于这些数据我已经有了一个HTML的view,但是我还想有一个XML的,使这些数据能够运用在桌面的windget或者被其他应用使用。首先我们需要应用Cake的webservice路由:


/app/config/core.php (部分)



/**
* The define below is used to turn cake built webservices
* on or off. Default setting is off.
*/
define('WEBSERVICES', 'on');



下面我们和以前一样在controller中构建我们的应用逻辑:


messages_controller.php


<?php
class PhonesController extends AppController
{
function doWhosOnline()
{
// 这个action完成查看我的办公室里谁在打电话……

// 如果我想使这个action以Cake的xml webservices路由方式获得,
// 我需要在定义一个view--/app/views/posts/xml/do_whos_online.thtml
// 注意:默认的view布局模版使用/app/views/layouts/xml/default.thtml.

// 如果请求 /phones/doWhosOnline, 结果将是一个HTML版本。
// 如果请求 /xml/phones/doWhosOnline, 将获得一个XML版本。
}
}
?>


第五节



(可选) 自定义变形配置(Inflections Configuration)


Cake的命名约定非常优美,你可以命名你的model,controller,一切都可以设计出来。但有一些时候(特别是对于一些非英语国家的朋友) Cake的词尾变化(class的复数,单数,大小写分隔和下划线分隔单词)可能并不是像你希望的那样工作。如果Cake不能够处理 Foci 或者 Fish(处理这些单词的单数复数形式的变化),编辑自定义变形配置文件(custom inflections configuration)能够满足你的需要。


/app/config/inflections.php列出了一些Cake的变量,你可以使用他们去判别Cake中class名称的单数,复数形式,根据定义的规则,并不能变换所有的单、复数形式,例如一些不规则的单复数单词Foci或者Fish(Fish的单数、复数形式相同)。


根据配置文件中的说明,或者取消文件中的一些注释来配置规则。在你做这些之前,你需要懂得一些正则表达式。





2007-01-07

CakePHP Manual翻译3:安装CakePHP


安装CakePHP


第一节


介绍

你现在已经知道CakePHP的目的和结构了,如果你仅仅是想开始使用CakePHP,不关心这些文档,而跳过这部分,那么后面你将会遇到一些麻烦。


这一章将讲述服务器上必须安装的东西,配置服务器的不同方式,下载安装CakePHP,展现CakePHP的默认页面,和一些不在计划内的问题的解决方式。


第二节


安装需求

为了使用CakePHP,你必须先有一个包含能够运行CakePHP的库和程序的服务器。


服务器需求

下面是一些运行CakePHP的服务器需求:


Here are the requirements for setting up a server to run CakePHP:




  1. 一个HTTP服务器(例如:Apache) 并且使这些模块有效-- sessions, mod_rewrite (这个不是必须的但是最好有这个功能)。




  2. PHP 4.3.2 或者更新的版本。CakePHP可以工作在PHP 4和5或者更新的版本。




  3. 一个数据库引擎(现在CakePHP支持MySQL, PostgreSQL 和一个wrapper for ADODB).




第三节


安装CakePHP

获得最新的稳定版本

通过这些方式你可以安全的获取一份CakePHP的拷贝:从CakeForge获取稳定版本,抓取每日构建,或者从SVN获取最新的代码。


去http://cakeforge.org/projects/cakephp/下载CakePHP项目的稳定版本。


去http://cakephp.org/downloads/index/nightly获得一个每日构建的版本。这些版本是稳定的,但是在发布成稳定版本之前常常会有一些bug需要修订。


选择你最喜欢的SVN客户端去https://svn.cakephp.org/repo/trunk/cake/获得一份你想要版本的CakePHP代码。


解压缩

现在你已经下载了最新的版本,把下载的压缩包放在你web服务器上的根目录下。现在你需要将CakePHP解压缩。解压有两种方式,一种是使用开发设置,这种方式可以方便的在一个域上放置多个CakePHP应用;另外一种是产品设置,这种方式可以在一个域上运行一个单独的CakePHP应用。


第四节


设置CakePHP

设置CakePHP的第一种方式使用开发环境的设置,但是这种方式不是很安全。另外一种更加安全的方式是使用产品环境设置。


注:当你的web服务器运行的时候/app/tmp 目录必须可写。


开发方式的设置

在开发方式时,我们可以把整个Cake的安装目录放到web服务器的根目录下(DocumentRoot)像下面这样:




/wwwroot
/cake
/app
/cake
/vendors
.htaccess
index.php


在这种设置下wwwroot文件夹是你web server的根目录,你的url可能像下面这样(如果你启用web server的mod_rewrite功能)


www.example.com/cake/controllerName/actionName/param1/param2


产品方式的设置


为了使用产品方式的设置,你需要有一些修改web server的根目录(DocumentRoot )的权限。这样做可以使整个web server的域运行一个CakePHP应用。


产品方式设置的文件布局如下:




../path_to_cake_install
/app
/config
/controllers
/models
/plugins
/tmp
/vendors
/views
/webroot <-- 将web server的根目录(DocumentRoot )指向这里
.htaccess
index.php
/cake
/vendors
.htaccess
index.php



建议产品方式的web服务器配置httpd.conf


DocumentRoot /path_to_cake/app/webroot


在这种设置下wwwroot文件夹是你web server的根目录,你的url可能像下面这样(如果你启用web server的mod_rewrite功能)


http://www.example.com/controllerName/actionName/param1/param2


高级设置: 可选的安装选项


下面有一些案例,展示了将Cake的目录放在不同的地方。这些情况是当你的应用在一台共享的主机(译者注:如在租用的空间上放置你的web应用),或者当你想多个应用共享一个Cake库。


Cake应用有三个主要的部分:






  1. CakePHP的核心库 - 在 /cake





  2. 应用的代码 (如:controllers, models, layouts和views) - 在 /app





  3. 应用的根目录访问文件 (如:images, javascript和css) - 在 /app/webroot





这些文件夹可以放在文件系统的任何位置,除了webroot,他是需要被web server访问的。你可以将webroot放到app的外面,当你移动webroot的时候同时也要告诉Cake你把他放到哪里了。


如果你这样做了,你需要修改/app/webroot/index.php 。有三个常量需要更改:








  1. ROOT 必须设置成包含 app 文件夹的目录.





  2. APP_DIR 别需设置成 app 目录(译者注:通常就是'app').





  3. CAKE_CORE_INCLUDE_PATH 应该被设置成 Cake 库的目录(译者注:是指包含Cake的目录).





/app/webroot/index.php (去掉了部分注释)


if (!defined('ROOT'))
{
define('ROOT', dirname(dirname(dirname(__FILE__))));
}
if (!defined('APP_DIR'))
{
define ('APP_DIR', basename(dirname(dirname(__FILE__))));
}
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
define('CAKE_CORE_INCLUDE_PATH', ROOT);
}


用一个例子说明可能会更容易理解。假设我想设置Cake工作在下面的方式:






  1. 我像让Cake被其他应用共享, 并且Cake在 /usr/lib/cake.





  2. 我Cake的webroot目录是 /var/www/mysite/.





  3. 我的应用的文件存储在 /home/me/mysite.





那么文件的布局可能会像这样:

/home
/me
/mysite <-- 相当于 /cake_install/app
/config
/controllers
/models
/plugins
/tmp
/vendors
/views
index.php
/var
/www
/mysite <-- 相当于 /cake_install/app/webroot
/css
/files
/img
/js
.htaccess
css.php
favicon.ico
index.php
/usr
/lib
/cake <-- 相当于 /cake_install/cake
/cake
/config
/docs
/libs
/scripts
app_controller.php
app_model.php
basics.php
bootstrap.php
dispatcher.php
/vendors

在这种设置下,我需要修改我webroot下的index.php文件(在该示例中文件应该是/var/www/mysite/index.php)如下:
这里推荐使用'DS'常量,而不是用斜线('/')分隔文件路径。这种方式避免了你可能误用错误的分隔符而导致的"文件丢失错误",并且这样会使你的代码更加轻便。


if (!defined('ROOT'))
{
define('ROOT', DS.'home'.DS.'me');
}
if (!defined('APP_DIR'))
{
define ('APP_DIR', 'mysite');
}
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib'.DS.'cake');
}


第五节



配置 Apache 的 mod_rewrite


当CakePHP没有mod_rewrite支持时候,我们发现许多用户由于不能完美运行他们的系统而苦恼。下面是一些可能需要尝试并且使之正确运行的事情:






  1. 确认.htaccess 允许被重载:在httpd.conf,你的服务器上你必须确认为每一个Directory(虚拟目录)定义一个section。 确认当前Directory的AllowOverride 选项被设置成 All





  2. 确定你修改的是系统的httpd.conf,而不是用户或者特定站点的httpd.conf。





  3. 由于一些原因你可能获得了一份没有.htaccess文件的CakePHP的拷贝。这种情况有可能是因为一些操作系统将以'.'开头的文件看作隐藏文件,从而没有拷贝他们。确认你的CakePHP拷贝是从官方网站或者SVN库中下载的。





  4. 确认你正确的加载了mod_rewrite模块。你需要在你的httpd.conf中查看一下LoadModule rewrite_module libexec/httpd/mod_rewrite.so 和 AddModule mod_rewrite.c





  5. 如果你安装CakePHP在一个用户目录 (如:http://example.com/~myusername/), 你需要在Cake安装的根目录中修改.htaccess文件,添加一行 "RewriteBase /~myusername/".





  6. 如果因为某些原因你的URL后缀太长, 如令人讨厌的session ID (http://example.com/posts/?CAKEPHP=4kgj577sgabvnmhjgkdiuy1956if6ska),你可以在Cake安装的根目录中的.htaccess文件添加"php_flag session.trans_id off" 。





第六节



确认他在工作


好的,让我们看看Cake是如何工作在你的设置下的。在浏览器中输入http://www.example.com 或者 http://www.example.com/cake,你会看到CakePHP的默认页面,页面上会显示一些数据库链接的信息。那么恭喜你,你已经准备好创建一个基于Cake的应用了。


2007-01-06

CakePHP Manual翻译2:CakePHP介绍


CakePHP介绍


第一节


CakePHP是什么?

CakePHP是一个免费、开源的PHP快速开发框架。它是一个用于创建web应用的给予类库的运行时框架,最开始的灵感来自于Ruby on Rails框架。我们的主要目标是使你的开发更加快速有条理,而不失灵活性。


第二节


为什么选择CakePHP?

CakePHP的一些特性使他成为一个更加快速而少争议的应用开发框架。下面是他的一些特性:




  1. 活跃,友好的社区支持




  2. 灵活的监听




  3. 兼容 PHP4 和 PHP5




  4. 整合数据库CRUD操作和简单的查询




  5. 应用脚手架(译者注:这里是指不需要写代码即可对一个表进行简单的CRUD,来源与ROR)




  6. 基于MVC构架




  7. 支持漂亮并且可以定制的url的请求分发




  8. 内置数据验证




  9. 快速灵活的框架 (PHP 语法, 结合helpers类)




  10. 提供展示AJAX, Javascript, HTML Forms……的帮助类




  11. 安全, Session, 和处理请求的组件




  12. 灵活的访问控制




  13. Data Sanitization




  14. Flexible View Caching




  15. 可以工作在你站点的任何目录下,并且只需要很少的apache配置




第三节


CakePHP的历史

2005年,Michal Tatarynowicz写了一个很小的PHP快速开发框架。他发现这是一个非常不错的框架,于是他在MIT license下发布了这个框架,叫做Cake,并且向社区的开发者开放,这就是现在的CakePHP。


2007-01-05

CakePHP Manual翻译:前言

随着ROR的火热,PHP世界中也出现了不少类似的框架,CakePHP就是其中的佼佼者。在学习的过程中把Manual(手册)翻译出来,其中有不少不当或者是错误,希望高手指点。

---------------------------------------------------------------------------------

前言

第一节

Audience

这个手册是为那些想更愉快和快速的建立web应用的人们写的。CakePHP的目标是帮助所有水平的PHP用户快速而简单的建立健壮,可维护的应用程序。

读这个手册需要一些基础的PHP和HTML知识。如果你熟悉MVC编程模式会更有帮助,但是我们会帮助那些刚刚了解MVC的人们学习这个手册。配置web服务器,将不在本手册的讨论范围内。此外一些基础知识也不在本手册的讨论范围。

第二节

CakePHP是免费的

CakePHP是免费的。你可以用任何方式使用他,而并不需要为他付费。CakePHP是在MIT License下开发的。CakePHP是一个开放源代码的项目,也就是说你可以看到他所有的源码。获得最新代码的最好地方是CakePHP的网站 (http://www.cakephp.org)。在那里你可以浏览最新和最伟大的代码。

第三节

社区

CakePHP是有社区的人努力开发的。他们来自世界各国,聚集在一起创建CakePHP框架,提供了最广泛的功能。访问http://www.cakephp.org可以得到更多的Cake开发者和用户社区的消息。

我们的IRC频道总是有很多技术精通、友好的志愿者。如果你在代码上有什么棘手的问题、需要了解或讨论代码规范,请发给我们。我们希望听到你的声音。请访问irc.freenode.com。

用Windows live writer测试

用Windows live writer测试,post一篇到blogger。