2006年3月28日
如果有一天 我突然用很奇怪的内容联系你 记得来救我!! (转)
大家一定要互相关照 我转一篇很实用的东西
觉得这对大家都有用!!
敏感身边异常现象
当你听到电话中,任何女性(尤其是老婆/家人/女朋友/亲密朋友,也可能是男性):
· 正和你本人在一起,和已过世的人在一起,和出差/出国的人在一起,和任何不可能的人在一起,在XX地点.. · 任何不可能、异常、蹊跷的事 ·
跟你借钱,急用 · 电话异常挂断 (一定打回去,不能再通就更紧急危险) ——这是求救信号! 立刻报警! 救援!
·不要以为她疯了,不要骂她有病,不要说她明明有钱,不要说出你和她的真实关系或任何真实、实际情况(以防是被迫用手机扬声器或是免提电话) ·
记住任何与地点信息(如在XX吃饭,XX商场——很可能在车库遇到危险;家——很可能入室抢劫) ·
她没说地点要尽量问详(在X家,问X哪个家,尽管X可能就一个家),她不正面回答要用只需表示肯定否定的一般疑问句尽量问出来
(btw,如果平时手机要没电了打电话时先说明,既是尊重对方也免得让对方误会或担心你有紧急情况。当然尽量不要让手机处于这种状态,耽误事且辐射比满电大n多倍)
遇到明显异常的信息时,多一份留意,因为你的朋友正在向你呼救! 尤其是你,需要多小心了!
一、敏感身边异常现象
一妇女被劫持,正好其老公打电话过来,她在电话里应付了一通,说正与她妈妈外出。
随后警察赶到,终于得救。原因即在于,她妈妈早已去世,她丈夫即意识到存在问题。
而遗憾的是,我们多数人,没有这样敏捷的反应能力和应变能力。
附件是个事例,前不久在深圳也发生过一起类似事件:
一男驾车被绑架,他与歹徒周旋说没钱,只是小白领,歹徒要其打电话跟家人、朋友借。
他很机警的跟家人、朋友每人借三、五千,当然有朋友立刻反应过来,他不可能找他们急借这么点钱。 结果他姐姐在大呼
“你还跟我哭穷,你刚赚了钱”,一朋友也大叫“你小子一顿饭就 花三、五千” 等等,——酿成惨重后果。
所以遇事务必保持冷静,设法周旋,向外传递信息。
若遇到明显异常的信息时,多一份留意,因为你的朋友正在向你呼救。
二、警惕入室盗窃
昨夜遭遇持刀盗贼入室行窃,此刻我仍然惊魂未定,这是我亲身经历的事情,想给我身边的每一
位朋友一个警觉,永远不要以为很多事情不会降临自己的身上,永远不要以为自己总是幸运的那一个,危险总是出现在我们丧失警觉的时候。
首先交待一下出事的地点及背景:为了迁就公司搬到了北四环以及照顾周末在北大读书人的老公,我们在望京的新家还没有装修好之前,租住在北大中关园教工宿舍,我家是在
2楼。
就在这里 7月26日凌晨3点左右,本来打着微微鼾声的先生突然说:“ 老婆你听到什么声音了吗”? 迷迷糊糊的我说 “ 没有啊”
但是紧接着,先生喊了一声“嘿,干什么”,我也应声而起 “ 嘿” 。当时恐惧和正义的力量让我的声音非常大。
先生迅速关上卧室的门并反锁,两个人迅速穿上衣服,我走到凉台把窗户打开,当时想要是歹徒不要命的闯进来,我跟先生可以从窗户逃走,避免跟他搏斗。但是很快冷静下来,先生从阳台上喊保安,我开始打110。
110啊110这个从小被我熟记的救命电话号码,这个被我心中神圣而威严的保护伞,在我用手机拨了10几次后,仍然没有人工接通的迹象,电话接通后出现电脑声音,
“ 这里是110报警台”然后持续44秒之后自动挂断,始终没有人应答。此刻,先生的手机不在房间内,卧室内也没有固定电话。
我急中生智,走到卧室门口隔着门大声说: “喂喂,110我要报警,嗯嗯
..,我这里有人入室盗窃,目前盗贼还在室内,嗯嗯,是的,请马上过来吧”
“我的地点啊,地点在北大中关园,XX楼,X单元,对对对,就是方正大厦的后边,好好,多长时间赶到,嗯好,你们马上赶到是吧,,嗯嗯,好好,我明白”“ 谢谢你们”
而其实这一切都是我在自言自语。
我走到阳台跟先生小声说,我 110压根没打通,刚才诈一下歹徒。然后两个人坐在床上,先生一个劲的对我说:
“老婆,你看你平时老是不爱关窗户,万一我出差不在家,你怎么办啊” 我无言,只有惊恐,心里默念请菩萨保佑。
就这样大概过了将近20分钟,我们听着好像没有动静了,也担心是不是自己听错了,想着歹徒听了我之前的诈报警应该已经逃走了。彼此小声会意了歹徒可能藏身的地方,因为门口的左边就是家,在客厅门口和家门之间有个可以挂衣服和放鞋子的衣架,我们确信歹徒很可能藏身在衣架的后面。老公抄着凳子,但是我的武器只有是阳台上的木头衣架了,于是先生迅速打开门,凳子朝着衣架方向抡去,没有动静,我们打开客厅的灯,这个小小的1室1厅就尽收眼底了(房子是个长方形,北边是厕所,厨房,中间是小客厅,南边是卧室,卧室外面是凉台,南北通透,盗贼就是从厨房进来的)。
我走进厨房,发现原来放在厨房窗台上的两层小架子(平时会放一些洗菜的盆子方便面什么的)已经被移动到地下,我很佩服盗贼的技巧,居然把我很辛苦放在那里的小架子就轻易的挪到地上。厨房的窗户开着,先生的笔记本电脑和我的一个真皮手提包放在地上,先生的手机放在我的手提包。
回头看到客厅,果然在衣架的旁边,先生的西装在地上,厨房的菜刀也在那里。 天哪,如此胆大的盗贼,如此凶残的盗贼。
先生的笔记本电脑原本是在卧室的桌子上的,盗贼居然从我们的床前明目张胆来回取走了笔记本电脑。
此刻又注意到卧室门口有一条毛巾,那绝对不是我们的毛巾。后来分析是歹徒放在客厅门边,以 备主人发现关门,不能关死,这样他才可以顺利逃脱。
天哪,我开始回想今晚的一些反常迹象。我跟老公11:00多钟睡觉,大概凌晨2点多钟。感觉蚊子特别多,先生自责可能是自己放进来蚊子。而其实入夏以来,我们的房间里面还从来没有过一个
蚊子。猜想盗贼可能1点多钟就已经开始进入厨房了,厨房的窗户开着放进来了蚊子。
由于被蚊子咬醒了,先生起身给他还有我抹了花露水,过了一会,我还是睡不着,没开灯去了洗手间,推算大概2:20左右,这时发现卧室门口有个包,当时迷迷糊糊的我也没在意,反而把包挪了一下放在旁边,心里嘀咕是不是老公没把包放好,怎么可以放在门口的路上。从洗手间往卧室里面走,发现地上有个东西,由于我是高度近视也没想什么东西,想着可能是什么东西掉了,懒得拣了,踢到了旁边,事后发现那是歹徒的毛巾,防止门被锁死的。
先生用他的没被盗贼偷走手机终于拨通了110,3个防爆警察10钟之内就赶到了,这点我稍感欣慰,看到他们手中的枪,觉得踏实多了,可惜之前110没有打通;小区保安随后也来了,过了1个多小时,刑警来了,现场取了指纹,拍照,询问了事情发生的经过。说抱歉来迟了,因为派出所的人都出去
—— 到一个自杀现场去了,天哪,我没想到身边会有这么多的事情。之后刑警帮助我们
总结的如下经验:
1.110的系统是从总局到分局分层下达的,偶尔110系统也会出问题,出现我之前无法到达人工接听的情形,或者110非常繁忙无法及时接听,应该记得自己被管辖派出所的电话,直接打派出所的电话是最快最好的方式。所以请大家牢记自己所在派出所的电话,避免出现紧急事务无法到达110的情况。
2. 晚上的门窗务必关好,天再热也不能放松警惕,盗贼就是这样乘虚而入的,不要以为这样的事情离你很遥远,其实盗贼就在你身边。
3.遇到入室盗贼尽量不要与其搏斗(除非你是警察或者有专业搏斗训练),按照刑警的经验,盗贼都是持刀入室的,前不久颐和山庄一个保姆发现盗贼入室而被刺死。并非不信任我们的警察侦破能力,这样的被害与虚意被谋杀是两回事情,除了现场指纹等,没有什么有效的线索帮助他们破案了。我们的生命远远贵重于我们的财产。提醒在遇到事情的时候首先自保。比如我们迅速关上反锁卧室门,而不是急于求证歹徒是否被吓走,或者与歹徒正面冲突。
4. 遇到事情不要惊惶,不防对歹徒使诈,事后刑警说我当时自言自语的电话,吓唬盗贼起了很大作用。
>5.
尽量不要破坏案发现场,然后报警。
>此刻的我想起客厅衣架旁边的菜刀,确信我去厕所的时候,歹徒就藏匿在那里并用先生的西装作遮挡(后来发现先生的西装是在地上的),我们去完厕所,盗贼等我们熟睡后准备逃离时候,被我们发现。一直庆幸我们去洗手间的时候没有发现持刀盗贼。万一当时惊动盗贼,生死未卜,此次钱物基本没有丢失,人身没有受到伤害,但是我昨夜难以入眠,此刻仍然惊魂未定。我检讨自己的大意,检讨自己总以为很多事情不会发生在自己的身上,事情绝非如此,无论何时当我们放松警惕的时候,危险可能就在我们身边。洋洋洒洒千言,并非危言耸听而是我亲身经历的事实,提醒我得朋友提高警惕,希望每个人都平平安安。请朋友们互相转告,一定注意安全。
三. 当事人已经够笨了,警察更笨
5月7号,我们单位有一个女生,在家里被人入室抢劫,身中13刀!肺被扎穿,经抢救终于活过来!同事去看她,带回她惊险的故事,我听了以后双腿发软、双腿发软。不是我脆弱,实在是太
可怕了!
这个女生一个人租住在一个比较老旧的小区,被歹徒盯了一个多月。夜里俩点歹徒用钥匙打开她的家门,把她掐醒、蒙上双眼、索要钱财。她一直合作,冷静而机智的与歹徒周旋,凌晨四点歹徒把她绑起来说是要出去联系买主把她的车卖了。这个女生在半小时后确认歹徒已经离开,挣扎着松绑、报警、给自己的弟弟打电话,然后吓木了的她在家里等待警方支援(这是她的致命失误!!)谁知歹徒又回来了,俩人在客厅面对面撞上了!!!
歹徒惊慌失措,气急败坏质问她是否报警,她极力否认说只是给家人打了个电话搪塞过去。突然电话铃响了,她接,是110的确认电话。这个女生仍冷静机智,说“妈妈,我没事,我平安到家
了”,谁知110的笨蛋一点都没职业素质,说:我不是你妈,是110,你刚才是不是报警了?我们确认一下!!(天哪,这个笨蛋!!!害死人哪!以后有危险谁还能相信警察?!!!)女生重复说妈妈我没事,你放心吧,把电话挂掉!
歹徒已经起疑,女生陷入生死境地!这时候家里的电话又响了!是弟弟打来的!歹徒接了电话,弟弟以为是警察,说找***,然后问姐姐,忘了姐姐家在哪个桥拐了(这个慌乱糊涂的弟弟哟,就是这个电话害了姐姐呀)。可怜的姐姐又在编:**老师,我从老家回来太累了不太舒服,明天不上班了,跟您请个假!那个弟弟不明所以:我是弟弟呀我就问你在哪个桥拐?姐姐只好说***桥-------话还没说完,歹徒按下电话丧心病狂地朝她猛扎!!!!这个女生先还反抗,后来只能装死,直到歹徒离去。。。
三分钟后,警察赶到!在外面敲门说是接到报警电话。可怜的女生忍着剧痛爬去开门,警察看见
地上躺这一个浑身是血的人,第一句话是:还是个大案!(我靠)女生报出自己的车号叫他们拦截歹徒,他们无一人出门侦查追踪!女生又让他们叫救护车,然后,弟弟终于赶到。。。。
警察打电话确认确实是现在的工作方式。因为110是总台,110接到报警电话后会转到出事地点的片警。但现在看来对于这类入室抢劫的案子还电话确认是有问题。我以前也没想到过类似问题。
注意:歹徒 tmd拿钥匙开门。看来还是需要一个插销之类的东西才保险。
在家被抢后,换个地方等警察,人多的公共场合,也可以找邻居。
经验教训:
1,这样要紧的电话一定要打给很熟悉自己近况的人,而且反应要快。警察往往不可靠。
2,派出所或者公安局的电话一定要记牢,110有时候也不管用。不过可以考虑119。
昨晚我参加一个的安全防范的研习会,让我很惊叹!这场研习会是由一个叫Pat
Malone的人主持,他是知名人士的保镳,也为FBI工作,并教授警察及海军的SEALS徒手格斗。
以下建议非常实用,多看几次,受用无穷!
1.警方的提醒 : 手肘是身体最有力的部位。距离够近,就善用手肘!
2.假如歹徒向你要皮夹或钱包,
不要递给他,而是往远处丢去。歹徒很可能 对财物比对你有兴趣,他会去拿皮夹或钱包,这是你逃跑的机会。 往反方向拼命跑!!
3.假如被丢进车子的后备厢:把车后灯踢破,手从洞中伸出去,用力挥手,驾驶人看不到你,但是其他人看得到。这个方法救过无数人命。
4.女性常常在购物、吃饭及下班後进入车子,然後就坐在驾驶座上处理事情(如记帐、列清单等)。千万不要这么做!
歹徒会藉机观察情势,闯入车内,拿枪威胁,控制你的行动。进入车内,立即锁门,驶离现场。
5.在平面停车场及立体停车场的几个注意事项 :
A.要警觉: 环顾四周;察看车内的副驾和后座。(接近车子时,留意车底。)
B.假如你的车停在箱型车旁,则应该从副驾车门进入你的车子。许多连续杀人犯都是趁著女性要进入车中时,将她们拖进箱型车中加害。
C.观察停放在你左右两边的车。如果有男性单独坐在最近的邻车内,最好回到购物中心或办公室,找男同事、保安或警察陪你回去。
宁愿防患未然,也不要终生遗憾。 (大惊小怪总比丧命好。 )
6.永远搭电梯,不要走楼梯。(楼梯间是一个可怕的地方,容易让人形单影支,变成最好的犯罪场所。)
7.假如歹徒有枪而你并没有受到他的控制, 一定要跑! 一百次中,只有四次歹徒会袭击逃跑的目标;即使他攻击你,大多不会是致命的部位, 要跑!
8.身为女性,我们总是发挥同情心: 不要再这样! 这样会增加被强暴或是杀害的机会。一个叫泰得 ·
邦迪(TedBundy)的连续杀人犯就是一个相貌堂堂并且受过良好教育的人,总是利用女性的同情心。他走路时带著一根手杖或是跛行,经常要求别人「帮忙」他进入车内或是看一下他的车子,趁机绑架受害者。
最近有人告诉我,他的朋友在晚上听到门口有婴儿在哭,不过当时已经很晚了,而且她认为这件事很奇怪,於是她打电话给警察。
警察告诉她:「无论如何,绝对不要开门。」这位女士表示那声音听起来像是婴儿爬到窗户附近哭,她担心婴儿会爬到街上,被车子碾过。警察告诉她:我们已经派人前往,无论如何不能开门。警方认为这是一个连续杀人犯,利用婴儿哭声的录音带,诱使女性以为有人在外面遗弃婴儿,骗她们出门察看。虽然尚未证实此事,但是警方已经接到许多女性打电话来说,他们晚上独自在家时,听到门外有婴儿的哭声,请将这个消息传给其他人,不要因为听到婴儿的哭声而开门。
请严肃看待 , 因为上礼拜六「美国头号通缉犯」(America's Most Wanted)节目中,报导路易斯安那州的连续杀人犯时 ,
提到了「哭泣婴儿」的假设 。
请转寄这封信给你所有认识的女性朋友, 并一个接一个传下去 。
我原本只想把这封信转寄给女性朋友,但是男性朋友,假如你爱你的妈妈、太太、姊妹、女儿等等,你也应该把这个讯息传给他们 .
觉得有用就顶一下吧,让更多的人知道这些知识
项目的管理部分用的active_scaffold,active_scaffold对render进行了改写,theme_support对render_file进行了改写,导致active_scaffold无法使用theme_support的机制。 目前的解决思路是active_scaffold不使用theme_support机制,在active_scaffold中Core文件底部加入rails本身的render_file方法,已达到再次覆盖的方式。 还有一个思路是让active_scaffold使用theme_support机制,然后对代码进行改写,达到两者兼容,目前这个方法没有进行,主要是时间问题,而且目前的方式也可以,可能不怎么优雅
在项目使用active_scaffold来做项目的管理部分,用jrails来代替首页部分的js。 active_scaffold用的是prototype.js,jrails用的是jquery。本身prototype和jquery两者就存在冲突,网上对两者的解决方式是可以的实现的,可以很好一起工作。但是对于active_scaffold和jrails的冲突还是有不行,jrails的rails中ajax等代码进行了重写,导致active_scaffold无法正常工作,我只有想办法把他们完全分开。 我目前的解决方案是module ActionView中 module Helpers重新copy到项目管理部分的代码中,已达到再次覆盖,还原到本身的方式。这个办法可以解决,但是我总觉得不是很好,不知道有没有更好的办法呢?
最近买了一台小黑,IBM T61,第一次感受IBM,小小激动了一把,性能上真的没话说。 现在机子上用的是ubuntu7.10,把整个工作环境都搬到了linux,开发的环境是windows上没法比的,windows上写好代码和调试代码都慢的要命,linux就不会有这个问题,相当流畅,设计的时候不会被打断思路了。windows上的一写常用功能linux上都能实现,除了QQ和IE,这两个现在还没发丢掉的,所以在linux上通过虚拟机装上了一个windows xp,这个XP的运行速度也很快,操作没有停顿,完美解决。有关linux的生活,想接下来具体做些介绍,看时间了。 最后,欢迎来到linux的世界。
昨天去交房租的时候,房东说想自己用了,不想租给我们了,主要是我们的房租太便宜。 刚起步就发生这个事情,对我们打击很大的,没场地,没地方办公,公司怎么办下去啊。当天晚上和朋友一起去跟房东谈这个问题,动之以情、晓之以理,最后加了点房租以告结束,今天把房租交了,总算放下心来。 都说创业很难,是的很难,现在一个个困难都摆出来了,处理不好的话,对我们都是一个很大的打击, 不过我们有信心一个个解决,只要我们有共同的目标,共同理想,成功在不远处。
3月26号,ki突然向我宣布一件事情,答应做我女朋友,又是意外又是开心。 前面好几次提出这个问题,都没有结果,也是比较郁闷的事情,不过现在好了哈哈 以此纪念,ki,我会好好待你的!
10多年前,在大洋彼岸的美国,有一个即将从商学院毕业的女孩,她是以下面的方法找工作、进入商界的。现在,这个女孩成了美国年轻一代商界女性的明星和楷模,并创建了属于自己的公司,被誉为“难以抗拒的商界女性”。
请看她如何讲述自己当年踏入商场的第一步——
“在商学院的最后一年里,我开始找工作的同时,就着手建立自己的职业关系网。像多数即将毕业的学生一样,我在商界没有什么熟人,因此不得不从零开始。我有一个详细地记载我找工作的笔记,并且每一页上都写着我想去工作的公司名称。每次我发一封信,打一个电话,或跟某个人谈一次话,我都记下日期、时间、通信的性质,以及接下来的步骤。(典型的a型性格)。(“a型性格”的人个性急躁、成功心切、善于进取、争强好胜)。
我有意向的大多数公司,我一个人也不认识。可是我不像其他毕业生那样给人力资源部打电,而是上网查看公司的网站,找到负责我感兴趣的部门的主管名字。我会直接给个人打电话,仅仅是为了弄清楚他或她是不是联系这份工作该找的人。不过,屡试不爽的是,那个人或者那个对待我像贵宾一样的助理,会给我另一位需要联系的主管名字。然后,我在与那位主管联系的时候,就会在我的邮件里赫然提到前面那位主管的名字: 您的同事某某建议我跟您联系。 马上就拉上了关系!
要是这一切听起来像精于算计,那真抱歉。可它就是那么管用。并且这也是,在我们一起毕业的同学里面,我怎么就能够得到最高的薪水!
在即将从研究生院毕业时,我想去工作的一家公司,就是萨柏瑞公司。这家公司开创了并紧追网上旅游预订服务的潮流,是美洲航空公司的母公司美利坚公司的一个分公司。秋季学期的时候,公司到德克萨斯基督教大学校园招人,可是我当时忙于功课,不知道有面试这回事。不过,当一位同学得到了该公司一份收入可观的工作后,我一下子来了兴趣。我决定将萨柏瑞公司也定为自己的目标。碰上这种情形,大多数人都会耸肩叹息: 咳,我错过了正式的招聘会,所以我机会了。 我可不这样。我决定运用已有的一点点关系接近该公司。
我父母有个邻居是美国航空公司的董事,我给他打电话,问他能否告诉我,要是我想在萨柏瑞公司找份工作该跟谁联系。他很热心,给了我几个人的名字。自然,我给每个人的信都用邻居的名字开头—— 执行副总裁乔治某某建议我跟您联系…… 这样的介绍把我从一大堆的求职者中分离了出来,让我比其他无名的求职者得到更多的关注。我相信,有的人给我回复,仅仅是看在我邻居的面子上,可是管它呢。最终,我得到了与合适的人面试的机会,并得到了一份业务分析师的工作。” 世界经理人博客http://blog.icxo.com
怎么样,这个女孩是不是有些不同凡响?她叫艾米·亨利(amy henry),上述文字摘自她不久前出版的一本畅销书——《女总裁告诉你:当代女性如何在商界成功》。
艾米·亨利曾在美国一些领先的it企业担任高管职,取得了骄人的业绩,然后建立了一家管理咨询公司,成为当今美国炙手可热的一位企管顾问。她服务、合作过的公司客户,包括ibm、摩根大通、美林证券、麦肯锡公司、伊士曼化学公司、斯伦贝谢、蓝十字保险公司等全球著名企业。艾米·亨利还频频受邀到美国和加拿大的许多电视台、大学、领导才能培训机构演讲,与人们分享自身的经历和体验,包括成功与失败,讲述现代女性如何在职场、商界获取升和成功。
艾米·亨利坦率地说,工作场所不是一个纯粹的能人的天下。换句话说,单单有业绩并不能保证你步步高升。光知道躲在角落里埋头干活,很可能会让别人抢了你的功劳,而你自己却仍然呆在老地方。如果你想发展,就必须让人知道你。
统治商界的不是女性(至少现在不是),如果我们想要与那些占统治地位的人一起捉迷藏,我们就不得不努力拼搏。对此,艾米·亨利感受很深。她认为,职场的规则长期以来都是男人们书写的,女性必须了解那些规则,并学会如何让那些规则为己所用。但女性应该心安理得地表现得像个女人而不是男人,并善于利用自己的女性资本取得对自己有利的结果。
有些道理总要等到适当的年纪才能明白,人生的哲理总是来得太迟。
(深有同感,当我为工作,生活中的错误而自责时,理智却清醒地告诉自己,这些教训我早已知晓,并且有无数前人用他们的人生为我做过证明,只能感叹一句:只有自己经历过,才会真正明白并记住它们。但是,细想,为什么我就不能尽可能地遵循自己并未经历但被人证明正确的真理呢?,试着去做吧,既然相信,为何不遵循,回头时,我会庆幸自己今天做出了这样的决定)
(1)很多事情其实无关紧要(10年后再回首,有多少担忧,一笑置之,既如此,早点觉悟又有什么关系呢?) (2)等待有把握时再去做一件事,往往意味着永远的等待(简单计划,立刻出发,不断修正) (3)一个人能做的最大的冒险事情,就是乐意在公共场合经常暴露自己的愚昧。没有什么能比这样学得更快。“哎呀”, 也是一种乐趣。(习惯自嘲是一种优秀的品质,它证明你足够自信) (4)盲目追赶潮流是对精神和智力的扼杀 你可以成为一个廉价的时尚木偶,也可以成为独一无二的你,这些都在于自己的选择。信仰不是群众的鸦片,流行才是。(最后这句话说的挺妙) (5)如果有人抱怨你太特立独行,恭喜你,你正走在正确的路上(我希望自己足够与众不同,甚至我愿为了特立独行而特立独行) (6)如果你将工作等同于生活,那么你将为工作而生活(深表赞同,工作是为了更好的生活) (7)试图取悦别人是徒劳无益的做法 (如老罗所言:彪悍的人生不需要解释,我精力有限,在工作以外,把关注放在爱我的我爱的双亲,兄弟,女人身上吧) (8)你不可能取悦、平息或改造一个混蛋 (小人难养,敬而远之,我不跟你玩了,这还不行,那就得流氓一点,以彼之道还施彼身了) (9)接纳自己(因为自卑,悔恨,我还无法真正爱上自己,从思想,身体上去改造自己,希望这一天早点到来吧!) (10)生活中,有时候形式就是内容
这两天装了ubuntu系统,然后把整个开发环境都装到上面了 。 但发现一个很奇怪的问题,hibernate的事务无法会滚,这个问题困扰我好几天,今天终于解决了,原来mysql有配置有问题。mysql总共有4种存储方式,MyISAM 是默认存储方式,但是不支持事务,所以导致了我的问题,只要把默认设置成default-storage-engine=innodb就可以了,当然也可以在每个table创建的时候指定。 希望对碰到此类问题的朋友有所帮助。
今天星期六,放假。
很久没有双休日了。
本来想睡个懒觉的,但是到了正常工作时间,还是醒来睡不着了。起来开电脑是我的第一反应,那么多年的电脑和网络生活让我有了一种下意识,但是今天这个念头一闪而过,工作是为了生活,因为我想到了这句话。我们为了工作,而忘记自己的生活应该怎么样的了。我想我开始去寻找生活还有什么,有爸爸妈妈,有朋友,有痛苦和感动,有无奈和追求,突然发现生活是多么宽广,原来我把自己局限在工作这个狭窄的空间里了。好好享受我的周末巴。起来给自己弄点东西,拿本自己喜欢的书,一杯咖啡,我喜欢的生活,之一。......
这段时间发生很多的事情,也让我认识到一些事情。 罗列一下: 一天早上醒来,我突然产生一个感觉:我没有那么多的精力去研究那些深奥复杂的it技术细节!这个想法让我有点发呆 ,一直以来我都是很喜欢这个工作,以极大的热情投入到研发这个工作中,不知道怎么会产生这样的想法的。这段时间看了很多资料,也看到自己很多的不足,学的越多,知道自己越不足,难道我在这个无知面前害怕了?还是我的思维中心产生了转移,因为我在慢慢的考虑往项目管理方面发展。我也搞不清楚了。 这两天在看一本书,《第五项修炼》,很早的书 ,主要讲系统的思考方面的。其实去年已经看过,但是只看了前几章,感觉不好理解,这段时间我又拿起来了,发现里面很多概念和想法,比较容易理解了,而且可以继续看下去了。我感到很欣喜,这个算不算是一种进步呢?现在每天上班下班,因为是长期出差,平时的活动很少了,朋友接触也少,感觉有点封闭,我慢慢感到自己的激情在磨损,这个现象终于在我身上体现了 (我居然用了终于这个词)。进步了,思想在成熟,激情在减少,难道这个是反比的吗?以我现在的水平无法看清这个问题,等以后慢慢去慢慢弄清楚吧。 这段时间总的来说不是很快乐,快乐是什么?我有点模糊了,难道就是脑子中的一种蛋白质?还是我想得到的太多,而拥有的太少?这段时间烟抽的有点多,感觉嘴巴不舒服,该收敛一下了,难道是烟抽多了?这段时间喝酒很少,我是一个喜欢喝酒的人,难道是酒的缘故?细细想来,这样的状态其实已经很久了。难道是一种必经的过程,我不得而知了。 今天早上又让我看到了一句话,工作是为了生活,工作只是生活的一部分。我想我应该重新去理解这句话了,回到我自己喜欢的生活。回的去吗?不知道,还有半包烟在桌子上,不抽了。抽烟无助与生活和思考。
内容介绍
本书是名著《心灵地图》的续集。《心灵地图》从1978年出版以来,连续十多年居于美国最著名的《纽约时报》畅销书排行榜上,总发行量上千万册,在读者中产生了广泛的影响和获得了巨大的认同。 本书为《心灵地图》添了一个注脚:“人生多变”。每一个人的人生道路都得自己探索,没有任何绝对的答案可以凭借。但是,我们也不必坚持踽踽独行,可以向出现在我们生活中任何一种超过我们的力量求助。 在本书中,派克着重谈的是“宗教”,但这并不是那种扼杀个人意志的宗教团体所传播的宗教,而是作为个人信仰追求和灵魂提升的“心灵的宗教”,亦即,本书所宣传的是一种极其自省的信仰。 本书有助于你避免以偏概全的思考模式,拒绝所有以偏概全的冲动,不要钻牛角尖去寻找公式或简单的解答,而开始从多元化的角度思考,崇扬生命的神秘与矛盾,不要因为每一次经验内在的多重因果关系而惶惑不安,安心去欣赏生命的复杂多变。 愿本书与更多的读者相遇,共结一段心灵共呜的缘份!
本书精彩言论选 伊甸园的故事是神话,可是它蕴含着真理,告诉我们害羞是人性的一部分。 任何终生追求心理和心灵成长的人,都可以预防心理上的失调。 我们必须有一点罪恶感,才能在社会中生存。 不恐惧不等于有勇气;勇气是你尽管害怕、尽管痛苦,但还是继续向前。 为自己的极限辩护,你就永远受制于它们。 治疗一个受苦的人最好的法子,并不是设法消除痛苦,而是怀着愿意分享的心坐在他身旁。 愈愿意承担别人的痛苦,就愈能感受到更多的欢乐。 愤怒有其存在的必要;求生绝对少不了它。 我们必须学习一套复杂的方法,以处理愤怒的情绪。 我们的生活品质就决定于我们所作判断的品质。 人生一切际遇无非是为了帮助我们灵性的成长。 坚强的意志是人类最大的优点,虽然有了它不一定能担保成功或善良,但是少了它却几乎保证会失败。 你不能用自己的意志控制意志,因为这样等于没有控制。 归咎游戏也可称做“要不是因为你”游戏,这是所有婚姻关系中最常见的游戏。 原谅需要正视邪恶,真正的原谅是一个非常困难的过 程,但它也是你维持心里健康一个不可或缺的要素。 你不能因一个人没有犯的罪而原谅他。只有在确定他有罪以后,才能原谅。 原谅是疗伤的必要条件 我们不可忘记任何事。我们做不到真正遗忘,只可能做到真正宽赦。 死亡不仅不剥夺生命的意义,反而是意义的赋与者。 你在跟自己的死亡之秘搏斗的过程中,一定会发现人生的意义。 除非我们能坦然面对自己的死亡、否则就永远不可能 在生活中找到勇气和自信。 大多数人其实有能力选择在何时、何地、以何种方式死去。 要是世界上没有一件我们愿意为之牺牲生命的事,生命就不完整。 所有的疾病都有心理、心灵、社会、生理的因素。求 生意志能大幅延长寿命,并改善生活的品质。 学习生活一定要面对死亡。因为死亡让我们记住生命的有限。 如果你罹患严重的慢性病,倒不妨检讨一下,自问可 曾做过促使自己生病的事。 如果我们只把死亡当作一场意外,就不仅忽视了大多 数死亡的现实面,也忽视了它的神秘性。 我们遭遇的每一件事,无非是帮助我们学习,而最能 帮助我们学习的就是死亡。 只要我们向前跨出一大步,都会经过否定、愤怒、讨 价还价、沮丧、接受的过程。 信仰宗教而能承认死亡的重要性,但然面对死亡,才更勇敢。 漫无节制的自恋是心理与心灵疾病的主要前兆。健全 的心灵生活是一种脱离自恋的渐进成长。 我们对百分之九十的事物的了解还不到百分之一。 我一开始问:“我们不知道什么?”所有我以为已经关 闭的疆域就又重新开放。 我们的知识像一叶扁舟,在无知的大海、神秘的汪洋中漂泊。 现代文化有逃避痛苦的特质,对心理建康并不特别鼓励。 我们愈能适应现实,生活就愈有意义。 在现实生活里,探究神秘不仅是心理保健的目标也是心灵之旅的目的地。 有人为了逃避神秘而投身宗教,同样有人为了逃避神秘而投身科学。 迷惑是追寻清晰的第一步,在追寻过程中,你会获得很多知识。 谦逊就是确实了解自我的真相。真正的谦逊总要与实际相符。 为了生存,我们需要某种程度的罪恶感。要是我们一 直都自以为很好,当然就无法改正有缺点的部分。 我不好,你也不好,不过没关系。 我们需要破裂时刻,让我们觉悟到自己有问题,我们并不完美。 罪恶感涌现的时刻、忏悔的时刻、缺乏自信的时刻、面 对自己不喜欢自己的试炼时刻,对我们的成长都是不可或缺。 爱自己,追求自己灵魂的进步,是人生最重要的事。 准备是不能分享的。我们唯一能做的就是尽可能提供别人好好准备的动机。 神话对于了解自我可提供很大帮助,我们可以从中发掘人性的知识。 任何过于简化的思考方式都会出问题。 神话是有关人性各种矛盾、多重向度、复杂面的一个最佳知识泉源。 人不可能像神一般无所不能,我们不可能靠自己的力量上达于神。 当某种东西挡了你的路,妨碍你的心理健康或心灵成 长,你就该除掉它,不要只是坐着抱怨。 做好事的动机就是创造力的泉源。做坏事的动机只会带来毁灭,不能创造。 我们只有有学会同时发挥自身的男性和女性特质—— 左脑和右脑并用之后,才能成为英雄。 总有一天我们要放开孩子,他们是上天赐下的礼物,交 给我们照顾——但不是永远。 人的本性是汁么?我最常给的答复就是,根本没有这种东西。 我们人类最大的不同,就是在自身行为上享有完全的自由和变通可能。 大多数人当然早已脱离胚胎期。但会随着年龄增长,更 加坚持自己的方法和本性。 身体的老化不能遇阻,但人的心理不一定要变老。 触及自身生命的混沌,这可能是人类最痛苦的经验。 信奉神秘主义的人热爱神秘,喜欢解开神秘,同时也 知道,解开的愈多,发现的会更多。 处于心灵旅程不同阶段的人,相互之间会产生饱受威胁的感觉。 悔改不是一时就结束的事。它跟所有灵性成长一样,是一种持续不断的程序。 立足不够坚定时,固然可能堕落回去,但我们不可能 因此省略心灵成长过程的任何一阶段。 关于心灵成长。不论我们发展到多远,都还会保留一部分早期各阶段的痕迹。 每个圣人都有不可告人的过去,每个罪人都有美好的展望。 上瘾者有回家的渴望,证明他们比大多数人更努力追 求灵性和上帝,只不过他们搞错了方向。 西方语言传统上酒精和灵魂用同一个字表示,并非意 外,也许酗酒者比一般人更渴求灵性。 很多人听到宗教都会退避三舍,一般人都不久喜欢被 感化而改变,他们有抗拒心理。你唯一改变得了的人就是自己。 每个人都有自己的忧伤与恐惧;也许我们没有意识到,但这些情绪是存在的。 只有面临危机时,共同体才会自然发展。 健康心理一大特征就是,及早面对危机的能力。 我们亟须赋与危机应有的尊严,只有透过这些痛苦与危机,我们才会成长。 我们的生活太缺乏戏剧味,整日混沌过活,对生命的重要本质毫无觉悟。 不同的人有不同的生存使命,每个人的使命都很独特 不同的宗教往往殊途同归,只要能到达同一个目的地, 走不同的路又有什么关系。 只要你认罪、忏侮,那么所有的罪就此涤清。唯一需 要的就是为自己的所作所为。觉得难过、痛苦。 每一个人都应该尽可能从各种宗教传统中汲取智慧。 不论多么善良的人,都不免偶而因疲倦或过于自信,以至于显得不够努力。 用全部的灵魂和全部的力量,全心全意爱你的神。爱如邻己 学习把自己交给上帝,心甘情愿让他驾驭我这仍末脱离青春的人生。 或许基督教最大的罪,就是以一种独特的傲慢或自恋 心态,让许多基督徒自以为可以量身裁制一个上帝。 我对于凡是号称足以解释所有事物的观念,都采取保留的立场。 身体只是一种限制,我相信灵魂可以不靠肉体存在,它不需要肉体就能进步。 地狱的大门是敝开的,任何人都随时可以走出去,他 们之所以待在地狱是因为他们选择不离开。 追求知识最好的方法就是透过经验。 唯物主义和科学发展带来一种使人坐立难安的匾乏 感,一种对内在生命的渴望。 分化使事情容易,整合则带来痛苦。迫不经过整合,一个人永远是支离破碎。 厘清科学的领域可视为人类智慧史上最重要的事件。 整合的过程需要我们坦然面对各种互相冲突的力量、 观念,以及生活中的压力 每当面对一个号称能解决社会问题的方案,一定要问: “缺少了什么? 佛洛伊德用“爱”与“工作”界定心理健康。 为患恐惧症的人灌输比较乐视的世界观,是唯一的治疗办法。 审慎运用宗教观念,对于很多精神病例,也有加强疗效或加速痊愈的效果。 抑郁源自无礼和不肯赞美别人。 如果父母能温和的对待孩子,尽可能提供支持,孩子 就能朝脱离自恋迈出一大步。人生就是在你已定好的计划之外所发生的事。 接受人生层出不穷的矛盾,是心理健康不可或缺的要素。 新时代运动的最大特色,就是对新观念、新方法采取完全开放的态度。 救赎可以说是一种矛盾的混合,其中有恩典也有努力。 不论我们如何抉择,其他的选择并不因此被牺牲、被抛弃。 邪恶跟虚伪有很密切的关系。 从事任何冒险之前,都必须知道如何辨认对健康有益 或有害的事物,心灵旅程当然也不例外。 打好高尔夫球的原则,就是不要以一杆进洞为目标。心灵生活也应是如此。 上帝一方面是我们里面的一个小声音,但同时也存在 我们外面,无比超越、伟大。 信心若不能化为行动,还有什么价值呢? 我们需要跟自己的极限、自己的支离破碎、以及人际 关系之间无可避免的互相倚赖关系妥协。 新时代运动最大的贡献也无非是带来新鲜空气。 我们应该摆脱竞争和分化,全心追求社会生活和灵性生活各方面的整合。 根据神话的说法,性欲源自有一种不完整感,表现于追求个体完整和神性。 如果你追求最高品质的性高潮,最好的方法就是找自己深爱的人从事性行为。 对沉浸在爱情狂喜里的恋人而言,对方就像通往祭坛 的庙字大门,已经无关重要。 任何以为两性关系中可以建立永恒罗曼史的人,都注定要失望。 这世界可被当作是一个上帝设计的魔鬼训练营,其中 最难超越的一项障碍就是性。 性是上天赐与的好礼物,但这不代表它在所有季节,所 有时候都适合所有的人。 我发现了解上帝本质最有意义的方式,就是把人性中 最好的部分投射在他身上。
阮大年
生命的饥渴�����
� 《与心灵对话》是美国著名精神导师派克医生继《心灵地图》(The Road Less Traveled)而写的续集,顾名思义他所探讨的乃是一般人不常去思考的问题,也是一般认为不实际的问题。� ��中国人一向重视实用,也许是中国人的历史一直是为了生活而努力、奋斗,不得不实际的面对生存问题,在台湾的这数十年经验里,果然看到了实用主义的辉煌成果,而使台湾人民走到任何地方都感到抬头挺胸、趾高气昴,甚至表现出不可一世的气概,只是令人担心的是,经济的成就并没有带来真正生命的丰盛和愉悦,反而普遍的沉迷与失落。� ��其实台湾的问题不是偶发的,而是一味追求发达及富足之后的必然因果,一九九二年的《美国新闻与世界报导》杂志中记载︰「近来有一种饥渴,那是源自唯物主义和科学发展而来的,一种使人不安的匮乏感,一种对内在生命的渴望……愈来愈多的人亟于找寻一个从心灵与精神层次出发的答案」。同样的话可描绘在台湾的中国人,我们目前心灵的饥渴及精神的苦闷,比当时的美国人可谓有过之而无不及。� ��派克医生的主张是因应这种饥渴而写的。� ��人生是由一连串的饥渴而编织成的,一个婴孩一生下来就饥渴--需要食物及温情;稍长后又对知识、真理产生饥渴--因此要上学、读书;有生理及性的饥渴--因此进入婚姻之门;有群居及归属的饥渴--因此组织家庭、参加社团;有追求卓越的饥渴--因此努力于求名求利,著书立言等。� ��饥渴感并没什么不好,而且是使人类努力的原动力,然而吾生也有涯,往往因为忙于解决上述一般的饥渴后,人生也就在解饥止渴的过程中溜走了,而很多人一辈子都没有体会到生命中有另一种更基本及深邃的饥渴--心灵永恒的需求。� ��圣法兰西斯有言︰「神啊!我心永远不得安息(或作永远在饥渴),直到在你里面。」� ��派克医生的话,不一定能解除你我心灵中的饥渴,就像他一开始就说的「坏消息--我什么也不知道。」他的目的也不是给我们一个标准答案,虽然他承认已经寻到了自己的答案及方向。� ��派克医生提醒我们,生命是有限却又可能是永恒的,我们外在、可见的身体是会变老及消逝,但我们内心已经看见心灵是永存及可以日新又新的,只可惜我们几乎把一生的精力及时间都去改进和化装外在的形体,而忽视了对心灵的贯注及追寻。从某方面讲,外在努力是可见且容易见效的,也易引人注意,甚至功成名就还可以遗传给儿女,惠及子孙何乐而不为,反之,对心灵的追寻,是非只存乎一心,别人也体会不到,更不易传授转赠,因此在功利的环境中更加不受重视及被忽略了。� ��我推荐这本书,因为它系暮鼓晨钟,在这个多元却无目标的社会中发出了一个声音,「要追求永恒!」、「要自省!」确实,这一代可称为不多自省的一代,我们每天看到的都是批评、不满,却鲜见任何人自省。� ��派克医生认为人类的心灵有无止境求新求变的独特能力,这也是孟子所说人之异于禽兽者的「几希」,而作者认为心灵的成长可大致分为四个阶段︰� ��第一阶段的人可谓是混沌的心灵,只有生活的过程而没有明确的人生目标。� ��第二阶段的人属于需要形式才能满足的心灵,他们倚赖某些形式作为生命意义之所依,这形式可能是宗教、艺术团体,也可能是党派、社团,他们的特征是强调组织内的形式及教条,而以仪式为最高准则。� ��第三阶段的心灵较自由且理性,也许没有明显的信仰主题,但都热心积极正面的参与社会,认为生命的意义在贡献自己,使世界更美好。� ��第四阶段的心灵可以说是第三阶段努力寻求后的答案,他们不迷信宗教,却真正的可以认识上帝,生命中有不能说的真正神秘,也真正能感到天人合一的生命境地。然而这并不是一个目的地,第四阶段只是表明真正进入一个有无限发展可能的心灵之旅,也正如基督教所谓的信仰是一条路--来于信,以致于信。� ��无论如何,一个好好接纳本书的读者,对自己心灵的成长都有更高、更深一层的激励,也能认清自己内心有比目前更进步的可能,正如王尔德所说的︰「每个圣人都有不可告人的过去,每个罪人都能有美好的盼望!」�
王浩威医师(专栏作家、台大医院精神部兼任主治医师)的导读
原先翻阅派克医生着的《心灵地图》时,总有些随兴消遣的意味,毕竟市面有太多「励志」、「心理」或「心灵」的书籍了,令人觉得翻来翻去,也不过如此。偶尔拾遇了一本令我眼睛一亮的这类书籍,好不容易记住作者的大名,待他的新作出版时便赶快买一本,然而,常常原本抱着极大期待的,却一次次的失望了。
看《心灵地图》的感觉却截然不同。躺在床上翻着这本书时,睡意逐渐消失,取而代之的是对作者的好奇。「爱」是谈得令人有点厌烦的字眼,而「纪律」则是天生引人反感的,然而在这本书中,一切却有了重生的定义。
对作者而言,写作的材料原本就是源自实务的临床经验。病人或个案所陈述的生命经验,触目惊心地引发了他对自己的思考,写作也就成为另一种自我探索的纪录。
身为一位擅长精神分析的精神科医师,在学理训练的出发点上,他很明显受到佛洛伊德和荣格的影响。特别是有关自恋的理论,佛洛伊德首先提出了原初自恋和次发自恋,荣格进而将之视为自我完成的必要途径,也就是除了一般人知道的「自恋人格违常」这类负面陈述以外,其实自恋也有另一种正面的意义呈现。
在派克医师的笔下,这一切学理化为无形,取而代之的是极其平易的举例和用词。也因为对这个平易的要求,他毫不畏惧地重新用了一些已经有些俗气的字词。这时,「纪律」已经不再是团体对个人的要求,而是来自自我的要求,是自我进行着纪律,而非自我被要求守纪律;同样的,「爱」也不再是对他人的付出,而是「扩充自我的意愿」,只不过前提是「滋养个人和他人心灵成长」罢了。这是作者极其高明的地方,他用平凡得甚至有点保守的字眼,来畅谈他极其进步的观念。
到了《心灵地图2》这本书,他进而开始谈宗教。
直到今日,虽然很多人已经不再像马克思一般强烈排反宗教:但对于社会上各种宗教形式的盛行,不免还是有些担忧,从书中可以看出,派克医师也怀有这样一份隐忧,他敢于拂逆当今盛行的新世纪运动,指出各种盲点和困境,就是典型的例子。
然而作者也不忌讳宗教,甚至用信仰来解决宗教的困境。对他而言,宗教是必要的;但他指的是个人信仰的追求,而非宗派团体的遵循。
当下的宗教团体往往在无形中扼杀了个人的意志。关于这点,如果用强烈的字眼,便是常见的「宗教法西斯」:如果用派克医师的说法,就是「秘密教派」。作者不担心教派的攻击,甚至提出了它们的十大特征,认为只要符合三、四点就可以了,像对领袖魄力的偶像崇拜、地位崇高的权力核心、行政黑箱作业、隐瞒财务、鼓励教徒倚赖、强化教徒一致性、特殊语言、武断的教义、异端邪说或是自认掌握了上帝。他列出了这份标准,几乎是从新时代运动到传统的基督教或佛教,全都被击中要害了。
另一方面,他却是极力陈述个人心灵或个人信仰的重要性,虽是科学训练出身的精神科医师,他还是排斥了以科学自居的狭义心理学,从《心灵地图》到《心灵地图2》,最大的突破莫过于这种将宗教和心理学融为一体的努力,恐怕是和心理学的人格阶段相关;他对个案信仰活动发展出的兴趣,特别强调了类似艾瑞克森(Eric Erikson)「认同危机」一般的「信仰危机」。
宗教的特殊角色,一种极与自省的信仰,成为本书最大的特色。作者自己也承认,他的受洗是在《心灵地图》完成之后,《心灵地图2》是重新信仰以后写就的。因为宗教和科学(心理学和精神医学)的兼顾,让他能看见更广阔的视野。
对于不可知的世界,他永远保持必要的敬畏,像现象学常说的「划上括号」(bracketing),也就是「存而不论」;承认它的存在,但暂时不会急着说定它。因为这样的敬畏,他开始谈论密契主义和死亡,甚至认为性爱高潮和性灵经验有着一定的相关性。
如果《心灵地图》是一本有关自我心理调适和成长的书籍,那么《心灵地图2》则是自我灵性的修行和解放。这其实是很不容易的一步,然而作者平易而轻松地做到了。
春节假期结束,也告别了忙碌的2006年,迎来一个还未知的2007。想起2006年初,我给自己定的一些目标,惭愧的是大多数没有完成,有些还在进行中。但是2006,对我来说也算是个充实的一年,有了很多的第一次,对事情思考比以前深入了,不过也许到了2008回想,现在的思考也是肤浅的,我希望是如此,这样表示我在进步。
过去的2006有太多的内容,我也不想去细数了,还是在这里说说2007的目标。
- 作为一个软件开发人员,我还是一如既往地对新技术、新思想关注,并努力的应用到平时开发工作中去,让发挥其价值。
- 这一年我会更加关注敏捷管理,对于敏捷的思想和做法,我一直在徘徊在门外,不是犹豫,而是还在找哪扇门,希望今年能有机会能够在实践中应用。
- Kent有一句名言,"程序员要取得成功,关键在于程序之外的东西"。虽然平时也有这所认识,但是不够重视,比如沟通能力(特别是口头沟通和书面正式文档的编写)、全面系统思考问题的能力、组织协调能力、策划推动能力、自我管理和团队管理能力、工作的规范性和质量意识,等等。这需要我们更用心的去思考、去摸索、去提升,就是要有一个全面的提高。
- 到年底,目标是能达到一个项目经理的水平,要以一个项目经理的要求来衡量自己。
- 工作为了生活!我很喜欢这句话,但是现实和喜欢存在着很大的差距,只能在平时忙碌的工作中努力协调这个矛盾。
- 2006接触了一些健康方面的知识,人体使用手册让我初步了解了人体的奇妙,健康一生让我认识到饮食的重要性。忙碌的工作往往会把身体搞垮,不规律的饮食,不正常的加班熬夜,我们要怎么来呵护我们的身体呢?是不是工作到不惑之年后就疾病缠身呢?我不想要这样的生活,2007年我会把一些健康知识应用到实际中来,如果有效,我还会推荐给我的朋友们。这一点也是对第五点的补充。
春节在家里找到一本以前看过的书,与心灵的对话,还是高中的时候看过这本书,主要说的是人生多变,人生的目标是让自己的灵性成长,讲的非常好。当时对其中讲的很有感触,现在拿起来又读,犹如第一次读一样,引领我对人生的思考,而且比以前读更加的能理解其中的含义。2007我将细读这本书,特别在我这个年龄段,现实的冲击,生活的压力,导致我们对人生的迷惑。
2007会带来什么谁也不知道,也许这就是人生多变,我喜欢这个多变。
人生就是你计划之外发生的事情。2007,唯一现在要做的就是保持一种乐观积极的心态。
Quartz作为一个开源的作业调度框架,已经广泛应用于j2ee中。因为项目需要一个任务管理模块,所以选择了Quartz这个强大的框架,并对其进行
了扩展以适应项目的要求。首先介绍一下我们的系统构架,采用webwork,spring,hibernate整合架构,我的任务是无缝的把Quartz
加入到系统,提供一个界面,提供一些操作,使最终用户能够自己定义在什么时间对什么东西做哪些事情,“哪些事情”是预先定义的,提供给客户选择,这是客户
需求,系统地要求是能够容易的扩展,对增加一个新的任务定义提供一些简单的接口。这里不对Quartz作介绍了,想了解的人参考官方网站:http:
//www.opensymphony.com/quartz/,由于涉及的东西比较多,有些细节就带过了,我就大致的介绍一下总体的设计。
作业调度框架,主要要解决的问题是在某个时间对某些对象作某些动作。
对于某个时间,Quarta提供一个字符表达式来表示,这方面要做的是提供一个方便的界面,直观的对其进行设置,不能让最终客户看那些对客户没意义的字符
串。这个工作需要解析那些字符,做起来还是有点意思的,也是比较麻烦的,有兴趣的话可以自己去试试。
对于某些对象作和某些动作,Quartz都交给程序员自己去定义,它提供一个Job接口,对我们来说增加任务是比较简单的一件事情.既然Quartz提供
这么简单的接口,我为什么还要对其进行扩展呢?这就要来看"某些对象"了.在一般的系统来"某个动作"所操纵的对象是固定的,比如定期删除日至,定期检查
库存等.由于系统地特殊性,我们"某个动作"对哪些对象是不确定的,"哪些对象"由我提供一个界面,由最终客户去决定对一个或多个对象进行操作.
这样就引入了一个范围的概念,"某个动作"是作用在一定范围内的,这个范围就不仅仅是哪些对象了,也可能是时间范围,比如删除几天前的日志信息.到这里对
任务的定义有所改变了,一个任务包括一些范围也可以说是条件,这个条件不包括触发点这个条件),一个动作.所以系统中定义了一个IRange接口,范围的
表示都保存在一个XML字符串,XML字符串的结构和怎么解析都交给具体的子对象,这样就给了子类的灵活性.
public interface IRange {
public Map saveToMap(String strMap);//保存范围参数
public List getResult(Map map);//解析范围参数,并返回操作对象线程列表
public List getViewInfo();取得页面表示方式,结合了webwork
}
一个任务对应一个IRange的子类,IRange的子类对任务的各种参数范围,动作进行了实现.接着还加入一个IRangeManager接口,
public interface IRangeManager {
public void saveDataMap(Long jobId, String strMap)throws SchedulerException;//保存范围参数
public List getObjects(Map map);//取得对象列表,其中包括了对参数的解析
public List getViews(Map map);
}
实现的功能是对范围进行管理,包括对Quartz的操作,主要一些保存数据库等的操作,这样对于增加一个新的Range子类就可以不用知道Quartz了.
这样因为很多东西都是可配置的,增加了灵活性,对以后任务的添加定义了一些接口,考虑到了扩展性.在设计这个模块的时候,总的思路是把那些不变的东西都封装起来,把能变得东西都交给具体的任务了.
上面我只是大致讲了一下,由于水平有限,可能讲的不是清楚,比较乱,我没有提供具体的例子,只是提供了一个思路,希望对大家有所帮助,或者你还有更好的设计,请与我联系.
首先介绍一下我们的系统构架,采用webwork,spring,hibernate整合架构,现在引入Quartz框架,Quartz和
hibernate各自拥有的自己数据库配置和连接池的配置,现在的任务是把两者用同一套配置.
先谈谈Quartz,我用的版本是1.5.1,后面的版本我没去看了,没时间,接下来说的都以这个版本为准.Quartz虽然在提供一个
ConnectionProvider接口,提供给程序扩展,但是看它的StdSchedulerFactory实现类,要对它进行扩展还是一件比较麻烦
一件事情,所以我就直接修改了StdSchedulerFactory类,以达到的我的需求.
接下来的问题是既然要结合,那么让Quartz来提供连接池配置呢还是有Hibernate提供.研究了两者的连接池方面的源代码,发现
Hibernate的连接池设计远远好于Quartz,Quartz目前只提供一个连接池提供类PoolingConnectionProvider,而
且使用的连接池是dbcp,这个连接池听说问题多多,相反hibernate提供了更加灵活的配置,所以连接池由Hibernate提供.
首先实现一个Quartz中ConnectionProvider子类HibernateConnectionProvider
public class HibernateConnectionProvider implements ConnectionProvider {
private Connection con = null;
protected static ThreadLocal hibernateHolder = new ThreadLocal();
public Connection getConnection() throws SQLException {
con = null;
SessionFactoryImpl sessionFactory = null;
sessionFactory = (SessionFactoryImpl) Global.getSessionFacotry();
con = sessionFactory.getConnectionProvider().getConnection();
return con;
}
public void shutdown() throws SQLException {
// FIXME Auto-generated method stub
}
}
,然后修改StdSchedulerFactory,在不破坏其本来的逻辑和可配置性下进行了相应的修改.修改的是private Scheduler
instantiate() throws SchedulerException方法,找到//Set up any
DataSources段进行修改,代码如下:
String[] dsNames = cfg.getPropertyGroups(PROP_DATASOURCE_PREFIX);
for (int i = 0; i < dsNames.length; i++) {
PropertiesParser pp = new PropertiesParser(cfg.getPropertyGroup(
PROP_DATASOURCE_PREFIX + "." +
dsNames[i], true));
String dsDriver = pp
.getStringProperty(PROP_DATASOURCE_DRIVER, null);
String dsURL = pp.getStringProperty(PROP_DATASOURCE_URL, null);
boolean dsAlwaysLookup = pp.getBooleanProperty(
PROP_DATASOURCE_JNDI_ALWAYS_LOOKUP, false);
String dsUser = pp.getStringProperty(PROP_DATASOURCE_USER, "");
String dsPass = pp.getStringProperty(PROP_DATASOURCE_PASSWORD, "");
int dsCnt = pp.getIntProperty(PROP_DATASOURCE_MAX_CONNECTIONS, 3);
String providerClass = pp.getStringProperty(
PROP_DATASOURCE_PROVIDER_CLASS,
null);
String dsJndi = pp
.getStringProperty(PROP_DATASOURCE_JNDI_URL, null);
String dsJndiInitial = pp.getStringProperty(
PROP_DATASOURCE_JNDI_INITIAL,
null);
String dsJndiProvider = pp.getStringProperty(
PROP_DATASOURCE_JNDI_PROVDER,
null);
String dsJndiPrincipal = pp.getStringProperty(
PROP_DATASOURCE_JNDI_PRINCIPAL,
null);
String dsJndiCredentials = pp.getStringProperty(
PROP_DATASOURCE_JNDI_CREDENTIALS,
null);
String dsValidation = pp.getStringProperty(
PROP_DATASOURCE_VALIDATION_QUERY,
null);
if (providerClass == null
|| providerClass.equals("")
|| providerClass
.equals("org.quartz.utils.PoolingConnectionProvider")) {
if (dsDriver == null) {
initException = new
SchedulerException(
"Driver not specified for DataSource: "
+ dsNames[i]);
throw initException;
}
if (dsURL == null) {
initException = new
SchedulerException(
"DB URL not specified for DataSource: "
+ dsNames[i]);
throw initException;
}
try {
PoolingConnectionProvider cp =
new PoolingConnectionProvider(
dsDriver, dsURL, dsUser, dsPass, dsCnt,
dsValidation);
dbMgr =
DBConnectionManager.getInstance();
dbMgr.addConnectionProvider(dsNames[i], cp);
} catch (SQLException sqle) {
initException = new
SchedulerException(
"Could not initialize DataSource: " + dsNames[i],
sqle);
throw initException;
}
} else if (providerClass
.equals("org.quartz.utils.JNDIConnectionProvider")) {
Properties props = null;
if (null != dsJndiInitial || null != dsJndiProvider
|| null !=
dsJndiPrincipal || null != dsJndiCredentials) {
props = new Properties();
if (dsJndiInitial != null)
props.put(PROP_DATASOURCE_JNDI_INITIAL, dsJndiInitial);
if (dsJndiProvider != null)
props.put(PROP_DATASOURCE_JNDI_PROVDER, dsJndiProvider);
if (dsJndiPrincipal != null)
props.put(PROP_DATASOURCE_JNDI_PRINCIPAL,
dsJndiPrincipal);
if (dsJndiCredentials != null)
props.put(PROP_DATASOURCE_JNDI_CREDENTIALS,
dsJndiCredentials);
}
JNDIConnectionProvider cp = new
JNDIConnectionProvider(dsJndi,
props,
dsAlwaysLookup);
dbMgr = DBConnectionManager.getInstance();
dbMgr.addConnectionProvider(dsNames[i], cp);
} else if (providerClass
.equals("org.quartz.utils.HibernateConnectionProvider")) {
HibernateConnectionProvider cp = new
HibernateConnectionProvider();
dbMgr = DBConnectionManager.getInstance();
dbMgr.addConnectionProvider(dsNames[i], cp);
} else {
initException = new SchedulerException(
"Provider_Class not Supported: " + providerClass);
throw initException;
}
}
最后就是修改配置文件quartz.properties,加入
#org.quartz.dataSource.myDS.provider_class = org.quartz.utils.JNDIConnectionProvider
#org.quartz.dataSource.myDS.provider_class = org.quartz.utils.PoolingConnectionProvider
org.quartz.dataSource.myDS.provider_class = org.quartz.utils.HibernateConnectionProvider加#的供参考.
经过测试,需要对hibernate连接池的一些参数进行微调,这样就完成了Quartz与Hibernate在数据库的连接方面的结合,如果有更好的解决方案,请联系我.
由于项目的需要,需要对项目环境进行一些配置,主要是apache和tomcat的整合,并加入集群的功能,在apache中加入ssl,增加其安全性,
我在网上找了很长的时间,找到一些资料,但是都不完整,一般只介绍其中的一部分而已,在这些教程的基础上,加上官方网站的资料,经过努力终于搞定了。这些
都来自网络,我只是把他们都整合到一起,希望对你有所帮助,如果你有什么更好的配置方法,请联系我,谢谢。
目标:apache、tomcat,ssl,的整合,加入集群的功能
操作系统:FC4-i386,redhat as 4
所需软件:httpd-2.2.0,jakarta-tomcat-5.0.30,jdk1.4或者jdk1.5,openssl-0.9.8,ssl.ca-0.1.tar.gz
安装openssl
$ tar zxf openssl-0.9.8.tar.gz
$ cd openssl-0.98
$ ./config --prefix=/usr/local/ssl
$ make
$ make test
$ make install
安装httpd,并支持ssl
# tar zxf httpd-2.2.0.tar.gz
# cd httpd-2.2.0
apr和apr-util的安装
安装apr
# cd srclib/apr
# ./configure --prefix=/usr/local/apr
# make
# make install
安装apr-util
# cd ../apr-util/
# ./configure --prefix=/usr/local/apr-util \
--with-apr=/usr/local/apr
# make
# make install
# cd ../../
安装apache
# ./configure --prefix=/usr/local/apache \
--enable-so \
--enable-proxy-balancer \
--enable-rewrite=share \
--enable-proxy=share \
--enable-proxy-ajp=share \
--enable-dav=share \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-ssl=static \
--with-ssl=/usr/local/ssl
--enable-mods-shared=all
# make
# make install
安装ssl临时证书:
ssl.ca-0.1.tar.gz
# cd /usr/local/apache2/conf
# tar zxvf ssl.ca-0.1.tar.gz
# cd ssl.ca-0.1
# ./new-root-ca.sh
No Root CA key round. Generating one
Generating RSA private key, 1024 bit long modulus
...........................++++++
....++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
......
Self-sign the root CA...
Enter pass phrase for ca.key:
........
........
Country Name (2 letter code) [MY]:CN
State or Province Name (full name) [Perak]:ZheJiang
Locality Name (eg, city) [Sitiawan]:HangZhou
Organization Name (eg, company) [My Directory Sdn Bhd]:sc
Organizational Unit Name (eg, section) [Certification Services Division]:sc
Common Name (eg, MD Root CA) []:2
Email Address []:admin@admin.com
这样就生成了ca.key和ca.crt两个文件,接下来生成一个证书:
# ./new-server-cert.sh server
......
......
Country Name (2 letter code) [MY]:CN
State or Province Name (full name) [Perak]:ZheJiang
Locality Name (eg, city) [Sitiawan]:HangZhou
Organization Name (eg, company) [My Directory Sdn Bhd]:sc
Organizational Unit Name (eg, section) [Secure Web Server]:sc
Common Name (eg, www.domain.com) []:2
Email Address []:admin@admin.com
这样就生成了server.csr和server.key这两个文件。
还需要签署一下才能使用的:
# ./sign-server-cert.sh server
CA signing: server.csr -> server.crt:
Using configuration from ca.config
Enter pass phrase for ./ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CN'
stateOrProvinceName :PRINTABLE:'JiangSu'
localityName :PRINTABLE:'NanJing'
organizationName :PRINTABLE:'Wiscom System Co.,Ltd'
organizationalUnitName:PRINTABLE:'ACSTAR'
commonName :PRINTABLE:'acmail.wiscom.com.cn'
emailAddress :IA5STRING:'acmail@wiscom.com.cn'
Certificate is to be certified until Jul 16 12:55:34 2005 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
CA verifying: server.crt <-> CA cert
server.crt: OK
下面要按照ssl.conf里面的设置,将证书放在适当的位置。
最后是配置conf/httpd.conf
此文件中找到
# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
把#Include conf/extra/httpd-ssl.conf前面的'#'号去掉保存
启动服务器,测试
$cd bin
$./apachectl start
浏览器中打入http://127.0.0.1/和https://127.0.0.1,如果看到同一个成功画面,说明apache+ssl配置成功.
jdk的安装
把jdk1.4或者jdk1.5复制到/usr/local
$chmod 755 jdk....bin
$./jdk....bin
配置全局变量,打开/etc/profile文件,加入
JAVA_HOME=这里为你jdk安装目录
JRE_HOME=$JAVA_HOME/jre
PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$HOME/bin
export JAVA_HOME JRE_HOME PATH
#ant
PATH=/usr/local/ant/bin:$PATH
export PATH
重起电脑.
配置完毕.
tomcat安装
首先把tomcat复制到目录/usr/local
$tar zxf jakarta-tomcat-5.0.30.tar.gz
$cd jakarta-tomcat-5.0.30/bin
$./startup.sh
浏览器中打入http://127.0.0.1:8080/,如果看到tomcat的欢迎画面,表示安装成功.
配置apache目录下conf/httpd.conf文件,
此文件中找到
#Include conf/extra/httpd-vhosts.conf
把#Include conf/extra/httpd-ssl.conf前面的'#'号去掉保存,然后打开conf/extra/httpd-vhosts.conf文件的找到<VirtualHost _default_:443>,在其里面加入
ServerAdmin admin@easyea.com
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
ServerName localhost
ServerAlias www.easyea.com
ErrorLog logs/easyea.com-error_log
CustomLog logs/easyea.com-access_log common
加入的设置有些是与它原先的默认设置是冲突的,请删掉相应冲突的设置.
启动服务器,测试,浏览器中打入https://127.0.0.1,如果看到tomcat的欢迎画面,表示配置成功.
集群和sesion复制
集群
在conf/extra/httpd-vhosts.conf文件的找到<VirtualHost _default_:443>,在其里面加入
<Proxy balancer://128.8.153.203>
BalancerMember ajp://localhost:8009
BalancerMember ajp://128.8.153.81:8009
</Proxy>
<Location /sc/>
ProxyPass balancer://128.8.153.203/sc/
</Location>
sesion复制
tomcat的conf/server.xml文件中,把Cluster
部分的注释去掉,最后一步是把你所要的session复制的项目中的web.xml中加入<distributable
/>,测试的话你需要两个配置一样的tomcat
配置到这里配置完成,在装的过程中因为环境的问题,配置可能有所不同.
aspirin
2006-3-14
第一封信:从诚信谈起
我在苹果公司工作时,曾有一位刚被我提拔的经理,由于受到下属的批评,非常沮丧地要我再找一个人来接替他。我问他:“你认为你的长处是什么?”
他说,“我自信自己是一个非常正直的人。”我告诉他:“当初我提拔你做经理,就是因为你是一个公正无私的人。管理经验和沟通能力是可以在日后工作中学习
的,但一颗正直的心是无价的。”我支持他继续干下去,并在管理和沟通技巧方面给予他很多指点和帮助。最终,他不负众望,成为一个出色的管理人才。
与之相反,我曾面试过一位求职者。他在技术、管理方面都相当的出色。但是,在谈论之余,他表示,如果我录取他,他甚至可以把在原来公司工作时的
一项发明带过来。随后他似乎觉察到这样说有些不妥,特作声明:那些工作是他在下班之后做的,他的老板并不知道。这一番谈话之后,不论他的能力和工作水平怎
样,我都肯定不会录用他。原因是他缺乏最基本的处世准则和最起码的职业道德“诚实”和“讲信用”。如果雇用这样的人,谁能保证他不会在这里工作一段时间
后,把在这里的成果也当作所谓“业余之作”而变成向其他公司讨好的“贡品”呢?这说明:一个人品不完善的人是不可能成为一个真正有所作为的人的。
最后想提的是一些喜欢贪小便宜的人。他们用学校或公司的电话打私人长途、多报销票。
也许有人认为,学生以成绩、事业为重,其他细节只是一些小事,随心所欲地做了,也没什么大不了的。然而,就是那些身边的所谓“小事”,往往成为一个人塑造
人格和积累诚信的关键。一些贪小便宜、耍小聪明的行为只会把自己定性为一个贪图小利、没有出息的人的形象,最终因小失大。对于这些行为,一言以蔽之,就是
“勿以恶小而为之”。
第二封信:从优秀到卓越
一位企业的领导者在成功的基础上,要想进一步提高自己,使自己的企业保持持续增长,使自己的个人能力从优秀向卓越迈进,就必须努力培养自己在“谦虚”、“执著”和“勇气”这三个方面的品质。
谦虚使人进步。许多领导者在工作中唯我独尊,不能听取他人的规谏,不能容忍他人和自己意见相左,这些不懂得谦虚谨慎的领导者也许可以取得暂时的
成功,但却无法在事业上不断进步,达到卓越的境界。这是因为,一个人的力量终究有限,在瞬息万变的商业环境中,领导者必须不断学习,善于综合他人的意见,
否则就将陷入一意孤行的泥潭,被市场所淘汰。
执著是指我们坚持正确方向,矢志不移的决心和意志。无论是公司也好,还是个人也好,一旦认明了工作的方向,就必须在该方向的指引下锲而不舍地努力工作。在工作中轻言放弃或者朝三暮四的做法都不能取得真正的成功。
成功者需要有足够的勇气来面对挑战。任何事业上的成就都不是轻易就可以取得的。一个人想要在工作中出类拔萃,就必须面对各种各样的艰难险阻,必
须正视事业上的挫折和失败。只有那些有勇气正视现实,有勇气迎接挑战的人才能真正实现超越自我的目标,达到卓越的境界。正如马克·吐温所说:“勇气不是缺
少恐惧心理,而是对恐惧心理的抵御和控制能力。”
第三封信:成功、自信、快乐
美国作家威廉·福克纳说过:“不要竭尽全力去和你的同僚竞争。你应该在乎的是,你要比现在的你强。”
中国社会有个通病,就是希望每个人都照一个模
式发展,衡量每个人是否“成功”采用的也是一元化的标准:在学校看成绩,进入社会看名利。尤其是在今天的中国,人们对一个人的成功的评价,更多地以个人财
富为指标。但是,有了最好的成绩就能对社会有所贡献吗?有名利就一定能快乐吗?
真正的成功应是多元化的。成功可能是你创造了新的财富或技术,可能是你为他人带来了快乐,可能是你在工作岗位上得到了别人的信任,也可能是你找到了回归自我、与世无争的生活方式。每个人的成功都是独一无二的。
第四封信:大学应这样过
就读大学时,你应当掌握七项学习,包括自修之道、基础知识、实践贯通、培养兴趣、积极主动、掌控时间、为人处世。
经过大学四年,你会从思考中确立自我,从学习中寻求真理,从独立中体验自主,从计划中把握时间,从表达中锻炼口才,从交友中品味成熟,从实践中赢得价值,从兴趣中获取快乐,从追求中获得力量。
离开大学时,只要做到了这些,你最大的收获将是“对什么都可以拥有的自信和渴望”。你就能成为一个有潜力、有思想、有价值、有前途的中国未来的主人翁。
第五封信:做个积极主动的你
如果你想做一个积极主动、对自己负责的人,我建议你立即行动起来,按照以下几点严格要求自己:
●以一整天时间,倾听自己以及四周人们的语言,注意是否有“但愿”“我办不到”
●依据过去的经验,设想一下,自己近期内是否会遭遇一些令人退缩逃避的情况?这种情况处在你自己的影响范围之内吗?你应该如何本着积极主动的原则加以应对?请在脑海中一一模拟。
●从工作或日常生活中,找出一个令你备感挫折的事情。想一想,它属于哪一类,是可以直接控制的事情,还是可以间接控制的事情,抑或根本无法控制的事情?然后在自己的影响范围内寻找解决方案并付诸行动。
●锻炼自己积极主动的意识。在30天内,专注于自己影响范围内的事物,对自己许下承诺,并予以兑现;做一支照亮他人的蜡烛,而非评判对错的法
官;以身作则,不要只顾批评;解决问题,不要制造问题;不必怪罪别人或为自己文过饰非,不怨天,不尤人;别活在父母、同事或社会的荫庇之下,善用天赋的独
立意志,为自己的行为与幸福负责。
只有积极主动的人才能在瞬息万变的竞争环境中赢得成功,只有善于展示自己的人才能在工作中获得真正的机会。
最后,我将公司总裁的一段话赠给中国的学生:
你们的时间有限,所以不要浪费时间活在别人的生活里。
不要被信条所惑———盲从信条是活在别人的生活里。
不要让任何人的意见淹没了你内在的心声。
最重要的,拥有跟随内心和直觉的勇气。
你的内心与直觉知道你真正想成为什么样的人。
任何其他事物都是次要的。
这个文件是在项目过程中慢慢积累的,功能不是很多,但是完全满足了现在的项目需求,以后还会慢慢加全,希望大家支持。
/* AspirinCheck v1.0 code by aspirin thinking814@hotmail.com */ function AspirinCheck(){ var i =1; var ipCk = ipCk=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}$)/g; var numberCk=/^\d+$/g; //Email:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ //例子<input name="Email" dataType="Email" msg="信箱格式不正确"> /*参考的ip控件 <span class="ipInput" id="bip"> <input
name="broadCastIpOne" MAXLENGTH=3 onkeydown="nextFocus(event)"
>.<input name="broadCastIpTwo" MAXLENGTH=3
onkeydown="nextFocus(event)" >.<input name="broadCastIpThree"
MAXLENGTH=3 onkeydown="nextFocus(event)" >.<input
name="broadCastIpFour" MAXLENGTH=3 onkeydown="nextFocus(event)" > </span> <script> function nextFocus(event){ if(event.keyCode==110 || event.keyCode==46 || event.keyCode==190){ event.keyCode=9; } } </script> */ this.ipCheck = function(ip){ if(this.isEmpty(email))return true; var ipArray = ip.split("."); return
ipCk.test(ip) && new Number(ipArray[0])<=255 && new
Number(ipArray[1])<=255 && new Number(ipArray[2])<=255
&& new Number(ipArray[3])<=255; } this.numberOnly = function (str){ if(this.isEmpty(email))return true; return numberCk.test(str); } this.limit = function (len,min,max){ min = min || 0; max = max || Number.MAX_VALUE; return min <= len && len <= max; } this.isRepeat = function (one,two){ return one==two; }
this.checkemail = function (email){ if(this.isEmpty(email))return true; var emailCk = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ if (!emailCk.test(email)) return false; return true; } this.checkmobile = function (mobile){ if(this.isEmpty(email))return true; var mobileCk = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; if (!mobileCk.test(mobile)) return false; return true; }
this.isEmpty = function (obj){ return (obj=="" || obj.split(" ").join("") == "")?true:false; } } /*引入方式(star) <script type="text/javascript"> function _import(className){ window.document.write("<scr"+"ipt
type=\"text/javascript\"
src=\"前段路径\""+className+".js\"></sc"+"ript>"); } _import("AspirinCheck"); </script> */
// 动态DHCP获得 # 启动系统激活设备. # Loop回环地址. auto lo iface lo inet loopback # 启动系统激活设备. # 网卡eth0设置为DHCP类型. auto eth0 iface eth0 inet dhcp // 静态Static获得 # 启动系统激活设备. # 网卡eth0设置为Static类型. auto eth0 iface eth0 inet static # 指定IP地址.子网掩码.广播.网关. address 192.168.0.1 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 # 指定DNS服务器地址 dns-nameservers 202.103.0.117 dns-search somedomain.org DNS服务器设置: /etc/resolv.conf // 必须设置.否则无法访问任何URL nameserver 202.103.0.117 nameserver 211.95.193.97 Apt-get 命令: apt-setup 设置Apt源.可选择列表或者手工导入 apt-get update 系统软件包更新 apt-get upgrade 更新所有软件包并且自动升级成最新 apt-get dist-upgrade 更新软件包并解决软件依赖关系 apt-cache search keyword 查找指定软件包信息 apt-cache show package_name 详细显示指定软件包的信息 apt-get install 安装指定软件包 apt-get remove 移除指定软件包 常用命令: base-config 配置基本系统 apt-get install zhcon 安装 Zhcon 中文字符支持包. zhcon 运行 Zhcon UC-DOS 中文系统 apt-get remove netatalk 删除不必要的 Appletalk. apt-get remove exim4 删除MTA.提高启动速度. vi /etc/zhcon.conf 配置 Zhcon 设置 vi /etc/apt/source.list 配置 Apt 源址 base-config #进入基本系统配置设置. apt-setup #重新设置APT源文件. apt-get install zhcon #安装 Zhcon 中日韩文外挂. apt-get install vim #安装VIM编辑器.比VI好用很多. apt-get install rar #安装Rar.推荐安装. apt-get install gcc #安装GCC apt-get install make #安装Make apt-get install x-window-system-core #安装X-Window核心 >> 你可以选择安装全部 apt-get install x-window-system apt-get install xdebconfigurator #安装X自动配置工具 >> xdebconfigurator #自动检测硬件 >> dexconf #配置 /etc/X11/XF86Config-4 dpkg-reconfigure xserver-xfree86 # 重新配置X参数.重要. apt-get install gnome-core #安装Gnome核心.你也可以选择全部安装. apt-get install modconf # 安装硬件管理模块工具. apt-get install rcconf # 安装启动管理模块工具. apt-get install deborphan # 显示未关联和使用的软件包. tasksel # 基础的软件包管理工具 apt-get remove packages-name # 删除一个软件包. dpkg -P packages-name # 彻底删除一个软件包以及配置文件. tzconfig # 修改系统默认时区 debconf # Deb配置命令 (具体不详) fc-cache -f -v # 运行于字体目录中.更新字体信息缓存 fc-cache -v # 运行于字体目录中.更新字体信息缓存 mkfontscale # 生成 font.scale 文件.与字体在同一目录下运行. cp fonts.scale fonts.dir #将生成的 fonts.scale 复制为系统需要的 fonts.dir 配置文件. apt-get install locales # 安装最新版的 locales 软件包 >> 安装以后将会在 /usr/lib/locale/ 自动生成所需要的 locale >> 执行 locale 查看现有的配置内容 >> 路径为 /etc/locale.gen >> 可用命令 locale-gen dpkg-reconfigure locales # 重新配置 locale 设置 apt-get install fvwm # 安装fvwm 1. 设置你的系统启动方式是命令行启动模式. 在 /etc/inittab 文件中.设置以命令行的方式来启动: id:3:initdefault 2. 将 etc/X11/xinit/xinitrc 这个文件备份.比如 xinitrc.old cp xinitrc xinitrc.old 然后在 /root/ 或者是 /home/usrname/ 下面建立一个 .xinitrc 文件. 在里面写入: exec fvwm 并保存. 最后执行: startx 进入 fvwm 1. 安装Debian的时候.选择中文简体. 2. 设置时区的时候选择: "Asia" 以及 "Shanghai" 3. 设置Apt源地址包含: DebianSecurity CN99 GeekBone Nctu.edu.tw 地址. 4. 运行 apt-get update 命令更新系统软件包. 5. 运行 apt-get upgrade 命令安装更新软件包. 6. 运行 apt-get install zhcon 命令安装 zhcon 中文控制台. 7. 运行 apt-get install vim 为了方便可安装 VIM 编辑器. 8. 修改配置文件 /etc/profile 增加如下内容: export LANG=zh_CN.GB2312 export LC_ALL=zh_CN.GB2312 10. 重新登陆 Debian. 进入 zhcon. 11. 执行 apt-get install locales 安装或者更新最新版本. 12. 安装 locales 后会自动进入设置 locale 对话框. 语言设置选中: "en_US ISO-8859-1" 和 "zh_CN" 如果你需要支持更多的也可以选择 "BIG" 和 "UIF-8" 等等. 最后记得将 "zh_CN" 设置为 locale 的默认编码. 13. 退出zhcon环境(Ctrl+D). 退出Debian控制台(Exit) 重新登陆 Debian. 进入 zhcon. 运行 locale 查看是否设置生效. 14. 运行 apt-get install libpango1.0-common 安装 defoma. 安装完以后.会提示你将其设置为字体管理工具.选择 Yes. 15. 因为我们已经有了defoma.所以只需要安装新的中文环境和字体. 设置字体和配置字体文件等复杂工作我们都不需要做了. 运行 apt-get install xfonts-intl-chinese 安装简体中文的环境字体. (重要) 运行 apt-get install xfonts-intl-chinese-big 安装支持繁体中文环境字体. (可选) (你可以参考: http://www.debian.org/intl/zh/software 支持中文的所有软件.) 16. 安装两个官方推荐的简体中文的字体: apt-get install ttf-arphic-gbsn00lp apt-get install ttf-arphic-gkai00mp 17. 安装中文输入法.如小企鹅或者XCIN. apt-get install xcin 18. 设置 /etc/X11/xinit/xinitrc 中自动运行中文输入法.增加如下内容: export XMODIFIERS="@im=xcin" xcin & 19. 到这里建议重新启动一下Debian.然后开始安装 GNOME 或者 FVWM. 我建议还是安装 FVWM 这个比较稳定和专业一点. apt-get install fvwm 想漂亮继续装个fvwm的主题 apt-get install fvwm-themes 20. OK.现在我们可以直接输入 startx 进入 fvwm. 如果没有问题的话.应该可以看到是中文环境了. # 安装软件包并且自动检测并安装相关软件. aptitude -R -G install Package # 检测软件包的相关资料. # 这里将检测 Package 软件包的信息. aptitude show Package # 安装指定软件并且指定安装该软件的版本. # 这里将安装 Packge 软件.版本是2.2.5. aptitude install Package=2.2.5 # 删除指定软件.但是不会删除配置文件. aptitude remove # 删除软件包以及所有配置文件. [完全删除] # 推荐使用.这个命令会自动检测依赖关系. aptitude purge Debian Linux Install VMware and Xfce www.Debian.org 下载最新的 Debian 3.1 r01 ISO镜像. Download: http://debian.cn99.com/debian-cd/debian-31r0a-i386-netinst.iso提示: 请确保下载的是 Stable 的版本.否则.如果你使用 Testing 的版本将无法使用 GCC 3.3.5 下载完以后开始安装.可以选择安装英文版的或者是简体中文版的. 安装完以后.我们首先安装 GCC 3.3.5 和 Make.因为VMware将会依赖这两个软件包. aptitude install gcc make 提示: 执行命令后请注意确认一下 GCC 的版本号.正确的应该是 GCC 3.3.5. 如果是 GCC 4.0 的那就说明 Debian 是 Testing 的.需要更换正确的版本重新安装. 安装完以后推荐安装VIM来代替VI.如果需要的话安装FTP Client. aptitude install vim aptitude install ftp 下面进入关键的一步.我们需要安装 Debian 的 kernel-headers 文件. 因为 Debian 下的 VMware 需要该内核头部文件.并且版本要与你现在的内核一致. 查看当前系统的内核信息: (我的是:2.4.27-2) ls /boot 安装与自己匹配的 kernel-headers. aptitude install kernel-headers-2.4.27-2 kernel-headers-2.4.27-2-386 因为该文件太长了.我每次都是用通配符匹配的.先查到自己的内核版.比如: aptitude install kernel-headers-2.4.27-2* 注意红色的部分为自己的内核版本然后加通配符. aptitdue 会自动寻找匹配的文件.一般找到的全部安装也没问题. 到这里为止就完成了系统的基本配置.接下来开始安装X和XFCE. aptitude install x-window-system-core aptitude install xfce4 安装完毕以后登陆XFCE.通过X的Terminal进行VMare的安装就可以了.
首先,我尚且不懂javascript,以下心得,完全是通过学习正则表达式的文档和实践得出,
写该文的目的之一也是试图消除大家对正则表达式的畏惧心理,从简单之处先入门。
而这其中必定有贻笑大方之处,恳请高手们斧正!
在看本文之前,我在附件中附上了带我进入正则表达式之门的一个基础教程,
和一个“正则表达式的练习器”,建议大家先读此文并粗略的实践一下,因为
下面的文字都站在这篇文章的基础上。
---------------------------------------------------------------------------------------------
通过对正则表达式的文档的研究,以及对本人Maxthon积累下来的广告过滤条目对应的url的分析,
我有以下几点心得:
1.正则表达式的优势,在于高整合度和高精确度,记做到了代码的简洁,又疏而不漏,唯一的缺点,不过是
可读性略差了一点。
2.理论上说,所有的过滤条目都可以用|符号整合到一条正则表达式过滤器里面去,可是这样既雪上加霜地降低了
可读性,还不可避免地失去了正则表达式高整合度的优势。所以,为了能写出好的正则表达式,分析需要匹配的
文本(在这里就是url了)是必不可少的。
*************************************************************************************
我们常见的url无非是:aaa.bbb.ccc/123456789/........htm,gif等等
需要过滤的地址,由抽象到具体来说,往往有以下特点:
I.全部过滤一个不漏,只要出现就喀嚓,往往是令人深恶痛绝的url。
例(例子中都是用原始的带通配符的表达式):*.ad.*; */ad/*; *.3721.*/*或者*3721*
II.过滤网址主体,也就是第一个/号之前的所有。
例:www.1000downloads.com/*; www.w163.com/*
III.过滤具体到网页子目录,进入若干个/号内
例:http://imguv.21cn.com/images/*; http://union.homeway.com.cn/images/*
之所以能这样,一般是因为一眼看过去就知道这样的目录下没有好东西,或者看到很多条过滤器中
都出现如下的结构(也表明了网页作者的风格类似),如这里的images
IV.过滤具体到文件,一般就是*.gif,*.swf,*.js类的文件了
例:http://images.chinabyte.com/*.swf; http://www.5ud.com/images/*.gif
综上,只要把问题分开考虑即可:
**************************************************************************************
1.一段体
创建一个如下的表达式(注:本文的正则表达式如果不带前后的两个/号,加入adblock时需加上)
(\.|\/)(您的输入)(\.|\/|_) (感谢zlowly给出这个filter模型)
前后两个括号中表示的是在你的字段前出现"."或"/",字段后出现".","/"或"_"时候考虑你的字段,
没有这两个限制的话过滤范围就过宽了,例:只写(ad)的话,任何带有ad二字的url均会被过滤。
例:
/(\.|\/)(tomnews|dns99|ad|banner|3721|taobao|unionsky)(s)?(\d)*(\.|\/|_)/
--其中的(s)?是表示s出现0次或1次,则该filter通配ad或者ads,banner或banners,但由于
可以出现0次,所以其他成分仍然可以往中间的括号里加入,即便没有unionskys,taobaos。
--后面的(\d)*表示0-9之间的数字,*号表示0次或多次。
正如zlowly所说,为的是对抗网站根据日期显示不同广告,例如
.../ad20041020/...
然后无非是在中间那个括号中,用|号分开你所有想要匹配的字段了。
知道了这一点,后面的情况就势如破竹了。
2.二段体
创建一个这样的表达式雏形:
\.()\.()
由于已经具体到网址的主体部分,所以前后的/或者.也就不需再出现了
例:
\.(boyis|***|cjt1|w163|ppzxw|1000downloads)\.(net|com)
它等价于
http://*.***.com/*
*.boyis.com*
*.cjt1.net*
*.w163.com*
*.ppzxw.com*
*.1000downloads.com*
这样看来,应该比较清晰了吧?
3.三段体
例:
(union|adimg|unstat|ulinkjs)\.(baidu|tom|163|sogou)\.(com)
等价于
*adimg.163.com*
*unstat.baidu.com*
*ulinkjs.tom.com*
*union.sogou.com*
或许有朋友问,为什么分开三种情况呢?整合到一起去有没有可能?
一个很自然的想法是用一个"?"号来表示三段体中的第一段或者出现,或者不出现,
例如想要整合admig.163.com和*.boyis.com,这样写的话:
(adimg)?\.(163|boyis)\.(com)
因为adimg这个字段可出现也可不出现,所以实际上www.163.com这样的地址自然也会被匹配上了,这可不是我们的初衷,
这也就是为什么我觉得应该把各种情况分开考虑,当然更期待高手能解决这个
问题。
其次,鉴于"|"符号会导致自由组合,整合度不应太高。三段体例子中,第一个括号中最好不要放进通用性太强的字段,
如www,否则"|"符号产生自由组合,若要过滤www.ads8.com和adimage.163.com,自由组合的结果当然www.163.com也被过滤了……
有鉴于此,锁定某一段应该是一个不错的选择,我看第三段应该锁定,也就是说里面没有“或”符号
例如:结尾为com的全部单独写一条,而不要结尾(com|net|org|biz|gov)全加上,
或许会有意想不到的组合的(大家看看whitehouse.com/net/gov就知道了)
4.具体到文件的,swf/gif类(如有FlashBlock这个扩展的,可以不需要重复过滤swf)
下面是一条很个人的filter,原则也就是在()\.()\.()\/的基本型后面加上了一个.*\.(gif|swf)的文件类型判断,
鉴于这个时候网站网址变化很大,这个filter的整合度就不高了,很多都是直接贴进去然后用"|"符号分开而已。
(www\.(mydrivers|btbbt|shd|5ud)\.com(\.cn)?|search(\d)?\.btchina\.net|image\.cgame\.cn|
onlinedown\.net|218\.106\.83\.10|down\.20cl\.com)\/(image(s)?|photo)?\/.*\.(gif|swf)
等价于:
http://*.onlinedown.net/*.swf
http://*.onlinedown.net/images/*.gif
http://down.20cl.com/*.gif
http://image.cgame.cn/photo/*.gif
http://search3.btchina.net/images/*.gif
http://www.btbbt.com/*.gif
http://www.shd.com.cn/*.gif
http://www.mydrivers.com/images/*.gif
http://www.mydrivers.com/images/*.swf
http://218.106.83.10/images/*.gif
*****************************************************************************************************************
希望拙作能给大家体会正则表达式的强大、学习使用正则表达式带来帮助。
在此最有必要感谢的是AdBlock的(作者(们)?)(0次或1次……呵呵),我在AdBlock的设置中也没找到他(们)?的名字,
网站上也没找到,对这样默默无闻的人表示敬佩。
顺带谢谢提供广告帮助测试AdBlock的所有广告提供商……
下决心开始学oracle了,用mysql已经有不短的时间了,今天写下这些算是对自己的一个mysql之旅的一个交代吧.以下仅仅是本人在使用mysql过程中的一点个人的体会,也许存在许多纰漏和错误,还请指正!!
首先,为了使一个系统更快,最重要的部分就是基础设计,不过有些东西是现有情况下无法逾越的,比如说系统常见的瓶颈.
我所能想到的:
1:磁盘寻道能力,以高速硬盘(7200转/秒),理论上每秒寻道7200次.这是没有办法改变的,优化的方法是----用多个硬盘,或者把数据分散存储.
2:硬盘的读写速度,这个速度非常的快(限于本人的知识所限,只知道在每秒几十甚至上百MB).这个更容易解决--可以从多个硬盘上并行读写.
3:cpu.cpu处理内存中的数据,当有相对内存较小的表时,这是最常见的限制因素.
4:内存的限制.当cpu需要超出适合cpu缓存的数据时,缓存的带宽就成了内存的一个瓶颈---不过现在内存大的惊人,一般不会出现这个问题.
第二步:
(本人使用的是学校网站的linux平台(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk ))
1:调节服务器参数
用shell>mysqld-help这个命令声厂一张所有mysql选项和可配置变量的表.输出以下信息:
possible variables for option--set-variable(-o) are:
back_log current value:5 //要求mysql能有的连接数量.back_log指出在mysql暂停接受连接的时间内有多少个连接请求可以被存在堆栈中
connect_timeout current value:5 //mysql服务器在用bad handshake(不好翻译)应答前等待一个连接的时间
delayed_insert_timeout current value:200 //一个insert delayed在终止前等待insert的时间
delayed_insert_limit current value:50 //insert delayed处理器将检查是否有任何select语句未执行,如果有,继续前执行这些语句
delayed_queue_size current value:1000 //为insert delayed分配多大的队
flush_time current value:0 //如果被设置为非0,那么每个flush_time 时间,所有表都被关闭
interactive_timeout current value:28800 //服务器在关上它之前在洋交互连接上等待的时间
join_buffer_size current value:131072 //用与全部连接的缓冲区大小
key_buffer_size current value:1048540 //用语索引块的缓冲区的大小,增加它可以更好的处理索引
lower_case_table_names current value:0 //
long_query_time current value:10 //如果一个查询所用时间大于此时间,slow_queried计数将增加
max_allowed_packet current value:1048576 //一个包的大小
max_connections current value:300 //允许同时连接的数量
max_connect_errors current value:10 //如果有多于该数量的中断连接,将阻止进一步的连接,可以用flush hosts来解决
max_delayed_threads current value:15 //可以启动的处理insert delayed的数量
max_heap_table_size current value:16777216 //
max_join_size current value:4294967295 //允许读取的连接的数量
max_sort_length current value:1024 //在排序blob或者text时使用的字节数量
max_tmp_tables current value:32 //一个连接同时打开的临时表的数量
max_write_lock_count current value:4294967295 //指定一个值(通常很小)来启动mysqld,使得在一定数量的write锁定之后出现read锁定
net_buffer_length current value:16384 //通信缓冲区的大小--在查询时被重置为该大小
query_buffer_size current value:0 //查询时缓冲区大小
record_buffer current value:131072 //每个顺序扫描的连接为其扫描的每张表分配的缓冲区的大小
sort_buffer current value:2097116 //每个进行排序的连接分配的缓冲区的大小
table_cache current value:64 //为所有连接打开的表的数量
thread_concurrency current value:10 //
tmp_table_size current value:1048576 //临时表的大小
thread_stack current value:131072 //每个线程的大小
wait_timeout current value:28800 //服务器在关闭它3之前的一个连接上等待的时间
根据自己的需要配置以上信息会对你帮助.
第三:
1:如果你在一个数据库中创建大量的表,那么执行打开,关闭,创建(表)的操作就会很慢.
2:mysql使用内存
a: 关键字缓存区(key_buffer_size)由所有线程共享
b:
每个连接使用一些特定的线程空间.一个栈(默认为64k,变量thread_stack),一个连接缓冲区(变量net_buffer_length)和
一个结果缓冲区(net_buffer_length).特定情况下,连接缓冲区和结果缓冲区被动态扩大到max_allowed_packet.
c:所有线程共享一个基存储器
d:没有内存影射
e:每个做顺序扫描的请求分配一个读缓冲区(record_buffer)
f:所有联结均有一遍完成并且大多数联结甚至可以不用一个临时表完成.最临时的表是基于内存的(heap)表
g:排序请求分配一个排序缓冲区和2个临时表
h:所有语法分析和计算都在一个本地存储器完成
i:每个索引文件只被打开一次,并且数据文件为每个并发运行的线程打开一次
j:对每个blob列的表,一个缓冲区动态的被扩大以便读入blob值
k:所有正在使用的表的表处理器被保存在一个缓冲器中并且作为一个fifo管理.
l:一个mysqladmin flush-tables命令关闭所有不在使用的表并且在当前执行的线程结束时标记所有在使用的表准备关闭
3:mysql锁定表
mysql中所有锁定不会成为死锁.
wirte锁定:
mysql的锁定原理:a:如果表没有锁定,那么锁定;b否则,把锁定请求放入写锁定队列中
read锁定:
mysql的锁定原理:a:如果表没有锁定,那么锁定;b否则,把锁定请求放入读锁定队列中
有时候会在一个表中进行很多的select,insert操作,可以在一个临时表中插入行并且偶尔用临时表的记录更新真正的表
a:用low_priority属性给一个特定的insert,update或者delete较低的优先级
b:max_write_lock_count指定一个值(通常很小)来启动mysqld,使得在一定数量的write锁定之后出现read锁定
c:通过使用set sql_low_priority_updates=1可以从一个特定的线程指定所有的更改应该由较低的优先级完成
d:用high_priority指定一个select
e:如果使用insert....select....出现问题,使用myisam表------因为它支持因为它支持并发的select和insert
4:最基本的优化是使数据在硬盘上占据的空间最小.如果索引做在最小的列上,那么索引也最小.实现方法:
a:使用尽可能小的数据类型
b:如果可能,声明表列为NOT NULL.
c:如果有可能使用变成的数据类型,如varchar(但是速度会受一定的影响)
d:每个表应该有尽可能短的主索引
e:创建确实需要的索引
f:如果一个索引在头几个字符上有唯一的前缀,那么仅仅索引这个前缀----mysql支持在一个字符列的一部分上的索引
g:如果一个表经常被扫描,那么试图拆分它为更多的表
第四步
1:索引的使用,索引的重要性就不说了,功能也不说了,只说怎么做.
首先要明确所有的mysql索引(primary,unique,index)在b树中有存储.索引主要用语:
a:快速找到where指定条件的记录
b:执行联结时,从其他表检索行
c:对特定的索引列找出max()和min()值
d:如果排序或者分组在一个可用键的最前面加前缀,排序或分组一个表
e:一个查询可能被用来优化检索值,而不用访问数据文件.如果某些表的列是数字型并且正好是某个列的前缀,为了更快,值可以从索引树中取出
2:存储或者更新数据的查询速度
grant的执行会稍稍的减低效率.
mysql的函数应该被高度的优化.可以用benchmark(loop_count,expression)来找出是否查询有问题
select
的查询速度:如果想要让一个select...where...更快,我能想到的只有建立索引.可以在一个表上运行myisamchk--analyze
来更好的优化查询.可以用myisamchk--sort-index--sort-records=1来设置用一个索引排序一个索引和数据.
3:mysql优化where子句
3.1:删除不必要的括号:
((a AND b) AND c OR (((a AND b) AND (a AND d))))>(a AND b AND c) OR (a AND b AND c AND d)
3.2:使用常数
(a<b AND b=c) AND a=100 > b>5 AND b=c AND a=5
3.3:删除常数条件
(b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=100 AND 2=3) > b=5 OR b=6
3.4:索引使用的常数表达式仅计算一次
3.5:在一个表中,没有一个where的count(*)直接从表中检索信息
3.6:所有常数的表在查询中在任何其他表之前读出
3.7:对外联结表最好联结组合是尝试了所有可能性找到的
3.8:如果有一个order by字句和一个不同的group by子句或者order by或者group by包含不是来自联结的第一个表的列,那么创建一个临时表
3.9:如果使用了sql_small_result,那么msyql使用在内存中的一个表
3.10:每个表的索引给查询并且使用跨越少于30%的行的索引.
3.11在每个记录输出前,跳过不匹配having子句的行
4:优化left join
在mysql中 a left join b按以下方式实现
a:表b依赖于表a
b:表a依赖于所有用在left join条件的表(除了b)
c:所有left join条件被移到where子句中
d:进行所有的联结优化,除了一个表总是在所有他依赖的表后读取.如果有一个循环依赖,那么将发生错误
e:进行所有的标准的where优化
f:如果在a中有一行匹配where子句,但是在b中没有任何匹配left join条件,那么,在b中生成的所有设置为NULL的一行
g:如果使用left join来找出某些表中不存在的行并且在where部分有column_name IS NULL测试(column_name为NOT NULL列).那么,mysql在它已经找到了匹配left join条件的一行后,将停止在更多的行后寻找
5:优化limit
a:如果用limit只选择一行,当mysql需要扫描整个表时,它的作用相当于索引
b:如果使用limit#与order by,mysql如果找到了第#行,将结束排序,而不会排序正个表
c:当结合limit#和distinct时,mysql如果找到了第#行,将停止
d:只要mysql已经发送了第一个#行到客户,mysql将放弃查询
e:limit 0一直会很快的返回一个空集合.
f:临时表的大小使用limit#计算需要多少空间来解决查询
6:优化insert
插入一条记录的是由以下构成:
a:连接(3)
b:发送查询给服务器(2)
c:分析查询(2)
d:插入记录(1*记录大小)
e:插入索引(1*索引)
f:关闭(1)
以上数字可以看成和总时间成比例
改善插入速度的一些方法:
6.1:如果同时从一个连接插入许多行,使用多个值的insert,这比用多个语句要快
6.2:如果从不同连接插入很多行,使用insert delayed语句速度更快
6.3: 用myisam,如果在表中没有删除的行,能在select:s正在运行的同时插入行
6.4: 当从一个文本文件装载一个表时,用load data infile.这个通常比insert快20
倍
6.5:
可以锁定表然后插入--主要的速度差别是在所有insert语句完成后,索引缓冲区仅被存入到硬盘一次.一般与有不同的insert语句那样多次存入要
快.如果能用一个单个语句插入所有的行,锁定就不需要.锁定也降低连接的整体时间.但是对某些线程最大等待时间将上升.例如:
thread 1 does 1000 inserts
thread 2,3 and 4 does 1 insert
thread 5 does 1000 inserts
如
果不使用锁定,2,3,4将在1和5之前完成.如果使用锁定,2,3,4,将可能在1和5之后完成.但是整体时间应该快40%.因为insert,
update,delete操作在mysql中是很快的,通过为多于大约5次连续不断的插入或更新一行的东西加锁,将获得更好的整体性能.如果做很多一行
的插入,可以做一个lock tables,偶尔随后做一个unlock tables(大约每1000行)以允许另外的线程存取表.这仍然将导致获得好
的性能.load data infile对装载数据仍然是很快的.
为了对load data infile和insert得到一些更快的速度,扩大关键字缓冲区.
7优化update的速度
它的速度依赖于被更新数据的大小和被更新索引的数量
使update更快的另一个方法是推迟修改,然后一行一行的做很多修改.如果锁定表,做一行一行的很多修改比一次做一个快
8优化delete速度
删除一个记录的时间与索引数量成正比.为了更快的删除记录,可以增加索引缓存的大小
从一个表删除所有行比删除这个表的大部分要快的多
第五步
1:选择一种表类型
1.1静态myisam
这
种格式是最简单且最安全的格式,它是磁盘格式中最快的.速度来自于数据能在磁盘上被找到的难易程度.当锁定有一个索引和静态格式的东西是,它很简单,只是
行长度乘以数量.而且在扫描一张表时,每次用磁盘读取来读入常数个记录是很容易的.安全性来源于如果当写入一个静态myisam文件时导致计算机down
掉,myisamchk很容易指出每行在哪里开始和结束,因此,它通常能收回所有记录,除了部分被写入的记录.在mysql中所有索引总能被重建
1.2动态myisam
这
种格式每一行必须有一个头说明它有多长.当一个记录在更改期间变长时,它可以在多于一个位置上结束.能使用optimize tablename或
myisamchk整理一张表.如果在同一个表中有像某些varchar或者blob列那样存取/改变的静态数据,将动态列移入另外一个表以避免碎片.
1.2.1压缩myisam,用可选的myisampack工具生成
1.2.2内存
这种格式对小型/中型表很有用.对拷贝/创建一个常用的查找表到洋heap表有可能加快多个表联结,用同样数据可能要快好几倍时间.
select tablename.a,tablename2.a from tablename,tablanem2,tablename3 where
tablaneme.a=tablename2.a and tablename2.a=tablename3.a and tablename2.c!=0;
为了加速它,可以用tablename2和tablename3的联结创建一个临时表,因为用相同列(tablename1.a)查找.
CREATE TEMPORARY TABLE test TYPE=HEAP
SELECT
tablename2.a as a2,tablename3.a as a3
FROM
tablenam2,tablename3
WHERE
tablename2.a=tablename3.a and c=0;
SELECT tablename.a,test.a3 from tablename,test where tablename.a=test.a1;
SELECT tablename.a,test,a3,from tablename,test where tablename.a=test.a1 and ....;
1.3静态表的特点
1.3.1默认格式.用在表不包含varchar,blob,text列的时候
1.3.2所有的char,numeric和decimal列填充到列宽度
1.3.3非常快
1.3.4容易缓冲
1.3.5容易在down后重建,因为记录位于固定的位置
1.3.6不必被重新组织(用myisamchk),除非是一个巨量的记录被删除并且优化存储大小
1.3.7通常比动态表需要更多的存储空间
1.4动态表的特点
1.4.1如果表包含任何varchar,blob,text列,使用该格式
1.4.2所有字符串列是动态的
1.4.3每个记录前置一个位.
1.4.4通常比定长表需要更多的磁盘空间
1.4.5每个记录仅仅使用所需要的空间,如果一个记录变的很大,它按需要被分成很多段,这导致了记录碎片
1.4.6如果用超过行长度的信息更新行,行被分段.
1.4.7在系统down掉以后不好重建表,因为一个记录可以是多段
1.4.8对动态尺寸记录的期望行长度是3+(number of columns+7)/8+(number
of char columns)+packed size of numeric columns+length of strings +(number of
NULL columns+7)/8
对
每个连接有6个字节的惩罚.无论何时更改引起记录的变大,都有一个动态记录被连接.每个新连接至少有20个字节,因此下一个变大将可能在同一个连接中.如
果不是,将有另外一个连接.可以用myisamchk -恶毒检查有多少连接.所有连接可以用myisamchk -r删除.
1.5压缩表的特点
1.5.1一张用myisampack实用程序制作的只读表.
1.5.2解压缩代码存在于所有mysql分发中,以便使没有myisampack的连接也能读取用myisampack压缩的表
1.5.3占据很小的磁盘空间
1.5.4每个记录被单独压缩.一个记录的头是一个定长的(1~~3个字节)这取决于表的最大记录.每列以不同的方式被压缩.一些常用的压缩类型是:
a:通常对每列有一张不同的哈夫曼表
b:后缀空白压缩
c:前缀空白压缩
d:用值0的数字使用1位存储
e:如果整数列的值有一个小范围,列使用最小的可能类型来存储.例如:如果所有的值在0到255之间,一个bigint可以作为一个tinyint存储
g:如果列仅有可能值的一个小集合,列类型被转换到enum
h:列可以使用上面的压缩方法的组合
1.5.5能处理定长或动态长度的记录,去不能处理blob或者text列
1.5.6能用myisamchk解压缩
mysql能支持不同的索引类型,但一般的类型是isam,这是一个B树索引并且能粗略的为索引文件计算大小为(key_length+4)*0.67,在所有的键上的总和.
字符串索引是空白压缩的。如果第一个索引是一个字符串,它可将压缩前缀如果字符串列有很多尾部空白或是一个总部能甬道全长的varchar列,空白压缩使索引文件更小.如果很多字符串有相同的前缀.
1.6内存表的特点
mysql内部的heap表使用每偶溢出去的100%动态哈希并且没有与删除有关的问题.只能通过使用在堆表中的一个索引来用等式存取东西(通常用'='操作符)
堆表的缺点是:
1.6.1想要同时使用的所有堆表需要足够的额外内存
1.6.2不能在索引的一个部分搜索
1.6.3不能按顺序搜索下一个条目(即,使用这个索引做一个order by)
1.6.4mysql不能算出在2个值之间大概有多少行.这被优化器使用是用来决定使用哪个索引的,但是在另一个方面甚至不需要磁盘寻道
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 http://www.chedong.com/tech/apache_install.html
关键词: apache install php resin mod_gzip mod_expire webalizer cronolog
内容摘要:
Apache是一个历史悠久并且功能十分强大的WEB服务器,但其丰富的功能对于一个新手来说往往不知道从何下手。我个人感觉Apache的设计充
分体现了模块化设计的优势,通过在动态模块加载(DSO)模式下的安装,任何子应用模块都可以通过配置文件的简单修改进行积木式的灵活配置。安装的过程可
以从简单的静态html服务开始,一个模块一个模块的学习使用。从单纯的HTML静态服务(core),到复杂的动态页面服务(core
+ php, core + resin, core + php + mod_gzip, core + resin + mod_expire)。
本文主要从简化安装==>性能调优==>维护方便的角度,介绍了WEB服务的规划、HTTPD安装/应用模块配置、升级/维护等过程。
让Apache和PHP,Resin等应用模块的独立升级,完全互不影响。
-
WEB应用容量规划:根据硬件配置和WEB应用的特点进行WEB服务的规划及一些简单的估算公
式;
-
Apache安装过程:apache的通用的简化安装选项,方便以后的应用的模块化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560 <===将原来的 HARD_SERVER_LIMIT 256 后面加个“0”
apache编译:
./configure --prefix=/home/apache --enable-shared=max
--enable-module=most
-
可选应用模块/工具的安装:php resin mod_gzip
mod_expire及各个模块之间的配合;
mod_php安装:./configure --with-apxs=/home/apache/bin/apxs
--enable-track-vars --with-mysql
mod_resin安装:./configure --with-apxs=/home/apache/bin/apxs
mod_gzip安装:修改Makefile中的 apxs路径:然后make make install
工具:日志轮循工具cronolog安装:http://www.cronolog.org
-
升级/维护:看看通用和模块化的安装过程如何简化了日常的升级/维护工作;
按照以上的方法:系统管理员和应用管理员的职责可以清楚的分开,互相独立。
系统安装:系统管理员的职责就是安装好一台DSO模式的Apache,然后COLON即可,
应用安装:由应用管理员负责具体应用所需要的模块,比如PHP Resin等,并设置httpd.conf中相关的配置。
系统升级:系统管理员:升级操作系统/升级Apache
应用升级:应用管理员:升级应用模块,PHP Resin等。
WEB应用的容量规划
Apache主要是一个内存消耗型的服务应用,我个人总结的经验公式:
apache_max_process_with_good_perfermance < (total_hardware_memory /
apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢?原
因是在低负载下系统可以使用更多的内存用于文件系统的缓存,从而进一步提高单个请求的响应速度。在高负载下,系统的单个请求响应速度会慢不少,而超过
apache_max_process,系统会因为开始使用硬盘做虚拟内存交换空间而导致系统效率急剧下降。此外,同样的服务:2G内存的机器的
apache_max_process一般只设置到1G内存的1.7倍,因为Apache本身会因为进程过多导致性能下降。
例子1:
一个apache + mod_php的服务器:一个apache进程一般需要4M内存
因此在一个1G内存的机器上:apache_max_process_with_good_perfermance < (1g / 4m) *
2 = 500
apache_max_process = 500 * 1.5 = 750
所以规划你的应用让服务尽量跑在500个进程以下以保持比较高的效率,并设置Apache的软上限在800个。
例子2:
一个apache + mod_resin的服务器: 一个apache进程一般需要2M内存
在一个2G内存的机器上:
apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
apache_max_process = 2000 * 1.5 = 3000
以上估算都是按小文件服务估算的(一个请求一般大小在20k以下)。对于文件下载类型站点,可能还会受其他因素:比如带宽等的影响。
Apache安装过程
服务器个数的硬上限HARD_SERVER_LIMIT的修改:
在Apache的源代码中缺省的最大进程数是256个,需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560 <===将原来的HARD_SERVER_LIMIT 256 后面加个“0”
#endif
#endif
解释:
Apache缺省的最大用户数是256个:这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置,但随着内存成本的急剧下降,现在大型站
点的服务器内存配置一般比当时要高一个数量级不止。所以256个进程的硬限制对于一台1G内存的机器来说是太浪费了,而且Apache的软上限
max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服务器内存大于256M,都应该调高Apache的
HARD_SERVER_LIMIT。根据个人的经验:2560已经可以满足大部分小于2G内存的服务器的容量规划了(Apache的软上限的规划请看后
面)。
Apache的编译:以下通用的编译选项能满足以后任意模块的安装
./configure --prefix=/another_driver/apache/ --enable-shared=max
--enable-module=most
比如:
./configure --prefix=/home/apache/ --enable-shared=max
--enable-module=most
解释:
--prefix=/another_driver/apache/:建议将apache服务安装在另外一个驱动设备上的目的在于硬盘往往是一个系统使用
寿命最低的设备,因此:将服务数据和系统完全分开,不仅能提高了数据的访问速度,更重要的,大大方便系统升级,应用备份和恢复过程。
--shared-module=max:使用动态加载方式载入子模块会带来5%的性能下降,
但和带来的配置方便相比更本不算什么:比如模块升级方
便,系统升级风险降低,安装过程标准化等
--enable-module=most:用most可以将一些不常用的module编译进来,比如后面讲到的mod_expire是就不在
apache的缺省常用模块中
如果不想build so, 也可以这样:
./configure \
"--with-layout=Apache" \
"--prefix=/path/to/apache" \
"--disable-module=access" \
"--disable-module=actions" \
"--disable-module=autoindex" \
"--disable-module=env" \
"--disable-module=imap" \
"--disable-module=negotiation" \
"--disable-module=setenvif" \
"--disable-module=status" \
"--disable-module=userdir" \
"--disable-module=cgi" \
"--disable-module=include" \
"--disable-module=auth" \
"--disable-module=asis"
但结果会发现,这样编译对服务性能只能有微小的提高(5%左右),但却失去了以后系统升级和模块升级的灵活性,无论是模块还是Apache本身升级
都必须把Apache和PHP的SOURCE加在一起重新编译。
apache的缺省配置文件一般比较大:可以使用去掉注释的方法精简一下:然后再进入具体的培植过程能让你更快的定制出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf
需要修改的通用项目有以下几个:
#服务端口,缺省是8080,建议将整个Apache配置调整好后再将服务端口改到正式服务的端口
Port 8080 => 80
#服务器名:缺省没有
ServerName name.example.com
#最大服务进程数:根据服务容量预测设置
MaxClients 256 => 800
#缺省启动服务后的服务进程数:等服务比较平稳后,按平均负载下的httpd个数设置就可以
StartServers 5 => 200
不要修改:
以前有建议说修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200
但从我的经验看来:缺省值已经是非常优化的了,而且让Apache自己调整子共享进程个数还是比较好的。
特别修改:
在solaris或一些比较容易出现内存泄露的应用上:
MaxRequestsPerChild 0 =>3000
应用模块和工具的安装配置:
由于使用模块动态加载的模式,所以可以方便的通过简单的配置调整来把Apache定制成你需要的:最好把不常用模块全部清除(无论处于安全还是效
率)。
比如:对于静态页面服务器:就什么其他子模块都不加载,对于PHP应用就加上PHP模块,对于JAVA应用就把Resin模块加载上。而且各种模块的插拔
非常简单,这样调试过程中就可以简单的通过注释掉不需要的模块,而不用重新编译。
一般说来,可以不需要的模块包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已经过时了
#LoadModule includes_module libexec/mod_include.so
#不需要将没有缺省index文件的目录下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#尽量不使用CGI:一直是Apache安全问题最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全认证可以大大提高访问速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so
最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件应用的关联
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so
可用可不用的有:
#比如:需要在~/username/下调试php可以将
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要将以前的URL进行转向或者需要使用CGI script-alias
LoadModule alias_module libexec/mod_alias.so
常用的模块:
最常用的可能就是php和JAVA应用服务器的前端,此外,从性能上讲利用mod_gzip可以减少40%左右的流量,减少机器用于传输的负载,而
mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。
建议将所有MODULE的配置都放到相应模块的配置内部:<IfModule some_module.c>some_module
config </IfModule>
PHP的安装:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs
--with-other-modules-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php
resin的安装设置:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs
具体的resin设置放在另外一个文件中:比如/home/resin/conf/resin.conf
<IfModule mod_caucho.c>
CauchoConfigFile /path/to/apache/conf/resin.conf
</IfModule>
mod_expires的安装配置:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresDefault "now plus 1 day"
</IfModule>
注释:
所有的.gif文件1个月以后过期
所有的文件缺省1天以后过期
mod_gzip的安装
http://www.chedong.com/tech/compress.html
日志的轮循:cronolog的安装和设置 cronolog可以非常整齐的将日志按天轮循存储
缺省编译安装到/usr/local/bin/下,只需要将配置改成: CustomLog "|/usr/local/sbin/cronolog
/home/apache/logs/%w/access_log" combined
日志将按天截断并存放在以星期为目录名的目录下:比如:log/1是周一,log/5是周五, log/0是周日
用gzip压缩每天的日志:
30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday
+%w`/access_log
日志的定期删除:
30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime
+3 |xargs -r /bin/rm -f 升级维护: 由于使用动态模块加载方式(DSO模式)安装Apache,Apache的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活,建议将所
有独立模块的配置都放在
<IfModule mod_name>
CONFIGURATIONS..
</IfModule>
里,这样配置非常容易通过屏蔽某个模块来进行功能调整:比如:
#AddModule mod_gzip.c
就屏蔽了mod_gzip,而其他模块不首任何影响。 安装和维护过程: - 系统安装:系统管理员的职责就是安装系统和一个按照DSO模式安装的Apache,然后COLON。
- 应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
- 系统升级:系统管理员:升级系统/升级Apache
- 应用升级:应用管理员:升级应用模块:PHP CAUCHO等
- 系统备份/恢复:如果Apache不在缺省的系统盘上,只需要将Apache目录备份就可以了,遇到系统分区的硬件问题直接使用预先准备好的
系统COLON,再直接将Apache所在物理盘恢复就行了。
系统管理员:Apache的最简化安装 | OS + Apache (httpd core only) | 应用管理员:应用模块定制 | 纯静态页面服务
core
| PHP动态页面
core+so
+php
| JAVA应用
core+so
+caucho
+ssl | 应用例子: | www.example.com
image.example.com
| bbs.example.com | mall.example.com |
例子:Apache和PHP模块的独立升级。 如果Apache是按照以下方式安装:
./configure --prefix=/home/apache --enable-shared=max
--enable-module=most
PHP是按照以下方式安装:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars
--with-mysql
以后单独升级Apache的时候,仍然是:
./configure --prefix=/home/apache --enable-shared=max
--enable-module=most
make
su
#/home/apache/bin/apachectl stop
#make install
单独升级php时,仍然是:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars
--with-mysql
make
su
#/home/apache/bin/apachectl stop
#make install
#/home/apache/bin/apachectl start
基于反相代理的WEB加速:
squid和mod_proxy都可以实现反相代理加速。而基于缓存的代理加速比起原有WEB服务,速度会有数量级的提升。
小提示: Apache安装后,缺省根目录下没有但很有用的2个文件: 参考文档: Apache项目 http://httpd.apache.org PHP http://www.php.net Resin http://www.caucho.com mod_gzip http://sourceforge.net/projects/mod-gzip/ Cronolog http://www.cronolog.org mod_expires http://httpd.apache.org/docs/mod/mod_expires.html
面向搜索引擎的CMS设计: http://www.chedong.com/tech/cms.html
原文出处:http://www.chedong.com/tech/apache_install.html">http://www.chedong.com/tech/apache_install.html
如果你碰到重复的情况,就要开始总结了,然后进一步抽象,最后把这个抽象应用到其他普遍情况。慢慢你的功力就提升了
极限编程和敏捷软件开发可以说是一种比较松散的开发管理,一种好的开发状态,好的迭代和版本控的等工具的使用是基础,更重要的是个人的创新和团体的交流。
个人的开发状态是全身心的投入编程,在开发中不断创新,加入自己的想法,体现到设计中,给人一种惊喜地效果。
团体的交流可以交换各自的想法,很快的找出错误,找到更好的设计方法。在一个融且的团体中,团队中的每个人都是自信的,开心的,而且是高效率的。
总结的重要性:在每天,每一个功能的实现,每一个迭代完成,每个项目结束,如果你感觉自己没进步,那是一件很失败的事情,你就可以想象你干了十年之后还是
现在的水平,至少我是不希望这样的。我把这个blog作为一个媒体,记录下我的每一点进步,每一点的想法,总结自己的不足,希望在不长的一段时间里面看到
一个不同自己。
软件开发的思想:在实现每个人功能,每一个项目首先一点就是就是要问一下自己,我为什么要完成这个功能?这个功能到底是干嘛的?如果你自己都不清楚的话你
就不能让客户明白是怎么回事,也许你完成了功能,客户也可以利用这个功能完成一些工作,但这个并非一个成功的项目开发。一个成功的项目开发,在开发中都加
入了自己的理解,自己的理念,把自己理念贯穿到每一个功能的开发,这样开发出来的软件会是完全不同的软件。我现在还没有找到自己的理念到底是什么,现在能
做的就是使自己在那种高效的开发状态,总结创新,我想我可以找到自己的理念。
软件开发的目标:在每一个开发开始,自己都要找到一个方向,是方向不是具体的目标,然后开发中不断向着那个方向前进,最后不一定回到那个方向,你到达的是
有稍许偏差的方向,但是不要紧,如果你真的到了那个原来的方向,那你是失败的。这也是一个认识过程,不在熟悉一个事物之前的认识肯定是相当初级的,只有你
在不断的实践中那个方向才会不断地清楚起来。其实我们的职业生涯也是如此,我现在对我的目标的认识也在初级阶段,希望自己在软件开发领域能有自己一片天
地,但是方向并不是很明确,但是我并不急,这也是个过程,一个认识的过程。 上面是我们把平时听到的学到的一部分,在加上我自己的理解,记下来以供以后慢慢学习。
最近同事在碰到一个棘手的问题,用了一天还是调试不出到底哪里出错了,郁闷中时老大过来就说了一个很好的解决方法,用日志跟踪.没过半小时,问题就找到了,定位很准确.这让我看到日志的重要性了.
一开始我还是写一些log的,但是那时候觉得好像没什么必要,后来就从来没有写过,因为我想不出他的好处.现在在知道日志真正的作用,而且也是一个很强大
的工具.平时在写代码的时候,花个几秒钟写个log,也许会觉得很烦,但是我觉得还是值得的.
这也是一个习惯的问题,好的程序员之所以是个好的程序员是因为他有好的习惯,这些好的习惯带来的好处也是很多的.写日志只是其中一个好习惯,我也要慢慢留意一些好的习惯,慢慢总结.
Quartz作为一个开源的作业调度框架,已经广泛应用于j2ee中,在这里提供一些资料以供参考:
首先是官方网站: http://www.opensymphony.com/quartz/ 这里可以下载源代码,还有论坛,jira等最原始的资料。
一个写的不错的介绍Quartz的中文文章: 详细讲解Quartz如何从入门到精通,英文不好的可以参考这个。这篇文章大致的讲了Quartz的框架,很多细节并没有涉及,这也难怪,一篇文章不可能都写上去的。
如果你想继续了解Quartz,官方网站有面向开发人员的文档,但是放在不起眼的角落,我以前闲逛时找到,现在一时找不到,什么时候什么找到了在加上去,我在
另外地方找到其中的几章,这两章是其中最重要的两章,可以作为参考,http://javaforge.com/proj/doc.do?doc_id=
1740
如果你还要继续深入研究,就请自己到cvs去下载最新源码,自己研读了,祝大家成功,我会接下去写一些自己从中学到的东西。
在完全刚装好的fc4上用jdbc进行数据库操作出现了一下错误: java.net.SocketException: Invalid argument or cannot assign requested address at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158) at java.net.Socket.connect(Socket.java:452) at java.net.Socket.connect(Socket.java:402) at java.net.Socket.<init>(Socket.java:309) at java.net.Socket.<init>(Socket.java:124) 这是IP地址的问题,在FC4中默认的是IPv6 socket,JDK1.4支持的应该是IPv4,具体原因可以查看SUN公司给出的解释. 解决办法是在运行JAVA程序时加上 -Djava.net.preferIPv4Stack=true 如:
java -Djava.net.preferIPv4Stack=true application.
但是这个在每次都要加上这句话,另有解决方法是 修改 /etc/modprobe.conf 文件,增加
alias net-pf-10 off alias ipv6 off
这样就不用增加参数 "-Djava.net.preferIPv4Stack=true ",重起即可.
但是既要ipv6又能解决这个问题的方法还没找到。希望高人指点
附:最近在弄cc,也找了一些ant资料,顺便转载记录一下
转自http://ant.apache.org/manual/OptionalTasks/junit.html
Description
This task runs tests from the JUnit testing framework. The latest version of
the framework can be found at http://www.junit.org. This task has been tested
with JUnit 3.0 up to JUnit 3.8.1; it won't work with versions prior to JUnit
3.0.
Note: This task depends on external libraries not included
in the Ant distribution. See Library Dependencies for more
information.
Note: You must have junit.jar and the class
files for the <junit> task in the same classpath. You can do
one of:
- Put both
junit.jar and the optional tasks jar file in
ANT_HOME/lib .
- Do not put either in
ANT_HOME/lib , and instead include their
locations in your CLASSPATH environment variable.
- Do neither of the above, and instead, specify their locations using a
<classpath> element in the build file. See the FAQ for
details.
Tests are defined by nested test or batchtest tags
(see nested elements).
Parameters
Attribute
|
Description
|
Required
|
printsummary |
Print one-line statistics for each testcase. Can take the values
on , off , and withOutAndErr .
withOutAndErr is the same as on but also includes the
output of the test as written to System.out and
System.err . |
No; default is off . |
fork |
Run the tests in a separate VM. |
No; default is off . |
forkmode |
Controls how many Java Virtual Machines get created if you want
to fork some tests. Possible values are "perTest" (the default), "perBatch" and
"once". "once" creates only a single Java VM for all tests while "perTest"
creates a new VM for each TestCase class. "perBatch" creates a VM for each
nested <batchtest> and one collecting all nested
<test> s. Note that only tests with the same settings of
filtertrace , haltonerror , haltonfailure ,
errorproperty and failureproperty can share a VM, so
even if you set forkmode to "once", Ant may have to create more
than a single Java VM. This attribute is ignored for tests that don't get forked
into a new Java VM. since Ant 1.6.2 |
No; default is perTest . |
haltonerror |
Stop the build process if an error occurs during the test
run. |
No; default is off . |
errorproperty |
The name of a property to set in the event of an error. |
No |
haltonfailure |
Stop the build process if a test fails (errors are considered
failures as well). |
No; default is off . |
failureproperty |
The name of a property to set in the event of a failure (errors
are considered failures as well). |
No. |
filtertrace |
Filter out Junit and Ant stack frames from error and failure
stack traces. |
No; default is on . |
timeout |
Cancel the individual tests if they don't finish in the given
time (measured in milliseconds). Ignored if fork is disabled. |
No |
maxmemory |
Maximum amount of memory to allocate to the forked VM. Ignored if
fork is disabled. |
No |
jvm |
The command used to invoke the Java Virtual Machine, default is
'java'. The command is resolved by java.lang.Runtime.exec() .
Ignored if fork is disabled. |
No; default is java . |
dir |
The directory in which to invoke the VM. Ignored if
fork is disabled. |
No |
newenvironment |
Do not propagate the old environment when new environment
variables are specified. Ignored if fork is disabled. |
No; default is false . |
includeantruntime |
Implicitly add the Ant classes required to run the tests and
JUnit to the classpath in forked mode. Note: Please read the Ant FAQ if you want to set this
to false and use the XML formatter at the same time. |
No; default is true . |
showoutput |
Send any output generated by tests to Ant's logging system as
well as to the formatters. By default only the formatters receive the
output. |
No |
tempdir |
Where Ant should place temporary files. Since Ant
1.6. |
No; default is the project's base
directory. |
reloading |
Whether or not a new classloader should be instantiated for each
test case. Ignore if fork is set to true. Since Ant
1.6. |
No; default is
true . |
By using the errorproperty and failureproperty
attributes, it is possible to perform setup work (such as starting an external
server), execute the test, clean up, and still fail the build in the event of a
failure.
The filtertrace attribute condenses error and failure stack
traces before reporting them. It works with both the plain and XML formatters.
It filters out any lines that begin with the following string patterns:
"junit.framework.TestCase" "junit.framework.TestResult" "junit.framework.TestSuite" "junit.framework.Assert." "junit.swingui.TestRunner" "junit.awtui.TestRunner" "junit.textui.TestRunner" "java.lang.reflect.Method.invoke(" "sun.reflect." "org.apache.tools.ant."
The <junit> task supports a nested
<classpath> element that represents a PATH like structure.
jvmarg
If fork is enabled, additional parameters may be passed to the
new VM via nested <jvmarg> elements. For example:
<junit fork="yes"> <jvmarg value="/-Djava.compiler=NONE"/> ... </junit>
would run the test in a VM without JIT.
<jvmarg> allows all attributes described in Command-line Arguments.
sysproperty
Use nested <sysproperty> elements to specify system
properties required by the class. These properties will be made available to the
VM during the execution of the test (either ANT's VM or the forked VM, if
fork is enabled). The attributes for this element are the same as
for environment variables.
<junit fork="no"> <sysproperty key="basedir" value="${basedir}"/> ... </junit>
would run the test in ANT's VM and make the basedir property
available to the test.
syspropertyset
You can specify a set of properties to be used as system properties with syspropertysets.
since Ant 1.6.
env
It is possible to specify environment variables to pass to the forked VM via
nested <env> elements. For a description of the
<env> element's attributes, see the description in the exec task.
Settings will be ignored if fork is disabled.
bootclasspath
The location of bootstrap class files can be specified using this PATH like structure - will be ignored if
fork is not true or the target VM doesn't support it (i.e.
Java 1.1).
since Ant 1.6.
permissions
Security permissions can be revoked and granted during the execution of the
class via a nested permissions element. For more information please see
permissions
Settings will be ignored if fork is enabled.
since Ant 1.6.
assertions
You can control enablement of Java 1.4 assertions with an <assertions>
subelement.
Assertion statements are currently ignored in non-forked mode.
since Ant 1.6.
formatter
The results of the tests can be printed in different formats. Output will
always be sent to a file, unless you set the usefile attribute to
false . The name of the file is determined by the name of the test
and can be set by the outfile attribute of
<test> .
There are three predefined formatters - one prints the test results in XML
format, the other emits plain text. The formatter named brief will
only print detailed information for testcases that failed, while
plain gives a little statistics line for all test cases. Custom
formatters that need to implement
org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter
can be specified.
If you use the XML formatter, it may not include the same output that your
tests have written as some characters are illegal in XML documents and will be
dropped.
Note: Please read the Ant FAQ if you want to set the
fork attribute to true , the includeAntRuntime attribute to
false and use the XML formatter at the same time.
Attribute
|
Description
|
Required
|
type |
Use a predefined formatter (either xml ,
plain , or brief ). |
Exactly one of these. |
classname |
Name of a custom formatter class. |
extension |
Extension to append to the output filename. |
Yes, if classname has been used. |
usefile |
Boolean that determines whether output should be sent to a
file. |
No; default is true . |
if |
Only use formatter if the named property is set. |
No; default is true . |
unless |
Only use formatter if the named property is not set. |
No; default is true . |
test
Defines a single test class.
Attribute
|
Description
|
Required
|
name |
Name of the test class. |
Yes |
fork |
Run the tests in a separate VM. Overrides value set in
<junit> . |
No |
haltonerror |
Stop the build process if an error occurs during the test run.
Overrides value set in <junit> . |
No |
errorproperty |
The name of a property to set in the event of an error. Overrides
value set in <junit> . |
No |
haltonfailure |
Stop the build process if a test fails (errors are considered
failures as well). Overrides value set in <junit> . |
No |
failureproperty |
The name of a property to set in the event of a failure (errors
are considered failures as well). Overrides value set in
<junit> . |
No |
filtertrace |
Filter out Junit and Ant stack frames from error and failure
stack traces. Overrides value set in <junit> . |
No; default is on . |
todir |
Directory to write the reports to. |
No; default is the current directory. |
outfile |
Base name of the test result. The full filename is determined by
this attribute and the extension of formatter . |
No; default is TEST- name,
where name is the name of the test specified in the name
attribute. |
if |
Only run test if the named property is set. |
No |
unless |
Only run test if the named property is not set. |
No |
Tests can define their own formatters via nested
<formatter> elements.
batchtest
Define a number of tests based on pattern matching.
batchtest collects the included files from any number of nested
<fileset> s. It then
generates a test class name for each file that ends in .java or
.class .
Attribute
|
Description
|
Required
|
fork |
Run the tests in a separate VM. Overrides value set in
<junit> . |
No |
haltonerror |
Stop the build process if an error occurs during the test run.
Overrides value set in <junit> . |
No |
errorproperty |
The name of a property to set in the event of an error. Overrides
value set in <junit> . |
No |
haltonfailure |
Stop the build process if a test fails (errors are considered
failures as well). Overrides value set in <junit> . |
No |
failureproperty |
The name of a property to set in the event of a failure (errors
are considered failures as well). Overrides value set in
<junit> |
No |
filtertrace |
Filter out Junit and Ant stack frames from error and failure
stack traces. Overrides value set in <junit> . |
No; default is on . |
todir |
Directory to write the reports to. |
No; default is the current directory. |
if |
Only run tests if the named property is set. |
No |
unless |
Only run tests if the named property is not
set. |
No |
Batchtests can define their own formatters via nested
<formatter> elements.
Examples
<junit> <test name="my.test.TestCase"/> </junit>
Runs the test defined in my.test.TestCase in the same VM. No
output will be generated unless the test fails.
<junit printsummary="yes" fork="yes" haltonfailure="yes"> <formatter type="plain"/> <test name="my.test.TestCase"/> </junit>
Runs the test defined in my.test.TestCase in a separate VM. At
the end of the test, a one-line summary will be printed. A detailed report of
the test can be found in TEST-my.test.TestCase.txt . The build
process will be stopped if the test fails.
<junit printsummary="yes" haltonfailure="yes"> <classpath> <pathelement location="${build.tests}"/> <pathelement path="${java.class.path}"/> </classpath>
<formatter type="plain"/>
<test name="my.test.TestCase" haltonfailure="no" outfile="result"> <formatter type="xml"/> </test>
<batchtest fork="yes" todir="${reports.tests}"> <fileset dir="${src.tests}"> <include name="**/*Test*.java"/> <exclude name="**/AllTests.java"/> </fileset> </batchtest> </junit>
Runs my.test.TestCase in the same VM, ignoring the given
CLASSPATH; only a warning is printed if this test fails. In addition to the
plain text test results, for this test a XML result will be output to
result.xml . Then, for each matching file in the directory defined
for ${src.tests} a test is run in a separate VM. If a test fails,
the build process is aborted. Results are collected in files named
TEST- name.txt and written to
${reports.tests} .
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
26 | 27 | 28 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|
常用链接
留言簿(6)
随笔分类
随笔档案
文章档案
相册
我关注的文章
我听的音乐
我浏览的网站
我的好友
我看的书
我看社会
搜索
最新评论
阅读排行榜
评论排行榜
|
|