佳丽斯 加厚双人/单人秋冬被子暖冬 羊毛被芯羊毛柔丝被特价包邮 忧忧鱼冬外穿打底裤女秋冬厚长裤女裤加绒加厚高腰弹力铅笔裤靴裤 韩国代购2013新款 韩版秋冬休闲女时尚磨破口袋卫衣韩版学生装 潮

有时,退一步,能一口气进几步,只是这先退一步需要勇气和自信。

用心爱你,努力工作。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  70 随笔 :: 1 文章 :: 33 评论 :: 0 Trackbacks

2007年10月21日 #

人的生活方式有两种:

  第一种方式是像草一样活着,你尽管活着,每年还在成长,但是你毕竟是一棵草,你吸收雨露阳光,但是长不大。人们可以踩过你,但是人们不会因为你的痛苦,而他产生痛苦;人们不会因为你被踩了,而来怜悯你,因为人们本身就没有看到你。

  第二种方式是像树一样成长,即使我们现在什么都不是,但是只要你有树的种子,即使被人踩到泥土中间,你依然能够吸收泥土的养分,自己成长起来。也许两年三 年你长不大,但是八年,十年,二十年你一定能长成参天大树,当你长成参天大树以后,遥远的地方人们就能看到你,走近你,你能给人一片绿色,一片阴凉,你能 帮助别人,即使人们离开你以后回头一看,你依然是地平线上的一道美丽风景线。

  树活着是美丽的风景,死了依然是栋梁之才,活着死了都有用,这就是我们做人的标准和成长的标准。

  尽管每一条河流都有自己不同的生命曲线,但是每一个河流都有自己的梦想,那就是奔向大海。我们的生命,有的时候会是泥沙,你可能慢慢的就会像泥沙一样沉淀下去。

  一旦你沉淀下去,也许你不再为了前进而努力,但是你永远见不到阳光了。

  所以不管你现在的生命是怎样的状态,一定要有水的精神,像水一样不断的积蓄自己的力量,不断的冲破障碍,当你发现时机不到的时候,把自己的厚度给积累起来,当有一天机会来临的时候,你就能够奔腾入海,成就自己的生命。

 
  ”为了不苦一辈子,定要苦过这阵子“
posted @ 2012-01-05 14:43 王生生 阅读(257) | 评论 (0)编辑 收藏

     摘要:  教你怎样混社会   很多人混到现在一事无成,或自认为一事无成。还有很多人混到现在感觉很失败,或不成功。还有很多人混到现在就觉得过得没意思,过得很机械,过得已经不会思考和心动。我们羡慕着社会上每一个成功人士,羡慕着身边的有钱人,羡慕着身边每一辆呼啸而过的名车。我们时常有这样的念头:他妈的,我怎么混得这么差?   是啊,我怎么会混得这么差?当年班里(周围)不如我的那个家伙怎么现...  阅读全文
posted @ 2010-09-16 20:43 王生生 阅读(790) | 评论 (0)编辑 收藏

因一直很犹豫不想发表这些只言片语,但鉴于各种经历、思想、所感、所悟让我写下以下这些文字供大家参考、指正:


问题:今天我们为 什么不成功?


1、首先我们没有定义好自己的成功标准是什么(是票子、车子、房子、妻子?),不清楚自己的真正目标,是为了理想、 爱好、钱、事业、家庭、权利、欲望、还是人生价值的体现,因此我们每天依旧重复过着糊里糊涂的日子。生活是那么单调、枯燥。


2、 我们不清楚已所之长,己所之短,完全不了解自己,到底缺什么、需补什么、擅长什么、有哪些资源,是知识、钱、关系、项目、人脉、还是时势。我们缺乏核心竞 争力和不可替代性(即唯一性),所以我们往往不知道该做什么,不该做什么。永远盲目着、彷徨着。


3、我们很容易围着别人转、被别 人感染、而不能让别人围着自己转、去感染和影响别人,所以注定了把别人的思想放进自己的脑袋,把自己的钱包放进别人的口袋,自己的命运被别人牢牢把握着, 我们的灵魂和思想早被洗窃一空,剩下的只是行尸走肉。既然如此那么我们还能指望自己成就点什么。


4、我们习惯了肤浅的东西,看表 面的文章、百般无聊、如出一辙的电视,挂QQ、玩游戏、搓麻将、泡馆子、蹲酒吧、守休闲场所、谈论众说纷纭的炒作新闻等,却少读了几本有价值的书、少见了 几个有价值的人,少给了自己几分钟静夜思,严重缺乏看透事物本质的能力。所以我们今天被这个专家、明天被那个大师、后天还有某个名人,前后左右、上上下 下、媒体广告、报纸、杂志、电视、网络、轮番轰炸着,在这个混淆视听的环境里,我们缺乏起码的判断力、分析力、概括力、我们往往被迷失了方向,迷失了自 我。


5、我们缺乏勇气和魄力,习惯了三点一线的生活,没有了当年的匹夫之勇,不敢走回头路和不归路。我们觉得生活很无奈、工作很 单调,发展很受限,却往往詹前顾后,不敢改变自己,懒于学习、不敢做领导、不敢换职位、不敢换工作、不敢创业、不敢质疑、不敢反抗、不敢发表自己的意见、 不敢主动交流、不敢创新,因此我们依旧平淡无奇、素然寡味的过平凡人的日子,因为我们人生的旅途缺乏过程、缺乏那种能够品位真正酸、甜、苦、辣的勇气。


6、 我们缺乏信任、合作、资源整合,我们总在猜测和矛盾中生活,仍在学着一个人打天下。我们很少拥有真正的朋友、能帮到上忙、借的上钱、铁的了心、有心灵感应 时常挂念的朋友、平时不烧香临时抱佛脚,我们不太懂得相互宽容、理解、互补、平衡、分享、互利这些道理,所谓的兄弟、酒肉朋友太多,危难之中,我们可信任 的人太少、信任的程度太低、信任的成本太高、我们都在相互猜忌着,力量相互内耗着。我们找不到资源的整合点,其实不会合理利用,仍在感叹我能点做什么,到 底怎么办,我们认识的人层次太低,我们的胸怀太狭隘,所以很多道理,真相明白不透,我们默默的做了垫脚石而已。


7、我们缺乏行动 力、执行力、做人、处事方法,仍在日复一日,年复一年平淡、懵懂的过日子。我们每时每刻都有美妙的想法,唯独缺没有做法,没有持之以恒的信心和耐力。我们 不能时常的照镜子,予以自醒、禅悟。


8、我们缺乏总结力,纠正力,失败了,还是失败了,错误了,依旧错误着。我们的习惯依旧没有 改变,由此养成了这种性格,最终决定了这种命运。


9、我们不懂得编织关系网,其实关系网是网状结构,先从你认识和了解的人开始, 然后从认识你的人开始,最后从你朋友的朋友开始,依次类推,记得要用心和以诚相待,人与人之间其实是平等的,没有高、低、贵、贱之分(除非你真的有求于他 /她),没有什么了不起的,注意了解他/她人背景和整合资料很重要。


10、我们缺乏理财,常常不知道该买什么,该卖什么,什么是 收入,什么是支出,什么是负债,什么是资产,何谓投资,如何开源节流,我们忽视了细节,量变成了质变,因此我们的现金数字依然很尴尬。我们不清楚如何找 钱、挣钱、存钱、借钱、还钱、花钱。


11、我们严重缺知识,基础知识+社会知识,即学历太低、经历太少,缺乏不断学习补充、虚心 请教、拜师学艺的能力


缺乏海纳百川、中西合璧、文理交融的素质、缺乏一技之长、专攻和全面,我们还是怀着陈旧的思想和笨拙的方 法,我们不敢怀疑、挑战、创新新思维。


12、我们早被这个灯红酒绿、物欲横流的世界弄得焦躁不安,不能静下心来,反复,认真的思 考自己的人生,稳重走好自己的每一步。我们不懂得管理时间、合理利用时间、守时。以至老大涂伤悲。


13、我们缺乏快乐感、幸福 感、安全感,人与人之间太冷漠、太现实,许多家庭支离破碎、许多交际带着有色眼镜,许多圈子旁人所不能及,许多婚姻夹着交易,许多爱情不是爱情,许多亲情 缺乏关心、许多兄弟背后插刀、我们害怕房奴、车奴、结婚、生子、生病、失业、人情、意外、整日惶惶,我们不知道什么是快乐幸福,不知道如何寻找、不知道调 整自己的心态和位置、不明白取、舍、知足常乐、超越、分享、顺其自然这些东西。


14、我们不懂得把握时势,不懂得政治、经济的厉 害关系,不明白风水轮流转、天地合一、互利互惠的道理,不明白红海和蓝海战略,不明白水能载舟亦能覆舟、没有绝对的朋友和绝对的敌人。不懂得顺应潮流和创 造潮流,我们依旧固步自封,停滞不前。


15、最后我们看准了方向,做好充分的准备(破斧沉舟),请立即开始行动,坚持、坚持、再 坚持!熬过了今天,明天会很美好!其间我们不断的完善自我,调整自我。愿所有有心人能成功!天道酬勤!

轉自 http://topic.csdn.net/u/20100609/22/9f6cb6ec-8eaf-4aa4-a0e1-fd3a9ddda88e.html
posted @ 2010-07-06 15:46 王生生 阅读(238) | 评论 (0)编辑 收藏

有 人工作,有人上学,大家千万不要错过这篇文章,能看到这篇文章也是一种幸运,真的受益匪浅,对我有很大启迪,这篇文章将会改变你我的一生,真的太好了,希 望与有缘人分享,也希望对有缘人有所帮助!看完之后有种“相见恨晚”的感觉,特别激动,希望大家好好的珍藏这篇文章,相信多年以后,再来看这篇文章,一定 有不同的感觉。

图片

        正如"打工皇帝"唐骏说:"我觉得有两种人不 要跟别人争利益和价值回报。第一种人就是刚刚进入企业的人,头5年千万不要说你能 不能多给我一点儿工资,最重要的是能在企业里学到什么,对发展是不是有利……"
       
人总是从平坦中获得的教益少,从磨难中获得的教益多;从平坦中获得的教益浅,从磨难中获得的教益深。 一个人在年轻时经历磨难,如能正确视之,冲出黑暗,那就是一个值得敬慕的人。最要紧的是先练好内功,毕业后这5年就是练内功的最佳时期,练好内功,才有可能在未来攀得更高。

       
出路在哪里?出路在于思路!
  其实,没有钱、没有经验、没有阅历、没有社会关系,这些都不可怕。没有钱,可以通过辛勤劳动去 赚;没有经验,可以通过实践操作去总结;没有阅历,可以一步一步去积累;没有社会关系,可以一点一点去编织。但是,没有梦想、没有思路才是最可怕的,才让 人感到恐惧,很想逃避
!
  人必须有一个正确的方向。无论你多么意气风发,无论你是多么足智多谋,无论你花费了多大的心血, 如果没有一个明确的方向,就会过得很茫然,渐渐就丧失了斗志,忘却了最初的梦想,就会走上弯路甚至不归路,枉费了自己的聪明才智,误了自己的青春年华。

    
荷马史诗《奥德赛》中有一句至理名 言:"没有比漫无目的地徘徊更令人无法忍受的了。"毕业后这5年里的迷茫,会造 成10年后的恐慌,20年后的挣扎,甚 至一辈子的平庸。如果不能在毕业这5年尽快冲出困惑、走出迷雾,我们实在是无颜面对10年后、20年后的自己。毕业这5年里,我们既有很多的不确定,也有很多的可能性。
  毕业这5年里,我们既有很 多的待定,也有很多的决定。
迷茫与困惑谁都会经历,恐惧与逃避谁都曾经有过,但不要把迷茫与困惑当作可以自我放弃、甘于平庸的借口,更不要成为自怨自艾、祭奠失意的苦酒。生命需要 自己去承担,命运更需要自己去把握。在毕业这5年里,越早找到方向,越早走出困惑,就 越容易在人生道路上取得成就、创造精彩。无头苍蝇找不到方向,才会四处碰壁;一个人找不到出路,才会迷茫、恐惧。
    
生活中,面对困境,我们常常会有走投无路的感觉。不要气馁,坚持下去,要相信年轻的人生没有绝路,困境在前方,希望在拐角。只要我们有 了正确的思路,就一定能少走弯路,找到出路!
       
成功的人不是赢在起点,而是赢在转折点。
   
不少刚刚毕业的年轻人,总是奢望马上就能找到自己理想中的工作。然而,很多好工作是无法等来的,你必 须选择一份工作作为历练。职业旅程中的第一份工作,无疑是踏入社会这所大学的起点。也许你找了一份差强人意的工作,那么从这里出发,好好地沉淀自己,从这 份工作中汲取到有价值的营养,厚积薄发。千里之行,始于足下,只要出发,就有希望到达终点。

    
起点可以相同,但是选择了不同的拐点,终点就会大大不同!
    
毕业这几年,我们的生活、感情、职业 等都存在很多不确定的因素,未来也充满了各种可能。这个时候,必须学会选择,懂得放弃,给自己一个明确的定位,使自己稳定下来。如果你不主动定位,就会被 别人和社会"定型"
  可以这么说:一个人在毕业这5年培养起来的行为习惯,将决定他一生的高度。我们能否成功,在某种程度上取决于自己对自己的评价,这 就是定位。你给自己定位是什么,你就是什么。定位能决定人生,定位能改变命运。丑小鸭变成白天鹅,只要一双翅膀;灰姑娘变成美公主,只要一双水晶鞋。
   
人的命,三 分天注定,七分靠打拼,有梦就"会红",爱 拼才会赢。只要不把自己束缚在心灵的牢笼里,谁也束缚不了你去展翅高飞。
    
现实情况远非他们所想的那样。于是, 当优越感逐渐转为失落感甚至挫败感时,当由坚信自己是一块"金子"到怀疑自己是一粒"沙子"时,愤怒、迷茫、自卑就开始与日俱增。
   
其实,应该仔细掂量一下自己,你是否真是金子?是真金,手中要有绝活,才能上要有过人之处才行。一句话:真金是要靠实力来证明的,只有 先把自己的本领修炼好了,才有资格考虑伯乐的事情
   
每颗珍珠原本都是一粒沙子,但并不是每一粒沙子都能成为一颗珍 珠。
   
想要卓尔不群,就要有鹤立鸡群的资本。忍受不了打击和挫折,承受不住忽视和平淡,就很难达到辉煌。年轻人要想让自己得到重用,取得成 功,就必须把自己从一粒沙子变成一颗价值连城的珍珠。
       
天有下雨与日出,人生高峰与低谷。
       
莫为浮云遮望眼,风物长宜放眼量。

只要拂去阴霾,就能亮出 朗朗晴空。如果你在工作上有些不如意,要相信自己不会一直处于人生的低谷期,总有一天能冲破重重云层。告诉自己:我并没有失败,只是暂时没有成功!只要在 内心点亮一盏希望之灯,一定能驱散黑暗中的阴霾,迎来光明。
    
的确,论资历,他们是 不折不扣的职场菜鸟,业务涉及不深,人脉一穷二白,在工作中经常碰壁。他们的压力并不一定都像千钧大石,而是像大雨来临前的天色,灰色低沉,明明有空间, 却被灰色填满每个缝隙,只能等待大雨倾盆之后的晴空。
  "起得比鸡早,睡得比狗 晚,干得比驴多,吃得比猪差。"这是很多刚刚毕业的人喜 欢用来调侃自己生活状态的话。虽然有点儿夸张,但是,他们中的很多人的确一直都被灰色心情所笼罩--心里永远是多云转阴。记得有位哲人曾说:"我们的痛苦不是问题本身带来的,而是我们对这些问题的看法产生的。"换个角度看人生,是一种突破、一种解脱、一种超越、一种高层次的淡泊与宁 静,从而获得自由自在的快乐。
    
一位哲人说:"人生就是一连串的抉择,每个人的前途与命运,完全把握在自己手中,只要努 力,终会有成。"就业也好,择业也罢,创 业亦如此,只要奋发努力,都会成功。你是不是准备把生命的承诺全部都交给别人?
  毕业后这5年,是改变自己命运的黄金时期。在最能决定自己命运时,如果还不把握,那你 还要等到什么时候呢?我的人生我做主,命运由己不由人。
  不要活在别人的 嘴里,不要活在别人的眼里,而是把命运握在自己手里。
  别说你没有背景, 自己就是最大的背景。美国作家杰克·凯鲁亚克说过一句话:"我还年轻,我渴望上 路。"在人生的旅途中,我们永 远都是年轻人,每天都应该满怀渴望。每个人的潜能都是无限的,关键是要发现自己的潜能和正确认识自己的才能,并找到一个能充分发挥潜能的舞台,而不能只为 舞台的不合适感到不快。要客观公正地看待自己的能力,结合自己的实际情况和爱好冷静选择,尽可能到最需要自己、最适合自己的地方。
     在人力资源管理界,特别流行一个说法,即"骑马,牵牛,赶猪,打狗"理论:人品很好,能力又很强的,是千里马,我们要骑着他;人品很好但能力普 通的,是老黄牛,我们要牵着他;人品、能力皆普通的,就是"",我们要赶走他;人品很差能力很强的,那是"",我们要打击他。
   
我想,刚刚毕业几年的 你,一样胸怀大志,一样想成为一匹被人赏识、驰骋沙场的千里马吧?那么,就好好沉淀下来。低就一层不等于低人一等,今日的俯低是为了明天的高就。所谓生命 的价值,就是我们的存在对别人有价值。能被人利用是一件好事,无人问津才是真正的悲哀!
    
能干工作、干好工作是职场生存的基本保障。
   
任何人做工作的前提条件都是他的能力能够胜任这项工作。能干是合格员工最基 本的标准,肯干则是一种态度。一个职位有很多人都能胜任,都有干好这份工作的基本能力,然而,能否把工作做得更好一些,就要看是否具有踏实肯干、苦于钻研 的工作态度了。
    
在 能干的基础上踏实肯干。
    工作中,活干得比别人 多,你觉得吃亏;钱拿得比别人少,你觉得吃亏;经常加班加点,你觉得吃亏……其实,没必要这样计较,吃亏不是灾难,不是失败,吃亏也是一种生活哲学。现在 吃点儿小亏,为成功铺就道路,也许在未来的某个时刻,你的大福突然就来了。
    
能吃亏是做人的一种境界,是处世的一种睿智。
    
在工作中并不是多做事 或多帮别人干点儿活就是吃亏。如果领导让你加加班、赶赶任务,别以为自己吃了大亏,反而应该感到庆幸,因为领导只叫了你,而没叫其他人,说明他信任你、赏 识你。吃亏是一种贡献,你贡献得越多,得到的回报也就越多。乐于加班,就是这样的一种吃亏。
   
舍 得舍得,有舍才有得;学会在适当时吃些亏的人绝对不是弱智,而是大智。
  给别人留余地就是给自己留余地,予人方便就是予己方便,善待别人就是善 待自己。
  傻人有傻福,因为 傻人没有心计。和这样的人在一起,身心放松,没有太多警惕,就能相互靠近。傻在很多时候意味着执着和忠贞,也意味着宽厚和诚实,让人不知不觉站到他一边。 傻人无意中得到的,比聪明人费尽心机得到的还多。毕业这几年,你的天空中只飘着几片雪花,这样你就满足了吗?成功需要坚持与积累,与其专注于搜集雪花,不 如省下力气去滚雪球。巴菲特说:"人生就像滚雪球,最重要 的是发现很湿的雪和很长的坡。"让自己沉淀下来,学着发 现"很湿的雪",努力寻找"很长的坡"。记住:散落的雪花会很快融化,化为乌有,只有雪球才更实在,才能长久。
在毕业这几年里,你要是 能做到比别人多付出一分努力,就意味着比别人多积累一分资本,就比别人多一次成功的机会。
    
什么是职业化呢?职业化就是工作状态的标准化、规范化、制度化,即在合适的时间、合适的地点用合适的方 式说合适的话、做合适的事,使知识、技能、观念、思维、态度、心理等符合职业规范和标准。"在每个行业里,都有很 多出色的人才,他们之所以能存在,是因为比别人更努力、更智慧、更成熟。但是,最重要的是,他们比一般人更加职业化!这就是为什么我现在能当你老板的原 因。一个人仅仅专业化是不够的,只有职业化的人才能飞在别人前面,让人难以超越!"不要以为我们现在已经 生存得很安稳了。对于毕业5年的人来讲,一定要认清 即将面临的五大挑战。

一、赡养父母。
二、结婚生子。
三、升职加薪。
四、工作压力。
五、生活质量。
    
有的人为生存而雀跃,目 光总是停在身后,三天打鱼两天晒网,有始无终。
   有的人为发展而奋斗, 目光总是盯在正前方,每天进步一点点,坚持不懈。
  毕业这几年,不能没有追求和探索,不能没有理想和目标。人生如逆水行舟,不进则退。甘于现状的生活就是不再前行 的船,再也无法追上时代前进的步伐。一定要抓紧每一秒钟的时间来学习,要明白学习不是学生的专利。小聪明的人最得意的是:自己做过什么?大智慧的人最渴望 的是:自己还要做什么?
  小聪明是战术,大智慧是战略;小聪明看到的是芝麻,大智慧看到的是西瓜。
  在这个世界上,既 有大人物,也有小角色,大人物有大人物的活法,小人物有小人物的潇洒,每个人都有自己的生活方式,谁也勉强不了谁。但是,小聪明只能有小成绩和小视野,大 智慧才能有大成就和大境界。小企业看老板,中企业看制度,大企业看文化。
    
小公司与大企业都有生 存之道,没有好坏之分,但对一个人不同阶段的影响会不同。
  小公司肯定想要发展为大企业,这是一种目标,年轻人也要给自己的职业生 涯制定目标。毕业几年的你,是否经常会怯场或者是感到没有底气?居安思危绝对不是危言耸听!此刻打盹,你将做梦;此刻学习,你将圆梦。在竞争激烈的人生战 场上,打盹的都是输家!
  
每个人在年轻的时候似乎 都豪情万丈,什么都不怕,可是随着年龄的增长,每天想着房子、工作、养家糊口这些俗事儿,再也没有年轻时那种敢于"上天探星、下海捞月"的勇气了。是我们改变了生活,还是生活改变了我们?我们的思想越来越复杂, 因为有了越来越多的舍不得、越来越多的顾虑,我们总是在徘徊、总是在犹豫。毕业开始一两年,生活的重担会压得我们喘不过气来,挫折和障碍堵住四面八方的通 口,我们往往在压迫得自己发挥出潜能后,才能杀出重围,找到出路。可是两三年后,身上的重担开始减轻,工作开始一帆风顺,我们就松懈了下来,渐渐忘记了潜 在的危险。直到有一天危机突然降临,我们在手足无措中被击败……毕业这几年,仍然处于危险期,一定要有居安思危的意识,好好打拼,这样才能有一个真正的安 全人生!
    
生 于忧患,死于安乐。如果你想跨越自己目前的成就,就不能画地自限,而是要勇于接受挑战。对畏畏缩缩的人来说,真正的危险正在于不敢冒 险!
   
年轻人在社会的重压下, 适应能力已变得越来越强,只是他们不自觉地习惯被环境推着走。他们不敢冒险,怕给自己带来终身的遗憾,于是告慰自己:"我对得起自己、对得起家人,因为我已竭尽全力。"其实,人只有不断挑战和突破才能逐渐成长。长期固守于已有的安全感中,就会 像温水里的青蛙一样,最终失去跳跃的本能。
    
经历了这几年社会生 活,你应该明白:这个世界上有富也有贫,有阴也有亮,有丑也有美,到底看到什么,取决于自己是积极 还是消极。在年轻时学会勤勉地工作,用一种光明的思维对待生活,那么,只要张开手掌,你就会发现,里面有一片灿烂的人生。
    把感恩刻在石头上,深深地感谢别人帮助过你,永远铭记,这是人生应有的一种 境界;把仇恨写在沙滩上,淡淡忘掉别人伤害过你,学会宽容,让所有的怨恨随着潮水一去不复返,这也是一种人生境界。
   
学 会倒出水,才能装下更多的水。从毕业那天开始,学会把每天都当成一个新的起点,每一次工作都从零开始。如果你懂得把"归零"当成一种生活的常态, 当成一种优秀的延续,当成一种时刻要做的事情,那么,经过短短几年,你就可以完成自己职业生涯的正确规划与全面超越。
  在职业起步的短短道 路上,想要得到更好、更快、更有益的成长,就必须以归零思维来面对这个世界。不要以大学里的清高来标榜自己,不要觉得自己特别优秀,而是要把自己的姿态放 下,把自己的身架放低,让自己沉淀下来,抱着学习的态度去适应环境、接受挑战。放下"身段"才能提高身价,暂时的俯低终会促成未来的高就。
  年轻人从校园或者从 一个环境进入一个新环境,就要勇于将原来环境里熟悉、习惯、喜欢的东西放下,然后从零开始。我们想在职场上获得成功,首先就要培养适应力。从自然人转化为 单位人是融入职场的基本条件。一个人起点低并不可怕,怕的是境界低。越计较自我,便越没有发展前景;相反,越是主动付出,那么他就越会快速发展。很多今天 取得一定成就的人,在职业生涯的初期都是从零开始,把自己沉淀再沉淀、倒空再倒空、归零再归零,正因为这样,他们的人生才一路高歌,一路飞扬。
  在毕业这几年里,我 们要让过去归零,才不会成为职场上那只背着重壳爬行的蜗牛,才能像天空中的鸟儿那样轻盈地飞翔。请好好品味一下杰克·韦尔奇说过的一句话:"纠正自己的行为,认清自己,从零开始,你将重新走上职场坦途。" 吐故才能纳新,心静才能身凉,有舍才能有得,杯空才能水满,放下才能超 越。
   
归零思维五大表现:心中无我,眼中无钱,念中无他,朝中无人,学无止境。
    年轻人难免带着几分傲气,认为自己无所不能、所向披靡,其实不然,初入职场 的新人还是个"婴儿",正处在从爬到走的成长阶段。在毕业这几年里,一定要让自己逐步培养起学徒 思维、海绵思维、空杯思维,具有这样思维的人心灵总是敞开的,能随时接受启示和一切能激发灵感的东西,他们时刻都能感受到成功女神的召唤.

posted @ 2010-03-29 13:30 王生生 阅读(393) | 评论 (0)编辑 收藏

Memcache函数库是在PECL(PHP Extension Community Library)中,
主要作用是搭建大容量的内存数据的临时存放区域,
在分布式的时候作用体现的非常明显,否则不建议使用。以下為幾個例子,都很簡單。

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could
not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version." ";
?>

<?php
$memcache = new Memcache; $memcache->connect('localhost', 11211) or die ("Could not connect");
print_r($memcache->getStats());
/** * Array * ( * [pid] => 8052 * [uptime] => 9205 * [time] => 1205898428 * [version] => 1.2.5 * [pointer_size] => 32 * [rusage_user] => 0.008000 * [rusage_system] => 0.000000 * [curr_items] => 1 * [total_items] => 17 * [bytes] => 57 * [curr_connections] => 2 * [total_connections] => 15 * [connection_structures] => 3 * [cmd_get] => 9 * [cmd_set] => 23 * [get_hits] => 5 * [get_misses] => 4 * [evictions] => 0 * [bytes_read] => 671 * [bytes_written] => 850 * [limit_maxbytes] => 10485760 * [threads] => 1 * ) */
?>

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$memcache->set( 'name', 'leo', 0, 30);
if(!$memcache->add( 'name', 'susan', 0, 30)){
 echo 'susan is exist';
};
$memcache->replace( 'name', 'lion', 0, 300);
echo $memcache->get( 'name');
$memcache->delete( 'name', 5);
?>

<?php
function _callback_memcache_failure($host, $port) {
 print "memcache '$host:$port' failed";
}
$memcache = new Memcache;
$memcache->addServer('192.168.1.116', 11211);
$memcache->setServerParams('192.168.1.116', 11211, 1, 15, true,'_callback_memcache_failure');
echo $memcache->getServerStatus('192.168.1.116', 11211);
?>


<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$memcache->set('test_item', 8);
$memcache->increment('test_item', 4);
echo $memcache->decrement('test_item', 7);
// 显示 5
?>

Memcach方法說明:
01.Memcache::add — 添加一个值,如果已经存在,则返回false
02.Memcache::addServer — 添加一个可供使用的服务器地址
03.Memcache::close — 关闭一个Memcache对象
04.Memcache::connect — 创建一个Memcache对象
05.memcache_debug — 控制调试功能
06.Memcache::decrement — 对保存的某个key中的值进行减法操作
07.Memcache::delete — 删除一个key值
08.Memcache::flush — 清除所有缓存的数据
09.Memcache::get — 获取一个key值
10.Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计
11.Memcache::getServerStatus — 获取运行服务器的参数
12.Memcache::getStats — 返回服务器的一些运行统计信息
13.Memcache::getVersion — 返回运行的Memcache的版本信息
14.Memcache::increment — 对保存的某个key中的值进行加法操作
15.Memcache::pconnect — 创建一个Memcache的持久连接对象
16.Memcache::replace — R对一个已有的key进行覆写操作
17.Memcache::set — 添加一个值,如果已经存在,则覆写
18.Memcache::setCompressThreshold — 对大于某一大小的数据进行压缩
19.Memcache::setServerParams — 在运行时修改服务器的参数


posted @ 2010-03-23 11:11 王生生 阅读(447) | 评论 (0)编辑 收藏

必须掌握的八个cmd 命令 

一,ping    

  它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它 所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我 们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧,在DOS窗口中键入:ping /? 回车,。所示的帮助画面。在此,我们只掌握一些基本的很有用的参数就可以了(下同)。    

  -t 表示将不间断向目标IP发送数据包,直到我们强迫其停止。试想,如果你使用100M的宽带接入,而目标IP是56K的小猫,那么要不了多久,目标IP就因为承受不了这么多的数据而掉线,呵呵,一次攻击就这么简单的实现了。    

  -l 定义发送数据包的大小,默认为32字节,我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用,会有更好的效果哦。    

  -n 定义向目标IP发送数据包的次数,默认为3次。如果网络速度比较慢,3次对我们来说也浪费了不少时间,因为现在我们的目的仅仅是判断目标IP是否存在,那么就定义为一次吧。    

  说明一下,如果-t 参数和 -n参数一起使用,ping命令就以放在后面的参数为标准,比如"ping IP -t -n 3",虽然使用了-t参数,但并不是一直ping下去,而是只ping 3次。另外,ping命令不一定非得ping IP,也可以直接ping主机域名,这样就可以得到主机的IP。    

  下面我们举个例子来说明一下具体用法。    

  这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒,从这里可以判断网络连接速度的大小。从TTL的返回值可以初步判断被ping主机的操作系统,之所以说"初步判断"是因为这个值是可以修改的。这里TTL=32表示操作系统可能是 win98。 

  (小知识:如果TTL=128,则表示目标主机可能是Win2000;如果TTL=250,则目标主机可能是Unix) 

  至于利用ping命令可以快速查找局域网故障,可以快速搜索最快的QQ服务器,可以对别人进行ping攻击……这些就靠大家自己发挥了。    

二,nbtstat    

  该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接,使用这个命令你可以得到远程主机的NETBIOS信息,比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。    

  -a 使用这个参数,只要你知道了远程主机的机器名称,就可以得到它的NETBIOS信息(下同)。    

  -A 这个参数也可以得到远程主机的NETBIOS信息,但需要你知道它的IP。 

  -n 列出本地机器的NETBIOS信息。    

  当得到了对方的IP或者机器名的时候,就可以使用nbtstat命令来进一步得到对方的信息了,这又增加了我们入侵的保险系数。    

三,netstat 

  这是一个用来查看网络状态的命令,操作简便功能强大。    

  -a 查看本地机器的所有开放端口,可以有效发现和预防木马,可以知道机器所开的服务等信息,如图4。    

  这里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务等。用法:netstat -a IP。 

  -r 列出当前的路由信息,告诉我们本地机器的网关、子网掩码等信息。用法:netstat -r IP。 

四,tracert 

  跟踪路由信息,使用此命令可以查出数据从本地机器传输到目标主机所经过的所有途径,这对我们了解网络布局和结构很有帮助。如图5。    

  这里说明数据从本地机器传输到192.168.0.1的机器上,中间没有经过任何中转,说明这两台机器是在同一段局域网内。用法:tracert IP。    

五,net    

  这个命令是网络命令中最重要的一个,必须透彻掌握它的每一个子命令的用法,因为它的功能实在是太强大了,这简直就是 微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令,键入net /?回车如图6。 

  在这里,我们重点掌握几个入侵常用的子命令。    

  net view    

  使用此命令查看远程主机的所以共享资源。命令格式为net view \IP。   

  net use 

  把远程主机的某个共享资源影射为本地盘符,图形界面方便使用,呵呵。命令格式为net use x: \IP\sharename。上面一个表示把192.168.0.5IP的共享名为magic的目录影射为本地的Z盘。下面表示和192.168.0.7 建立IPC$连接(net use \IP\IPC$ "password" /user:"name"),    

  建立了IPC$连接后,呵呵,就可以上传文件了:copy nc.exe \192.168.0.7\admin$,表示把本地目录下的nc.exe传到远程主机,结合后面要介绍到的其他DOS命令就可以实现入侵了。    

  net start 

  使用它来启动远程主机上的服务。当你和远程主机建立连接后,如果发现它的什么服务没有启动,而你又想利用此服务怎么办?就使用这个命令来启动吧。用法:net start servername,如图9,成功启动了telnet服务。    

  net stop 

  入侵后发现远程主机的某个服务碍手碍脚,怎么办?利用这个命令停掉就ok了,用法和net start同。    

  net user 

  查看和帐户有关的情况,包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的,最重要的,它为我们克隆帐户提供了前提。键入不带参数的net user,可以查看所有用户,包括已经禁用的。下面分别讲解。 

  1,net user abcd 1234 /add,新建一个用户名为abcd,密码为1234的帐户,默认为user组成员。 

  2,net user abcd /del,将用户名为abcd的用户删除。 

  3,net user abcd /active:no,将用户名为abcd的用户禁用。 

  4,net user abcd /active:yes,激活用户名为abcd的用户。 

  5,net user abcd,查看用户名为abcd的用户的情况   

  net localgroup 

  查看所有和用户组有关的信息和进行相关操作。键入不带参数的net localgroup即列出当前所有的用户组。在入侵过程中,我们一般利用它来把某个帐户提升为administrator组帐户,这样我们利用这个帐户 就可以控制整个远程主机了。用法:net localgroup groupname username /add。    

  现在我们把刚才新建的用户abcd加到administrator组里去了,这时候abcd用户已经是超级管理员了,呵呵,你可以再使用net user abcd来查看他的状态,和图10进行比较就可以看出来。但这样太明显了,网管一看用户情况就能漏出破绽,所以这种方法只能对付菜鸟网管,但我们还得知 道。现在的手段都是利用其他工具和手段克隆一个让网管看不出来的超级管理员,这是后话。有兴趣的朋友可以参照《黑客防线》第30期上的《由浅入深解析隆帐 户》一文。    

  net time 

  这个命令可以查看远程主机当前的时间。如果你的目标只是进入到远程主机里面,那么也许就用不到这个命令了。但简单的入侵成功了,难道只是看看 吗?我们需要进一步渗透。这就连远程主机当前的时间都需要知道,因为利用时间和其他手段(后面会讲到)可以实现某个命令和程序的定时启动,为我们进一步入 侵打好基础。用法:net time \IP。    

六,at 

这个命令的作用是安排在特定日期或时间执行某个特定的命令和程序(知道net time的重要了吧?)。当我们知道了远程主机的当前时间,就可以利用此命令让其在以后的某个时间(比如2分钟后)执行某个程序和命令。用法:at time command \computer。    

  表示在6点55分时,让名称为a-01的计算机开启telnet服务(这里net start telnet即为开启telnet服务的命令)。    

七,ftp    

  大家对这个命令应该比较熟悉了吧?网络上开放的ftp的主机很多,其中很大一部分是匿名的,也就是说任何人都可以登陆上去。现在如果你扫到了一 台开放 ftp服务的主机(一般都是开了21端口的机器),如果你还不会使用ftp的命令怎么办?下面就给出基本的ftp命令使用方法。 

  首先在命令行键入ftp回车,出现ftp的提示符,这时候可以键入"help"来查看帮助(任何DOS命令都可以使用此方法查看其帮助)。    

  大家可能看到了,这么多命令该怎么用?其实也用不到那么多,掌握几个基本的就够了。    

  首先是登陆过程,这就要用到open了,直接在ftp的提示符下输入"open 主机IP ftp端口"回车即可,一般端口默认都是21,可以不写。接着就是输入合法的用户名和密码进行登陆了,这里以匿名ftp为例介绍。    

  用户名和密码都是ftp,密码是不显示的。当提示**** logged in时,就说明登陆成功。这里因为是匿名登陆,所以用户显示为Anonymous。    

  接下来就要介绍具体命令的使用方法了。    

  dir 跟DOS命令一样,用于查看服务器的文件,直接敲上dir回车,就可以看到此ftp服务器上的文件。 

  cd 进入某个文件夹。 

  get 下载文件到本地机器。 

  put 上传文件到远程服务器。这就要看远程ftp服务器是否给了你可写的权限了,如果可以,呵呵,该怎么 利用就不多说了,大家就自由发挥去吧。 

  delete 删除远程ftp服务器上的文件。这也必须保证你有可写的权限。 

  bye 退出当前连接。 

  quit 同上。 

八,telnet 

  功能强大的远程登陆命令,几乎所有的入侵者都喜欢用它,屡试不爽。为什么?它操作简单,如同使用自己的机器一样,只要你熟悉DOS命令,在成功 以 administrator身份连接了远程机器后,就可以用它来干你想干的一切了。下面介绍一下使用方法,首先键入telnet回车,再键入help查看 其帮助信息。    

  然后在提示符下键入open IP回车,这时就出现了登陆窗口,让你输入合法的用户名和密码,这里输入任何密码都是不显示的。    

  当输入用户名和密码都正确后就成功建立了telnet连接,这时候你就在远程主机上具有了和此用户一样的权限,利用DOS命令就可以实现你想干的事情了。这里我使用的超级管理员权限登陆的。   

  到这里为止,网络DOS命令的介绍就告一段落了,这里介绍的目的只是给菜鸟网管一个印象,让其知道熟悉和掌握网络DOS命令的重要性。其实和网 络有关的DOS命令还远不止这些,这里只是抛砖引玉,希望能对广大菜鸟网管有所帮助。学好DOS对当好网管有很大的帮助,特别的熟练掌握了一些网络的 DOS命令。 

  另外大家应该清楚,任何人要想进入系统,必须得有一个合法的用户名和密码(输入法漏洞差不多绝迹了吧),哪怕你拿到帐户的只有一个很小的权限,你也可以利用它来达到最后的目的。所以坚决消灭空口令,给自己的帐户加上一个强壮的密码,是最好的防御弱口令入侵的方法。 

  最后,由衷的说一句,培养良好的安全意识才是最重要的。 

========================================= 

开始→运行→命令集锦 

winver---------检查Windows版本 

wmimgmt.msc----打开windows管理体系结构(WMI) 

wupdmgr--------windows更新程序 

wscript--------windows脚本宿主设置 

write----------写字板 

winmsd---------系统信息 

wiaacmgr-------扫描仪和照相机向导 

winchat--------XP自带局域网聊天 

mem.exe--------显示内存使用情况 

Msconfig.exe---系统配置实用程序 

mplayer2-------简易widnows media player 

mspaint--------画图板 

mstsc----------远程桌面连接 

mplayer2-------媒体播放机 

magnify--------放大镜实用程序 

mmc------------打开控制台 

mobsync--------同步命令 

dxdiag---------检查DirectX信息 

drwtsn32------ 系统医生 

devmgmt.msc--- 设备管理器 

dfrg.msc-------磁盘碎片整理程序 

diskmgmt.msc---磁盘管理实用程序 

dcomcnfg-------打开系统组件服务 

ddeshare-------打开DDE共享设置 

dvdplay--------DVD播放器 

net stop messenger-----停止信使服务 

net start messenger----开始信使服务 

notepad--------打开记事本 

nslookup-------网络管理的工具向导 

ntbackup-------系统备份和还原 

narrator-------屏幕"讲述人" 

ntmsmgr.msc----移动存储管理器 

ntmsoprq.msc---移动存储管理员操作请求 

netstat -an----(TC)命令检查接口 

syncapp--------创建一个公文包 

sysedit--------系统配置编辑器 

sigverif-------文件签名验证程序 

sndrec32-------录音机 

shrpubw--------创建共享文件夹 

secpol.msc-----本地安全策略 

syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码 

services.msc---本地服务设置 

Sndvol32-------音量控制程序 

sfc.exe--------系统文件检查器 

sfc /scannow---windows文件保护 

tsshutdn-------60秒倒计时关机命令 

tourstart------xp简介(安装完成后出现的漫游xp程序) 

taskmgr--------任务管理器 

eventvwr-------事件查看器 

eudcedit-------造字程序 

explorer-------打开资源管理器 

packager-------对象包装程序 

perfmon.msc----计算机性能监测程序 

progman--------程序管理器 

regedit.exe----注册表 

rsop.msc-------组策略结果集 

regedt32-------注册表编辑器 

rononce -p ----15秒关机 

regsvr32 /u *.dll----停止dll文件运行 

regsvr32 /u zipfldr.dll------取消ZIP支持 

cmd.exe--------CMD命令提示符 

chkdsk.exe-----Chkdsk磁盘检查 

certmgr.msc----证书管理实用程序 

calc-----------启动计算器 

charmap--------启动字符映射表 

cliconfg-------SQL SERVER 客户端网络实用程序 

Clipbrd--------剪贴板查看器 

conf-----------启动netmeeting 

compmgmt.msc---计算机管理 

cleanmgr-------垃圾整理 

ciadv.msc------索引服务程序 

osk------------打开屏幕键盘 

odbcad32-------ODBC数据源管理器 

oobe/msoobe /a----检查XP是否激活 

lusrmgr.msc----本机用户和组 

logoff---------注销命令 

iexpress-------木马捆绑工具,系统自带 

Nslookup-------IP地址侦测器 

fsmgmt.msc-----共享文件夹管理器 

utilman--------辅助工具管理器 

gpedit.msc-----组策略


转自 http://blog.csdn.net/ccsbb/archive/2010/01/27/5261954.aspx

posted @ 2010-02-01 11:35 王生生 阅读(416) | 评论 (0)编辑 收藏

mysql> UPDATE EACONTACTGROUPS A

SET GROUPNAME=(SELECT CONCAT(B.GROUPNAME,'-',A.GROUPNAME) FROM EACONTACTGROUPS B WHERE B.CORPID=A.CORPID AND B.USERID=A.USERID AND B.GROUPID=A.PARENTGROUPID)

WHERE A.PARENTGROUPID IS NOT NULL;

ERROR 1093 (HY000): You can't specify target table 'A' for update in FROM clause

上面是目前MYSQL5.0仍然有的限制,文档中说:

  • In general, you cannot modify a table and select from the same table in a subquery. For example, this limitation applies to statements of the following forms:

    DELETE FROM t WHERE ... (SELECT ... FROM t ...);UPDATE t ... WHERE col = (SELECT ... FROM t ...);{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);

    Exception: The preceding prohibition does not apply if you are using a subquery for the modified table in the

    FROM

    clause. Example:

    UPDATE t ... WHERE col = (SELECT (SELECT ... FROM t...) AS _t ...);

    Here the prohibition does not apply because a subquery in the

    FROM

    clause is materialized as a temporary table, so the relevant rows in

    t

    have already been selected by the time the update to

    t

    takes place. 依据文档,改成下面的样子就行了:

    mysql> UPDATE EACONTACTGROUPS A

  • SET GROUPNAME=(SELECT CONCAT(B.GROUPNAME,'-',A.GROUPNAME) FROM ( SELECT GROUPNAME,CORPID,USERID,GROUPID,PARENTGROUPID FROM EACONTACTGROUPS) B

    WHERE B.CORPID=A.CORPID AND B.USERID=A.USERID AND B.GROUPID=A.PARENTGROUPID)

    WHERE A.PARENTGROUPID IS NOT NULL;

    Query OK, 16 rows affected (0.01 sec)

    Rows matched: 16 Changed: 16 Warnings: 0

    注:今天写一个删除语句时找到的一点资料.解决了一个简单的删除语句.呵呵,以后注意了,

    原句:delete  from menu_item  where parent_id =(select menu_item_id from menu_item where menu_data like '%manageVendors%');

    修改后:delete  from menu_item  where parent_id =(select temp.menu_item_id from (select m.menu_item_id,m.menu_data from menu_item m) temp where temp.menu_data like '%manageVendors%');

    posted @ 2010-01-28 12:56 王生生 阅读(3843) | 评论 (0)编辑 收藏

    bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )

          setcookie() 定义一个和其余的 HTTP 标头一起发送的 cookie。和其它标头一样,cookie 必须在脚本的任何其它输出之前发送(这是协议限制)。这需要将本函数的调用放到任何输出之前,包括 <html> 和 <head> 标签以及任何空格。如果在调用 setcookie() 之前有任何输出,本函数将失败并返回 FALSE。如果 setcookie() 函数成功运行,将返回 TRUE。这并不说明用户是否接受了 cookie。

         注: 自 PHP 4 起,可以用输出缓存来在调用本函数前输出内容,代价是把所有向浏览器的输出都缓存在服务器,直到下命令发送它们。可以在代码中使用 ob_start() 及 ob_end_flush() 来实现这样的功能,或者通过修改 php.ini 中的 output_buffering 配置选项来实现,也可以通过修改服务器配置文件来实现。

          除了 name 外,其它所有参数都是可选的。可以用空字符串("")替换某参数以跳过该参数。因为参数 expire 是整型,不能用空字符串掉过,可以用零(0)来代替 。下面的说明对 setcookie() 的每一个参数都进行了解释。可以对照 Netscape cookie 规范以了解 setcookie() 的每一个参数的细节以及通过阅读 RFC 2965 了解 HTTP cookie 的工作方式。

    1. setcookie() 参数详解
    参数 说明 举例
    name Cookie 的名字:   使用 $_COOKIE['cookiename'] 调用名为 cookiename 的 cookie。
    value Cookie 的值:此值保存在客户端,不要用来保存敏感数据。   假定 name 是 'cookiename',可以通过 $_COOKIE['cookiename'] 取得其值。
    expire Cookie 过期的时间:这是个 Unix 时间戳,即从 Unix 纪元开始的秒数。换而言之,通常用 time() 函数再加上秒数来设定 cookie 的失效期。或者用 mktime()来实现。   time()+60*60*24*30 将设定 cookie 30 天后失效。如果未设定,cookie 将会在会话结束后(一般是浏览器关闭)失效。
    path Cookie 在服务器端的有效路径:   如果该参数设为 '/' 的话,cookie 就在整个 domain 内有效,如果设为 '/foo/',cookie 就只在 domain 下的 /foo/ 目录及其子目录内有效,例如 /foo/bar/。默认值为设定 cookie 的当前目录。
    domain 该 cookie 有效的域名:   要使 cookie 能在如 example.com 域名下的所有子域都有效的话,该参数应该设为 '.example.com'。虽然 . 并不必须的,但加上它会兼容更多的浏览器。如果该参数设为 www.example.com 的话,就只在 www 子域内有效。细节见 Cookie 规范中的 tail matching。
    secure 指明: cookie 是否仅通过安全的 HTTPS 连接传送。当设成 TRUE 时,cookie 仅在安全的连接中被设置。默认值为 FALSE。   0 或 1

          当 cookie 被设置后,便可以在其它页面通过 $_COOKIE 或 $HTTP_COOKIE_VARS 数组取得其值。需要注意的是,autoglobals 的 $_COOKIE 形式适用于 PHP 4.1.0 或更高版本。而 $HTTP_COOKIE_VARS 则从 PHP 3 起就可以使用。Cookie 的值也会被保存到 $_REQUEST 数组中。

         注: 如果 PHP 的选项 register_globals 被设为 on 的话,cookie 的值仍然会被斌到变量内。在下面的例子中,$TestCookie 会被注册,但是仍然推荐使用 $_COOKIE 数组。

    常见缺陷:

         *       Cookies 不会在设置它的本页生效,要测试一个 cookie 是否被成功的设定,可以在其到期之前通过另外一个页面来访问其值。过期时间是通过参数 expire 来设置的。可以简单地使用 print_r($_COOKIE); 来调试现有的 cookies。

         *       Cookie 必须用和设定时的同样的参数才能删除。如果其值一个空字符串,或者是 FALSE,并且其它的参数都和前一次调用 setcookie 时相同,那么所指定名称的 cookie 将会在远程客户端被删除。

         *       由于把 cookie 的值设为 FALSE 会使客户端尝试删除这个 cookie,所以要在 cookie 上保存 TRUE 或 FALSE 时不应该直接使用 boolean 值,而应该用 0 来表示 FALSE,用 1 来表示 TRUE

         *       可以把 cookie 的名称设置成一个数组,但是数组 cookie 中的每个元素的值将会被单独保存在用户的系统中。考虑使用 explode() 函数用多个名称和值设定一个 cookie。不推荐将 serialize() 用于此目的,因为它可能会导致一个安全漏洞。

            在 PHP 3 中,在同一个 PHP 脚本中多次使用 setcookie() 来设置 cookie,将会按照倒序的方式来分别执行,如果想要在插入另外一个 cookie 之前删除一个 cookie,要把插入放到删除之前。自 PHP 4 起,多次调用 setcookie() 则是按照顺序来执行的。

    下面一些例子说明了如何发送 cookie:

    例子 1. setcookie() 发送例子
    $value = 'something from somewhere';

    setcookie("TestCookie", $value);
    setcookie("TestCookie", $value,time()+3600);   /* expire in 1 hour */
    setcookie("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);

    注意 cookie 中值的部分在发送的时候会被自动用 urlencode 编码并在接收到的时候被自动解码并把值赋给与自己同名的 cookie 变量。如果不想这样并且在使用 PHP 5 的话,可以用 setrawcookie() 来代替。下面这个简单的例子可以得到刚才所设定的 cookie 的值:

    <?php
    // 输出单独的 cookie
    echo $_COOKIE["TestCookie"];
    echo $HTTP_COOKIE_VARS["TestCookie"];

    // 另一个调试的方法就是输出所有的 cookie
    print_r($_COOKIE);
    ?>

          要删除 cookie 需要确保它的失效期是在过去,才能触发浏览器的删除机制。下面的例子说明了如何删除刚才设置的 cookie:

    例子 2. setcookie() 删除例子
    // 将过期时间设为一小时前
    setcookie("TestCookie", "", time() - 3600);
    setcookie("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);

          也可以通过在 cookie 名称中使用数组符号来设定数组 cookie,可以设定多个 cookie 作为数组单元,在脚本提取 cookie 时所有的值都放在一个数组中:

    例子 3. setcookie() 中使用数组的例子
    <?php
    // 设定 cookie
    setcookie("cookie[three]", "cookiethree");
    setcookie("cookie[two]", "cookietwo");
    setcookie("cookie[one]", "cookieone");

    // 刷新页面后,显示出来
    if (isset($_COOKIE['cookie'])) {
        foreach ($_COOKIE['cookie'] as $name => $value) {
            echo "$name : $value <br />\n";
        }
    }
    ?>

    上例将输出:

    three : cookiethree
    two : cookietwo
    one : cookieone

         注: 下面的一些 RFC 也具参考价值:RFC 2109 和 RFC 2695。

         注意 expire 参数的接受的是 Unix 时间戳,而不是日期格式 Wdy, DD-Mon-YYYY HH:MM:SS GMT,这是因为 PHP 在内部进行了转换。

         expire 是与客户端的时间相比较,和服务器时间可能不同。

         注: 向 Microsoft Internet Explorer 4 Service Pack 1 不能正确处理设定了 path 的 cookie。

         Netscape Communicator 4.05 及 Microsoft Internet Explorer 3.x 不能正确处理没有设定 path 和 time 的 cookie。

    参见 header(),setrawcookie()

    posted @ 2009-12-31 16:22 王生生 阅读(652) | 评论 (0)编辑 收藏

    方法主要有三种

    转换函数、强制类型转换、利用js变量弱类型转换。

    1. 转换函数

    js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。

    在判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串。parseInt()方法首先查看位置0处的字符, 判断它是否是个有效数字;如果不是,该方法将返回NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样的测试。 这一过程将持续到发现非有效数字的字符为止,此时parseInt()将把该字符之前的字符串转换成数字。

    例如,如果要把字符串 "1234blue "转换成整数,那么parseInt()将返回1234,因为当它检测到字符b时,就会停止检测过程。字符串中包含的数字字面量会被正确转换为数字,因此 字符串 "0xA "会被正确转换为数字10。不过,字符串 "22.5 "将被转换成22,因为对于整数来说,小数点是无效字符。一些示例如下:

    parseInt("1234blue");   //returns   1234
    parseInt("0xA");   //returns   10
    parseInt("22.5");   //returns   22
    parseInt("blue");   //returns   NaN

    parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,所以要解析十六进制的值,需如下调用parseInt()方法:
    parseInt("AF",   16);   //returns   175
    当然,对二进制、八进制,甚至十进制(默认模式),都可以这样调用parseInt()方法:
    parseInt("10",   2);   //returns   2
    parseInt("10",   8);   //returns   8
    parseInt("10",   10);   //returns   10
    如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:
    parseInt("010");   //returns   8
    parseInt("010",   8);   //returns   8
    parseInt("010",   10);   //returns   10
    在这段代码中,两行代码都把字符串 "010 "解析成了一个数字。第一行代码把这个字符串看作八进制的值,解析它的方式与第二行代码(声明基数为8)相同。最后一行代码声明基数为10,所以iNum3最后等于10。

    parseFloat()方法与parseInt()方法的处理方式相似,从位置0开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字符之前 的字符串转换成数字。不过,对于这个方法来说,第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的,parseFloat() 方法会把这个小数点之前的字符串转换成数字。这意味着字符串 "22.34.5 "将被解析成22.34。
    使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,而不能用八进制形式或十六进制形式。该
    方法会忽略前导0,所以八进制数0908将被解析为908。对于十六进制数0xA,该方法将返回NaN,因为在浮点数中,x不是有效字符。此外,parseFloat()也没有基模式。

    下面是使用parseFloat()方法的示例:
    parseFloat("1234blue");   //returns   1234.0
    parseFloat("0xA");   //returns   NaN
    parseFloat("22.5");   //returns   22.5
    parseFloat("22.34.5");   //returns   22.34
    parseFloat("0908");   //returns   908
    parseFloat("blue");   //returns   NaN

    2. 强制类型转换

    还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
    ECMAScript中可用的3种强制类型转换如下:
    Boolean(value)——把给定的值转换成Boolean型;
    Number(value)——把给定的值转换成数字(可以是整数或浮点数);
    String(value)——把给定的值转换成字符串。
    用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
    当要转换的值是至少有一个字符的字符串、非0数字或对象(下一节将讨论这一点)时,Boolean()函数将返回true。如果该值是空字符串、数字0、#ff0000或null,它将返回false。

    可以用下面的代码段测试Boolean型的强制类型转换。

    Boolean("");   //false   –   empty   string
    Boolean("hi");   //true   –   non-empty   string
    Boolean(100);   //true   –   non-zero   number
    Boolean(null);   //false   -   null
    Boolean(0);   //false   -   zero
    Boolean(new   Object());   //true   –   object

    Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。还记得 吗,parseInt()和parseFloat()方法只转换第一个无效字符之前的字符串,因此 "4.5.6 "将被转换为 "4.5 "。用Number()进行强制类型转换, "4.5.6 "将返回NaN,因为整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number()将判断是调用parseInt()方法还是调用 parseFloat()方法。下表说明了对不同的值调用Number()方法会发生的情况:

    用  法  结  果
    Number(false)  0
    Number(true)  1
    Number(undefined) NaN
    Number(null)  0
    Number( "5.5 ")  5.5
    Number( "56 ")  56
    Number( "5.6.7 ") NaN
    Number(new   Object())  NaN
    Number(100)  100 

    最后一种强制类型转换方法String()是最简单的,因为它可把任何值转换成字符串。要执行这种强制类型转换,只需要调用作为参数传递进来的值的 toString()方法,即把1转换成   "1 ",把true转换成 "true ",把false转换成 "false ",依此类推。强制转换成字符串和调用toString()方法的唯一不同之处在于,对null或undefined值强制类型转换可以生成字符串而不引 发错误:

    var   s1   =   String(null);   //"null"
    var   oNull   =   null;
    var   s2   =   oNull.toString();   //won’t   work,   causes   an   error

    3. 利用js变量弱类型转换

    举个小例子,一看,就会明白了。
    <script>
    var   str= '012.345 ';
    var   x   =   str-0;
    x   =   x*1;
    </script>

    上例利用了js的弱类型的特点,只进行了算术运算,实现了字符串到数字的类型转换,不过这个方法还是不推荐的。

    posted @ 2009-12-21 18:20 王生生 阅读(2294) | 评论 (0)编辑 收藏

        1、你以为最酸的感觉是吃醋吗?不是,最酸的感觉是没权吃醋。
    2、低头要有勇气,抬头要有底气。
    3、上天决定了谁是你的亲戚,幸运的是在选择朋友方面它给你留了余地。
    4、人生就像一杯茶,不会苦一辈子,但总会苦一阵子。
    5、不要见一个爱一个,爱的太多,你的爱就要贬值。
    6、当我们搬开别人架下的绊脚石时,也许恰恰是在为自己铺路。  7、不是每句 “ 对不起 ” ,都能换来 “ 没关系 ” 。
    8、世界上只有想不通的人,没有走不通的路。
    9、地球是运动的,一个人不会永远处在倒霉的位置。
    10、在事实面前,我们的想象力越发达,后果就越不堪设想。
    11、当别人开始说你是疯子的时候,你离成功就不远了 ……
    12、理想和现实总是有差距的,幸好还有差距,不然,谁还稀罕理想?  
    13、说有上辈子的人是在骗自己;说有下辈子的人是在骗别人。
    14、任何人都可以变得狠毒,只要你尝试过嫉妒。
    15、常常告诫自己不要在一棵树上吊死,结果 …… 在树林里迷路了。
    16、爱情就像攥在手里的沙子,攥的越紧,流失的越快。
    17、人生有两大悲剧:一个是得不到想要的东西,另一个是得到了不想要的东西。
    18、成熟不是心变老,而是眼泪在眼里打转却还保持微笑。  
    19、问候不一定要郑重其事,但一定要真诚感人。
    20、同样的一瓶饮料,便利店里 2 块钱,五星饭店里 60 块,很多的时候,一个人的价值取决于所在的位置。
    21、真坏人并不可怕,可怕的是假好人。
    22、把不忙不闲的工作做的出色,把不咸不淡的生活过得精彩。
    23、忙碌是一种幸福,让我们没时间体会痛苦;奔波是一种快乐,让我们真实地感受生活;疲惫是一种享受,让我们无暇空虚。
    24、就算不快乐也不要皱眉,因为你永远不知道谁会爱上你的笑容。  
    25、当大部分人都在关注你飞的高不高时,只有少部分人关心你飞的累不累,这就是友情。
    26、天使之所以会飞,是因为她们把自己看得很轻 ……
    27、试金可以用火,试女人可以用金,试男人可以用女人。
    28、喜欢一个人,就是在一起很开心;爱一个人,就是即使不开心,也想在一起。
    29、幽默就是一个人想哭的时候还有笑话的兴致。
    30、人之所以活得累,是因为放不下架子,撕不开面子,解不开情节。  
    31、漂亮只能为别人提供眼福,却不一定换到幸福。
    32、美丽让男人停下,智慧让男人留下。
    33、如果你为自己定的所有目标都已达到,那么说明你定的目标还不够远大。
    34、生活可以将就,生活也可以讲究。
    35、女人的眼泪是没用的液体,但你让女人流泪说明你很没用。
    36、付出真心,才会得到真心,却可能伤的彻底;保持距离,才能保护自己,却注定永远寂寞。
    37、说真话的最大好处就是你不必记得你都说些什么。
    38、有时候,不是对方不在乎你,而是你把对方看的太重。
    posted @ 2009-12-03 21:24 王生生 阅读(381) | 评论 (0)编辑 收藏

         摘要: Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal";...  阅读全文
    posted @ 2009-11-24 13:38 王生生 阅读(253) | 评论 (0)编辑 收藏

    急事,慢慢的说;大事,清楚的说;小事,幽默的说;没把握的事,谨慎的说; 没发生的事,不要胡说; 做不到的事,别乱说; 伤害人的事,不能说; 讨厌的事,对事不对人的说; 开心的事,看场合说; 伤心的事,不要见人就说; 别人的事,小心的说; 自己的事,听听自己的心怎么说; 现在的事,做了再说。
    posted @ 2009-11-22 18:39 王生生 阅读(203) | 评论 (0)编辑 收藏

    1 echo 和 @
    回显命令
    @                        #关闭单行回显
    echo off                 #从下一行开始关闭回显
    @echo off                #从本行开始关闭回显。一般批处理第一行都是这个
    echo on                  #从下一行开始打开回显
    echo                     #显示当前是 echo off 状态还是 echo on 状态
    echo.                    #输出一个”回车换行”,空白行
                                #(同echo, echo; echo+ echo[ echo] echo/ echo)


    2 errorlevel
    echo %errorlevel%
    每个命令运行结束,可以用这个命令行格式查看返回码
    默认值为0,一般命令执行出错会设 errorlevel 为1


    3 dir
    显示文件夹内容
    dir                     #显示当前目录中的文件和子目录
    dir /a                  #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
    dir c: /a:d             #显示 C 盘当前目录中的目录
    dir c: /a:-d            #显示 C 盘根目录中的文件
    dir c: /b/p            #/b只显示文件名,/p分页显示
    dir *.exe /s            #显示当前目录和子目录里所有的.exe文件


    4 cd
    切换目录
    cd                     #进入根目录
    cd                      #显示当前目录
    cd /d d:sdk            #可以同时更改盘符和目录


    5 md
    创建目录
    md d:abc             #如果 d:a 不存在,将会自动创建中级目录
    #如果命令扩展名被停用,则需要键入 mkdir abc。

    6 rd
    删除目录
    rd abc                  #删除当前目录里的 abc 子目录,要求为空目录
    rd /s/q d:temp         #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式


    7 del
    删除文件
    del d:test.txt         #删除指定文件,不能是隐藏、系统、只读文件
    del /q/a/f d:temp*.*
    删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
    del /q/a/f/s d:temp*.*
    删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录


    8 ren
    重命名命令
    ren d:temp tmp         #支持对文件夹的重命名

    9 cls
    清屏

    10 type
    显示文件内容
    type c:boot.ini        #显示指定文件的内容,程序文件一般会显示乱码
    type *.txt              #显示当前目录里所有.txt文件的内容


    11 copy
    拷贝文件
    copy c:test.txt d:test.bak
    复制 c:test.txt 文件到 d: ,并重命名为 test.bak
    copy con test.txt
    从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
    con代表屏幕,prn代表打印机,nul代表空设备
    copy 1.txt + 2.txt 3.txt
    合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
    如果不指定 3.txt ,则保存到 1.txt
    copy test.txt +
    复制文件到自己,实际上是修改了文件日期


    12 title
    设置cmd窗口的标题
    title 新标题            #可以看到cmd窗口的标题栏变了


    13 ver
    显示系统版本

    14 label 和 vol
    设置卷标
    vol                     #显示卷标
    label                   #显示卷标,同时提示输入新卷标
    label c:system          #设置C盘的卷标为 system

    15 pause
    暂停命令

    16 rem 和 ::
    注释命令
    注释行不执行操作

    17 date 和 time
    日期和时间
    date              #显示当前日期,并提示输入新日期,按"回车"略过输入
    date/t            #只显示当前日期,不提示输入新日期
    time              #显示当前时间,并提示输入新时间,按"回车"略过输入
    time/t            #只显示当前时间,不提示输入新时间


    18 goto 和 :
    跳转命令
    :label            #行首为:表示该行是标签行,标签行不执行操作
    goto label        #跳转到指定的标签那一行


    19 find (外部命令)
    查找命令
    find "abc" c:test.txt
    在 c:test.txt 文件里查找含 abc 字符串的行
    如果找不到,将设 errorlevel 返回码为1
    find /i “abc” c:test.txt
    查找含 abc 的行,忽略大小写
    find /c "abc" c:test.txt
    显示含 abc 的行的行数


    20 more (外部命令)
    逐屏显示
    more c:test.txt        #逐屏显示 c:test.txt 的文件内容


    21 tree
    显示目录结构
    tree d:                #显示D盘的文件目录结构


    22 &
    顺序执行多条命令,而不管命令是否执行成功

    23 && 和 ||
    &&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
    | | 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

    find "ok" c:test.txt && echo 成功
    如果找到了"ok"字样,就显示"成功",找不到就不显示

    find "ok" c:test.txt || echo 不成功
    如果找不到"ok"字样,就显示"不成功",找到了就不显示

    24 |
    管道命令
    dir *.* /s/a | find /c ".exe"
    管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
    该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
    type c:test.txt|more
    这个和 more c:test.txt 的效果是一样的


    25 > 和 >> 和 ^
    输出重定向命令
    > 清除文件中原有的内容后再写入
    >> 追加内容到文件末尾,而不会清除原有的内容
    主要将本来显示在屏幕上的内容输出到指定文件中
    指定文件如果不存在,则自动生成该文件
    type c:test.txt >prn
    屏幕上不显示文件内容,转向输出到打印机
    echo hello world>con
    在屏幕上显示hello world,实际上所有输出都是默认 >con 的
    copy c:test.txt f: >nul
    拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
    copy c:test.txt f: >nul 2>nul
    不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
    ^的作用是把命令符号转意成文本符号,它也可以转意自己,如:
    echo ^^W ^> ^W>c:test.txt
    生成的文件内容为 ^W > W
    ^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
    set /p=^|
    |是管道命令,要显示|,就要加^

    26 '' 和 ""
    单引号的作用是,将多个命令组成的复合语句当成一条语句
    双引号的表示其内部内容为文本符号,它也可以连接两个或多个以空格间隔的文本符号
    for /f "tokens=15" %%i in ('ipconfig ^| find /i "ip address"') do set ip=%%i
    ipconfig为语句一,find /i "ip address"为语句二,用单引号合为一条语句

    IF /I "%c%"=="1" ECHO %c%
    set p="I Love You!!"
    find if set

    27 <
    从文件中获得输入信息,而不是从屏幕上
    一般用于 date time label 等需要等待输入的命令
    @echo off
    echo 2005-05-01>temp.txt
    date <temp.txt
    del temp.txt
    这样就可以不等待输入直接修改当前日期

    28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
    命令行传递给批处理的参数
    %0 批处理文件本身
    %1 第一个参数
    %9 第九个参数
    %* 从第一个参数开始的所有参数

    批参数(%n)的替代已被增强。您可以使用以下语法:

            %~1             - 删除引号("),扩充 %1
            %~f1            - 将 %1 扩充到一个完全合格的路径名
            %~d1            - 仅将 %1 扩充到一个驱动器号
            %~p1            - 仅将 %1 扩充到一个路径
            %~n1            - 仅将 %1 扩充到一个文件名
            %~x1            - 仅将 %1 扩充到一个文件扩展名
            %~s1            - 扩充的路径指含有短名
            %~a1            - 将 %1 扩充到文件属性
            %~t1            - 将 %1 扩充到文件的日期/时间
            %~z1            - 将 %1 扩充到文件的大小
            %~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
                          扩充到找到的第一个完全合格的名称。如果环境
                          变量名未被定义,或者没有找到文件,此组合键会
                          扩充到空字符串

    可以组合修定符来取得多重结果:

           %~dp1           - 只将 %1 扩展到驱动器号和路径
           %~nx1           - 只将 %1 扩展到文件名和扩展名
           %~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
                          并扩展到找到的第一个文件的驱动器号和路径。
           %~ftza1         - 将 %1 扩展到类似 DIR 的输出行。
    可以参照 call/? 或 for/? 看出每个参数的含意
    echo load "%%1" "%%2">c:test.txt
    生成的文件内容为 load "%1" "%2"
    批处理文件里,用这个格式把命令行参数输出到文件

    29 if
    判断命令
    if "%1"=="/a" echo 第一个参数是/a
    if /i "%1" equ "/a" echo 第一个参数是/a
    /i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见:
        EQU - 等于
        NEQ - 不等于
        LSS - 小于
        LEQ - 小于或等于
        GTR - 大于
        GEQ - 大于或等于
    if exist c:test.bat echo 存在c:test.bat文件
    if not exist c:windows (
            echo 不存在c:windows文件夹
            )
    if exist c:test.bat (
            echo 存在c:test.bat
            ) else (
            echo 不存在c:test.bat
            )

    30 setlocal 和 endlocal
    设置”命令扩展名”和”延缓环境变量扩充”
    SETLOCAL ENABLEEXTENSIONS                #启用"命令扩展名"
    SETLOCAL DISABLEEXTENSIONS               #停用"命令扩展名"
    SETLOCAL ENABLEDELAYEDEXPANSION          #启用"延缓环境变量扩充"
    SETLOCAL DISABLEDELAYEDEXPANSION         #停用"延缓环境变量扩充"
    ENDLOCAL                                 #恢复到使用SETLOCAL语句以前的状态
    “命令扩展名”默认为启用
    “延缓环境变量扩充”默认为停用
    批处理结束系统会自动恢复默认值
    可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
    序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
    保程序能在其它系统上正确运行
    "延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程

    31 set
    设置变量
    引用变量可在变量名前后加 % ,即 %变量名%
    set                        #显示目前所有可用的变量,包括系统变量和自定义的变量
    echo %SystemDrive%         #显示系统盘盘符。系统变量可以直接引用
    set p                      #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
    set p=aa1bb1aa2bb2         #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
    echo %p%                   #显示变量p代表的字符串,即aa1bb1aa2bb2
    echo %p:~6%                #显示变量p中第6个字符以后的所有字符,即aa2bb2
    echo %p:~6,3%              #显示第6个字符以后的3个字符,即aa2
    echo %p:~0,3%              #显示前3个字符,即aa1
    echo %p:~-2%               #显示最后面的2个字符,即b2
    echo %p:~0,-2%             #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
    echo %p:aa=c%              #用c替换变量p中所有的aa,即显示c1bb1c2bb2
    echo %p:aa=%               #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
    echo %p:*bb=c%             #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
    set p=%p:*bb=c%            #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
    set /a p=39                #设置p为数值型变量,值为39
    set /a p=39/10             #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
    set /a p=p/10              #用 /a 参数时,在 = 后面的变量可以不加%直接引用
    set /a p=”1&0″             #”与”运算,要加引号。其它支持的运算符参见set/?
    set p=                     #取消p变量
    set /p p=请输入
    屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
    注意这条可以用来取代 choice 命令
    注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
    @echo off
    set p=aaa
    if %p%==aaa (
            echo %p%
            set p=bbb
            echo %p%
            )
    结果将显示
    aaa
    aaa
    因为在读取 if 语句时已经将所有 %p% 替换为aaa
    这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
    可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
    set p=aaa
    if %p%==aaa (
            echo %p%
            set p=bbb
            echo !p!
            )
    ENDLOCAL
    结果将显示
    aaa
    bbb
    还有几个动态变量,运行 set 看不到
    %CD%                      #代表当前目录的字符串
    %DATE%                    #当前日期
    %TIME%                    #当前时间
    %RANDOM%                  #随机整数,介于0~32767
    %ERRORLEVEL%              #当前 ERRORLEVEL 值
    %CMDEXTVERSION%           #当前命令处理器扩展名版本号
    %CMDCMDLINE%              #调用命令处理器的原始命令行
    可以用echo命令查看每个变量值,如 echo %time%
    注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到

    32 start
    批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令

    33 call
    批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
    有时有的应用程序用start调用出错的,也可以call调用

    34 choice (外部命令)
    选择命令
    让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
    win98里是choice.com
    win2000pro里没有,可以从win98里拷过来
    win2003里是choice.exe
    choice /N /C y /T 5 /D y>nul
    延时5秒


    35 assoc 和 ftype
    文件关联
    assoc 设置'文件扩展名'关联,关联到'文件类型'
    ftype 设置'文件类型'关联,关联到'执行程序和参数'
    当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
    而是先判断.txt属于 txtfile '文件类型'
    再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
    可以在"文件夹选项"→"文件类型"里修改这2种关联
    assoc               #显示所有'文件扩展名'关联
    assoc .txt          #显示.txt代表的'文件类型',结果显示 .txt=txtfile
    assoc .doc          #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
    assoc .exe          #显示.exe代表的'文件类型',结果显示 .exe=exefile
    ftype               #显示所有'文件类型'关联
    ftype exefile       #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
    assoc .txt=Word.Document.8
    设置.txt为word类型的文档,可以看到.txt文件的图标都变了
    assoc .txt=txtfile
    恢复.txt的正确关联
    ftype exefile="%1" %*
    恢复 exefile 的正确关联
    如果该关联已经被破坏,可以运行 command.com ,再输入这条命令

    36 pushd 和 popd
    切换当前目录
    @echo off
    c: & cd & md mp3           #在 C: 建立 mp3 文件夹
    md d:mp4                   #在 D: 建立 mp4 文件夹
    cd /d d:mp4                #更改当前目录为 d:mp4
    pushd c:mp3                #保存当前目录,并切换当前目录为 c:mp3
    popd                        #恢复当前目录为刚才保存的 d:mp4

    37 for
    循环命令
    这个比较复杂,请对照 for/? 来看
    for %%i in (c: d: e: f:) do echo %%i
    依次调用小括号里的每个字符串,执行 do 后面的命令
    注意%%i,在批处理中 for 语句调用参数用2个%
    默认的字符串分隔符是"空格键","Tab键","回车键"
    for %%i in (*.txt) do find "abc" %%i
    对当前目录里所有的txt文件执行 find 命令
    for /r . %%i in (*.txt) do find "abc" %%i
    在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
    for /r . %%i in (.) do echo %%~pni
    显示当前目录名和所有子目录名,包括路径,不包括盘符
    for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
    把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
    for /l %%i in (2,1,8) do echo %%i
    生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
    for /f %%i in ('set') do echo %%i
    对 set 命令的输出结果循环调用,每行一个
    for /f "eol=P" %%i in ('set') do echo %%i
    取 set 命令的输出结果,忽略以 P 开头的那几行
    for /f %%i in (d:mp3.txt) do echo %%i
    显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
    for /f "delims=" %%i in (d:mp3.txt) do echo %%i
    显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
    for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
    对 dir 命令的结果,跳过前面5行,余下的每行取第4列
    每列之间的分隔符为默认的"空格"
    可以注意到 dir 命令输出的前5行是没有文件名的
    for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
            echo %%a
            echo %%b
            echo %%c
            )
    对 date /t 的输出结果,每行取1、2、3列
    第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
    分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
    其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
    for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
    取第2列给 %%a ,其后的列都给 %%b


    38 subst (外部命令)
    映射磁盘。
    subst z: serverd         #这样输入z:就可以访问serverd了
    subst z: /d                 #取消该映射
    subst                       #显示目前所有的映时

    39      xcopy (外部命令)
    文件拷贝
    xcopy d:mp3 e:mp3 /s/e/i/y
    复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
    加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问


    转自http://blog.csdn.net/mydriverc/archive/2008/01/16/2047152.aspx

     

    posted @ 2009-11-19 09:02 王生生 阅读(389) | 评论 (0)编辑 收藏

    人生成功第1课

    做一个终生学习的人

    离开学校并不意味着学习就结束了。

    学习可以成为一种生活方式,帮助你发挥最大的潜能。

    我们从未停止学习,总会有新的,有趣的东西等待我们去发现。

    学习新的技能可能让人感到有一点恐惧,但每当我们在个人学习上停滞不前时,我们都需要去学习新的东西。

    积极地寻求支援和建议,突破停滞期。

    参加一些培训,进修,夜校-任何新的兴趣都将会有助于发展你的优势。

    多看,多听,让你的头脑保持活跃。活到老,学到老。

    人生成功第2课

    令自己感到沮丧的秘诀就是用空闲时间去烦恼自己是否快乐。所以不要费事去想它!摩拳擦掌干起来吧。你将热血沸腾,你会头脑清醒。很快,在你身体中的这种高涨的积极人生观将把烦恼从你的头脑中赶出去。

    行动起来,忙碌起来。这是世界上最便宜的一种药,也是最好的一种。

    人生成功第3课

    在困境中寻找成功的希望 

    逆境是一所最好的学校。每一次失败,每一次打击,每一次损失,都蕴育着成功的萌芽,都教会我在下一次有更出色的表现。我再也不会逃避现实,也不会拒绝从以往的错误中获取经验,我不再因此而促成自己的失败。因为我知道,宝玉不经磨砺就不能发光,没有,我也不能完善自我。

    现在我知道,灵魂倍受煎熬的时刻,也正是生命中最多选择与机会的时刻。任何事情的成败取决于我在寻求帮助时是抬起头还是低下头。无论何时,当我被可怕的 失败击倒,在最初的阵痛过去之后,我都要想方设法将苦难变成好事。伟大的机遇就在这一刻闪现-这苦涩的根必将迎来满园芬芳!

    我将一直在困境中寻找成功的希望。 

    人生成功第4课

    没有人可以使你感到自卑

    我选择自我感觉良好,这样我能更加开放地学习。如果人们给我负面的回应或是批评我做的事情,我不会认为他们所说的就表明我是一个“差劲的”人。我坚信自尊由我掌控,这让我毫无戒心地去听取别人的反馈,想看看是否有我可以学习的东西。

    我们每天都有两种选择。我们可以感到自己很棒,也可以感到自己很差劲。难道有人会选择后者吗?

    人生成功第5课

    紧紧抓住梦想

    我们每个人都有梦想。我们每个人都希望能发自内心地相信自已有一种特殊的天赋,相信自己能发挥重要的作用,相信自己能以一种特殊的方式感动他人,相信自己能够把世界变得更加美好。

    在一生中,我们都曾经对自己渴望并追求的生活品质抱有憧憬。然而,对我们大多数人来说,这些憧憬在日常生活的成规和挫败中已经变得如此渺茫,以到于我们 甚至不再努力去实现它们。对太多人来说,梦想已经远离,随之远离的还有塑造我们命运的意愿。很多人已经推动了坚定的信念,而正是坚定的信念为胜利者创造了 优势。

    我们所要做的就是重拴梦想,并实现梦想,让我们每个人都记住,并去运用深藏在自己身上的无限潜能。

    人生成功第6课

    毅力无法替代

    世界上没有任何东西可以替代毅力。才干不可以,无所作为的能人十分普遍;天分不可以,碌碌无为的天才尽人皆知;教育不可以,受过良好教育的没落者更是随处可见。只要有毅力和决心,就是无所不能的。

    毅力并不总是意味着永远坚持做同一件事。它意味着无论你做任何事情,你都要立刻全心投入,竭尽全力;它意味着先做艰苦的工作,再去期待随之而来的满足和 回报。它意味着开心地工作,渴望更多的知识和进步。它意味着多打几个电话,多夏装几里路,多除草,早起床,意味着总是寻求更好的方式去做你在做的事情。毅 力就是经历考验和过失的成功。

    人生成功第7课

    驻足片刻闻花香

    在现代生活的忙忙碌碌中,人们很少会停下来欣赏自然的美。

    问问自己,你有多少次倾听过鸟儿的歌唱。你最近一次抬头仰望闪耀的星空又是在什么时候?

    时光飞逝,人生苦短。不要忘记驻足闻闻花香。我们在急于谋生的过程中,往往忽视了我们生活的品质。多少次,你听见人们为这为那说“我忙死了。”多可惜啊!有一天,当他们真的找到时间能够驻足片刻闻花香时,可能已经太迟了。

    人生成功第8课

    加入到微笑者和赞美者的行列来

    当你对别人,别人也会对你报以,你自然会感觉很棒。即使他有对你报以,你也会感觉很棒,因为你认识到世界上最贫穷的人就是从不微笑的人,当你对那个人微笑,你立刻变得更加富有。

    赞美也是这个道理。当你真诚地毛病抑或恭维一个人时,他将立刻受益,更喜欢自己。当你让别人感觉更好时,你自己也会感觉更好。

    人生成功第9课

    让自己快乐

    调查表明,我们当中70%的人在生活中时间有临床性的抑郁现象。

    如今我们有这么多的机遇,为什么我们还这么不快乐呢?

    人们尝试各种东西:金钱,**,事业,婚姻,离婚,酒精,摇滚甚至毒品,但我们大多数人只是想要得到一样东西-快乐。

    快乐是人的一种自然的身心状态;我们只要去相信快乐,让自己感受快乐。

    要宣称:我应当得到快乐。说出来,唱出来,喊出来。

    优先考虑快乐,让快乐成为你最重要的事情。

    对你所拥有的一切抱以感激之情吧。

    人生成功第10课

    我拥有无与伦比的想象力   

    现在我将通过这种神奇的力量得到我想要的。如果我害怕发表演讲,我就想象自己在公众场合无所畏惧,充满信心;如果我在病魔的煎熬,我就想象我以前健康的样子;如果我感到贫穷,我就想象我将要富有。

    现在我明白了:人类惟一的限制就是想象力。我之所以没有成功,原因就在于我不知道如何使用我的想象力。现在,我精通这个技巧,我将从中受益。最大的回报将是成功和愈加快乐。(摘自网络)
    posted @ 2009-11-06 13:46 王生生 阅读(189) | 评论 (0)编辑 收藏

        命令行下具体用法如下:  mysqldump -u用戶名 -p密码 -d 數據库名 表名 脚本名;

        1、导出數據库為dbname的表结构(其中用戶名為root,密码為dbpasswd,生成的脚本名為db.sql)
        mysqldump -uroot -pdbpasswd -d dbname >db.sql;

        2、导出數據库為dbname某张表(test)结构
        mysqldump -uroot -pdbpasswd -d dbname test>db.sql;

        3、导出數據库為dbname所有表结构及表數據(不加-d)
        mysqldump -uroot -pdbpasswd  dbname >db.sql;

        4、导出數據库為dbname某张表(test)结构及表數據(不加-d)
        mysqldump -uroot -pdbpasswd dbname test>db.sql;

       

    posted @ 2009-11-06 10:14 王生生 阅读(2888) | 评论 (0)编辑 收藏

    1.$_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言

    显示:zh-cn

    2.$_SERVER['REMOTE_ADDR'] //当前用户 IP 。

    显示:127.0.0.1

    3.$_SERVER['REMOTE_HOST'] //当前用户主机名

    显示:

    4.$_SERVER['REQUEST_URI'] //URL

    显示:/test.php

    5.$_SERVER['REMOTE_PORT'] //端口。

    显示:3864

    6.$_SERVER['SERVER_NAME'] //服务器主机的名称。

    显示:127.0.0.1

    7.$_SERVER['PHP_SELF']//正在执行脚本的文件名

    显示:/test.php

    8.$_SERVER['argv'] //传递给该脚本的参数。

    显示:ARRAY

    9.$_SERVER['argc'] //传递给程序的命令行参数的个数。

    显示:0

    10.$_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。

    显示: CGI/1.1

    11.$_SERVER['SERVER_SOFTWARE'] //服务器标识的字串

    显示:Apache/2.0.52 (Win32) PHP/5.2.1

    12.$_SERVER['SERVER_PROTOCOL'] //请求页面时通信协议的名称和版本

    显示:HTTP/1.1

    13.$_SERVER['REQUEST_METHOD']//访问页面时的请求方法

    显示:GET

    14.$_SERVER['QUERY_STRING'] //查询(query)的字符串。

    显示:

    15.$_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录

    显示:D:/Program Files/Apache/www

    16.$_SERVER['HTTP_ACCEPT'] //当前请求的 Accept: 头部的内容。

    显示:*/*

    17.$_SERVER['HTTP_ACCEPT_CHARSET'] //当前请求的 Accept-Charset: 头部的内容。

    显示:

    18.$_SERVER['HTTP_ACCEPT_ENCODING'] //当前请求的 Accept-Encoding: 头部的内容

    显示:gzip,deflate

    19.$_SERVER['HTTP_CONNECTION'] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。

    显示:Keep-Alive

    20.$_SERVER['HTTP_HOST'] //当前请求的 Host: 头部的内容。

    显示:127.0.0.1:8080

    21.$_SERVER['HTTP_REFERER'] //链接到当前页面的前一页面的 URL 地址。

    显示:http://127.0.0.1:8080/

    22.$_SERVER['HTTP_USER_AGENT'] //当前请求的 User_Agent: 头部的内容。

    显示:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

    23.$_SERVER['HTTPS']//如果通过https访问,则被设为一个非空的值(on),否则返回off

    显示:

    24.$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。

    显示:D:/Program Files/Apache/www/test.php

    25.$_SERVER['SERVER_ADMIN'] #管理员信息

    显示:w@w.com

    26.$_SERVER['SERVER_PORT'] #服务器所使用的端口

    显示:8080

    27.$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。

    显示:Apache/2.0.52 (Win32) PHP/5.2.1 Server at 10.145.40.150 Port 8080

    28.$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统(不是文档根目录)的基本路径。

    显示:

    29.$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。

    显示 :/test.php

    30.$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。

    显示:

    31.$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。

    显示:

    32.$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型

    posted @ 2009-11-05 09:31 王生生 阅读(188) | 评论 (0)编辑 收藏

    将A用户下所有的表授权给B用户;
    sqlplus A/A
    select 'grant select,insert,update,delete on A.' || table_name || ' to B;' from user_tables;
    然后选择上面出现的所有的语句,进入sysdba权限进行操作:
    sqlplus "/as sysdba"             
    然后执行上面的所有的语句就可以了;                 

    posted @ 2009-10-22 17:05 王生生 阅读(1015) | 评论 (0)编辑 收藏

    page- break-before和page-break-after CSS属性并不会修改网页在屏幕上的显示,这两个属性是用来控制文件的打印方式。每个打印属性都可以设定4种设定值:auto、always、left和 right。其中Auto是默认值,只有在有需要时,才需设定分页符号 (Page breaks)。page-break-before若设定成always,则是在遇到特定的组件时,打印机会重新开始一个新的打印页。page- break-before若设定成left,则会插入分页符号,直到指定的组件出现在一个左边的空白页上。page-break-before若设定成 right,则会插入分页符号,直到指定的组件出现在一个右边的空白页上。page-break-after属性会将分页符号加在指定组件后,而非之前。 在下列程序中您将可以看到这些属性的设定。

    <HTML>

    <HEAD>

    <TITLE>Listing 14-4</TITLE>

    </HEAD>

    <BODY>

    <DIV>This is the first DIV.</DIV>

    <DIV STYLE="page-break-before:always">This is the second DIV.</DIV>

    <DIV STYLE="page-break-after:always">This is the third DIV.</DIV>

    <DIV>This is the fourth DIV.</DIV>

    <DIV STYLE="page-break-before:right">This is the fifth DIV.</DIV>

    <DIV STYLE="page-break-after:right">This is the sixth DIV.</DIV>

    <DIV>This is the last DIV.</DIV>

    </BODY>

    </HTML>


    转自 http://www.cnblogs.com/JustinYoung/articles/710734.html
    posted @ 2009-10-22 14:00 王生生 阅读(350) | 评论 (0)编辑 收藏

        在开發中,經常遇到需要用去解析各类非结构化文本,像doc,xls,pdf,ppt,xml,html.
        本人在开發站内搜索时,需要加入对各类文件类型的支持,以方便建立索引。解析各类文档调用了几個开源的包。像dom4j-1.6.1.jar,FontBox-0.1.0-dev.jar,htmllexer.jar,htmlparser.jar,PDFBox-0.7.3.jar,poi-3.5-FINAL-20090928.jar,poi-scratchpad-3.5-FINAL-20090928.jar。这些开源的包可以讓我們很方便去解析各类非结构化文本。

    jar包的下载地址: http://www.ziddu.com/download/7017588/devlib.rar.html

    代码如下:
    package com.ducklyl;

    import java.io.File;
    import java.io.FileInputStream;
    import java.util.Iterator;
    import org.apache.poi.hslf.model.Slide;
    import org.apache.poi.hslf.model.TextRun;
    import org.apache.poi.hslf.usermodel.SlideShow;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.usermodel.Paragraph;
    import org.apache.poi.hwpf.usermodel.Range;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.htmlparser.Parser;
    import org.htmlparser.filters.*;

    import org.htmlparser.*;
    import org.htmlparser.nodes.TextNode;
    import org.htmlparser.util.*;

    import org.pdfbox.pdfparser.PDFParser;
    import org.pdfbox.pdmodel.PDDocument;
    import org.pdfbox.util.PDFTextStripper;



    public class HandleFile {
        
    public static void main(String args[]){
            String str
    ="e:\\test.HTML";
            System.out.println(handleFile(str));
        }

        
    public static String handleFile(String filename){
            String result
    ="";
            String fileType
    =filename.substring(filename.lastIndexOf(".")+1, filename.length());
            
    if(fileType.equalsIgnoreCase("pdf"))
                result
    =handlePdf(filename);
            
    else if(fileType.equalsIgnoreCase("xls"))
                result
    =handleExcel(filename);
            
    else if(fileType.equalsIgnoreCase("doc"))
                result
    =handleDoc(filename);
            
    else if(fileType.equalsIgnoreCase("xml"))
                result
    =handleXml(filename);
            
    else if(fileType.equalsIgnoreCase("ppt"))
                result
    =handlePPT(filename);
            
    else if(fileType.equalsIgnoreCase("htm")||fileType.equalsIgnoreCase("html"))
                result
    =handleHtml(filename);
            
    return result;
        }
    /**
     * 解析HTML
     * 
    @param filename
     * 
    @return
     
    */
        
    public static String handleHtml(String filename){
            String content
    ="";
            
    try{
                File file
    =new File(filename);
                
    if(!file.exists()) return content;
                
                Parser parser
    =new Parser(filename);
                parser.setEncoding(
    "UTF-8");
                NodeFilter textFilter
    =new NodeClassFilter(TextNode.class);
                NodeList nodes
    =parser.extractAllNodesThatMatch(textFilter);
                
    for(int i=0;i<nodes.size();i++){
                    TextNode textnode
    =(TextNode)nodes.elementAt(i);
                    String line
    =textnode.toPlainTextString().trim();
                    
    if(line.equals("")) continue;
                    content
    =content+line;
                }
            }
    catch(Exception e){
                e.printStackTrace();
            }
            
    return content;
        }
        
    /**
         * 解析PPT
         * 
    @param filename
         * 
    @return
         
    */
        
    public static String handlePPT(String filename){
            StringBuffer content 
    = new StringBuffer("");
            
    try{
                File file
    =new File(filename);
                
    if(!file.exists()) {
                    
    return content.toString();
                }
                FileInputStream instream
    =new FileInputStream(file);
                SlideShow ppt 
    = new SlideShow(instream);
                Slide[] slides 
    = ppt.getSlides();
                
    for(int i=0;i<slides.length;i++){
                    TextRun[] t 
    = slides[i].getTextRuns();//为了取得幻灯片的文字内容,建立TextRun
                    for(int j=0;j<t.length;j++){
                        content.append(t[j].getText());
    //这里会将文字内容加到content中去
                    }
                    content.append(slides[i].getTitle());
                }
            }
    catch(Exception e){
                e.printStackTrace();
            }
            
    return content.toString();
        }
        
    /**
         * 解析XML
         * 
    @param filename
         * 
    @return
         
    */
        
    public static String handleXml(String filename){
            String content
    ="",value="",text="";
            
    try{
                File file
    =new File(filename);
                
    if(!file.exists()) {
                    
    return content;
                }
                  SAXReader saxReader 
    = new SAXReader();
                  Document document 
    = saxReader.read(file);
                  Element root 
    = document.getRootElement() ;
                  
                  Iterator iter
    =root.elementIterator() ;
                   
    while(iter.hasNext()){
                      Element element
    =(Element)iter.next();
                      value
    =element.getStringValue();
                      
    if(!value.trim().equals(""))    content=content+value;
                   }
            }
    catch(Exception e){
                    e.printStackTrace();
            }
            
    return content;
        }
        
    /**
         * 解析DOC
         * 
    @param filename
         * 
    @return
         
    */
        
    public static String handleDoc(String filename){
            String content
    ="";
            
    try{
                File file
    =new File(filename);
                
    if(!file.exists()) {
                    
    return content;
                }
                FileInputStream instream
    =new FileInputStream(file);
                HWPFDocument doc
    =new HWPFDocument(instream);
                Range range
    =doc.getRange();
                String text
    =range.text();
                
    for(int i=0;i<range.numParagraphs();i++){
                    Paragraph p
    =range.getParagraph(i);
                    content
    =content+p.text().trim()+"\n";
                }
            }
    catch(Exception e){
                e.printStackTrace();
            }
            
    return content;
        }
        
    /**
         * 解析PDF
         * 
    @param filename
         * 
    @return
         
    */
        
    public static String handlePdf(String filename){
            String contenttxt
    ="";
            
    try{
                File file
    =new File(filename);
                
    if(!file.exists()){
                    
    return contenttxt;
                }
                FileInputStream instream
    =new FileInputStream(file);
                PDFParser parser
    =new PDFParser(instream);
                parser.parse();
                PDDocument pdfdocument
    =parser.getPDDocument();
                PDFTextStripper pdfstripper
    =new PDFTextStripper();
                contenttxt
    =pdfstripper.getText(pdfdocument);
            }
    catch(Exception e){
                e.printStackTrace();
            }
            
    return contenttxt;
        }
        
    /**
         * 解析EXCEL
         * 
    @param filename
         * 
    @return
         
    */
        
    public static String handleExcel(String filename){
            String content
    ="";
            
    try{
                File file
    =new File(filename);
                
    if(!file.exists()) {
                    
    return content;
                }
                HSSFWorkbook workbook
    =new HSSFWorkbook(new FileInputStream(file));
                HSSFSheet sheet
    =workbook.getSheetAt(0);
                
                
    for(int i=0;i<workbook.getNumberOfSheets();i++){
                    sheet
    =workbook.getSheetAt(i);
                    
    if(sheet!=null){
                        
    for(int m=0;m<sheet.getLastRowNum();m++){
                            HSSFRow row
    =sheet.getRow(m);
                            
    if(row==nullbreak;
                            
                            
    for(int n=0;n<row.getLastCellNum();n++){
                                HSSFCell cell
    =row.getCell(n);
                                
    if(cell==nullbreak;
                                
    int type=cell.getCellType();
                                
    switch(type){
                                    
    case 0:
                                        content
    =content+cell.getNumericCellValue();
                                        
    break;
                                    
    case 1:
                                        content
    =content+cell.getStringCellValue();
                                        
    break;
                                    
    case 3:
                                        
    break;
                                    
    default:
                                        ;
                                }
                            }
                            content
    =content+"\n";
                        }
                    }
                    content
    =content+"\n";
                }

            }
    catch(Exception e){    
                e.printStackTrace();
            }
            
    return content;
        }
    }
    不想拷贝的朋友可以直接下载源代码:http://www.ziddu.com/download/7017614/src.txt.html

    以上代码比较简单,就不作说明,希望能幫到需要用的朋友。当然上面只是一個简单的例子,如果要具体应用,大家可以自己再改写。如果你有其它的想法,欢迎分享你的精彩想法。


    转载请注明出处

    posted @ 2009-10-22 10:55 王生生 阅读(1622) | 评论 (0)编辑 收藏

    在看本文之前,请确保你已掌握了PHP的一些知识以及MYSQL的查询操作基础哦。

    作为一个Web程序,经常要和不计其数的数据打交道,比如会员的数据,文章数据,假如只有几十个会员那很好办,在一页显示就可以了,可是假如你的网站是几千甚至几十万会员的话,如果都在一页打开的话无论对浏览器还是观看者都是一种折磨。

    相信每个学习PHP的新手都会对分页这个东西感觉很头疼,不过有了默默的这一水帖,你肯定会拍拍脑袋说,嘿,原来分页竟然如此简单?的确,现在请深呼吸一口新鲜的空气,仔细的听默默给你一点一点的分解。

    假设我们要处理1000条数据,要在每页中显示10条,这样的话就会分100页来显示,咱们先看一看在mysql里提取10条信息是如何操作的。

    Select * from table limit 0,10

    上面是一句很简单的mysql查询语句,它的作用是从一个名叫table的表里提取10条数据,并且把所有字段的值都获得。

    关键的地方就在这段“limit 0,10”,它其中的0是以0为起始点,后面的10则是显示10条数据,那么我们要以10为起始点,显示到第20条数据该怎么写呢?

    可能很多大大会心直口快的说“limit 10,20”嘛!啊哦,这样可就错误了哦,正确的写法是“limit 10,10”它后面的参数并非是结束点而是要提取的数目,记住哦。

    懂得了如何提取10条数据,那么提取1000条也就是做100次这种查询呀,就是说要做如下的查询:

    Limit 0,10                 //第一页
    Limit 10,10                 //第二页
    Limit 20,10                 //第三页
    Limit 30,10                 //第四页
    ……
    看出有什么规律了吗?没错,第一个参数每翻一页就增加10,可是第二个参数是不变的。
    也就是说咱们设法根据页数来改变第一个参数的值,就可以进行分页显示数据了,怎么样,原理是不是很简单?

    可是要怎么设法根据页数来改变第一个参数的值呢?首先,咱们要有一个页数的值,用url的GET方式获取。
    比如index.php?page=18
    相信大部分的大大对这个东西不陌生吧,这种url地址可是随处可见,其中的page参数的作用就是传入要显示的页数。

    咱们通过一段代码来看一看究竟是如何实现的吧:

    <?php

    /*

    Author:默默
    Date   :2006-12-03

    */

    $page=isset($_GET['page'])?intval($_GET['page']):1;        //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
    $num=10;                                      //每页显示10条数据

    $db=mysql_connect("host","name","pass");           //创建数据库连接
    $select=mysql_select_db("db",$db);                 //选择要操作的数据库

    /*
    首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
    总数据数除以每页显示的条数,有余进一。
    也就是说10/3=3.3333=4 有余数就要进一。
    */

    $total=mysql_num_rows(mysql_query("select id from table")); //查询数据的总数,id是数据库中的一个自动赋值的字段
    $pagenum=ceil($total/$num);                                    //获得总页数

    //假如传入的页数参数大于总页数,则显示错误信息
    If($page>$pagenum || $page == 0){
            Echo
    "Error : Can Not Found The page .";
            Exit;
    }

    $offset=($page-1)*$num;                                        //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。

    $info=mysql_query("select name from table limit $offset,$num");   //获取相应页数所需要显示的数据,name是数据里的一个字段
    While($it=mysql_fetch_array($info)){
            Echo
    $it['name']."<br />";
    }                                                              
    //显示数据
       
    For($i=1;$i<=$pagenum;$i++){
           
           
    $show=($i!=$page)?"<a href='index.php?page=".$i."'>$i</a>":"<b>$i</b>";
            Echo
    $show." ";
    }

    /*显示分页信息,假如是当页则显示粗体的数字,其余的页数则为超连接,假如当前为第三页则显示如下
    1 2 3 4 5 6
    */
    ?>

    假如你仔细的读过上面的代码,把数据库连接和查询的表替换成你的,那么就能看见它的执行效果哦。

    是不是很简单,只要动动脑筋,可以让它显示的更为个性化哦,给大家出一个小题,如何实现“首页 上一页 下一页 尾页”这种格式的分页呢?

    OK,水帖灌完,收工。^_^
    辉老大『阿辉』:
    好帖子啊,我来顶默默的提问,代码,如下:

    <?php
    /*
    Author:默默
    Date   :2006-12-03
    */

    $page=isset($_GET['page'])?intval($_GET['page']):1;        //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
    $num=10;                                      //每页显示10条数据

    $db=mysql_connect("localhost","root","7529639");           //创建数据库连接
    mysql_select_db("cr_download");                 //选择要操作的数据库

    /*
    首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
    总数据库除以每页显示的条数,有余进一。
    也就是说10/3=3.3333=4 有余数就要进一。
    */

    $result=mysql_query("select * from cr_userinfo");
    $total=mysql_num_rows($result); //查询所有的数据

    $url='test.php';//获取本页URL

    //页码计算
    $pagenum=ceil($total/$num);                                    //获得总页数,也是最后一页
    $page=min($pagenum,$page);//获得首页
    $prepg=$page-1;//上一页
    $nextpg=($page==$pagenum ? 0 : $page+1);//下一页
    $offset=($page-1)*$num;                                        //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。

    //开始分页导航条代码:
    $pagenav="显示第 <B>".($total?($offset+1):0)."</B>-<B>".min($offset+10,$total)."</B> 条记录,共 $total 条记录 ";


    //如果只有一页则跳出函数:
    if($pagenum<=1) return false;

    $pagenav.=" <a href='$url?page=1'>首页</a> ";
    if(
    $prepg) $pagenav.=" <a href='$url?page=$prepg'>前页</a> "; else $pagenav.=" 前页 ";
    if(
    $nextpg) $pagenav.=" <a href='$url?page=$nextpg'>后页</a> "; else $pagenav.=" 后页 ";
    $pagenav.=" <a href='$url?page=$pagenum'>尾页</a> ";

    //下拉跳转列表,循环列出所有页码:
    $pagenav.=" 到第 <select name='topage' size='1' onchange='window.location=""$url?page=""+this.value'>"n";
    for(
    $i=1;$i<=$pagenum;$i++){
    if(
    $i==$page) $pagenav.="<option value='$i' selected>$i</option>"n";
    else
    $pagenav.="<option value='$i'>$i</option>"n";
    }
    $pagenav.="</select> 页,共 $pagenum 页";

    //假如传入的页数参数大于总页数,则显示错误信息
    If($page>$pagenum){
            Echo
    "Error : Can Not Found The page ".$page;
            Exit;
    }

    $info=mysql_query("select * from cr_userinfo limit $offset,$num");   //获取相应页数所需要显示的数据
    While($it=mysql_fetch_array($info)){
            Echo
    $it['username'];
            echo
    "<br>";
    }                                                              
    //显示数据
      
    echo"<br>";
       echo
    $pagenav;//输出分页导航
    ?>


    转自 http://www.cnblogs.com/justforfun/archive/2009/04/27/1444358.html
    posted @ 2009-10-21 10:08 王生生 阅读(192) | 评论 (0)编辑 收藏

        最近在开发站内搜索,以开源的lucene作為基础框架。Lucene可以实现自定义过滤器Filter接口,也可以直接调用lucene已經提供的类。
        本文使用 FilteredQuery 进行多条件过滤。

    import java.util.*;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.*;

    public class ezfilter{   
            private List<Filter> filterList;
            public ezfilter(){
                filterList = new ArrayList<Filter>();
            }
            public void addFilter(String Field,String Value){
                Term term=new Term(Field,Value);//添加term
                QueryWrapperFilter filter=new QueryWrapperFilter(new TermQuery(term));//添加过滤器
                filterList.add(filter);//加入List,可以增加多個过滤
            }
            public Query getFilterQuery(Query query){
                for(int i=0;i<filterList.size();i++){
                    //取出多個过滤器,在结果中再次定位结果
                    query = new FilteredQuery(query, filterList.get(i));
                }
                return query;
            }   
    }

    在查询时,调用方式如下:

    ezfilter filter = new ezfilter();
    filter.addFilter("id","1000");//过滤id=1000
    filter.addFilter("type","school");//过滤type=school
    .....
    query=filter.getFilterQuery(query);//结果过滤
    hits = searcher.search(query);


    以上代码只是简化说明,希望有碰到的朋友可以参考。





    posted @ 2009-10-13 17:28 王生生 阅读(1255) | 评论 (0)编辑 收藏

    简单实现网页采集程序,运行程序后,把抓到的网页放到目录下面

    package com.ducklyl;

    import java.net.*;
    import java.io.*;

    public class WebHttpClient {
        //网页保存路径
        private static String Text_File_Path="D:\\Test\\index.html";
        public static void main(String args[]){
            try{
                File file=new File(Text_File_Path);
                FileWriter fpWriter=new FileWriter(file);
               
                //生成下载对象
                String URL="www.bnu.edu.cn",Host="www.bnu.edu.cn";
                int Port=80;
                Socket webclient=new Socket(URL,Port);
                //输出流
                PrintWriter result=new PrintWriter(webclient.getOutputStream(),true);
                //读取流
                BufferedReader receiver=new BufferedReader(new InputStreamReader(webclient.getInputStream()));
               
                //发送http request
                result.println("GET / HTTP1.1");
                result.println("Host:"+Host);
                result.println("Connection:Close");
                result.println();

                //接收Http response
                boolean bRet=true;
                StringBuffer sb=new StringBuffer(8096);
                while(bRet){
                    if(receiver.ready()){
                        int idx=0;
                        while(idx!=-1){
                            idx=receiver.read();
                            sb.append((char)idx);
                        }
                        bRet=false;
                    }
                }
                //打印结果
                System.out.println(sb.toString());
                //寫到文件里面
                fpWriter.write(sb.toString());
                webclient.close();
                fpWriter.close();
            }catch(UnknownHostException e){
                System.err.println("don't get the host");
                System.exit(1);   
            }catch(IOException e){
                System.err.println("Download error,please check the URL.");
                System.exit(1);
            }
        }
    }


    posted @ 2009-10-12 14:04 王生生 阅读(225) | 评论 (0)编辑 收藏

         摘要: Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal";...  阅读全文
    posted @ 2009-10-12 13:28 王生生 阅读(2240) | 评论 (0)编辑 收藏

        orangeHRM是一套全面的人力资源管理(HRM)系统。它实现了任何企业都需要的一些重要HR功能,包括雇员资料管理、员工自服务系统、考勤、津贴以及招聘等功能。基于模块化架构,这个全面的开源解决方案反映了HR管理的主要领域从简单的人事管理到今天复杂的管理策略。 它是开源的人力资源管理软件中最活跃的一个,拥有超过175000的下载量,迅速的成为了使用最广泛的人力资源管理应用软件。

    你们决定开始做这个项目的原因是什么?


    我们在企业人力资源的软件中看到了一些弊端:对于中小型企业来说,这种软件是很昂贵的,所以有些公司只选择使用一些简单的技术,这样很不利于公司的发展。

    我们开始把OrangeHRM作为一个研究项目就是为了解决这些问题。因为它是免费的(并不代表不收费),所以任何人都何以负担的起。因为是开源的,所以任何人都可以使用,而且基于 PHP, MySQL和 Apache 会有更大的可移植性。


    让您最为自豪的是什么?

    OrangeHRM的下载已将超过了15万。虽然不是所有的下载都能运用到生产系统,但是据我们的估计数目,运用于生产系统的大约是数千人。我们感到自豪的是,我们为全世界的人们提供了一个系统,改善了他们的工作效率。

    OrangeHRM2.5下载: http://www.ziddu.com/download/6849421/orangehrm-2.5.tar.gz.html

    OrangeHRM2.5中文包下载(解压覆盖language即可):http://www.ziddu.com/download/6849422/OrangeHRM_v2.5.x_Chinese_language.zip.html
    posted @ 2009-10-10 08:51 王生生 阅读(1250) | 评论 (0)编辑 收藏

         上一次提到用HTML转PDF功能,生成了多个PDF之后,想要合并成一个怎么办?用程序生成,那就麻烦了。
    找了半天,找到一个解决的辦法,前提是在linux系統下,你需要事先在系统中安装好 Ghostscript 和 PDFtk 这两个软件:

    打开终端,并粘贴下列命令:

    pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf

    需要说明的是,此示例将 1.pdf 、 2.pdf 和 3.pdf 这三个 PDF 文档合并成 123.pdf 文件。请根据你的实际情况更改这些名称。另外,除了合并两个文件之外,你也可以合并三个、甚至更多。

    Ghostscript 和 PDFtk 这两个软件,大家可以网上搜一下。

    PDFtk :http://www.accesspdf.com/pdftk/#examples

    posted @ 2009-07-09 22:32 王生生 阅读(974) | 评论 (1)编辑 收藏

        項目中有用到需要生成PDF文件,网上找了一些关于生成PDF文件的技术,基本上都是用程序去生成。因為項目到了后期,客户才提出转PDF的需求,所以不太可能采用常规的方法。
        最后找到一个支持命令行的软件(HTML2PDF Pilot),可以直接将HTML页面转成PDF。这樣一來可以省很多时间去再去开發。
        用java实现命令行调用HTML2PDF是一件很简单的事,如此一來,解决了項目中目前棘手的问题,不过有一點比较郁悶,转成PDF的时间要好几秒,因此有一个比较长的等待过程。
        在这里記錄下这个方案,希望能給有遇到这个问题的朋友参考。如果大家有更好的方法,不妨提出來分享。

    HTML2PDF Pilot(破解)下载:(支持用命令行调用,可以参看压缩包中的help.chm)

    http://www.ziddu.com/download/5538757/HTML2PDFPilot.rar.html



    posted @ 2009-07-09 22:25 王生生 阅读(562) | 评论 (0)编辑 收藏

    很久沒用數據庫了,媽的竟然連批量插表都忘記了。在這里记录一下。

    把表B中的字段,插入到表A中;

    INSERT INTO 表A(字段名1, 字段名2, ……)  SELECT (字段名1, 字段名2, ……) FROM 表B;



    posted @ 2009-07-07 15:17 王生生 阅读(365) | 评论 (0)编辑 收藏

    MYSQL查询时区分字段值的大小写,则:字段值需要设置BINARY属性,设置的方法:

    A、创建时设置:
    CREATE TABLE T(
    A VARCHAR(10) BINARY
    );

    B、使用alter修改:
    ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY;
    posted @ 2009-05-22 18:26 王生生 阅读(622) | 评论 (0)编辑 收藏

        在MySQL中有两种方法可以删除数据,一种是DELETE语句,另一种是TRUNCATE TABLE语句。DELETE语句可以通过WHERE对要删除的记录进行选择。而使用TRUNCATE TABLE将删除表中的所有记录。
       
    DELETE和TRUNCATE TABLE的最大区别:
    (1)DELETE可以通过WHERE语句选择要删除的记录。但执行得速度不快,可以返回被删除的记录数。而TRUNCATE TABLE无法删除指定的记录,而且不能返回被删除的记录。但它执行得非常快。
    (2)分别执行
    DELETE FROM Table_name与TRUNCATE TABLE Table_name
         对执行
    TRUNCATE TABLE Table_name后,Table_name中自增流水从新开始计算,而DELETE FROM Table_name则不会从新开始,会继续之前的流水号。
    posted @ 2009-04-28 16:44 王生生 阅读(306) | 评论 (0)编辑 收藏

    若您还没有Moneybookers帐号,请在点击这里Moneybookers免费申请一个。
           注意:部分国内城市的招商银行无法接收MB的电汇,且手续费太高,因此建议不要用招行来接收!

    第一步:办国内的银行卡或存折
      办理中国银行的“本外币一本通”存折可能是最方便的吧。强烈推荐中行!当然,工商银行办理一张支持多币种的灵通卡也是可以的,注意:一定要多币种的!


    第二步:查开户行的SWIFE CODE
      查询你开户银行的SWIFT code。(形如:BKCHCNBJ810) 该号相当于各个银行的身份证号。从国外往国内转帐外汇必须得使用该号码。
      网上查询方法:打开http://www.swift.com/biconline/index.cfm?fuseaction=display_freesearch 用拼音填入城市名“City heading”(比如大连就填dalian),在“Country name”中选国家CHINA,其他的框留空,再点搜索[ Search ]。


    其中的BIC coad对应的内容就是swift code。本例中的第3号是——3:中国银行辽宁省分行“swift code”是“BKCHCNBJ810”


    注意:中行的swift code只要找到省或市一级的就可以了,不用详细到各区的分支行。


      该网页下面还注明了若表格中数字底色是蓝色的,其swift code是可以正常使用的,而灰色的是暂时有问题,不可用。


    第三步:把你的国内银行帐号加到你的Moneybookers中
      登陆你的MoneyBookers帐号:在“Profile”区的“List of bank accounts”下面的“Manage”页面中点“Add”后,它会自动填好国家“China”,在下面输入你的中行的SWIFT号以后点“Next”,MoneyBookers会自动识别银行所在地,然后输入你的中行的“本外币一本通”存折帐号,并填入你国内银行的开户名的汉语拼音(注意该名必须与你注册Moneybookers时使用的FistnameLastname拼音相同,以表明MB帐号与你的国内帐号是一个人的),这样你的银行帐号增加工作就完成了,回到“Profile”区的“List of bank accounts”区中,你会发现你的银行帐号被加在这里,如果有错误可以按旁边的按钮删除该帐号后重新添加。


    第四步:把外汇从Moneybookers中转帐到你的国内银行帐号里
      在Moneybookers中的“withdraw”区中先选中你已经加上的国内银行帐户,再填入你要取款的数额(注意:第一次取款最多只能取15美元,第二次填上激活码以后就几乎没有限制了,如果你的Moneybookers帐户中没有足够的钱,你可以先用人民币买一些,具体见本页最下面的介绍)。按NEXT,再照提示按下一步就会要求你填上你的生日(例如:31.05.1981),确定后就会提示你:在银行的3-5个工作日内就把你帐户中的钱转到你已经增加进去的国内银行帐号中。


    注意:每次转帐汇款到国内的银行金额最少不能少于$20美元,但第一次最多只能取回$15美元。另外moneybookers对部分国家还提供邮寄欧元支票的服务,但不对中国用户提供。


    第五步:收钱
      没事了,就等着取钱吧:一般是4-7天到帐,之后就可以在国内的中行取出美元了,注意:第一次电汇后一定要记得取回电汇水单,其中有校验码,可以激活你的Moneybookers帐户!切记,具体校验方法见下面。


    备注:每次把钱从Moneybookers转入你国内银行账户的手续费为?.8 (1.8欧元,约2.14美元)  不论转帐数额大小都是一样的费用。没进行身份认证的帐号也可转帐,但只能转一次最多$15。


      手续费是从你的MB帐户中另外扣除的,不会从你的国内银行帐户中扣除。


    注意:没激活的MB帐户,只能电汇最多15USD美元,呵呵,但激活后几乎没有限制。


      这时你就可以再取一次款到国内,同时还可以根据你第一次电汇得到的校验码来激活你的MB帐号,或者简单点说:Moneybookers(MB)-SWIFT-身份验证-收回国内:一步到位法。当然,激活码只有一个月的有效期,你必须在第一次收到款后马上再转帐一次,过了有效期就没有办法用这种办法激活了。具体步骤如下:


      1.首先拿10元人民币去中国银行开户:本、外币活期一折(本)通。找个热情MM聊一聊,问她该银行SWIFT代号,或自己在网上查,见本页上面(有的工作人员会不清楚,所以最好去市一级的总行开户),然后把你手机号码给她告诉她如果你有汇款要她通知你 :)其实不通知也行,你自己拿存折去银行打印余额也能看出来。


      2.回家上网,进入MB帐户选取收回“withdraw ”,根据提示输入SWIFT代号,再输入银行存折的帐户(注意:只能是数字,中间不要加-)。试取回15美元,确认后输入你的生日,就可以了。


      3.过3~5天去银行打印一下存折上的余额,会发现多了一笔$15的汇款。然后你亲自带着存折,身份证去中行在本地的市级分行索取电汇底单(又称为水单/对帐单/核销单)。确认码在你的收款帐单(水单)下面,形如“VRF CODE xxxxxx MONEYBOOKERS”xxxxxx,就是这个六位代码。(是字母或者是字母与数字混合的六位代码),这个代码是30天内有效的。


      4. 再次进入MB帐户选取收回“Withdraw”,根据提示这次要取回大于20美元(注意:你的帐户内必须要有多于20美元)。确定后在下一页中选取第二项:“Option 2: Verify your bank account”确定后MB会要求你输入6位确认码xxxxxx,如果成功,确认信息无误后再按“Withdraw”,再输入生日后按“Next”,恭喜,就等收款吧!你的MB帐号已经校验完毕了。


      再进入“Profile”区域上面的[ view limit ]页中看看,呵呵,确实是激活!高兴!现金流量已经增加到 USD19000/90天(注意:具体数字会随着汇率不同和帐户的使用情况不同而有所不同)(Your outgoing transaction limit: Remaining: USD 19033.60 / in any 90 day period)。


    打开注册MB时的信箱,激活MB的确认信已经发过来了:


    发件人: service@moneybookers.com
    主题: Bank account verified
    日期: XXXXXXXXXXXXXX


    Dear Moneybokers Customer,


    We would like to herewith gladly inform you that your bank account at
    BANK OF CHINA has been successfully verified.
    Thus we have increased your
    transfer limits and allowed all payment options with moneybookers.


    If you want to check your current transaction limits, please go to
    Profile > View limit.


    Thank you for using MONEYBOOKERS!


    The Moneybookers Team


    提示:
    1)我记得我第一次收到电汇以后马上向中行索要了电汇单/水单(这个本来是银行要给客户的,但是一般客户没有提出要求银行就省略掉了。而且想要到这个单子必须去市一级的分行才能拿到,普通的营业网点是拿不到的)。拿到电汇单,按照要求填写校验码上去就可以了。
    2)MB第一次没输入激活码第二次就不能再电汇了,也不给你机会再输入激活码了,(但你仍然可以向其他MB帐户转帐,但不能通过电汇的方式回到国内了)~电汇进帐单/水单肯定是有的,如果银行说没有只能说明银行职员不够专业,如果用中行的服务应该就不会出现类似情况。
    另外需要注意的是激活码只在MB电汇后的30天内有效,过期该码无效,所以请一定及时向中行索取电汇单。


    强烈建议你可以先购买一些MB,再把这些钱电汇回国内银行帐号,这样做其实你并没有什么损失,但以此很快就可以校验你的Moneybookers帐号,强烈推荐!(建议一次购买至少40美元的MB,因为首次汇款$15,取得校验码后至少再汇款$20,再加上两次手续费各2美元多一点,因此总计为接近$40美元)。


    若您还没有Moneybookers帐号,请在这里Moneybookers免费申请一个。

    posted @ 2009-02-17 11:54 王生生 阅读(1447) | 评论 (1)编辑 收藏

    JavaScript CSS Style属性对照表

    盒子标签和属性对照

    CSS语法 (不区分大小写)   JavaScript语法 (区分大小写)
    border   border
    border-bottom   borderBottom
    border-bottom-color   borderBottomColor
    border-bottom-style   borderBottomStyle
    border-bottom-width   borderBottomWidth
    border-color   borderColor
    border-left   borderLeft
    border-left-color   borderLeftColor
    border-left-style   borderLeftStyle
    border-left-width   borderLeftWidth
    border-right   borderRight
    border-right-color   borderRightColor
    border-right-style   borderRightStyle
    border-right-width   borderRightWidth
    border-style   borderStyle
    border-top   borderTop
    border-top-color   borderTopColor
    border-top-style   borderTopStyle
    border-top-width   borderTopWidth
    border-width   borderWidth
    clear   clear
    float   floatStyle
    margin   margin
    margin-bottom   marginBottom
    margin-left   marginLeft
    margin-right   marginRight
    margin-top   marginTop
    padding   padding
    padding-bottom   paddingBottom
    padding-left   paddingLeft
    padding-right   paddingRight
    padding-top   paddingTop

    颜色和背景标签和属性对照


    CSS语法 (不区分大小写)   JavaScript语法 (区分大小写)
    background   background
    background-attachment   backgroundAttachment
    background-color   backgroundColor
    background-image   backgroundImage
    background-position   backgroundPosition
    background-repeat   backgroundRepeat
    color   color

    样式标签和属性对照


    CSS语法 (不区分大小写)   JavaScript语法 (区分大小写)
    display   display
    list-style-type   listStyleType
    list-style-image   listStyleImage
    list-style-position   listStylePosition
    list-style   listStyle
    white-space   whiteSpace

    文字样式标签和属性对照


    CSS语法 (不区分大小写)   JavaScript语法 (区分大小写)
    font   font
    font-family   fontFamily
    font-size   fontSize
    font-style   fontStyle
    font-variant   fontVariant
    font-weight   fontWeight

    文本标签和属性对照


    CSS语法 (不区分大小写)   JavaScript语法 (区分大小写)
    letter-spacing   letterSpacing
    line-break   lineBreak
    line-height   lineHeight
    text-align   textAlign
    text-decoration   textDecoration
    text-indent   textIndent
    text-justify   textJustify
    text-transform   textTransform
    vertical-align   verticalAlign

    posted @ 2008-12-16 14:29 王生生 阅读(225) | 评论 (0)编辑 收藏

    wordpress数据库表基本结构:

    wp_options:系统基本设置信息;
    wp_users:注册用户基本信息;
    wp_usermeta:注册用户附加信息,主要包括权限等设置;
    wp_categories: 日记分类,友站链接(blogroll)也包含其中;分类之间也可以有从属关系;公开日记在category_count中计数,私人日记不计数;
    wp_links:友站链接(blogroll);
    wp_link2cat: 友站链接的分类;
    wp_posts:日记,其中的上传的附件和图片也作为其中的记录,不过类别不同,与日记存在从属关系;其中有几个字段好像没用,如: post_category,post_parent
    wp_post2cat:日记(包括附件)的分类;
    wp_postmeta:日记中的一些附加信息,也包括上传附件的一些附加信息,自定义字段也存在这里,如:Jerome’s Keywords的tag属性就是保存在这里的;
    wp_comments:评论,评论的游客的userid为0;
    posted @ 2008-12-12 11:38 王生生 阅读(832) | 评论 (0)编辑 收藏

            通过一个简单的例子来阐述。
    <script>
    function Lecture(name,teacher){
       this.name=name;
       this.teacher=teacher;
    }

    Lecture.prototype.display=function(){
       return this.teacher+"is teaching "+this.name;
    }

    function Schedule(lectures){
       this.lectures=lectures;
    }

    Schedule.prototype.display=function(){
       var str="";
       for(var i=0;i<this.lectures.length;i++)
          str+=this.lectures[i].display()+" ";
       return str;
    }

    var myLecture=new Lecture("Gym","Hunk Wang");
    var myLecture2=new Lecture("Tom","Ducklyl");

    var myArray=new Array(myLecture,myLecture2);
    var mySchedule=new Schedule(myArray);

    alert(mySchedule.display());
    </script>
    运行结果为:Hunk Wang is teaching Gym! Ducklyl is teaching Tom!

    下面分析一下流程,以上建立两个类LectureSchedule
    首先初始化Lecture类,调用Lecture类构造函数,接着把Lecture类的对象,作为参数传入Schedule类,Schedule对象初始化,从而实现上述结果。
    不难发现,这种方式和java是类似的。只过javascript要真正实现面象对象,还需要很多过程实现。
    期待后续。

    posted @ 2008-12-10 14:52 王生生 阅读(167) | 评论 (0)编辑 收藏

    通过下面的例子来说明js的继承机制。js通过 function来声明一个类,同"class".

    function Circle(radius)
    {
        this.r = radius;
    }

    Circle.PI = 3.14159;

    Circle.prototype.area = function(){
        return Circle.PI * parseInt(this.r) * parseInt(this.r);
    }

    //定义ChildCircle子类
    function ChildCircle(radius){
        this.root=Circle;
        this.root(radius);//调用父类的构造函数,也可以通过call方式调用
    //    Circle.call(this,radius);
    }

    ChildCircle.prototype=new Circle();//声明继承,ChildCircle继承了Circle的所有方法

    //子类覆盖父类的方法area
    ChildCircle.prototype.area = function(){
        return 2 * parseInt(this.r) * parseInt(this.r);
    }

    var d = new ChildCircle(2);
    alert(d.area());


    以上是一个简单的例子来说明javascript也可实现面向对象的机制,关键看你如何应用。在设计较大规模的JS程序时,利用JS本身的特性(基于prototype的继承),借鉴面向对象编程的方法,模拟类的定义与继承机制,会使开发的JS程序具有更高的质量。
    posted @ 2008-12-10 09:27 王生生 阅读(161) | 评论 (0)编辑 收藏


    1. 安装Wordpress主题
    2. Wordpress要求主题存放在wp-content/themes/目录,你只需将你喜爱的主题(含主题文件夹)用ftp上传到该目录,并在Dashboard(后台)-Design(外观)激活你上传的主题即可

    3. 安装Wordpress插件
    4. 同样,Wordpress要求插件存放在wp-content/plugins/目录,你只需将你喜爱的插件(含插件文件夹)用ftp上传到该目 录,尔后在Dashboard(后台)-Plugins(插件)激活你上传的插件,如若插件需要设置,请根据插件说明进行设置即可

    posted @ 2008-11-22 14:13 王生生 阅读(2064) | 评论 (1)编辑 收藏

    WordPress 官方原版

    WordPress 2.6.2下载地址:http://www.ziddu.com/download/2722092/wordpress-2.6.2.zip.html


    安装步骤:
    1、下载解压后,放到php的web目录下
    2、修改wp-config-sample.php,数据库名称、用户名、密码

    define('DB_NAME', '你的数据库名');    // The name of the database
    define('DB_USER', '用户名');     // Your MySQL username
    define('DB_PASSWORD', '密码'); // ...and password

    3、wp-config-sample.php重新命名为 wp-config.php
    到此,安装完成。

    WordPress 中文团队也已经根据官方的压缩包制作出了简体中文版。

    WordPress.MU.v2.6.2.Simp.Chinese 汉化包下载:
    http://www.ziddu.com/download/2722118/ordPress.MU.v2.6.2.Simp.Chinese.pack.only.v1-wpcng.zip.html


    直接将汉化包,放到wp-content目录下,修改wp-config.php中的“define (’WPLANG’, ”);”为“define (’WPLANG’, ‘zh_CN’);”;
    到此,汉化完成。

    或者直接下载,WordPress 2.6.3中文版下载地址:http://www.ziddu.com/download/2721797/wordpress.263.chs.zip.html


    posted @ 2008-11-22 13:25 王生生 阅读(206) | 评论 (0)编辑 收藏

    单例模式 有以下的特点:

    1. 单例类只能有一个实例。
    2. 单例类必须自己创建自己的唯一的实例。
    3. 单例类必须给所有其他对象提供这一实例。

    代码:

    Singleton.php :

    <?php
    class Singleton
    {
        private static $instance;

        private function __construct()
        {
        }

        public static function getInstance()
        {
            if(self::$instance == null)
            {
                self::$instance = new Singleton();
            }

            return self::$instance;
        }
    }
    ?>

    在使用的时候,因为构造方法是private(私有)的,所以是不能直接实例化的,必须使用类似下面的方法:

    例子:

    <?php
    require_once('Singleton.php ');

    $instance = Singleton::getInstance();
    ?>

    ============================================

    其它关于静态的说明

    静态成员.
    他在类被声明时就产生了,也就是在程序编译阶段产生的,它只有一个所有该类实例共享的原本,任何该类实例更改静态变量的值后,其它该类实例再去访问该静态变量,其值已经变成更改后的值,因为其在内存,就存一个原本。
    非静态成员是在类实例化时产生的,你new一个该类实例,系统就会为该类实例的所有非静态成员新开辟一个空间,每个实例都只能自己的非静态成员。(有多少个类的实例,就要开辟多少个非静态成员的空间)

    单例类全局只有一个实例,你可以把它看成全局对象。

    从底层来说,编译完成后主要是两个部分,一是CPU指令,这一部分包含各种方法;二是数据,也就是程序定义的各种类型的变量。运行程序实例化一个对象时,按如下方式分配内存:
    1。在程序启动时将静态数据和静态方法放入堆内存中。
    2。第一次实例化对象时将其它方法放入代码段中。
    3。每次实例化对象时将其它数据放入栈内存中。
    实例化同一个对象时,上述1、2项不动,只是再加一个第3项即可。销毁一个实例的时候,如果还有其它的实例存在,就只释放该实例的栈数据段(上述第3项)。

    根据以上原理回答您的问题
    静态方法和数据一般都是Public型的,用于类的极普遍的事物处理,可以在程序的任意地方调用,在整过程序运行过程中始终占用计算机内存,一搬少用。如果一个程序中的各个对象都用一个数据库的话,可以使用静态方法连接。

    单件模式的实例销毁时可以释放所有的非静态方法和数据,,如果把这个类的所有方法都设计为静态的,这些方法将一直占用内存,浪费资源,不可取。

    在new一个对象时,只是加一个数据段,并不重新加载方法和静态变量。

    最后说一个变量传送的问题,网上很多朋友在回答类之间参数传递时都说用静态变量,我认为这种方法不好,本来加类的目的就是为了封装,如果用一个类似于全局变量的静态变量作为参数就大大削弱了封装的意义。

    实际上,系统和应用程序对内存的管理相当复杂.
    =======================下面摘自思归的文字

    从表面上看,静态(static)成员可以通过 类名.成员名 来直接调用,而实例(instance)成员需要生成一个对象后才能调用。同一个操作,性能当然静态成员好

    但其实区别是跟对象设计有关的,一般来说实例成员跟实例的状态有关,某个方法的调用可能需要访问当前对象的状态,并改变其状态,从而影响其他方法的结果

    而静态成员是跟类本身有关,与单独的实例状态无关。但静态成员不要太多了,否则就沦为以前的procedural programming风格了,也许对象需要重新设计或重构。

    静态成员往往会在多线程下操作,需要做同步化控制

    posted @ 2008-11-15 17:52 王生生 阅读(528) | 评论 (0)编辑 收藏

    优化PHP代码的40条建议
    40 Tips for optimizing your php Code
    原文地址:http://reinholdweber.com/?p=3
    英文版权归Reinhold Weber所有,中译文作者yangyang(aka davidkoree)。双语版可用于非商业传播,但须注明英文版作者、版权信息,以及中译文作者。翻译水平有限,请广大PHPer指正。

    1. If a method can be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

    2. echo is faster than print. echo 比 print 快。

    3. Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

    4. Set the maxvalue for your for-loops before and not in the loop. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

    5. Unset your variables to free memory, especially large arrays. 注销那些不用的变量尤其是大数组,以便释放内存。

    6. Avoid magic like __get, __set, __autoload 尽量避免使用__get,__set,__autoload。

    7. require_once() is expensive require_once()代价昂贵。

    8. Use full paths in includes and requires, less time spent on resolving the OS paths. 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

    9. If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time() 如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

    10. See if you can use strncasecmp, strpbrk and stripos instead of regex. 检查是否能用strncasecmp,strpbrk,stripos函数代替正则表达式完成相同功能。

    11. str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4. str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

    12. If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments. 如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行 代码接受数组作为查询和替换的参数。

    13. It’s better to use select statements than multi if, else if, statements. 使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

    14. Error suppression with @ is very slow. 用@屏蔽错误消息的做法非常低效。

    15. Turn on apache’s mod_deflate 打开apache的mod_deflate模块。

    16. Close your database connections when you’re done with them. 数据库连接当使用完毕时应关掉。

    17. $row[’id’] is 7 times faster than $row[id]. $row[‘id’]的效率是$row[id]的7倍。

    18. Error messages are expensive. 错误消息代价昂贵。

    19. Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time. 尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。

    20. Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function. 在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

    21. Incrementing a global variable is 2 times slow than a local var. 递增一个全局变量要比递增一个局部变量慢2倍。

    22. Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable. 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

    23. Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one. 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

    24. Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists. 仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

    25. Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance. 方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

    26. Methods in derived classes run faster than ones defined in the base class. 派生类中的方法运行起来要快于在基类中定义的同样的方法。

    27. A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations. 调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

    28. Surrounding your string by ‘ instead of " will make things interpret a little faster since php looks for variables inside "…" but not inside ‘…’. Of course you can only do this when you don’t need to have variables in the string. 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变 量时才可以这么做。

    29. When echoing strings it’s faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments. 输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册 中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

    30. A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts. Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

    31. Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times. 除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

    32. Cache as much as possible. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request. 尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

    33. When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function. This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick. 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步 骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

    Ex.(举例如下)
    if (strlen($foo) < 5) { echo "Foo is too short"; }
    vs.(与下面的技巧做比较)
    if (!isset($foo{5})) { echo "Foo is too short"; }

    Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it’s execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string’s length. 调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是 说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

    34. When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend’s PHP optimizer. It is still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer. 当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它 们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变 量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不 是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

    35. Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory. 并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

    36. Do not implement every data structure as a class, arrays are useful, too. 并非要用类实现所有的数据结构,数组也很有用。

    37. Don’t split methods too much, think, which code you will really re-use. 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

    38. You can always split the code of a method later, when needed. 当你需要时,你总能把代码分解成方法。

    39. Make use of the countless predefined functions. 尽量采用大量的PHP内置函数。

    40. If you have very time consuming functions in your code, consider writing them as C extensions. 如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

    41. Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview. 评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码 的瓶颈。

    42. mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%. mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

    43. Excellent Article (http://phplens.com/lens/php-book/optimizing-debugging-php.php)about optimizing php by John Lim 另一篇优化PHP的精彩文章,由John Lim撰写。

    posted @ 2008-11-15 17:51 王生生 阅读(148) | 评论 (0)编辑 收藏

    1.RSS文件结构  
     1. <?xml version="1.0" encoding="gb2312" ?>   
       2. <rss version="2.0">   
       3. <channel>   
       4.   <title>我的Blog</title>                  //channel的标题  
       5.   <description>与我自己的技术Blog相关联</description>    //channel的介绍  
       6.   <link>http://counter.csdn.net/pv.aspx?id=72</link>      //channel的url  
       7.   <item>   
       8.   <title><!-- 项标题 --></title>            //item的标题  
       9.   <link><!-- 项 URL --></link>            //item的url  
      10.   <description><!-- 简要描述 --></description>         //item的介绍  
      11.   <!-- 可选的/可扩展的元素 -->         //item的其他属性,比如更新时间  
      12.   </item>   
      13.   <item>  
      14.   <!-- 可多个<item>项目-->            //一个channel有多个item  
      15.   </item>  
      16. </channel>  
      17. </rss>  
    RSS是两级结构,第一级结构是channel,相当于blog系统中某人的blog,第二级结构是item,相当于blog中的文章。属性中最重要的是title、description和link,title是标题,description是介绍,link是与其相关的url。

    2.RSS的使用
    有的网站提供了RSS自动发现机制,可以很方便地把RSS的URL添加到RSS阅读器中。如果没有自动发现,那么可以手动把RSS链接的URL添加到 RSS阅读器中,这样就加入了一个用户订阅的频道。在RSS阅读器中可以更新频道列表或点击一个item链接打开该item的页面。

    3.RSS的工作机制

    内容提供者在其网站上添加RSS的链接,以提供RSS订阅功能,当打开这个链接时,传送过去了一些频道信息,比如:blog的作者名。

    一种做法是,RSS链接URL指向的是一个空内容的页面,该页面后台程序通过传过来的频道信息访问数据库,获取频道列表,用Response.Write向该空页面写出XML格式的文件。

    另一种做法是,RSS链接URL指向的是一个xml文件,该文件由服务器的程序事先生成好的,放在服务器上,访问时静态获取,服务器在作者每添加一个频道列表时自动更新该xml文件。

    第一种做法的优点是管理方便,因为不需要为每个频道生成xml文件,所有的RSS请求都由一个后台页面处理,接口统一,但每次访问RSS链接时,都要动态地写出RSS频道列表,访问效率相对较低,第二种做法的优点是访问时,只是返回一个静态的xml文件,不需要访问数据库来临时生成,所以访问效率相对较高,但每更新一次频道列表中的项时,就要自动地重新生成xml文件以保证RSS文件的最新,这样就降低了更新的效率。

    posted @ 2008-11-11 22:46 王生生 阅读(162) | 评论 (0)编辑 收藏

        对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕。别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rar。可是Linux就不同了,它有.gz、.tar.gz、tgz等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了。本文就来对这些常见的压缩文件进行一
    番小结,希望你下次遇到这些文件时不至于被搞晕。
        在具体总结各类压缩文件之前呢,首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另它的工具将这一大堆文件先打成一个包,然后再就原来的压缩程序进行压缩。

    Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:

    tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:
    # tar -cf all.tar *.jpg
    这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包
    ,-f指定包的文件名。

    # tar -rf all.tar *.gif
    这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的
    意思。
    # tar -uf all.tar logo.gif
    这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

    # tar -tf all.tar
    这条命令是列出all.tar包中所有文件,-t是列出文件的意思

    # tar -xf all.tar
    这条命令是解出all.tar包中所有文件,-x是解开的意思

    以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。

    1) tar调用gzip

    gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:

    # tar -czf all.tar.gz *.jpg
    这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz

    # tar -xzf all.tar.gz
    这条命令是将上面产生的包解开。

    2) tar调用bzip2

    bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用gzip。下面来举例
    说明一下:

    # tar -cjf all.tar.bz2 *.jpg
    这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2

    # tar -xjf all.tar.bz2
    这条命令是将上面产生的包解开。

    3)tar调用compress
    compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与 compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用compress。下面来举例说明一下:

    # tar -cZf all.tar.Z *.jpg
    这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z

    # tar -xZf all.tar.Z
    这条命令是将上面产生的包解开

    有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:

    1)对于.tar结尾的文件

    tar -xf all.tar

    2)对于.gz结尾的文件

    gzip -d all.gz
    gunzip all.gz

    3)对于.tgz或.tar.gz结尾的文件

    tar -xzf all.tar.gz
    tar -xzf all.tgz

    4)对于.bz2结尾的文件

    bzip2 -d all.bz2
    bunzip2 all.bz2

    5)对于tar.bz2结尾的文件

    tar -xjf all.tar.bz2

    6)对于.Z结尾的文件

    uncompress all.Z

    7)对于.tar.Z结尾的文件

    tar -xZf all.tar.z

    另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:

    1)对于.zip

    linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

    # zip all.zip *.jpg
    这条命令是将所有.jpg的文件压缩成一个zip包
    # unzip all.zip
    这条命令是将all.zip中的所有文件解压出来

    2)对于.rar

    要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux不是免费的;可从http://www.rarsoft.com/download.htm下载RARfor Linux 3.2.0,然后安装:

    # tar -xzpvf rarlinux-3.2.0.tar.gz
    # cd rar
    # make

    这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

    # rar a all *.jpg
    这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar扩展名将自动附加到包名后。

    # unrar e all.rar
    这条命令是将all.rar中的所有文件解压出来

         到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、 uncompress、 zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、. Z、.tar.Z、.zip、.rar这10种压缩文件进行解压了,以后应该不需要为下载了一个软件而不知道如何在Linux下解开而烦恼了。而且以上方法对于Unix也基本有效。


    posted @ 2008-11-11 22:37 王生生 阅读(232) | 评论 (0)编辑 收藏

    开始学习的时候,把 struts2 的所有的 jar 包 都放到web-inf/lib下了, 结果老出错

    就是下面的两个错:

    -------------------------------------------------------------------
    Unable to load bean: type:com.opensymphony.xwork2.ObjectFactory class:org.apache.struts2.spring.StrutsSpringObjectFactory - bean - jar:file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/testStruts/WEB-INF/lib/struts2-spring-plugin-2.0.6.jar!/struts-plugin.xml:8:132
            at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:208)
     at org.apache.struts2.config.StrutsXmlConfigurationProvider.register(StrutsXmlConfigurationProvider.java:101)

    Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextAware

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

    其他的地方都检查了好几遍  但是一运行tomcat 就出错, 找了半天原因原来是不该把所有的包都放进来,这样默认会加载所有的包,所以会出现一堆错误。哎,这对初学者也要求太高了吧,去掉了那几个jar包, (简单的,留下xwork-2.0.4.jar、commons-logging-1.0.4.jar、freemarker-2.3.8.jar、 ognl-2.6.11.jar、struts2-core-2.0.11.jar)就可以运行了。

    posted @ 2008-11-11 22:27 王生生 阅读(161) | 评论 (0)编辑 收藏

        最近有朋友问我关于oracle表空间的问题,oracle有快一年没用了,都忘得差不多了。。。只好重新整理一下,哎,看来有时候有些东西是该记一下,不然以后想查都难。简单整理了一下表空间方面脚本。
    1.查看表空间情况
    select   ff.s   tablespace_name,
                  ff.b   total,
                  (ff.b   -   fr.b)   usage,
                  fr.b   free,
                  round((ff.b   -   fr.b)   /   ff.b   *   100)   ||   '% '   usagep
        from   (select   tablespace_name   s,   sum(bytes)   /   1024   /   1024   b
                        from   dba_data_files
                      group   by   tablespace_name)   ff,
                  (select   tablespace_name   s,   sum(bytes)   /   1024   /   1024   b
                        from   dba_free_space
                      group   by   tablespace_name)   fr
      where   ff.s   =   fr.s
    求表空间   空间大小   使用多少空间   剩余多少空间
     
    2.给表空间增加数据文件, 大小100M
    alter tablespace 表空间名 add datafile '数据文件路径' size 100M;
    例子:
    alter tablespace myspace add datafile 'c:\oracle\ora81\oradata\sid\user002.dbf' size 100M;
     

    3.设定数据文件自动增加大小(当数据文件达到最大限定值后,自动增加)
    alter database datafile 数据文件名 autoextend on next 10M
     

     

    posted @ 2008-11-10 13:06 王生生 阅读(161) | 评论 (0)编辑 收藏

        网上找了半天没有结果,就自己动手试试,真的部署成功了。
    1 建一个web项目 然后把 apache-roller-src-4.0\apps\weblogger\src\java下面的文件copy到项目的src下面,删除pojos包及其下面的文件
    2 copy apache-roller-4.0\webapp\roller 下面的所以文件到下面的webroot下面
    3 copy apache-roller-4.0\webapp\roller\WEB-INF\classes 下面的除了org文件夹下面的所有文件到项目的src 下面 
    4 在apache-tomcat-5.5.25\common\classes 下面新建roller-custom.properties,文件内容如下:
    installation.type=auto
    database.configurationType=jdbc
    database.jdbc.driverClass=com.mysql.jdbc.Driver
    database.jdbc.connectionURL=jdbc:mysql://localhost:3306/rollerdb?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8
    database.jdbc.username=scott
    database.jdbc.password=tiger
    mail.configurationType=properties
    mail.hostname=smtp-server.example.com
    mail.username=scott
    mail.password=tiger

    然后部署就可以了,启动tomcat,就可以了。
    posted @ 2008-11-07 09:16 王生生 阅读(411) | 评论 (0)编辑 收藏

             网络上有很多这方面的资料,可是我找了半天,装了都是出错。。。郁闷,自己看官方文档自己装。安装环境: JDK 1.5.05 ,tomcat-5.5.17,mysql-5.0.27 ,apache-roller-4.0

    1、进入mysql命令行,执行以下:
  • mysql> create database rollerdb default charset utf8  collate utf8_general_ci;  
  • 文档install-guide 上 create database rollerdb ; 建立的数据库默认是 lat1 字符  
  • 编码,中文会有问题所以使用 utf8 编码  
  •   
  • 给用户授权  
  • mysql> grant all on rollerdb.* to scott@'%' identified by 'tiger';  
  • mysql> grant all on rollerdb.* to scott@localhost identified by 'tiger';
    2、tomcat 的 common/lib 文件夹中放入 activation.jar、javamail.jar 、mysql-connector-java-5.0.4-bin.jar(必须加入,否则会报错。) 
  • 包下载地址:
    http://www.ziddu.com/download/2590658/roller_lib.rar.html
    3、在 conf/server.xml 文件中的connector加入 URIEncoding=”UTF-8”,
    例如:
    <Connector port="8080"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" debug="0"
    acceptCount="100" connectionTimeout="20000"
    disableUploadTimeout="true"
    URIEncoding="UTF-8" />

    将roller 发行包的 roller 文件夹copy 到tomcat 的 webapps 下。

    4、建立一个 roller-custom.properties 文件内容如下:
    installation.type=auto
    database.configurationType=jdbc
    database.jdbc.driverClass=com.mysql.jdbc.Driver
    database.jdbc.connectionURL=jdbc:mysql://localhost:3306/rollerdb?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8
    database.jdbc.username=scott
    database.jdbc.password=tiger
    mail.configurationType=properties
    mail.hostname=smtp-server.example.com
    mail.username=scott
    mail.password=tiger

    roller-custom.properties 放到 tomcat/common/classes 下


    启动tomcat ,就可以正常安装roller 了

    posted @ 2008-11-06 11:40 王生生 阅读(275) | 评论 (0)编辑 收藏

        今天做了个关于flex与动态语言通信的小例子。flex做web的前台的确效果很cool,对web程序员来说,首先要掌握flex与jsp,php等等动态语言之间的通信细节。其实也很简单,搞了个例子,有兴趣的朋友可以看一下。
        因为我的机器上只装了php的开发环境,所以以php为例子来说明。
        以下先介绍第一种通信方式:HTTPService
    1.建立HttpDemo.mxml,

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FD1D06, #EAF807]" height="328" width="428">
       <mx:HTTPService
        showBusyCursor="true" 
        id="loginSrv"
        result="doResult();" 
           method="GET"
        url="http://localhost/test.php">
       <mx:request>
        <username> 
         {txtname.text}
        </username>
        <userpassword>
        {txtpwd.text}
        </userpassword>
       </mx:request>
     </mx:HTTPService>
     
     
     <mx:Script>
      <![CDATA[
      
       import mx.controls.Alert;

       internal function doResult():void
       {
        var returnValue:String=loginSrv.lastResult.Result.msg;
              if(returnValue=="success")
          { 
          this.currentState="login";
              } 
         else
           { 
         Alert.show("您的登录失败了","提示信息",Alert.OK,this,null,null,Alert.YES);
                   }
       }
      ]]>
     </mx:Script>


    <mx:states >
     <mx:State id="s1"  name="login">
      <mx:RemoveChild target="{btnSubmit}"/>
      <mx:RemoveChild target="{txtname}"/> 
      <mx:RemoveChild target="{txtpwd}"/>
      <mx:RemoveChild target="{txtpwd}"/>
      <mx:RemoveChild target="{lbname}"/>
      <mx:RemoveChild target="{lbpwd}"/>
            <mx:AddChild relativeTo="{loginPanel}" position="lastChild">
               <mx:target>
                   <mx:Label text="你已经成功登陆!" x="64" y="33" fontSize="16" textAlign="center" fontStyle="normal" fontWeight="bold" textDecoration="normal" color="#1031AB"/>
               </mx:target>          
      </mx:AddChild>
            <mx:SetProperty target="{loginPanel}" name="title" value="登陆成功"/>
            <mx:AddChild relativeTo="{loginPanel}" position="lastChild">
             <mx:Button x="95.5" y="83" label="退出登陆" click="currentState=''"/>
            </mx:AddChild>
      
     </mx:State>
     
    </mx:states>

     <mx:Panel id="loginPanel" x="69.5" y="57" width="289" height="200" layout="absolute" title="登陆" fontSize="12">
      <mx:Button x="110" y="108" label="提交" id="btnSubmit" click="loginSrv.send();"/>
      <mx:TextInput x="79" y="30" fontSize="12" id="txtname"/>
      <mx:TextInput x="79" y="62" id="txtpwd"/>
      <mx:Label x="21" y="32" text="姓名:" id="lbname" fontSize="12" fontWeight="bold"/>
      <mx:Label x="21" y="64" text="密码:" id="lbpwd" fontSize="12" fontWeight="bold"/>
     </mx:Panel>
     
    </mx:Application>

    2.建立test.php,放到php开发的根目录下

    <?php
         $str="<Result><msg>success</msg></Result>";
         echo $str;
    ?>    

    在flex builder3运行HttpDemo.mxml,即可以看到效果。


    posted @ 2008-10-15 22:25 王生生 阅读(643) | 评论 (0)编辑 收藏

    方便大家学习交流。
    下载地址: http://www.ziddu.com/download/3556058/javamode.rar.html
    posted @ 2008-10-14 11:26 王生生 阅读(185) | 评论 (0)编辑 收藏

    相信大家在学习flex时,首先都要安装flex builer,这是我在网上找到的。大家可以试试。
    破解包地址:
    http://www.ziddu.com/download/3556054/flex_builder_3_crack_build_3_0_194161.rar.html
    posted @ 2008-10-10 20:51 王生生 阅读(445) | 评论 (0)编辑 收藏

    最近在用Flex builder,切換design mode時,畫面就老出現 "This component is based on Application, which is not a visual component. Switch to source mode to edit it."的訊息(如下圖),完全無法使用,原來以為是flex builder或eclipse版本更新的關係,花了兩三天,才在這裡找到方向,

    稍微試了一下,在Flex Builder 3.0.194161,Eclipse3.4及3.3環境下,
    幾乎八九月後出的sdk,不論Flex3 Release版,Flex3 Nightly版,Flex4 Nightly版都會出現這樣的問題,
    而之前的Flex3 Stable 3.0.3.2490版,Flex3 Release 3.0.0.477版都沒有問題的.
    所以有同樣問題的人在sdk bug還沒更新前,可以先換回舊的sdk試試.

    Flex 3 SDK Downloads

    flex builder design mode bug

    posted @ 2008-10-09 08:56 王生生 阅读(611) | 评论 (1)编辑 收藏

    CSS颜色对照码:

    FFFFFF #DDDDDD #AAAAAA #888888 #666666 #444444 #000000
    #FFB7DD #FF88C2 #FF44AA  #FF0088  #C10066  #A20055  #8C0044 
    #FFCCCC #FF8888 #FF3333  #FF0000  #CC0000  #AA0000  #880000 
    #FFC8B4 #FFA488 #FF7744  #FF5511  #E63F00  #C63300  #A42D00 
    #FFDDAA #FFBB66 #FFAA33 #FF8800  #EE7700  #CC6600  #BB5500 
    #FFEE99 #FFDD55 #FFCC22 #FFBB00  #DDAA00  #AA7700  #886600 
    #FFFFBB #FFFF77 #FFFF33 #FFFF00 #EEEE00 #BBBB00 #888800
    #EEFFBB #DDFF77 #CCFF33 #BBFF00 #99DD00 #88AA00 #668800
    #CCFF99 #BBFF66 #99FF33 #77FF00 #66DD00 #55AA00 #227700
    #99FF99 #66FF66 #33FF33 #00FF00 #00DD00 #00AA00 #008800
    #BBFFEE #77FFCC #33FFAA #00FF99 #00DD77 #00AA55 #008844
    #AAFFEE #77FFEE #33FFDD #00FFCC #00DDAA #00AA88 #008866
    #99FFFF #66FFFF #33FFFF #00FFFF #00DDDD #00AAAA #008888
    #CCEEFF #77DDFF #33CCFF #00BBFF #009FCC #0088A8 #007799
    #CCDDFF #99BBFF #5599FF #0066FF  #0044BB  #003C9D  #003377 
    #CCCCFF #9999FF #5555FF  #0000FF  #0000CC  #0000AA  #000088 
    #CCBBFF #9F88FF #7744FF  #5500FF  #4400CC  #2200AA  #220088 
    #D1BBFF #B088FF #9955FF  #7700FF  #5500DD  #4400B3  #3A0088 
    #E8CCFF #D28EFF #B94FFF  #9900FF  #7700BB  #66009D  #550088 
    #F0BBFF #E38EFF #E93EFF  #CC00FF  #A500CC  #7A0099  #660077 
    #FFB3FF #FF77FF #FF3EFF  #FF0 0FF  #CC00CC  #990099  #770077 

    顏色名稱  代碼 

    顏色

    maroon  #800000   
    darkred  #8B0000   
    brown  #A52A2A   
    firebrick  #B22222   
    crimson  #DC143C   
    red  #FF0000   

    桃紅~紛紅
    顏色名稱  代碼 

    顏色

    mediumvioletred  #C71585   
    palevioletred  #D87093   
    deeppink  #FF1493   
    fuchsia(magenta)  #FF00FF   
    hotpink  #FF69B4   
    pink  #FFC0CB   
    lightpink  #FFB6C1   
    mistyrose  #FFE4E1   
    lavenderblush  #FFF0F5   


    顏色名稱  代碼 

    顏色

    indigo  #4B0082   
    purple  #800080   
    darkmagenta  #8B008B   
    darkorchid  #9932CC   
    blueviolet  #8A2BE2   
    darkviolet  #9400D3   
    slateblue  #6A5ACD   
    mediumpurple  #9370DB   
    mediumslateblue  #7B68EE   
    mediumorchid  #BA55D3   
    violet  #EE82EE   
    plum  #DDA0DD   
    thistle  #D8BFD8   
    lavender  #E6E6FA   

    褐~橘~米白
    顏色名稱  代碼 

    顏色

    saddlebrown  #8B4513   
    sienna  #A0522D   
    chocolate  #D2691E   
    indianred  #CD5C5C   
    rosybrown  #BC8F8F   
    lightcorol  #F08080   
    salmon  #FA8072   
    lightsalmon  #FFA07A   
    orangered  #FF4500   
    tomato  #FF6347   
    coral  #FF7F50   
    darkorange  #FF8C00   
    sandybrown  #F4A460   
    peru  #CD853F   
    tan  #D2B48C   
    burlywood  #DEB887   
    wheat  #F5DEB3   
    moccasin  #FFE4B5   
    navajowhite  #FFDEAD   
    peachpuff  #FFDAB9   
    bisque  #FFE4C4   
    antuquewhite  #FAEBD7   
    papayawhip  #FFEFD5   
    cornsilk  #FFF8DC   
    oldlace  #FDF5E6   
    linen  #FAF0E6   
    seashell  #FFF5EE   
    snow  #FFFAFA   
    floralwhite  #FFFAF0   
    ivory  #FFFFF0   
    mintcream  #F5FFFA   

    金~黃
    顏色名稱  代碼 

    顏色

    darkgoldenrod  #B8860B   
    goldenrod  #DAA520   
    gold  #FFD700   
    yellow  #FFFF00   
    darkkhaki  #BDB76B   
    khaki  #F0E68C   
    palegoldenrod  #EEE8AA   
    beige  #F5F5DC   
    lemonchiffon  #FFFACD   
    lightgoldenrodyellow  #FAFAD2   
    lightyellow  #FFFFE0   

    ~黃


    顏色名稱  代碼 

    顏色

    darkslategray  #2F4F4F   
    darkolivegreen  #556B2F   
    olive  #808000   
    darkgreen  #006400   
    forestgreen  #228B22   
    seagreen  #2E8B57   
    green(teal)  #008080   
    lightseagreen  #20B2AA   
    madiumaquamarine  #66CDAA   
    mediumseagreen  #3CB371   
    darkseagreen  #8FBC8F   
    yellowgreen  #9ACD32   
    limegreen  #32CD32   
    lime  #00FF00   
    chartreuse  #7FFF00   
    lawngreen  #7CFC00   
    greenyellow  #ADFF2F   
    mediumspringgreen  #00FA9A   
    springgreen  #00FF7F   
    lightgreen  #90EE90   
    palegreen  #98F898   
    aquamarine  #7FFFD4   
    honeydew  #F0FFF0   


    顏色名稱  代碼 

    顏色

    midnightblue  #191970   
    navy  #000080   
    darkblue  #00008B   
    darkslateblue  #483D8B   
    mediumblue  #0000CD   
    royalblue  #4169E1   
    dodgerblue  #1E90FF   
    cornflowerblue  #6495ED   
    deepskyblue  #00BFFF   
    lightskyblue  #87CEFA   
    lightsteelblue  #B0C4DE   
    lightblue  #ADD8E6   
    steelblue  #4682B4   
    darkcyan  #008B8B   
    cadetblue  #5F9EA0   
    darkturquoise  #00CED1   
    mediumturquoise  #48D1CC   
    turquoise  #40E0D0   
    skyblue  #87CECB   
    powderblue  #B0E0E6   
    paleturquoise  #AFEEEE   
    lightcyan  #E0FFFF   
    azure  #F0FFFF   
    aliceblue  #F0F8FF   
    aqua(cyan)  #00FFFF   

    黑~灰~白
    顏色名稱  代碼 

    顏色

    black  #000000   
    dimgray  #696969   
    gray  #808080   
    slategray  #708090   
    lightslategray  #778899   
    darkgray  #A9A9A9   
    silver  #C0C0C0   
    lightgray  #D3D3D3   
    gainsboro  #DCDCDC   
    whitesmoke  #F5F5F5   
    ghostwhite  #F8F8FF   
    white  #FFFFFF 

    posted @ 2008-09-26 09:59 王生生 阅读(179) | 评论 (0)编辑 收藏

         摘要: 1. PHP的COOKIE cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。 PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。 1.1 设置cookie:  ...  阅读全文
    posted @ 2008-09-25 21:04 王生生 阅读(246) | 评论 (0)编辑 收藏

    <style>
    #demo{overflow:hidden;width:120px;text-align:center;padding:10px;}
    #
    demo img{border:none;width:100px;height:100px;border:5px solid #f4f4f4}
    #
    enlarge_images{position:absolute;display:none;z-index:2;border:5px solid #f4f4f4}
    </style>
    <div id="demo" style="overflow:hidden;width:120px;text-align:center;padding:10px">
     
    <img src="http://www.cnwebshow.com/uploadfile/web/uploadfile/200801/20080113054140200.jpg">
    </div>
    <div id="enlarge_images"></div>
    <script>
    var demo = document.getElementById("demo");
    var gg = demo.getElementsByTagName("img");
    var ei = document.getElementById("enlarge_images");
    for(i=0; i<gg.length; i++){
     
    var ts = gg[i];
     ts
    .onmousemove = function(event){
      event 
    = event || window.event;
      ei
    .style.display = "block";
      ei
    .innerHTML = '<img src="' + this.src + '" />';
      ei
    .style.top  = document.body.scrollTop + event.clientY + 10 + "px";
      ei
    .style.left = document.body.scrollLeft + event.clientX + 10 + "px";
     }
     ts
    .onmouseout = function(){
      ei
    .innerHTML = "";
      ei
    .style.display = "none";
     }
     ts
    .onclick = function(){
      window
    .open( this.src );
     }
    }
    </script>

    转自:http://www.phpweblog.net/fuyongjie/archive/2008/08/26/5649.html#5661
    posted @ 2008-09-25 20:55 王生生 阅读(606) | 评论 (0)编辑 收藏

        用CSS 来布局很容易。如果你已经习惯用表格布局的话,起先会感觉比较困难。其实不难,只不过动机不同。
       
    定位
        定位属性position用于定义一个元素是否absolute(绝对),relative(相对),static(静态),或者fixed(固定)。
        static值是元素的默认值,它会按照普通顺序生成,就如它们在HTML的出现一般。
        relative很像static,但可用top、right、bottom和left属性来偏移原始位置。
        absolute使元素从HTML普通流中分离出来,并把它送到一个完全属于自己的定位世界。在这个稍微疯狂的世界,这个绝对的元素可以放置到任何地方,只要设置了top、right、bottom和left的值。
        fixed的行为也很像absolute,但参考于浏览器窗口相对于页面而放置绝对的元素,所以,理论上,当页面滚动的时候,固定元素完全保持在浏览器视区中。为什么说理论上的?不为别的,在Mozilla和Opera中工作得很好,但IE不会。

    浮动 float
        浮动将移动一个元素到同一线上的左边或者右边,而周围也会有内容浮动。
        浮动经常用在定位一个页面内的小型的元素.

    posted @ 2008-09-24 15:27 王生生 阅读(179) | 评论 (0)编辑 收藏

        元标签对浏览器窗口中的内容不做任何事情,它们用在关于页面的像搜索引擎的归类目录信息中。
        元标签meta可以使用尽可能多次如你所需,包括内容属性content(必须的)、名称属性name和http-equiv属性。

        名称name属性可以是你喜欢的任何东西,通常使用的是作者author,关键词keywords和描述description。描述常被搜索引擎(比如Google,百度)用来在搜索结果中描述页面,而它本身也可能是元标签中最有用的应用。

        http-equiv属性取替名称name属性会产生HTTP数据头,它将会发送页面拥有的信息给服务器。随后内容属性content可以是content-type(类型)、expires(时效)、refresh(刷新,多长时间页面会自动刷新一次)以及set-cookie(设置cookie)。
    <html>
       <head>
          <title>Title</title>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
          <meta name="description" content="This is my bloody exciting web page about air conditioners" /> ...
    注意
        元标签之所以重要,是因为它们为搜索引擎所依赖和为页面建立概况。比如关键词keywords元数据就被广泛运用。如今,大部分的搜索引擎使用页面本身的内容,使大部分元数据对于阅读这个HTML的用户来说是没有什么作用的,除了转换信息以外。


    posted @ 2008-09-24 14:48 王生生 阅读(152) | 评论 (0)编辑 收藏

        HTML只是赋予内容的手段,大部分HTML标签都有其意义(标签p创建段落,h1标签创建标题等等)的,然而span和div标签似乎没有任何内容上的意义,听起来就像一个泡沫做成的锤子一样无用。但实际上,与CSS结合起来后,它们被用得十分广泛。它们被用来组合一大块的HTML代码并赋予一定的信息,大部分用类属性class和标识属性id与元素联系起来。
        span和div的不同之处在于span是内联的,用在一小块的内联HTML中,而div(想想division是什么意思)元素是块级的(简单地说,它等同于其前后有断行),用于组合一大块的代码。
    <div id="scissors">
       <p>This is <span class="paper">crazy</span></p>
    </div>
        在实践中,div,特别是span不应该滥用,尽管有其他相左的意见。比如,你要强调单词“crazy”和加粗类“paper”,可能会用这样的代码:
    <div id="scissors">
       <p>This is <strong class="paper">crazy</strong></p>
    </div>
    这是做法比再加一个span比较好。
    你所需要记住的是,span和div 是“无意义”的标签。

    posted @ 2008-09-24 14:44 王生生 阅读(145) | 评论 (0)编辑 收藏

    你可以用大量的属性来改变文本的大小和形态,概括如下:
        1.字体族font-family
        这是字体本身的名称,如“Times News Roman”,“Arial”或者“Verdana”(又如“宋体”等中文字体名称--译者著)。
    你指定的字体必须存在在用户的电脑上,所以在CSS使用字体会存在某种程度上的不确定性。有少量“安全”的字体(最常用的是Arial,Verdana和Times New Roman)。但你可以指定不止一种字体,只要用半角英文逗号,隔开就行。这样做的目的是如果用户的电脑上没有你指定的第一个字体,浏览器会逐遍寻找罗列的字体直到找到电脑上安装有的字体为止。这很有用因为不同的电脑有时侯有不同的安装字体。所以,例子font-family: arial, helvetica的目的就是用在PC(一般情况下有arial字体而没有helvetica字体)和Apple Mac上(一般有helvetica字体而没有arial字体)。
        注意:如果一个字体的名称超过一个单词,它应该用英文双引号括起来,如:font-family: "Times New Roman"。

        2.字体尺寸font-size
        定义字体的尺寸。必须小心──像标题一样的文本不应该是段落中的大字体而已,你应该使用标题标签(h1,h2 等)。甚至,在练习中,你可以使段落文本字体尺寸大于标题(不推荐使用,如果你明智的话)。

        3.字体加粗font-weight
        这用来声明文本粗细与否。实际应用中一般只有两种形式:font-weight: bold(粗体)和font-weight: normal(普通)。在理论上,它们的值有bolder(更粗),lighter(更细),100,200,300,400,500,600,700,800或者900,但许多浏览器会摇摇头,说:“我不认为这样”,所以使用bold和normal是比较安全的。

        4.字体样式font-style
        这定义文本正斜与否。可以这样使用 font-style: italic(倾斜)或者font-style: normal(正常)。

        5.文本装饰text-decoration
        这用来声明文本是否有划线。可以这样使用:
        text-decoration: overline──文本上面的划线。
        text-decoration: line-through──穿过文本的删除线。
        text-decoration: underline──这应该只使用在连接中,因为用户一般认为连接才有下划线。 这个属性通常用来装饰连接,而         text-decoration: none则是表示没有任何划线。

        6.文本转换text-transform
        这可以转换文本的大小写。
        text-transform: capitalize把每个单词的首字母转换成大写。 text-transform: uppercase把所有的字母都转换成大写。 text-transform: lowercase把所有的字母都转换成小写。 text-transform: none?你自己试一试啦。

        7.文本间距
        字母间隔letter-spacing和文本间隔 word-spacing属性分别用在字母间和单词间的距离。它们的值可以是长度或者默认的普通normal。
    line-height属性为比如段落等元素设置行高,它并不改变字体的尺寸。它的值可以是长度,百分比或者默认的normal。

        8.文本水平对齐
        text-align属性将对元素里的文本向左、右、中间或者两端对齐,自然,它们的值分别left(左)、 right(右)、center(中间)或者 justify(两端)。

        9.文本缩进
        text-indent属性依据你设置的长度或者百分比值对文本段落的第一行进行缩进。在印刷中经常会用到这样的格式,然而在像网页这样的电子媒体中并不常用。


    posted @ 2008-09-24 14:38 王生生 阅读(249) | 评论 (0)编辑 收藏

    呵呵,这两天项目比较急,事情也比较多,所以没有及时更新。
    上一回简单介绍了代理机制,通过创建LogBeforeAdvice来实现。通过实现MethodBeforeAdvice接口,会在目标对象的方法执行之前被呼叫。当然也可以通过实现AfterReturningAdvice,使得目标对象的方法在执行之后被调用。
    同样创建LogAfterAdvice类,实现AfterReturningAdvice接口。
    lib包下载:http://www.ziddu.com/download/3555992/SpringAndaop.rar.html

    (1)LogAfterAdvice.java

    package com.proxy;

    import java.lang.reflect.*;
    import java.util.logging.Logger;
    import java.util.logging.Level;
    import org.springframework.aop.AfterReturningAdvice;

    public class LogAfterAdvice  implements AfterReturningAdvice{

     private Logger logger=Logger.getLogger(this.getClass().getName());
     public void afterReturning(Object object,Method method,Object[] args,Object target) throws Throwable
     {
      logger.log(Level.INFO,"LogAfterAdvice mehtod ends "+method);
     }

    }
    (2)advice-config.xml修改如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
     <bean id="logBeforeAdvice" class="com.proxy.LogBeforeAdvice" />
        <bean id="logAfterAdvice" class="com.proxy.LogAfterAdvice" />
     <bean id="helloSpeaker" class="com.proxy.HelloSpeaker" />
     
     <bean id="helloProxy"
      class="org.springframework.aop.framework.ProxyFactoryBean"><!--建立代理对象-->
      <property name="proxyInterfaces"><!--代理接口-->
       <value>com.proxy.IHello</value>
      </property>
      <property name="target"><!--代理目标-->
       <ref bean="helloSpeaker"/>
      </property>
      <property name="interceptorNames"><!--代理实现类-->
       <list>
        <value>logBeforeAdvice</value>
        <value>logAfterAdvice</value>
       </list>
      </property>
     </bean>
     
    </beans>

    这样就实现了目标对象的方法在执行之后被调用。


    同样,在方法执行前后调用目标对象的方法也可以不通过上面的这种方式(毕竟实现两个接口比较麻烦),可以直接通过实现MethodInterceptor接口,达到目的。
    如LogInterceptor类便实现了这样的接口,如下
    (3)LogInterceptor.java

    package com.proxy;

    import java.util.logging.Logger;
    import java.util.logging.Level;
    import org.aopalliance.intercept.*;

    public class LogInterceptor  implements MethodInterceptor{

     private Logger logger=Logger.getLogger(this.getClass().getName());

     public Object invoke(MethodInvocation Invocation) throws Throwable {
      
      logger.log(Level.INFO,"LogInterceptor method starts..."+Invocation.getMethod());
      
      Object result=null;
      
      try
      {
       result=Invocation.proceed();
      }
      finally
      {
       logger.log(Level.INFO,"LogInterceptor method ends..."+Invocation.getMethod());
      }
      return result;
     }

    }

    (4)advice-config.xml 配置文件修改如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
     <bean id="logInterceptor" class="com.proxy.LogInterceptor" />
     <bean id="helloSpeaker" class="com.proxy.HelloSpeaker" />
     
     <bean id="helloProxy"
      class="org.springframework.aop.framework.ProxyFactoryBean"><!--建立代理对象-->
      <property name="proxyInterfaces"><!--代理接口-->
       <value>com.proxy.IHello</value>
      </property>
      <property name="target"><!--代理目标-->
       <ref bean="helloSpeaker"/>
      </property>
      <property name="interceptorNames"><!--代理实现类-->
       <list>
        <value>logInterceptor</value>
       </list>
      </property>
     </bean>
     
    </beans>

    通过实现MethodInterceptor接口,同样实现了这样的功能。



     

    posted @ 2007-10-31 19:14 王生生 阅读(962) | 评论 (0)编辑 收藏

    上一笔记,介绍了代理机制,这一节介绍Spring是如何实现代理。
    通过一个例子来说明。
    包下载地址:
    http://www.ziddu.com/download/3555992/SpringAndaop.rar.html

    (1)创建LogBeforeAdvice类(实现MethodBeforeAdvice接口,会在目标对象的方法执行之前被呼叫)

    package com.proxy;

    import java.lang.reflect.*;
    import java.util.logging.Logger;
    import java.util.logging.Level;
    import org.springframework.aop.MethodBeforeAdvice;;

    public class LogBeforeAdvice  implements MethodBeforeAdvice{

     private Logger logger=Logger.getLogger(this.getClass().getName());
     public void before(Method method,Object[] args,Object target) throws Throwable
     {
      logger.log(Level.INFO,"mehtod starts "+method);
     }
    }


    (2)创建配置文件advice-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
     <bean id="logBeforeAdvice" class="com.proxy.LogBeforeAdvice" />
     <bean id="helloSpeaker" class="com.proxy.HelloSpeaker" />
     
     <bean id="helloProxy"
      class="org.springframework.aop.framework.ProxyFactoryBean"><!--建立代理对象-->
      <property name="proxyInterfaces"><!--代理接口-->
       <value>com.proxy.IHello</value>
      </property>
      <property name="target"><!--代理目标-->
       <ref bean="helloSpeaker" />
      </property>
      <property name="interceptorNames"><!--代理实现类-->
       <list>
        <value>logBeforeAdvice</value>
       </list>
      </property>
     </bean>
     
    </beans>
    (3)测试类SpringAOPDemo

    package com.proxy;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;

    public class SpringAOPDemo {
     public static void main(String[] args)
     {
      //读取配置文件
      ApplicationContext context=new FileSystemXmlApplicationContext("advice-config.xml");
      IHello helloProxy=(IHello)context.getBean("helloProxy");
      helloProxy.hello("ducklyl");
      
     }
    }

    运行测试类,结果如下:
    Hello,ducklyl

    posted @ 2007-10-28 17:47 王生生 阅读(977) | 评论 (1)编辑 收藏

    接下来学习有关AOP,首先了解有关代理机制(Spring实现AOP的一种方式)。代理分为两种:静态代理与动态代理。
    通过一个例子来了解静态代理。
     Lib包下载:
    http://www.ziddu.com/download/3555992/SpringAndaop.rar.html
    (1)一个简单的接口IHello

    package com.proxy;
    /**
     * 接口
     *
     * **/
    public interface IHello {
     public void hello(String name);

    }
    (2)实现类HelloSpeaker

    package com.proxy;

    public class HelloSpeaker implements IHello{

     public void hello(String name) {
      System.out.println("Hello,"+name);
      
     }

    }
    (3)代理类HelloProxy

    package com.proxy;
    import java.util.logging.*;
    /**
     * 静态代理类,代理真正的实现类HelloSpeaker来执行
     *
     * */
    public class HelloProxy implements IHello{

     private Logger logger=Logger.getLogger(this.getClass().getName());
     
     private IHello helloObject;//接口声明

     //构造函数
     public HelloProxy(IHello helloObject)
     {
      this.helloObject=helloObject;
     }
     //接口实现方法
     public void hello(String name)
     {
      log("hello methods starts...");
      helloObject.hello(name);
      log("hello methods ends...");
     }
     private void log(String msg)
     {
      logger.log(Level.INFO,msg);
     }

    }

    (4)测试类ProxyDemo

    package com.proxy;

    public class ProxyDemo {
     public static void main(String[] args)
     {
      //静态代理模式
      HelloProxy proxy=new HelloProxy(new HelloSpeaker());
      proxy.hello("ducklyl");
     }

    }
    运行测试类,结果为:
    Hello,ducklyl
    2007-10-28 10:52:26 com.proxy.HelloProxy log
    信息: hello methods starts...
    2007-10-28 10:52:27 com.proxy.HelloProxy log
    信息: hello methods ends...



    接下来介绍动态代理
    (1)创建动态代理类LogHandler

    package com.proxy;

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.logging.*;
    /**
     *
     * 动态代理类
     * **/

    public class LogHandler implements InvocationHandler {

     private Logger logger = Logger.getLogger(this.getClass().getName());

     private Object delegate;

     public LogHandler()
     {
     }
     
     public Object bind(Object delegate) {
      this.delegate = delegate;
      log("bind starts...");
      return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
        delegate.getClass().getInterfaces(), this);
     }

     public Object invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
      Object result = null;
      try {
       log("method starts..." + method);
       result = method.invoke(delegate, args);
       log("method ends..." + method);
      } catch (Exception e) {
       log(e.toString());
      }
      return null;
     }

     private void log(String msg) {
      logger.log(Level.INFO, msg);
     }

    }
    (2)创建测试类ProxyTest

    package com.proxy;

    public class ProxyTest {
     public static void main(String[] args)
     {
      LogHandler logHandler=new LogHandler();
      //logHandler代理HelloSpeaker实例,调用hello
      IHello helloProxy=(IHello)logHandler.bind(new HelloSpeaker());
      helloProxy.hello("ducklyl");
     }

    }

    运行测试类,结果为:
    Hello,ducklyl
    2007-10-28 11:24:59 com.proxy.LogHandler log
    信息: bind starts...
    2007-10-28 11:24:59 com.proxy.LogHandler log
    信息: method starts...public abstract void com.proxy.IHello.hello(java.lang.String)
    2007-10-28 11:24:59 com.proxy.LogHandler log
    信息: method ends...public abstract void com.proxy.IHello.hello(java.lang.String)


    posted @ 2007-10-28 11:00 王生生 阅读(966) | 评论 (0)编辑 收藏

    这次介绍有关资源相关的接口:org.springframework.context.MessageResource.而类org.springframework.context.ApplicationContext实现了该接口.,您可以通过getMessage()的方法来取得资源文件,从而实现国际化消息。
    通过一个例子来说明。
    导入Spring所需的包:commons-logging.jar,spring.jar 。(日志包和Spring包)
    包下载地址:
    http://www.ziddu.com/download/3555993/Spring.rar.html

    (1)创建resource-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
     <property name="basename">
        <value>duck</value> <!-- 资源文件名前缀 -->
     </property>
    </bean>

    </beans>
    (2)创建资源文件duck_en_US.properties,duck_zh_CN.properties两个文件
    duck_en_US.properties内容为:
    ducklyl=User {0} login at {1}

    duck_zh_CN.properties内容(经过JDK工具native2ascii)编码转换为:
    ducklyl=\u7528\u6237 {0} \u4e8e {1} \u767b\u9646

    (3)创建测试类

    package com.resource;

    import java.util.*;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;


    public class SpringTest {
     public static void main(String[] args)
     {
     //读取配置文件
     ApplicationContext context=new FileSystemXmlApplicationContext("src/com/resource/resource-config.xml");
     
     //传入两个参数,替换资源文件{0},{1}
     String[] para=new String[]{"王生生",Calendar.getInstance().getTime().toString()};
     
     System.out.println(context.getMessage("ducklyl", para,Locale.US));
     System.out.println(context.getMessage("ducklyl", para,Locale.CHINA));
     
    }
    }

    如果以上配置正确,运行结果为:

    User 王生生 login at Thu Oct 25 19:15:59 CST 2007
    用户 王生生 于 Thu Oct 25 19:15:59 CST 2007 登陆

    posted @ 2007-10-25 19:28 王生生 阅读(983) | 评论 (1)编辑 收藏

    Spring提供了一个BeanFactoryPostProcessor接口的实现类:CustomEditorConfigurer。这个类可以实现java.beans.PropertyEditor接口的类,并将字符串值转换为指定类型的对象。
    通过一个简单的例子来说明。
    导入Spring所需的包:commons-logging.jar,spring.jar 。(日志包和Spring包)
    包下载地址:
    http://www.ziddu.com/download/3555993/Spring.rar.html
    或者http://www.blogjava.net/Files/ducklyl/Spring.rar

    (1)创建User 类

    package com.editor;

    public class User {
     private String name;
     private int number;
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public int getNumber() {
      return number;
     }
     public void setNumber(int number) {
      this.number = number;
     }

    }

    (2)创建HelloBean 类

    package com.editor;

    public class HelloBean {
     private String helloWord;
     private User user;
     public String getHelloWord() {
      return helloWord;
     }
     public void setHelloWord(String helloWord) {
      this.helloWord = helloWord;
     }
     public User getUser() {
      return user;
     }
     public void setUser(User user) {
      this.user = user;
     }


    }
    (3)创建UserEditor 类

    package com.editor;
    import java.beans.PropertyEditorSupport;

    public class UserEditor extends PropertyEditorSupport{
     public void setAsText(String text)
     {
      String[] strs=text.split(",");
      int number=Integer.parseInt(strs[1]);
      
      User user=new User();
      user.setName(strs[0]);
      user.setNumber(number);
      
      setValue(user);
     }

    }


    (4)在类路径下创建property-config.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
     <bean id="EditorConfigBean"
      class="org.springframework.beans.factory.config.CustomEditorConfigurer">
      <property name="customEditors"><!--CustomEditorConfigurer类会加载"customEditors"属性设定的map-->
       <map>
        <entry key="com.editor.User">
         <bean id="userEditor" class="com.editor.UserEditor" />
        </entry>
       </map>
      </property>
     </bean>

     <bean id="helloBean" class="com.editor.HelloBean">
      <property name="helloWord">
       <value>Hello!</value>
      </property>
      <property name="user">
       <value>ducklyl,123456</value>
      </property>
     </bean>

    </beans>
    (5)创建测试类

    package com.editor;

    import org.springframework.context.*;
    import org.springframework.context.support.*;


    public class SpirngTest {
     public static void main(String[] args)
     {
      //读取配置文件
      ApplicationContext context=new FileSystemXmlApplicationContext("property-config.xml");
      //获取id="helloBean"对象
      HelloBean hello=(HelloBean)context.getBean("helloBean");
      //调用helloBean对象getHelloWord()方法
      System.out.println(hello.getHelloWord());
      System.out.println("Name:"+hello.getUser().getName());
      System.out.println("Number:"+hello.getUser().getNumber());
     }

    }
    如果以上正确设置,运行结果为:
    Hello!
    Name:ducklyl
    Number:123456

    posted @ 2007-10-24 19:32 王生生 阅读(1283) | 评论 (1)编辑 收藏

    之前的例子比较简单,打算了解一下Spring的基本用法。Spring的依赖注入有三种实现方式,常用是setter和construct方式。对于像数组和集合对象注入,注入前必须填充一些对象到集合中,然后再把集合注入到Bean,采用setter方式来完成。
    通过一个例子来说明。
    导入Spring所需的包:commons-logging.jar,spring.jar 。(日志包和Spring包)
    包下载地址:
    http://www.ziddu.com/download/3555993/Spring.rar.html
    (1)创建ObjectSet类
    package com.set;

    public class ObjectSet {
     private String name;

     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public String toString()
     {
      return name;
     }
    }
    (2)创建SomeBean类
    package com.set;

    import java.util.List;
    import java.util.Map;

    public class SomeBean {
     private String[] someStrArray;
     private ObjectSet[] someObjArray;
     private List someList;
     private Map someMap;
     public SomeBean()
     {}
     public List getSomeList() {
      return someList;
     }
     public void setSomeList(List someList) {
      this.someList = someList;
     }
     public Map getSomeMap() {
      return someMap;
     }
     public void setSomeMap(Map someMap) {
      this.someMap = someMap;
     }
     public ObjectSet[] getSomeObjArray() {
      return someObjArray;
     }
     public void setSomeObjArray(ObjectSet[] someObjArray) {
      this.someObjArray = someObjArray;
     }
     public String[] getSomeStrArray() {
      return someStrArray;
     }
     public void setSomeStrArray(String[] someStrArray) {
      this.someStrArray = someStrArray;
     }
    }
    (3)在类路径下,创建set-config.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="first_object" class="com.set.ObjectSet" >
     <property name="name">
        <value>ducklyl</value>
     </property>
    </bean>
    <bean id="second_object" class="com.set.ObjectSet" >
     <property name="name">
        <value>wangsp</value>
     </property>
    </bean>

    <bean id="someBean" class="com.set.SomeBean" >
     <property name="someStrArray">
        <list>
         <value>Hello</value>
         <value>Welcome</value>
        </list>
     </property>
     <property name="someObjArray">
      <list>
       <ref bean="first_object"/>
       <ref bean="second_object"/>
      </list>
     </property>
     <property name="someList">
      <list>
       <value>ListTest</value>
       <ref bean="first_object"/>
       <ref bean="second_object"/>
      </list>
     </property>
     <property name="someMap">
      <map>
       <entry key="first">
        <value>Hello,ducklyl!</value>
       </entry>
       <entry key="second">
        <ref bean="first_object"/>
       </entry>
      </map>
     </property>
    </bean>
    </beans>
    (4)创建测试类SpringTest

    package com.set;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    import java.util.*;

    public class SpringTest {
     public static void main(String[] args)
     {
     //读取配置文件
     ApplicationContext context=new FileSystemXmlApplicationContext("set-config.xml");
     //获取id="setBean"对象
     SomeBean someBean=(SomeBean)context.getBean("someBean");
     
        //获取someStrArray,someObjArray
     String[] strs=someBean.getSomeStrArray();
     ObjectSet[] some=someBean.getSomeObjArray();
     
     for(int i=0;i<strs.length;i++)
     System.out.println(strs[i]+","+some[i]);
     
        //获取someList
     List someList=(List)someBean.getSomeList();
     for(int i=0;i<someList.size();i++)
      System.out.println(someList.get(i));
     
     //获取someMap
     Map someMap=someBean.getSomeMap();
     System.out.println(someMap);
     
    }
    }

    如果以上配置正确,运行测试程序,结果如下:
    Hello,ducklyl
    Welcome,wangsp
    ListTest
    ducklyl
    wangsp
    {first=Hello,ducklyl!, second=ducklyl}

    posted @ 2007-10-22 16:40 王生生 阅读(1306) | 评论 (5)编辑 收藏

    最近项目中涉及到外网平台调远程接口数据的问题,本来是用soap方式实现的,今天听人介绍了Hessian,想不到它的实现更加简单,代码写起来也比较少。
    下面这个例子我是从Hessian官方上,稍微改了点。
    创建一个名为Hessian的web工程,测试服务器为tomcat5.0,lib目录下必须包含hessian-3.0.20.jar包,下载地址:
    http://www.ziddu.com/download/3556057/hessian-3.0.20.jar.rar.html
    (1)接口Basic

    package example;

    public interface Basic {
       public String hello(); //与服务端的hello方法对应
    }
    (2)服务端实现类

    package example;

    public class BasicService implements Basic {
      private String _greeting = "Hello,ducklyl!";

      public void setGreeting(String greeting)
      {
        _greeting = greeting;
      }

      public String hello()
      {
        return _greeting;
      }
    }

    (3)客户端实现类

    package example;

    import com.caucho.hessian.client.HessianProxyFactory;
    /**  
     * <p>Title: hessian实现远程调用</p>  
     * <p>Copyright: Copyright (c) 2007</p>  
     * @author ducklyl  
     * @version 1.0  
     */  
    public class BasicClient {
      public static void main(String []args)
        throws Exception
      {
        String url = "http://127.0.0.1:8080/Hessian/ducklyl";
        //创建factory实例
        HessianProxyFactory factory = new HessianProxyFactory();
        //客户端需实现Basic接口
        Basic basic = (Basic) factory.create(Basic.class, url);

        System.out.println("Hessian: " + basic.hello());
      }
    }

    (4) web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
     <web-app>
      <servlet>
       <servlet-name>ducklyl</servlet-name>
       <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        <init-param>
          <param-name>home-class</param-name>
          <param-value>example.BasicService</param-value>
        </init-param>
        <init-param>
          <param-name>home-api</param-name>
          <param-value>example.Basic</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
     <servlet-name>ducklyl</servlet-name>
        <url-pattern>/ducklyl</url-pattern>
      </servlet-mapping>
    </web-app>

     运行客户端程序BasicClient ,如果以下配置没问题,输出结果为:

    Hessian: Hello,ducklyl!
    posted @ 2007-10-21 20:20 王生生 阅读(8213) | 评论 (4)编辑 收藏

    计划用一个月时间来学习Spring,在这里把自己的学习过程记录下来,方便想学习Spring的人,也为自己日后复习有个参考。以下通过一个简单的例子来先了解下Spring的用法。
    (1)创建一个java工程,建立如下类:HelloBean

    package com.ducklyl;

    public class HelloBean {
     private String helloWord;

     public String getHelloWord() {
      return helloWord;
     }

     public void setHelloWord(String helloWord) {
      this.helloWord = helloWord;
     }


    }


    (2)创建Spring配置文件:beans-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
    <bean id="helloBean" class="com.ducklyl.HelloBean">
     <property name="helloWord">
        <value>Hello,ducklyl!</value>
     </property>
    </bean>

    </beans>

    (3)导入Spring所需的包:commons-logging.jar,spring.jar 。(日志包和Spring包)
    包下载地址:
    http://www.ziddu.com/download/3555993/Spring.rar.html
    (4)创建测试类:SpringDemo.java

    package com.ducklyl;

    import org.springframework.core.io.FileSystemResource;
    import org.springframework.core.io.Resource;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.xml.*;


    public class SpringDemo{
     public static void main(String[] args)
     {
      //读取配置文件
      Resource rs=new FileSystemResource("beans-config.xml");
      //实例化Bean工厂
      BeanFactory factory=new XmlBeanFactory(rs);
      
      //获取id="helloBean"对象
      HelloBean hello=(HelloBean)factory.getBean("helloBean");
      //调用helloBean对象getHelloWord()方法
      System.out.println(hello.getHelloWord());
     }

    }

    如果以上配置正确的话,运行SpringDemo.java,可以看到输出结果:Hello,ducklyl!



        

    posted @ 2007-10-21 13:26 王生生 阅读(2122) | 评论 (12)编辑 收藏

    森露2013新款豹纹打底衫 高领 女 长袖 修身长袖t恤女 加绒加厚冬 2013春秋新款女装 潮修身大码长袖小西装外套女 韩版中长款小西装 忧忧鱼2013秋冬新款直筒裤女显瘦长裤加绒黑色休闲裤修身西裤女裤