03 Sep 2007

地主的奋斗

'妙文转载'



古代,有一个地主,家有良田百亩,算是一个小地主,他家一共雇佣了4个雇农,都属于长工性质,主要负责田地的耕种。


  开始,地主按照传统的方式对雇农采用高压政策,雇佣了一个护卫作为监工,现场监督雇农劳作,雇农稍有懈怠就会招来监工的一顿鞭打。雇农们非常气愤,经常聚集在一起声讨地主,一致达成默契,表面服从,但暗地里都不努力劳动,一有可能就磨洋工。


  一年下来,收成比别家低了许多,地主一怒之下,认为护卫监工不力,便换了个护卫,由于成本问题,他不可能雇佣更多的人来做监工。第二年收成依然下降,而且还发生了雇农集体罢工事件。


  地主气不打一处来,将监工和雇农全部拿下,并增加了四个雇农,他们分别是张三、李四、王五、赵六,同时地主亲自参与监督雇农的劳作,但情况丝毫没有转变,到了年底收成依然达不到理想水平。


  地主苦恼极了,正在此时,一个西方的传教士来到这个封闭的山庄,经过与传教士的深层次交流,地主深感资本主义的先进性,他转变成为了新兴派人物,同时落实到实际情况上,他辞退了监工,并强调给予雇农们充分人权和自由,保证不再采用强制性的高压政策,而采用固定工资制并制定了详细的规章制度。


  规章制度规定雇农们每日鸡叫必须起床,太阳升起之前必须上岗劳动,中午太阳烈时可以在树荫下休息一个时辰,太阳落山了才能够收工。上工和收工都必须在地主家按拇指印,考虑到雇农还得照顾家庭,地主规定雇农每隔5天可以休息2天,但条件是不得耽误农活。


  凡违反劳动记录,一次迟到或早退扣罚当天工资,一次旷工扣罚10天工资,一年累计5次旷工(三次迟到或早退算一次旷工,缺少一个拇指印按半次旷工处理)做自动离职处理。劳动期间不准偷懒和晒太阳,凡发现者一律按迟到论处。


  由于地主提供的薪金极具挑战性,而且按月提供,不至于青黄不接,雇农们欣喜若狂,纷纷表示一定要努力工作,以报答地主的大恩大德。


  当年土地收成提高了50%,地主看到民主管理带来的巨大收益,高兴得嘴都笑不合拢。兴奋之余,他决定扩大生产规模,于是向其他地主购买了100亩土地,另外又招聘了周七、武八两个雇农,准备大干一场。


  一切照旧,想象着年底丰厚的收成,地主经常从睡梦中笑醒,日子一天天过去,年底来了,收成汇总下来,在新增100亩地和两个人的情况下,收入仅仅增长了10%.地主气急败坏,把雇农们召集起来,开了一个声色俱厉的批判大会。大会会场悬挂了一幅大大的横幅上书一行大字“今天不努力耕作,明天就努力找耕作”让人看了胆战心惊、不寒而栗。


  会上地主在深刻批判了雇农们的懒惰和无能后,宣布今年年终最后一个月的工资全部扣罚。


  这一下子向捅了马蜂窝一样,大家纷纷表示不满和抗议,地主用手指朝横幅一指,丢下一句话“谁不想干,立马走人”转身便走。大家象焉了的茄子一般,都不讲话。


  会后,张三、李四和王五在一起打“斗地主”,一边打,一边骂地主狠心,让他们过年都没有钱拿回家,这下子回家不被老婆骂死才怪。


  一番发泄之后他们决定分头去找地主说情。


  张三首先出发,找到地主诉苦说他们四个人本来干得好好的,由于新来的周七、武八两个人平时工作不努力,一有机会就偷懒,而每个月工资和大家拿得一样多,时间长了大家觉得心里不公平,于是便纷纷开始偷懒,所以才造成了收成下降的原因。


  地主勃然大怒,决定找其他人来确认此事,他决心一旦落实此事,定当对当事人予以重罚。


  张三走后,李四旋即来找地主反映情况,地主当即核实了周七、武八的事情,情况基本与张三讲的一致。


  李四走后,王五也找地主谈心来了,除了张三、李四提及的问题外,他还提到了另外一个情况,说他有一次看到隔壁家的牛来吃庄稼,他去赶的时候被牛角顶破了腿,第二天没有能够来上班,被地主扣罚了10天的工资,于是以后他看见别家的牛吃庄稼就再也不管了。地主哼他一顿道“当时你为什么不声明理由呢?”王五说“我本来准备说的,但你当时气急败坏的样子把我吓慌了,就没有讲,过后也没有机会再说”。


  地主想,接下来该赵六来了,谁知等了一天却没有等到。地主等不及了,正准备召开员工大会,宣布对周七和武八的处分决定。俩人同时来找地主了,地主将他们大声责罚一番,两人大呼冤枉,说张三、李四他们仗着是老员工,资历老,人数多,平时经常欺负他们,自己从不好好劳动,还嘲笑他们俩踏实肯干是傻冒,还说他们经常在地主去视察的时候装着勤劳的样子。


  地主晕了,一下子分不清真伪,将六人找来当面对质,大家除了吵成一团外,没有解决丝毫的问题。


  地主被吵得不行,恍惚中似乎发现了问题的症结所在,他决定推行承包制,将土地划分为六份,采用招标的方式,根据土地的肥沃程度和面积大小以及耕种难度等指标,由地主事先根据往年的指标核定一个最低土地收益,由六人投标竟价,最后价高者承包成功,以此类推,直到最后一块土地。


  雇农们似乎对此都表示了极大的热情,投标当天,他们六人共同用竹竿支撑起一条更大更醒目的横幅,上书“地主,地主我爱你,我们永远支持你!”。地主看到横幅,前段时间的不快一扫而光,笑眯了双眼看着大家,大家回报给他的是自信而激昂向上的眼光。


  招标非常成功在经过激烈的竟标之后大家都获得了比较满意的结果。


  会场散去,地主的目光中散发出一种醉人的芬芳,他仿佛又看到了明年谷物满仓的丰收景象。


  刚开始,地主不放心,不时的到田间地头去转转,看见大家都在辛勤的耕种,庄稼一块比一块好,地主终于放下了心,在传教士朋友的邀请下,他们一起去游历祖国大好的河山,一去就是大半年。


  年底地主回到家里,看到自家的谷仓里面装满了稻谷、玉米等粮食,看到老婆脸上灿烂的笑容,不用说,今年的收成好得不得了。


  一算下来,“哇”,地主禁不住跳了起来,今年的净收益比上年增长了100%,雇农们全部完成定额,每人还主动多贡献了20%.地主尝试到了包产到户的甜头,决心将事业做大做强,他发誓要做乡里,不,县里、省里最大的地主。


  可是地主没有多余的钱大规模买地,怎么办?


  地主苦恼不已。


  第二天一开门,“哇”,门口站满了大大小小的地主们,他们每个人的额上都用血书写着“来吧,兼并我吧!”


  原来,大大小小的地主们看到地主取得了如此巨大的成绩,纷纷表示愿意用自有土地入股,与地主一起发展壮大。


  经过仔细挑选,地主选定了地主甲、地主乙、地主丙三个当地最有名的大地主作为战略合作伙伴,成立了一个土地合作经营联社,又地主出任社长负责日常经营,地主甲、地主乙、地主丙作为副社长,重大经营决策必须有三票以上同意才能通过。收益按1:1:1:1分配。


  由于几个大地主的参与,地主的经营规模一下子扩大了10倍,达到了2000亩。按每个人平均承包40亩计算,地主需要招聘50人,而目前只有6个人,地主决定公开对外招聘。


  地主放话出去,来竟标的人挤破了地主的大门,地主决定对参加投标者每人收取1两银子的投标费用,以保证投标活动的支出。仅此一项就收入1000两银子。地主们无不对地主的经营能力佩服得五体投地,尚未开张就净赚250,真是太划算了,这更增加了他们对地主的信任和爱戴。


  投标活动的会场非常热闹,到处洋溢着热烈的气氛,各种各样的横幅飘扬在会场当中好不精彩。


  “宝锄一出,谁与争锋!”


  “放眼田间,舍我其谁!”


  “东风吹,战鼓擂,如今的田地谁怕谁?”


  “没有了地,我的世界雨下个不停”


  “东方红,太阳升,我们出了个好地主!”


  还是老员工们的横幅比较感人“东家,东家,好东家,世世代代跟着你!”此条横幅被后人评选为投标最佳横幅,奖品是以后上茅厕每人可以领用两张草纸(备注:一般人每天只能领用一张)。


  竟标按预期进行,五十人经过长达三天的征战终于将和约拿下,按照同等条件,老员工优先获得和约的规则,六个老员工如愿的拿到了和约。


  从和约的统计来看,今年的每亩收益至少在去年的基础上增长50%,对于地主来说总收益的增长将达到去年的375%,想想都让人兴奋。其他的地主总收益也有很大的提高,大家都非常高兴,期待着来年的快快到来。


  第二年,地主主动邀约传教士去周游各地,这次他们去的是遥远的东瀛,一来一回正好一年的时间,地主玩得好不痛快。


  临到家了,想着家里新增的谷仓装满粮食的情景,地主的心情真是急不可耐。


  远远的看到了家门,还有门口站着的地主甲、地主乙和地主丙,他们一定是来欢迎我了。


  大老远的,地主就打着招呼“大家好!我回来了”


  看见大家阴沉着脸都没有答话,地主发现情况不对,连忙问其详情。


  原来今年的每亩收益只比去年增长了1%,这样各个地主的总收益不升反降,你叫他们怎么高兴得起来。


  “怎么会这样呢?”地主不断的自言自语到。


  地主连夜召集了10个雇农代表参加的土地收成分析研讨会,经过与会人员的充分讨论,汇总后得出如下原因:一、今年的天气比去年干旱,由于没有人肯出钱修建引水渠,导致庄稼缺水,收成下降。


  二、由于投标额太高,大部分雇农基本没有多余的收益,极大的影响了他们的积极性的发挥。


  三、没有人愿意多施肥,因为明年耕种的土地可能就不属于他们了,客观上导致土地施肥不足,产量下降。


  四、由于土地面积较以前扩大比较多,每户人家都需要增加耕牛和农具这对大家造成了新的困难,而平时这些东西闲置又比较多,这使得大家本来就薄的收益更加雪上加霜,这也是大家不愿意努力的原因。


  五、粮食收成之后,大家集中在一起竟卖,由于要卖掉换银子,大家的卖价一个比一个低,使得大家的收益降低。


  六、少数雇农缺乏职业道德,存心不交或少交承包金,甚至不惜举家迁徙到他乡,据初步统计大约有10户人家,直接导致大量的经济损失。


  经过仔细分析,地主看到了包产到户的各种弊端,决心进行大幅度的改革,但他面临的问题还很多,首当其冲的是副社长们的支持问题,地主甲已经明确提出要退股,地主乙和地主丙也在徘徊之中,维护联社的稳定是当务之急。


  由于地主耐心而细致的劝说,并承诺如果明年每亩收益增加不超过10%,地主分文不收,地主们总算同意再合作经营一年。


  经过上年的教训,地主成熟了许多。


  首先他意识到,作为领导者,仅仅制定了正确的政策,确立了发展战略就交给大家放手去做,自己不闻不问已经不适合现在的经营方式了,他必须亲自参与管理,这点对于不管何种模式来说都是至关重要的。


  其次,追求短期效应,要想在短期内年年大幅度增长,忽视了长期的投资,导致土地的后续资源不足。


  最后在经营方针上,鉴于历史原因和目前土地经济发展的状况,包产到户对农户的积极性具有重大的促进作用,地主再次肯定了在目前的联社规模下将继续坚持并不断完善包产到户的经营方式,同时针对其目前所具有的各种局限性,特地做了如下调整:一、鉴于农户的短期效应,不愿意对田地进行有效的维护,将土地承包期提高到5年。


  二、在设置投标金额上除设置保底金额外,另外设置封顶金额,在封顶金额上选取最佳人选中标,以保障投标人的合理利益。


  三、在社长和副社长的高层领导下面增设以下几个部门:1、水利部:负责辖区内的水利基础设施的建设和维护工作,农户根据用水量合理收取费用,从体制上保障耕地和人畜的用水。


  2、耕牛和农具部:出资将农户手中的耕牛全部收购上来,统一管理,并根据农户的需要安排耕种,并根据每亩收取相应的费用,多余的耕牛可以租借给其他农户。负责农具的购买和日常保养,先进农具的采购和试用等3、农肥部:建立联社统一的肥料中心,将各家各户的农家肥集中起来,并通过废料发酵等方式科学、合理的提供庄稼所需要的肥料。


  4、农技部:负责新产品、新技术以及先进的耕种方式的推广,提高农户的耕种效率和经济效益。


  5、管理部:负责农户的日常管理和相互间纠纷处理,保障农户能够安心劳作,对于可能发生欠款和困难的农户建立预警机制,确保承包金的安全。


  6、销售部:负责农产品的销售问题,确保收益的增加。


  四、确定管理人员的人选:建立了各个部门之后,选取相应的负责人就成为一个重要的任务,鉴于地主对张三等的了解决定启用他们六人作为联社的第一批管理人员。


  地主找张三等谈话,希望他们能够去农从管,提升自己的层次。张三等表示非常愿意,但对于收入提出了疑问,充当管理人员之后,自己的收入会不会发生大幅度的下降。对此,地主予以明确答复,由于工作性质已发生了改变,在目前的生产规模下,要保证以前的收益是比较困难的,但工作本身具备很高的挑战性,同时对于自己未来职业生涯的帮助非常大,大家应该克服暂时的困难,将来我们的规模扩大了,我保证大家的收益会发生巨大的转变。


  由于对地主的信任和对新工作的憧憬以及对今后人生的重新认识,张三等人决定跟着地主就新生活赌上一把,他们对自己和联社的未来充满了激情。


  张三沟通能力比较强,综合处理各种冲突的水平比较高,负责管理部。


  李四头脑灵活,善于专营,习惯和经销商打交道,负责销售部。


  王五擅长养牛负责耕牛和农具部。


  赵六喜欢专研新的农耕技术负责农技部。


  周七的农田灌溉搞得比较好,负责水利部。


  武八没什么专长,但踏实肯干,就负责农肥部。


  地主全面而系统的整体安排获得了联社其他地主的一致通过,他们决心在未来的日子里再跟地主一起同风雨共患难,共同打造美好的明天。


  工作紧张而有序的进行着,大家怀着满腔的激情奔赴各自的岗位,尽心尽力,不辞劳苦,各项工作均得到了有效的落实,事业在稳固而扎实的前进。


  这一年共做了如下大的事情:1、完成红河河水引水工程,并根据农田的布局,建设了一系列的庄稼灌溉设施。


  2、组成了50头牛的耕牛队,除圆满完成本联社的耕作计划外,在外承包了大量的耕作工程,为联社创造效益500两银子。


  3、建立了统一的肥料供应中心,保障了农民用肥需要。


  4、新推广“红河一号”产品,并取得初步见效,获得农户们的热烈欢迎。


  5、完美协调农户间的关系,全年没发生一起大的纠纷和逃税事件。


  6、寻找到好的粮食销售商,并在往年的基础上提高10%的粮食售价。


  由于各项措施安排得力,在水利、耕种、施肥、技术、农户管理、市场销售等的有力保障下,扣除大量的基础投资之后,年底每亩收益仍然较上年增长15%,考虑基础设施建设,实际增长在30%以上,而且这种增长是长期的,可以预见和有充足保障的。


  年底,在地主的倡导下,地主们一致同意对表现优异的张三等管理人员一个丰厚的红包,并加发一个月的工资。


  公司走上了正轨,大家也走上了管理者的道路,对此大家都非常高兴,期待着来年更大的收获。


  联社高层领导在经过协商后,一致同意新增资本,为此他们又引进了地主戊、地主戌、地主庚、地主辛,总耕地规模扩展到4000亩,新引进的地主表决权占原有地主的50%.新的一年开始了,新增的土地招标工作也取得了巨大的成功,新引进农户50家,这样联社直接管理的农户数目达到100家。


  一切在按部就班的执行着,但地主渐渐发现目前的管理形式出现了一些不和谐的情况,比如农户间的纠纷增多,农户对联社的各种不满情绪在扩大,张三们的工作激情似乎在减退,而且工作效率似乎不如从前,工作中相互扯皮的事件经常出现,地主经常忙于处理各种各样的冲突,尽管最后都获得了解决,但地主还是觉得其中存在明显的问题。


  年底,问题终于集中爆发了。


  问题是由李四那里开始的,今年粮食的销售价格比去年足足下降了15%,平均每亩总产量仅增长10%,这样总收益比去年还下降8%,考虑今年固定资产投资减少,汇总后每亩收益较去年依旧增加15%.相同的15%却具备不同的概念,联社高层在召开了相关的收益分析会议后,决定由地主出面组成一个调查小组,就今年出现的情况进行深入而仔细的调查分析。


  地主在深入走访各农户后,又召开了张三等中层管理人员和少数农户代表参加的分析会议,希望能够通过大家的畅所欲言,发现问题的症结所在。


  会上,地主先对大家去年一年的辛苦工作,表示感谢,并提出对去年的工作进行全面总结。


  总结首先从问题的源头,李四开始。


  李四发言了:今年的销售比往年下降的主要原因有以下几点。


  1、今年风调雨顺,农户们都有好的收成,客观上增加了供应,加大了市场的竞争,经销商压价情况比较严重。


  2、经销商普遍反映我们主要产品的成色下降,色泽还是饱满程度都不好,市民也反映不好吃。


  3、我们去年的新产品“红河一号”虽然外观比较美观,味道也好,但价格太高,市民不接受。


  针对李四的发言,赵六发言了。


  今年我们主要产品的成色下降,味道不好,主要原因在于肥料的肥度不足和灌溉水源经常出现问题,至于“红河一号”成本高的原因主要在于没有大面积的耕种,农户的耕种技巧还不成熟等原因。


  听了赵六的发言,武八不干了,他立马反驳到,由于新增2000亩的农田,而肥料中心又没有扩建,农肥部在人手不足的情况下采用轮流加班的办法,不分白天黑夜的努力工作,基本保证了才农田的用肥,那里还管得了肥料的技术指标,另外,他也指出,既然农肥的肥度不足,为什么没有人跟他提出来过。


  周七对李四的发言也表示了极大的不满,他几乎用愤概的语气说道,去年我们新增了2000亩田地的灌溉工程建设,而红河饮水工程的主渠道又没有拓宽,你叫我到哪里去找水源,能够基本保证供水我们已经是出了大力了。


  农户甲说,联社去年总的说来工作效率非常低,有一次,为了水源,他同其他农户乙发生了纠纷,要求联社出面解决,结果,整整三天后,才有人来问了一下情况,后又没了下文,这样的情况几乎所有的农户都遇见过,无论是缺少化肥、种子,还是相互间的纠纷,联社都处理得非常另人不满意,农户们对联社基本上已丧失了信任,有纠纷,有困难基本都自己解决。


  张三听后,也坐不做了,他站起来说道,农户甲说的的确不错,去年我们的工作的确存在这样或那样的问题,可是我敢保证,所有的纠纷,凡是报到管理部的,我们都负责处理了的,只是由于人手的原因,处理得不是很及时。他随即叫来当时处理该问题的小刘。


  小刘来了后,说道,当时由于每天要处理的纠纷太多,而农户相互间又互相不买账,所以只好根据当时的情况,直接处理了,后来具体他们到底服不服气,有没有执行就没有时间去追问。


  大家都讲完了,只有王五没有发言,也没有农户对王五的工作指出不满,但地主还是指了出来,他问到,今年耕牛和农具部在新增50头牛的基础上,为什么赚取的外汇反而比去年减少了许多?


  王五似乎也憋着一肚子气,他说道,新增50头牛,2000亩地,我的人手才增加了2人,忙都忙不过来,哪点还有时间去接外面的活儿,再说,弟兄们平时工作够累的了,出去接活也不增加收入,就算我安排他们去,也没人愿意去。


  王五的话成了一个火药引子,大家纷纷开始诉苦,主题均是关于工作、收入和付出的。主要集中在如下几点:1、去年,大家刚刚转型,联社也处于创业的阶段,富有激情和冲劲,不辞辛苦,不计报酬使得联社取得了较大的收益,今年大家都适应了新的工作方式,土地也增加了100%,而大家的收入却没有增加多少,目前他们管理人员的收入仅是农户的1/2,而下属员工的收入就更加少了,这极大的影响了大家的工作热情和工作效率。


  2、工作缺乏考核和激励,大家干好,干坏一个样,创造效益和亏损的都不会影响大家的工资收入。


  3、部门间缺乏有效的沟通和配合,互相不买账,各自为政的特点非常明显。


  4、个别部门官僚主义严重,对农户反映的问题不及时处理。


  在听了大家的汇报和争吵后,地主的心中对目前联社存在的问题有了清晰的认识,他决心就这些问题做一个完整的规划,以保证今后不再出现以上问题。


 From: http://blog.csdn.net/yuanchuang/archive/2007/04/14/1564738.aspx

02 Sep 2007

员工辞职的十大原因!

美国企管顾问史密斯(Gregory Smith),日前在《CEO Refresher》杂志上指出,根据他多年的顾问经验,员工辞职的十大原因为
1、员工的工作量过重,造成他们必须在晚上或周末加班。

2、公司不愿意在办公室杂务上,另外再花费雇用专人负责,以致专业工作者必须自行做影印等工作。

3、当员工可以在其他公司找到薪水高二至三成的工作时,公司却宣布暂时不帮员工加薪及升迁。

  4、公司不附予员工做决定的权力。

  5、公司不断重整部门、转调员工职务,以及改变公司走向。

6、公司不向员工清楚沟通目标及决定,以致有时候当员工完成一项工作时,却遭到公司的拒绝,严重打击士气。

  7、主管对某些员工偏心,给予他们较好的办公室,或者较舒适的出差机会等。

  8、公司搬家,迫使员工通勤时间加倍等。

  9、公司升迁没有能力的员工,真正的人才却没有受到重视。

  10、公司虽然强调团队合作,但是却塑造部门或员工间必须激烈竞争的环境

29 Aug 2007

本人的博客性别鉴定



博客园-武眉博<.








93.0%男性倾向,7.0%女性倾向



评点:您的文风冷静而镇定,言语间展现出强悍的思辨能力与恢宏的胸襟,一个男子汉的阳刚形象跃然纸上。
yodao | 博客男女

05 Aug 2007

自定义控件实现广告内容后期加载,以及NamingContainer层次的应用

自定义控件:广告内容后期加载。以及NamingContainer层次的应用
网站上的广告内容可能会因加载过慢而导致整个网页加载过慢
我们可以考虑将广告内全部放在网页最底部,等整个页面加载完毕後
再采用javascript使其显示,考虑给控件一个TargetContainerID标识
控件广告内容将要被显示的容器ID,然后从控件自己所处的 开始向上查找该ID
所指定的控件,(我们只向上找而没有向下找,并且没有处理某层次的
子NamingContainer,所以不一定能够找到,这里没有考虑从Page对象向下递归查找
主要考虑为了提高性能),如果没有找到,则考虑给用户一个事件让用户自己处理TargetContainer

下面的自定义控件对此实现了封装:

//------------------------------------------------------------------------------ // // Copyright (c) www.github.com All rights reserved. // //------------------------------------------------------------------------------ namespace HBZ.Ads.Controls { using System; using System.ComponentModel; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using HBZ.Ads; using System.Collections.Generic; using System.Text; [Designer( typeof( HBZ.Ads.Controls.AdRotatorDesigner ) )] public class AdRotator : WebControl { private Dictionary findControlHelperCacheList = new Dictionary( ); private readonly string scriptFormat = " var {0}_target = document.getElementById(\"{0}\"); var {1}_base = document.getElementById(\"{1}\"); if ({0}_target) {0}_target.innerHTML = {1}_base.innerHTML; if ({0}_target) {1}_base.innerHTML = \"\"; "; private static readonly object eventObj = new object( ); public event FindTargetContainerEventHandler FindTargetContainer { add { Events.AddHandler( eventObj , value ); } remove { Events.RemoveHandler( eventObj , value ); } } public AdRotator( ) : base( HtmlTextWriterTag.Span ) { } [TypeConverter( typeof( ValidatedControlConverter ) )] [DefaultValue( "" ) , Category( "Data" ) , Description( "广告位后期加载后显示的位置的控件ID" )] [IDReferenceProperty] public string TargetContainerID { get { return (string)this.ViewState[ "TargetContainerID" ] ?? string.Empty; } set { this.ViewState[ "TargetContainerID" ] = value; } } [Bindable( true ) , Category( "Data" ) , DefaultValue( "" ) , Description( "广告位的默认内容" )] public string DefaultContent { get { return (string)this.ViewState[ "DefaultContent" ] ?? "广告位招租"; } set { this.ViewState[ "DefaultContent" ] = value; } } protected override void OnPreRender( EventArgs e ) { base.OnPreRender( e ); if ( !string.IsNullOrEmpty( TargetContainerID ) ) { this.Style.Add( HtmlTextWriterStyle.Display , "none" ); ClientScriptManager cs = Page.ClientScript; if ( !cs.IsStartupScriptRegistered( this.ClientID ) ) { cs.RegisterStartupScript( this.GetType( ) , this.ClientID , GetLazyLoadingScript( ) , true ); } } } protected virtual string GetLazyLoadingScript( ) { Control target = FindControlHelper( TargetContainerID ); if ( target == null ) { throw new TargetContainerNotFoundException( ); } StringBuilder sb = new StringBuilder( ); sb.AppendFormat( scriptFormat , target.ClientID , this.ClientID ); return sb.ToString( ); } protected virtual void RenderAdvertisement( Advertisement ad , HtmlTextWriter writer ) { // 广告内容 } protected override void RenderContents( HtmlTextWriter writer ) { // call RenderAdvertisement method } protected Control FindControlHelper( string id ) { Control c = null; if ( findControlHelperCacheList.ContainsKey( id ) ) { c = findControlHelperCacheList[ id ]; } else { c = base.FindControl( id ); // 注意:我们从自己开始向上沿NamingContainer层次查找 Control nc = NamingContainer; while ( ( null == c ) && ( null != nc ) ) { c = nc.FindControl( id ); nc = nc.NamingContainer; } if ( null == c ) { // 因为我们是从自己开始向上沿NamingContainer层次查找,而没有向下找, // 并且没有找每一层NamingContainer内的其他NamingContainer, // 所以这种查找有可能出现没有找到id对应的控件 // 当没此时有找到时,激发FindTargetContainer事件交给用户自己设定Target Container Control FindTargetContainerEventArgs args = new FindTargetContainerEventArgs( id ); OnFindTargetContainer( args ); c = args.Control; } if ( null != c ) { findControlHelperCacheList[ id ] = c; } } return c; } protected virtual void OnFindTargetContainer( FindTargetContainerEventArgs e ) { FindTargetContainerEventHandler hander = Events[ eventObj ] as FindTargetContainerEventHandler; if ( hander != null ) { hander( this , e ); } } } public delegate void FindTargetContainerEventHandler( object src , FindTargetContainerEventArgs e ); public class FindTargetContainerEventArgs : EventArgs { private string controlID; private Control control; public FindTargetContainerEventArgs( string controlId ) { controlID = controlId; } public string ControlID { get { return controlID; } } public Control Control { get { return control; } set { control = value; } } } public class TargetContainerNotFoundException : Exception { string exceptionMessage = string.Empty; public TargetContainerNotFoundException( ) : this( "TargetContainerID所指定的控件没有找到!您或许应该处理一下FindTargetContainer事件" ) { } public TargetContainerNotFoundException( string message ) : base( message ) { this.exceptionMessage = message; } public override string Message { get { if ( exceptionMessage != null ) { return exceptionMessage; } return base.Message; } } } }

01 Aug 2007

奇怪的下载进度显示

今天下载VS2008 beta 发现一个奇怪的下载提示 百分之好几百

28 Jul 2007

中国EDONG网(中国排名第16的IDC)的技术力量和他的24小时客服。

这篇post写好后发现在博客园不能保存,原因是内容包含违禁内容。

只有写到其他地方,再挂个链接了。

http://spaces.huash.com/index.php/uid-133969-action-viewspace-itemid-240537

另外说一下,用了用感觉Discuz/ X-Space 真是个不错的博客、圈子软件,希望雪人和他同事们的DisuczNT做的更好。



----------------------------------------------------------------------------------------------------------
注:

此post不接受任何其他IDC评论,不接受其对其他IDC的推荐。
任何
评论中出现任何IDC网站相关链接都将被删除。
本人有权认定您的评论是否是枪手文章或广告内容。

评论前请看右边的公告,谢谢合作!

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

23 Jul 2007

在自定义控件中实现ICallbackEventHandler接口不经过回发而实现客户端回掉

 

在自定义控件中实现ICallbackEventHandler接口不经过回发而实现客户端回掉 
Asp.Net2.0中新增了ICallbackEventHandler接口,用于指示控件可以作器的回事件的目
MSDN中的描述:

实现 ICallbackEventHandler 接口的控件的示例包括 GridViewDetailsView TreeView 控件。当回事件以实现 ICallbackEventHandler 接口的控件标时,将把事件量作参数传递 RaiseCallbackEvent 方法以事件,并且GetCallbackResult 方法返回回

ICallbackEventHandler成员有:

 

 

名称

 


 

 

 

GetCallbackResult

 

返回以控件的回事件的果。

 

 

 

RaiseCallbackEvent

 

理以控件的回事件。

 

 
如下代码实现一个不经过回发而实现客户端回掉的CheckBox



//------------------------------------------------------------------------------<br />// <copyright company="Meibo Wu www.github.com"><br />// Copyright (c) www.github.com All rights reserved.<br />// </copyright><br />//------------------------------------------------------------------------------<br />using System;<br />using System.Drawing;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />namespace HBZ<br />{<br />/// <summary><br />/// A Asynchronous AutoPostback Checkbox Control<br />/// </summary><br />[DefaultEvent("CheckedChanged")]<br />[ControlValueProperty("Checked")]<br />[DefaultProperty("Text")]<br />public class AsynchronousCheckBox : WebControl, INamingContainer, ICallbackEventHandler<br />{<br />#region Delegates<br />/// <summary><br />/// The delegate for the checked changed event<br />/// </summary><br />///<br /><span name="sender" class="mceItemParam"></span></param><br />///<br /><span name="e" class="mceItemParam"></span></param><br />public delegate void CheckedChangedEventHander(object sender, CheckChangedEventArgs e);<br />#endregion<br />#region Events<br />private static readonly object eventCheckedChanged;<br />/// <summary><br />/// The checked changed event.<br />/// </summary><br />public event CheckedChangedEventHander CheckedChanged<br />{<br />add<br />{<br />Events.AddHandler(eventCheckedChanged, value);<br />}<br />remove<br />{<br />Events.RemoveHandler(eventCheckedChanged, value);<br />}<br />}<br />#endregion<br />#region Constructors<br />/// <summary><br />/// Static Constructor<br />/// </summary><br />static AsynchronousCheckBox()<br />{<br />eventCheckedChanged = new object();<br />}<br />/// <summary><br />/// Constructor<br />/// </summary><br />public AsynchronousCheckBox()<br />: base(HtmlTextWriterTag.Input)<br />{<br />}<br />#endregion<br />#region Properties<br />/// <summary><br />/// Gets or sets a value indicating whether the Lable Text<br />/// </summary><br />[Description("Gets or sets a value indicating whether the Lable Text")]<br />public virtual string Text<br />{<br />get<br />{<br />return (string)ViewState["Text"];<br />}<br />set<br />{<br />this.ViewState["Text"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the 'Client CallBack Script Name'<br />/// </summary><br />[Description("Gets or sets a value indicating whether the 'Client CallBack Script function Name'")]<br />public string ClientCallBackScript<br />{<br />get<br />{<br />object o = ViewState["ClientCallBackScript"];<br />return o == null ? "null" : o.ToString();<br />}<br />set<br />{<br />ViewState["ClientCallBackScript"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the checkbox 's checked<br />/// </summary><br />[Description("Gets or sets a value indicating whether the checkbox 's checked")]<br />public bool Checked<br />{<br />get<br />{<br />object o = ViewState["Checked"];<br />return o == null ? false : (bool)o;<br />}<br />set<br />{<br />ViewState["Checked"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the Text 's cssClass<br />/// </summary><br />[Description("Gets or sets a value indicating whether the Text 's cssClass")]<br />public string TextCss<br />{<br />get<br />{<br />return (string)ViewState["TextCss"];<br />}<br />set<br />{<br />ViewState["TextCss"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the Label 's position<br />/// </summary><br />public virtual TextAlign TextAlign<br />{<br />get<br />{<br />object o = ViewState["TextAlign"];<br />if (o != null)<br />{<br />return (TextAlign)o;<br />}<br />return TextAlign.Right;<br />}<br />set<br />{<br />if ((value <textalign.left) || (value > TextAlign.Right))<br />{<br />throw new ArgumentOutOfRangeException("value");<br />}<br />ViewState["TextAlign"] = value;<br />}<br />}<br />#endregion<br />#region Render Meghods<br />/// <summary><br />///<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />protected override void Render(HtmlTextWriter writer)<br />{<br />if (TextAlign == TextAlign.Left)<br />{<br />RenderLabel(writer);<br />base.Render(writer);<br />}<br />else<br />{<br />base.Render(writer);<br />RenderLabel(writer);<br />}<br />}<br />/// <summary><br />/// Render Label<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />private void RenderLabel(HtmlTextWriter writer)<br />{<br />if (string.IsNullOrEmpty(Text))<br />{<br />return;<br />}<br />writer.Write("<label");<br />writer.WriteAttribute("for", ClientID);<br />if (!string.IsNullOrEmpty(TextCss))<br />{<br />writer.WriteAttribute("class", TextCss);<br />}<br />writer.Write(">");<br />writer.Write(Text);<br />writer.WriteEndTag("label");<br />}<br />/// <summary><br />/// Override the AddAttributesToRender method<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />protected override void AddAttributesToRender(HtmlTextWriter writer)<br />{<br />if (base.Page == null)<br />{<br />base.Page.VerifyRenderingInServerForm(this);<br />}<br />string callbackReference<br />= Page.ClientScript.GetCallbackEventReference(this, "this.checked", ClientCallBackScript, null);<br />writer.AddAttribute(HtmlTextWriterAttribute.Onclick, callbackReference);<br />writer.AddAttribute(HtmlTextWriterAttribute.Type, "checkbox");<br />if (Checked)<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Checked, "checked");<br />}<br />if (!Enabled)<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");<br />}<br />if (!string.IsNullOrEmpty(ToolTip))<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Title, ToolTip);<br />}<br />base.AddAttributesToRender(writer);<br />}<br />#endregion<br />#region On Checked Changed<br />/// <summary><br />/// Invoke the check changed event.<br />/// </summary><br />///<br /><span name="sender" class="mceItemParam"></span></param><br />///<br /><span name="e" class="mceItemParam"></span></param><br />protected virtual void OnCheckedChanged(object sender, CheckChangedEventArgs e)<br />{<br />CheckedChangedEventHander hander = Events[eventCheckedChanged] as CheckedChangedEventHander;<br />if (hander != null)<br />{<br />Checked = e.Checked;<br />hander(this, e);<br />}<br />}<br />#endregion<br />#region ICallbackEventHandler Members<br />/// <summary><br />/// Get the result of a client side callback.<br />/// </summary><br />/// <returns>The callback result string.</returns><br />public string GetCallbackResult()<br />{<br />return Checked.ToString();<br />}<br />/// <summary><br />/// Raise the client callback event<br />/// </summary><br />///<br /><span name="eventArgument" class="mceItemParam"></span>The event arguments.</param><br />public void RaiseCallbackEvent(string eventArgument)<br />{<br />bool isChecked = Boolean.Parse(eventArgument);<br />CheckChangedEventArgs args = new CheckChangedEventArgs(isChecked);<br />OnCheckedChanged(this, args);<br />}<br />#endregion<br />}<br />}<br />//------------------------------------------------------------------------------<br />// <copyright company="Meibo Wu www.github.com"><br />// Copyright (c) www.github.com All rights reserved.<br />// </copyright><br />//------------------------------------------------------------------------------<br />using System;<br />using System.Drawing;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />namespace HBZ<br />{<br />/// <summary><br />///<br />/// </summary><br />public class CheckChangedEventArgs:EventArgs<br />{<br />/// <summary><br />///<br />/// </summary><br />///<br /><span name="_isChecked" class="mceItemParam"></span></param><br />public CheckChangedEventArgs(bool _isChecked)<br />{<br />isChecked = _isChecked;<br />}<br />private bool isChecked = false;<br />/// <summary><br />///<br />/// </summary><br />public bool Checked<br />{<br />get<br />{<br />return isChecked;<br />}<br />}<br />}<br />}<br />
         http://www.github.com/private/5504/default.aspx

07 Jul 2007

.Net专业人力资源网上线试运行.

自己也是搞.net开发的,经常看到有些朋友在csdn发求职/招聘贴
国内而现有的大招聘网站又未见专门为我们这拨人有个专门分类。就花了点时间做了这样一个网站。
今天开始试运行。

希望为.Net开发人员和企业提供一个良好的求职招聘平台!

.Net专业人力资源网




欢迎大家提出意见和建议
http://www.dotnetjobs.cn/FeedBack.aspx

04 Jul 2007

讨论一下类似BlogEngine为何要一次性加载所有Post到内存

试验了一下给BlogEngine生成10000个post 程序第一次运行时等待的时间让我想自杀(白屏了近2分钟)
看了一下代码,发现BlogEngine在第一次运行时候加载所有Post(从数据库)到List内,类似(Early initialization)
当新添加post时,给数据库(xml/database)内加入该post同时给List内追加该post
删除一个post时候从数据库(xml/database)内删除并从List内remove该post

  1
  2private string _Content;
  3/// <summary>
  4/// Gets or sets the Content or the post.
  5/// </summary>

  6public string Content
  7{
  8  get
  9  {
 10      if ( _Content == null )
 11      {
 12        _Content = LoadPostContent( this.Id );
 13      }

 14      return _Content;
 15  }

 16  set
 17  {
 18      if ( _Content != value )
 19      MarkDirty( "Content" );
 20      _Content = value;
 21  }

 22}

 23private string LoadPostContent(Guid id)
 24{    
 25    string content = null;
 26    
 27    string key = string.Format("Be:Content:{0}",id);
 28    
 29    // if there is no content cached
 30    object obj = HttpContext.Current.Cache.Get(key);
 31    if(obj == null)
 32    {
 33        // load the post's content from provider here
 34        content =  BlogService.LoadPostContent( id );
 35        
 36        HttpContext.Current.Cache.Insert(key, content, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero);
 37            
 38        // if use xml store the data 
 39        // 更丑陋点的 new CacheDependency(_Folder + "posts\\" + id.ToString() + ".xml") in the Cache.Insert Method 
 40    }

 41
 42}

 43
 44private static object _SyncRoot = new object();
 45private static List<Post> _Posts;
 46/// <summary>
 47/// A sorted collection of all posts in the blog.
 48/// Sorted by date.
 49/// </summary>

 50public static List<Post> Posts
 51{
 52    get
 53    {
 54        lock (_SyncRoot)
 55        {
 56          if (_Posts == null)
 57          {
 58            //in provider the 'FillPosts' method' dose not return the 'real'  content' per post; 
 59
 60            _Posts = BlogService.FillPosts( );
 61          }

 62          return _Posts;
 63        }

 64    }

 65}

 66
 67in XmlBlogProvider
 68
 69/// <summary>
 70/// Retrieves a post based on the specified Id.
 71/// </summary>

 72public override Post SelectPost(Guid id)
 73{
 74    string fileName = _Folder + "posts\\" + id.ToString() + ".xml";
 75    Post post = new Post();
 76    XmlDocument doc = new XmlDocument();
 77    doc.Load(fileName);
 78
 79    post.Title = doc.SelectSingleNode("post/title").InnerText;
 80    post.Description = doc.SelectSingleNode("post/description").InnerText;
 81
 82    post.Content = null;  // dose not return the 'real'  content'
 83
 84    post.DateCreated = DateTime.Parse(doc.SelectSingleNode("post/pubDate").InnerText);
 85    post.DateModified = DateTime.Parse(doc.SelectSingleNode("post/lastModified").InnerText);
 86    
 87    // setting other filed
 88
 89    return post;
 90}

 91Post class in Business object layer
 92
 93private string _Content;
 94/// <summary>
 95/// Gets or sets the Content or the post.
 96/// </summary>

 97public string Content
 98{
 99  get
100  {
101      if ( _Content == null )
102      {
103      _Content = LoadPostContent( this.Id );
104      }

105      return _Content;
106  }

107  set
108  {
109      if ( _Content != value )
110      MarkDirty( "Content" );
111      _Content = value;
112  }

113}

114private string LoadPostContent(Guid id)
115{    
116    string key = string.Format("Be:Content:{0}",id);
117    string content = null;
118    // if there is no content cached by id
119    object obj = HttpContext.Current.Cache.Get(key);
120    if(obj == null)
121    {
122        // load the post's content from provider here
123        content =  BlogService.LoadPostContent( id );
124        
125        HttpContext.Current.Cache.Insert(key, content, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero);
126            
127        // if use xml store the data 
128        // we can use a  CacheDependency like new CacheDependency(_Folder + "posts\\" + id.ToString() + ".xml") in the Cache.Insert Method 
129    
130    return content;
131    }

132    return (strong)obj;
133
134}

135
136private static object _SyncRoot = new object();
137private static List<Post> _Posts;
138/// <summary>
139/// A sorted collection of all posts in the blog.
140/// Sorted by date.
141/// </summary>

142public static List<Post> Posts
143{
144    get
145    {
146        lock (_SyncRoot)
147        {
148          if (_Posts == null)
149          {
150            //in provider the 'FillPosts' method' dose not return the 'real'  content' per post; 
151
152            _Posts = BlogService.FillPosts( );
153          }

154          return _Posts;
155        }

156    }

157}

158
159in XmlBlogProvider
160
161/// <summary>
162/// Retrieves a post based on the specified Id.
163/// </summary>

164public override Post SelectPost(Guid id)
165{
166    string fileName = _Folder + "posts\\" + id.ToString() + ".xml";
167    Post post = new Post();
168    XmlDocument doc = new XmlDocument();
169    doc.Load(fileName);
170
171    post.Title = doc.SelectSingleNode("post/title").InnerText;
172    post.Description = doc.SelectSingleNode("post/description").InnerText;
173
174    post.Content = null// dose not return the 'real'  content'
175
176    post.DateCreated = DateTime.Parse(doc.SelectSingleNode("post/pubDate").InnerText);
177    post.DateModified = DateTime.Parse(doc.SelectSingleNode("post/lastModified").InnerText);
178    
179    // setting other fileds
180
181    return post;
182}

个人觉得 是否应该对于Content、Comment这种占用大量内存的字段是否该采用类似Lazy Initialization 的方式
说明:第一次加载所有post时候 post list内的item不带真实的comtent和comment等
然后在用到的时候再从数据库读取,然后放入缓存,下次备用
这样Posts内的item都变的瘦多了,类似于延迟初始化(Lazy Initialization )
请大家讨论讨论,谢谢!

21 Jun 2007

GotDotNet.Com要退休了


http://www.gotdotnet.com/




GotDotNet Phase-out Announcement
Microsoft announces changes to the GotDotNet phase-out schedule.
Overall phase-out will be completed in summer 2007.



  
Based on your feedback, we’ve made some adjustments to our schedule:

  • CodeGallery phase-out – Rescheduled to July 2007 (original phase-out date was April 24, 2007)
    This gives CodeGallery owners more time to migrate. We suggest CodePlex as an excellent alternative. Please contact CodePlex support with any questions you may have.
  • User Samples phase-out – Schedule update in Fall ‘07
    We will not phase-out User Samples until we can provide customers with greater alternative. We will update you with further schedule information in Fall, 2007.
  • Workspaces phase-out – Completed on June 19, 2007.
    We suggest CodePlex as an excellent alternative. Please contact the CodePlex support staff with any questions you may have.


  •    We appreciate the input you’ve given us regarding the GotDotNet phase-out. We will keep you posted as we move forward.

    We are phasing out GotDotNet for the following reasons:

  • Microsoft wants to reinvest the resources currently used for GotDotNet in new and better community features for our customers

  • Traffic and usage of GotDotNet features has significantly decreased over the last six months
  • Microsoft wants to eliminate redundant functionality between GotDotNet and other community resources provided by Microsoft

  • Other Microsoft sites
    MSDN
    Offers help for developers in writing applications using Microsoft products and technologies.
    TechNet
    Offers help for IT professionals using Microsoft products and technologies
    ASP.NET
    The ASP.NET 2.0 site is a portal site for the ASP.NET development community.
    Channel 9
    Channel 9 is a Microsoft discussion forum used to promote conversations among Microsoft’s customers.
    CodePlex
    CodePlex is Microsoft’s open source project hosting web site.
    XML Downloads
    This page provides downloads for building XML applications using Microsoft technologies.

    Phase Out Schedule
    The GotDotNet phase out will be carried out in phases according the following timetable:


    Target Date Areas to be phased out
    February 20 Partners, Resource Center, Microsoft Tools
    March 20 Private workspaces, Team pages, Message Boards
    June 19 Workspaces
    By end of July 2007 CodeGallery (projected date)
    Schedule update in Fall 2007 User Samples (date TBD)