Friday 29 April 2016

周群飞 蓝思科技


1328 人评论

财经25年前她只是个农家妹;如今她的工厂一停工,全球手机都得断货

2016 04/28
作者:华商韬略 | 华商名人堂 张静波
湖南浏阳,在一片丘陵地带,坐落着一大片厂房。每天,络绎不绝的卡车在这里进出,从日本、美国运来玻璃,经过加工后变成手机玻璃,再运往全球各地。世界上每两片手机玻璃,就有一片在这里生产,一旦这些卡车停摆,全球的手机都要断货。
这里掌控着世界手机的命门,手握钥匙的是一个40多岁的女人,她就是如今的中国女首富周群飞。从昔日深圳宝安的一个小作坊,到今天全球手机的供应商,周群飞用20年时间,缔造了一个让对手胆寒的手机玻璃帝国。
【一】5岁丧母,独自撑起一个家
1971年,周群飞出生在湖南湘乡一个贫瘠的小山村,自幼命运多舛。在她出生前,父亲因为做炸药两根手指被炸残,眼睛几乎失明。5岁时,母亲又不幸离世。哥哥、姐姐都在外学艺,只留下年幼的她陪伴伤残的父亲。
▲图注:周群飞老宅
周父是一个聪明、好学的人,他会编竹背篮,靠这门手艺养活了一家人。为了补贴家用,他曾拜过八个师傅,学习各种手艺。这在耳闻目染间影响到了周群飞。
由于家境贫寒,周群飞打小就肩负起家庭的重任。她每天早起打猪草,放学回家喂猪喂鸡,还要给爸爸做饭,作业都是挤时间完成的。那时候,她需要到很远的地方去砍柴,由于山路崎岖不平,经常不小心滑下去,摔得浑身是土。但她不服输,一次砍柴太少,就往返两次,确保加起来不比别人少。
生活中,周群飞就是父亲的眼睛。每次出去卖竹背篮,她都会在前面用棍子牵着父亲,沿街叫卖,每个八毛钱。钱虽然不多,但却是全家的生活来源。
苦难的经历,让周群飞的内心有一种强烈的企图,她发誓长大后要通过自己的努力去改变命运,让家里人过上好日子。
【二】16岁打工,一直想出人头地
初二那年,舅舅回湖南探亲,周群飞说服他带自己去广东。那一年,她16岁。待了一段时间后,逐渐对外面世界有所了解的周群飞,选择离开韶关的舅舅家,前往深圳打拼。
离开韶关那天,周群飞一个人坐了十几个钟头车来到深圳。下车时,天已黑,还下着毛毛雨,她要去深圳大学附近的一家工厂,可死活找不到。当时的南山区是大片农田,没有路灯,一个女孩独自背着被子,拎着水桶,在漆黑的雨夜里摸索。
由于摸黑,她一脚不小心踩在稻田里,满是淤泥。那一晚的遭遇,成为周群飞一辈子抹不去的记忆。最后,在一个大学生的帮助下,她才找到那家工厂。
那是一家做手表玻璃的小工厂,条件很苦。周群飞白天上班,晚上读夜校,疯狂地学习各种技能,电脑、会计、报关……甚至货车驾照。她的想法很简单,多一门技能傍身,未来就多一条出路。
一起的工友里,只有她来自山村,同事们一下班就跑出去看电影、溜冰,只有周群飞一个人泡在图书馆,有时还义务帮会计贴发票、抄流水账。
三个月后,周群飞提出辞职,因为她觉得那里已经没东西可学。岂料,老板不但没同意,反而提拔她担任新成立的丝网印刷部的主管。这成了她人生中重要的转折点。
多年以后,周群飞也没搞懂升职的原因。“也许是我的字写的不错,”又或许是“我的辞职书太感人,我感谢他们收留了我,给了我机会锻炼,老板也很感动”。
不管原因如何,她从打工妹成了一名小领导。这是个新部门,没有任何经验可借鉴,一切都得靠自己摸索。有同事送了周群飞一本《丝网印刷》,她将其当做至宝,整天捧在手心,每次遇到难题,就翻开书看看,很快就将这本厚厚的书烂熟于心。
▲图注:当小领导时的周群飞
就在周群飞渐入佳境之际,她所在厂的厂长却突然辞职了。当时,工厂正在扩建,投资方澳亚光学由于信心不足,准备撤资。19岁的周群飞挺身而出,力劝大老板继续投资,并撂下一句狠话:成了,工资随你定;败了,我给你打一辈子工。老板被说服了,同意让她当负责人。周群飞很快就证明了自己,将工厂做成了集团效益最好的厂。
然而有了利润,烦恼也随之而来。老板任人唯亲,在厂里的“油水部门”安排了很多亲戚,这个团体处处排挤周群飞。久而久之,周群飞在负气之下选择辞职。
【三】22岁创业,受尽天下委屈
从澳亚光学辞职后,不少曾经的竞争对手向周群飞伸出橄榄枝。但周群飞的骨子里是希望自己能当家做主,在家人的鼓励下,她选择了创业。
1993年3月18日,周群飞和哥哥、嫂子、姐姐、姐夫、3个堂姐妹,8个人在深圳西乡钟屋村租下三室一厅,开始了创业,做的是老本行丝网印刷。
由于资金有限,这个三室一厅既是工厂,也是他们的家。对外称是工厂,其实就是个小作坊,8人吃住、工作都在这个套间里,女的睡主卧,男的睡次卧,客厅就是印刷、成品检验和包装车间。
▲图注:刚创业时的周群飞
刚开始没什么订单,周群飞只好买来一本黄页,照着上面的地址跑到工业园区,挨家挨户地拜访表壳厂、手表厂。对于一个20出头、生性羞涩的小姑娘而言,这样的工作很艰辛,更艰辛的是旁人的冷眼和无情拒绝。有的保安连理都不理就冲她大吼让其离开,周群飞也多次被突然窜出的大狗吓得一身冷汗。
这段经历给周群飞留下了很深的烙印,直到今天,她都不太懂得拒绝别人,因为当时被拒绝的太多,她深知其中的痛苦。
虽然被拒绝很多次,但随着敲遍深圳相关企业的门,周群飞的订单逐渐多了起来。白天推销完后,晚上她还得加班,有时干到凌晨两三点。虽然辛苦,大家都干劲十足。
订单越来越多,周群飞开始招工人,租厂房。但是她到手的钱却没涨多少,催款是其中最大的难题。当时的行业不规范,不少人没牌照,打一枪换一个地方。为了追讨欠债,周群飞夫妇好几个春节没回家。碰上耍赖的厂商,他们只能打碎牙往肚子里咽。有两次“大债”没能讨回,周群飞不得不卖掉房子给员工发工资。
1997年,受亚洲金融危机影响,很多客户付不起货款和加工费,其中讲道理的一些人拿设备来冲抵。这件当时看来很吃亏的事情,成了周群飞拓展产业链的机遇。
为了翻新这些旧设备,周群飞去香港买轴承、波条,靠一个双肩包背回来。东西很沉,每次双肩都会被勒出深深的红印。有一次,她带着年幼的女儿去买货,在旺角车站等红绿灯时,突然感觉背包轻了。她以为是包底磨破、东西漏了。赶紧回头一看,却发现是女儿用一双小手帮自己托住了背包。
那一刻,周群飞热泪盈眶,发誓一定要改变现状,让家人过上更好的生活。
【四】32岁转型,惨遭对手的暗算
2000年左右的中国,是电子产品的春天。电脑、手机、相机等“奢侈品”日渐趋于平民化,市场的留白空间非常大。在这股浪潮中,周群飞的事业迎来了转机。2001年,一位朋友接到TCL的手机订单,将面板加工的任务交给了周群飞。
那时候,手机面板使用的是有机玻璃(亚克力),不耐划,冬天容易爆裂,透光性也不好。周群飞拿到订单后,向TCL建议使用她比较熟悉的手表类型的玻璃屏,得到了对方的同意。当时的业内已经开始寻找有机玻璃的替代品,周群飞这个“外行”却成了改革先驱,她与团队几经实验,成功将手表玻璃技术移植到了手机上。
她负责加工的TCL 3188手机开创了业内先河,加之请来了金喜善做代言,这款产品在市场上大卖,整个手机行业也掀起了一场玻璃革命。
尝到甜头后,周群飞深感手机市场潜力巨大,她随即决定将公司发展重点放在手机屏幕的生产上,并据此成立了蓝思科技,蓝思是英文lens(镜片)的意思。
作为玻璃革命的开拓人物,周群飞获得了很多关注,企业相继找上门来,其中包括当时的巨头摩托罗拉。
2003年,摩托罗拉推出V3手机,原供应商无法解决屏幕油墨脱落的问题,摩托罗拉便找到了周群飞。那一年,蓝思科技刚刚成立,规模还很小,甚至没有英语翻译。
摩托罗拉不放心,派人过去考察,对方的工程师问了周群飞一个问题:“如果这产品破了,割到我们的总统,割到哪个明星,你们赔得起吗?”
一席话激起了周群飞的斗志,接下来的一段时间里,她没日没夜地泡在工厂车间,陪同研发人员反复做实验、找参数,终于攻克了玻璃韧性这一技术难关,在行业内第一个达到对方的跌落测试要求。最终,她赢得了摩托罗拉的订单。
订单确定后,蓝思的前景在周群飞的脑海里已经是一副飞黄腾达的模样。然而,就在她兴奋不已时,一把尖刀却悄然顶到了蓝思的致命处。
相较其他竞争对手,蓝思科技的规模很小,却成了最终赢家,周群飞的对手很不服气。他们找到蓝思的日本供货商,想用“歪方法”将其排挤出门。
拿下订单没多久,周群飞便得到日本供货商的通知,要求她先打全款再发货。而此前,按照行业的规矩,都是订单完成、收回款项后,再结清全部货款。几番商讨不成,无奈之下,周群飞只好贱卖房产,用来凑货款。但对方联手设“局”的目标显然不是货款,交了款项之后,日方还是以各种理由不发货。眼看着交货期日益临近,原材料却始终没有着落,周群飞急了,亲自追到香港去找日本客商。
结果可想而知,无论周群飞怎么请求,对方依旧一副“就是没货”的姿态。甚至谈判期间,对方还千方百计从她嘴中打听产品的关键参数。
房子贱卖,原材料断供,工厂停工,客户等着要货……站在香港红磡火车站的月台上,周群飞心犹如刀割,有一瞬间,她甚至想纵身一跃,一了百了。就在她最恍惚的时候,手机铃声突然响起,那一头传来了女儿的声音:“妈妈,你什么时候回家吃饭?”
周群飞心头一颤,猛然醒悟过来,“我是孩子的母亲,是丈夫的妻子,是上百名员工的老板。我必须回去!”
回到蓝思后,周群飞和同事们决定破釜沉舟,寻找新的原料供应商。他们通过各方关系在全球找对象,终于发现瑞士有一家企业可以提供相似的原材料。不过,瑞士企业的这种玻璃,必须通过客户认证才能使用。
周群飞不懂英文,当时的蓝思科技也没有擅长专业英语的专才,没办法给对方发申请认证。周群飞马上“搬救兵”,用中文起草了一封邮件给摩托罗拉,将自己的诉求、困难以及需要的产品类型一一罗列在邮件里,她向所有认识的相关人员群发了这封名为“LS119”的邮件。
“LS是蓝思的简写,119是中国的火警电话。”周群飞如此形容蓝思科技的情势紧急。她的求救令让蓝思迅速拿到了客户认证,一度停产的生产线终于重回繁忙状态。
度过生死存亡危机的蓝思科技,开始爆发惊人的力量。V3手机一经推出,热卖全球,累计售出了1亿部。蓝思科技在全球业内的地位和知名度也一下子上升了几个台阶,各大国际品牌都主动找上门来。
2005年,蓝思科技进入三星(DVD、MP3播放器)体系;2006年成为诺基亚的供应商,夏普、索尼等日系品牌也都相继成为其客户。至此,蓝思科技已经成了行业的龙头。
【五】36岁腾飞,成就手机玻璃女王
真正让蓝思产生质变的是苹果公司。苹果在消费类电子市场崛起的同时,带动了全球产业链中的一大批企业,蓝思科技是其中一员。
2007年,多点触控技术进入应用领域,苹果希望凭借这一技术,改写智能手机的行业规则。但是他们在产品设计时遇到了困难,由于这种手机对屏幕透光率等参数要求极高,之前一直合作的日本、台湾代工厂商都做不出来。
几经挫折后,苹果找到了蓝思科技。当时,蓝思已经积累了大量的专利、设备和技术,其CNC雕刻技术更是独步全球。在蓝思,苹果解决了屏幕技术的问题,对方唯一担心的是蓝思的产能。
为了打消对方的顾虑,正在国外谈判的周群飞当即打电话回国商讨厂房建设的事宜。很快,一个现代化的生产基地就在湖南浏阳拔地而起。
基地建成后,苹果公司派人过来认证。周群飞知道对方对细节有着近乎严苛的追求,不敢有丝毫怠慢。当时,她刚产下二胎,身体虚弱,又恰逢2008年雪灾。为了让对方的设备运进来,周群飞买来很多不锈钢板,带领大家一起铺路。
之后,她又带领大家对厂区进行扫荡式清洁。因为对方多为男士,她亲自抄起铲刀、钢丝球、刷子,跪在地上清扫男厕所的装修残渣,将整个工厂的清洁达到五星级酒店的标准。“我想做好的事,不吃不睡也一定要做好。”她说。
蓝思科技最终赢得了苹果的信任,也帮助iPhone系列开创了一个全新的时代。这次合作,将周群飞送上手机玻璃女王的宝座。
【六】45岁IPO,迎来事业巅峰
iPhone手机的成功,将蓝思科技推到了一个全新的高度。2009年,蓝思的销售收入仅为8.9亿元,6年后,这个数字猛增至172亿元。苹果对蓝思科技非常信任,从第一代iPhone到最新的iPhone 6 plus,一直使用蓝思科技的手机玻璃屏。
如此背景之下,2015年3月18日,蓝思科技成功登陆资本市场,一举改写了创业板的历史。
早在路演时,坊间就议论纷纷,认为蓝思科技将成为创业板中的巨无霸,周群飞也将取代碧桂园的杨惠妍,成为新一代中国女首富。而事实也验证了外界的猜测。
IPO当天,周群飞素雅淡妆,一袭短发,身穿红色外套,敲响了上市钟声。那一刻,她一定回想起了16年前的那个起点。当时的8个年轻人,恐怕做梦也想不到自己的小作坊有朝一日能变成市值几百亿的大公司。
蓝思科技以22.99元的发行价上市,当天“封死”在涨停板。此后,其股价一飞冲天,连续拉出13个涨停。4月3日,蓝思科技报收于103.93元。按周群飞持有的5.92亿股计算,其身家超过600亿。周群飞也因此被《福布斯》评为全球白手起家女企业家中的首富。
一时间,周群飞名声大噪,成为热门话题人物。然而,誉满天下,谤亦随之。大家最关心的问题是:一个外来打工妹怎么就成了身家几百亿的女首富?
在如今“仇富当道”的大环境下,关于周群飞的探讨逐渐演变成了诋毁。她早年被迫辞职创业,一些骨干也跟着她跳了槽,最终那家公司因为经营不善倒闭。有人说是因为她偷走了老东家的技术和人才导致公司颓败,说她忘恩负义。
华商韬略(微信公众号:hstl8888)分析:这类流言蜚语漫天的主要原因,是大把看客不相信一个柔弱的女子,可以白手起家、堂堂正正挣下600亿。
周群飞常说:“心是被委屈撑大的。”对于这些流言,她虽气愤,却不想浪费时间争辩,她说:“假若当年真是那样,我还用得着这么打拼吗?谣言止于智者。”
外界对其有所非议,真正和周群飞有联系的群体则对她感恩戴德。2006年投建新厂房时,周群飞力排众议、选择在家乡湖南省浏阳市落户。之后的近10年时间,她成了致富家乡、当地人有口皆碑的“金主”。2014年末,蓝思科技的员工总数已达8.2万人,全年薪酬的支出高达44.5亿元。厂区内中国银行的ATM机,每到发放工资的日子就会向总行信息库“报警”,因为刚放满钞票,很快就会被取光。
周群飞和蓝思也成了整个湖南省的企业代表。2011年,蓝思科技进出口额超过三一重工,跃居湖南第一,此后周群飞进一步在湖南设立了6家公司。三一重工迁出湖南后,蓝思成了省内民营制造业的扛鼎企业。
在谈到坚持回乡办企业时,周群飞说:父亲的遗愿,就是希望我有朝一日能够回乡,帮助那些曾经有恩于我们的人。■
本文作者:华商韬略 | 华商名人堂 张静波
版权声明:版权归华商韬略所有,禁止私自转载,如需转载,请联系微信公众号——华商韬略 获得授权。
商务合作请添加微信:hstl8888 ←长按可复制
网友跟贴1,328人跟贴 | 45,323人参与 |  手机发跟贴 | 注册

文明上网,登录发贴

密码
网友评论仅供其表达个人看法,并不表明网易立场。
0 人评论

财经 新晋亚洲首富,身家300多亿美元,要帮网店上市|今日财经头条

Sunday 24 April 2016

资金为什么不愿进股市?

本周,A股市场出现明显调整,打击了“短多长空”的一致预期。大家比较困惑的是:一季度放了这么多钱,为什么就是不进股市呢?
就以上问题,我们的看法是:
一、A股股市目前还有三个“不正常”的特征,无法吸引长期资金入场。
1、第一个不正常的现象:从来没有什么时候像现在这样,大家张口闭口就是“国家队”——“国家队高抛低吸”形成“横盘”的预期在蔓延,期望赚取稳定正收益的长期资金很难入场。
虽然在海外股市也有平准基金,但应该没有哪个股市会像现在的A股市场一样,大家把所有的焦点都聚焦在这个“平准基金”上面——海外平准基金的作用是在市场出 现非正常波动的时候才进场干预,对市场的中长期趋势基本不会产生影响,因此海外的投资者一般也不会把平准基金当“对手盘”来做。而放眼国内,虽然除了一个 季度才发布一次的上市公司季报以外,市场上没有任何“国家队”的公开信息,但是市场投资者却喜欢天天都讨论“国家队”,仿佛“国家队”就是他们唯一的“对 手盘”——很多人通过“捕风捉影”,认定“国家队”现在的操作就是“高抛低吸”去控盘,因此涨也涨不上去,跌也跌不下来,单边做多和单边做空都会很难受。我 们并不清楚“国家队”究竟是什么操作思路,但是一旦市场投资者都形成了这种“横盘”的预期,那么就注定无法吸引那些注重稳定正回报的长期资金入场。市场在 这方面要回归正常,要不然就是等“国家队”资金彻底退出市场之后,要不然就是早日公开“国家队”的操作思路和退出路径,从而稳定投资者的预期。
2、第二个不正常的现象:大家普遍长期悲观,但却以不低的仓位拼命在做短线交易——热点轮动太快,赚钱效应太差,期望通过布局核心产业赚取长线收益的资金很难入场。
目 前市场上大部分投资者对经济和股市的长期预期都是悲观的,但是他们的仓位却并不低,一是因为他们认为有“国家队”撑着,跌也跌不到哪去;二是因为现在市场 上也不是完全没机会,如果空仓看着一些热点上涨,心里反而会很难受。这种操作模式在最新发布的基金一季报中能够得到验证——去年三季度遇到两次“股灾”的时候,主动偏股基金仓位从82%降到了74%,大幅降仓;但今年一季度在遭遇第三次“股灾”之后,基金仓位只从83%下降到80%,显示出大家还是犹豫不决、不愿离场的心态。不过大家并不是保持着这么高的仓位就不管了,而是拼命在做短线交易:一位投资经理告诉我:“现在即使是他最看好的股票,涨了两天也要先卖掉,不敢像以前那么一直拿着了,而是等跌下来再补仓,如果不跌就干脆再也不进去了,宁愿重新换一个股票买”。在这种普遍的行为模式下,造成市场的热点轮动非常快,没有赚钱效应,也没有一条持续的行业主线,这样就很难吸引那些期望通过布局核心产业赚取长线收益的资金入场。
资金为什么不愿进股市?A股还有三个“不正常”

1
3、第三个不正常的现象:即使还有少数对股市长期趋势乐观的投资者,却也发现找不到真敢下手的具体股票——三轮“股灾”之后个股估值仍然不便宜,期望通过盈利扩张赚取长线收益的资金很难入场。
在我们的路演中,发现目前对市场长期趋势还持乐观态度的人,一般是那些去年“股灾”以来仓位就一直很低的投资者,他们在躲过了三轮“股灾”之后,其实也忍不住想要入场“吃口饭”了。但摆在他们面前的一个现实问题是——即使经历了三轮“股灾”,居然还是找不到基本面好估值又便宜的股票,因此无从下手。这些投资者面对的问题用下图可以很直观地表现出来——虽然目前A股整体的PE只有18倍,确实已经回落到了比较低的位置,但是如果看算术平均的PE却高达94倍,看PE中值也高达66倍,都还处在历史高点上,远未到“正常水平”。我们都知道,估值是“快变量”,盈利是“慢变量”,因此进入股市的长期资金往往都是赚盈利的钱,而不是赚估值的钱,他们只会在估值中枢比较稳定的时候才会进场,否则估值的大幅波动会完全抹杀掉盈利扩张的收益,现在来看还没到他们要进场的时候。
资金为什么不愿进股市?A股还有三个“不正常”

2
二、从资产横向比较来看,随着金融资产的收益率普遍下降,实体资产吸引力逐渐显现,未来资金可能“脱虚向实”,形成“经济强、股市弱”的“慢熊”环境。
我们在上周周报提出了资金“脱虚向实”的概念,很多投资者看了之后问:过去两年流动性一直很充裕,钱一直很多,为什么以前没有“脱虚向实”,偏偏现在要“脱虚向实”呢?对此我们的解释是:
1、很多金融资产在经历了牛市之后,收益率已经降到了很低的水平,因此实体资产的相对优势开始显现。2013年到现在,股市、债市、期市都经历过轰轰烈烈的牛市,而过去两年由于实体经济较差,投资实业的收益率远低于金融资产,因为资金都是“脱实向虚”的。但目前来看,一方面这些金融资产随着价格的上升,收益率也随之下降,而国内宏观经济却在“保增长”和地产复苏的双重拉动下出现了复苏,投资实业的收益率开始逐渐超过了金融资产,因此资金接下来很可能会“脱虚向实”。
2、能兼顾“高收益”和“无风险”的金融资产开始暴露出“类庞氏骗局”的特征;而在实体经济中,既能保证合意收益率、又有政府信用背书的PPP项目有望成为新的“高收益无风险资产”。近期大家可以观察到P2P跑路和信用债违约的事件明显增加,投资者开始意识到原来这些资产并不是“无风险资产”,甚至带有一些“庞氏骗局”的特征。可见在金融资产中,已很难找到能兼顾“高收益”和“无风险”的资产,而在实体经济中反而可能找到这样的资产,PPP项目就是一个值得重点关注的方向——今年以前做基建项目收益率不高、现金回款也慢,因此对资金没有吸引力。但随着各类金融资产收益率的下降,基建项目的收益率反而开始具备了相对吸引力;而同时其又具备政府信用担保,因此还有“无风险”的属性。随着监管层大力推行“PPP模式”,民间资金对接基建项目的渠道已被打通,预计接下来大家可以看到大量低风险偏好的资金涌向PPP基建项目。
3、资金“脱虚向实”,可能带来“经济强、股市弱”的“慢熊”环境。资金的“脱虚向实”,从正面来看,这是有利于进一步夯实本轮经济复苏基础的;但从反面来看,这也意味着资金绕过了股市这样的直接融资市场,直接流向了实体经济,这种“脱虚向实”可能会带来“经济强、股市弱”的环境。需要引起注意的是,如果要在“经济弱、股市强”和“经济强、股市弱”里面二选一的话,监管层肯定倾向于后者,因为资金“脱虚向实”其实是监管层乐于看到的情景,这时候反而会动摇投资者对股市“救市资金”的信仰。我们继续维持4月初以来的谨慎观点,建议投资者要更多地关注和学习01-05年的“慢熊”特征(见下图)。在这种环境下首先要降低仓位,然后在结构上建议偏向“保增长”或者“低估值”主线——建筑、环保、食品饮料、金融服务。

Style Slalom Tutorials


https://www.youtube.com/watch?v=YsSMxfKccHs

Friday 22 April 2016

Which are more in demand, .Net or Java developers?

For that question your time frame is wrong. Or conversely the question is wrong for the time frame. But also, the domain governs much more what language/environment you're going to use - e.g. if you make programs for Windows then 9 times out of 10 it would be DotNet, if you make something for Android phones then the same can be said of Java, if you make a backend for a web site you might have a equal split between Java / Ruby / Python / C++ / JavaScript (or even something else), for iPhone (or most Apple stuff) you might find ObjectiveC is much more prevalent (perhaps to be replaced by Swift in the future). At the moment I think the smart-phone craze is what's driving Java's majority, in other domains where it used to be top of the pops it's losing ground to stuff like Ruby, which in turn is losing ground to JavaScript, etc.

If you're going to spend the next 10 years in this industry and attempt to be a decent to good programmer / software engineer - then none of those 2 would be "enough". Neither would any other single language / environment / system. For that matter if you spend 10 years and don't realise that they're "the same" and have little (if any) influence on the way you program, design, create, fix bugs, etc. ... then you're missing the entire point. Much more influential is the domain, and even then it's more like an influence on the tools you use where other domains might use different tools to accomplish the exact same things in (even) the exact same ways.

Rather your question should ask what you should be looking for in the next 1 to 3 years (at most). Or what sort of understanding in programming you'd need over the course of 10 years.

If I went with looking at 10 years future just out of university I might have gone with Delphi. And it would have been the exact wrong choice. I'd have wasted the entire decade on something which was dying out, even though at the time it looked like the "next big thing", only to be replaced by the next-next big thing Java (only a few years later), which now seems to be in replacement phase to the next-next-next big thing Python/Ruby, and yet even that seems as if it's doomed by stuff like Haskell.

But even that previous paragraph is wrong, because none of them are entirely replacing each other. Neither is anything entirely "dead". I still do some stuff using Lazarus (i.e. a Delphi clone), not to mention many are still using Fortran (now if anything "should've" died out it would be that). I still do some C, and sometimes C++. Every now and then I go and do a bit of Java. And at present my major language is C# - simply because of the domain I find myself working in. And yet a large portion of my time is also spent on making stuff in Lisp. Thus nothing actually died over my 25+ years in the industry, some just became less popular replaced by "something new" which wasn't all that "new" in any case (some exceptions might be stuff like Haskell - though not as "mind blowingly new" as some would have you believe, functional programming came from long before Haskel was even an idea).

My advise? Learn something which interests YOU and where you can find immediate short term employment. At the moment it might be Java or it might be C#. It might also be Python / JavaScript / whatever else you can shake the proverbial stick towards.

But for the long term you should be doing many of these things, simply plodding away at Java or C# isn't going to give you enough "scope" to become a sought after employee - that sort of experience tends to keep you in a junior position. You get ahead further by understanding more concepts and broadening  your design capabilities - not just specializing in using a Philips head screw driver. Rather you want to know how to also use other types of screws, hammers, saws, glue, the works! Else all you're ever good for is being a cog in a production line doing the same actions over and over again, never getting ahead.


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

Looking strictly at current salary trends tells us that Java is currently paying more.  According to YouWorth salaries are trending as follows:
.NET - $74k/year
Java - $81k/year
While these are slightly different, I would not expect a large difference in the two in the near future. 
10 years from now?  That may be a different story.  With Windows being the primary operating system for the vast majority of businesses, I think .NET will be a safe bet for the long haul.  I don’t see Java going anywhere for now but the market for mobile/online programming languages is anybody’s guess.  With as quickly as things change in those markets I think it’s safe to say that Java will be around, but how prominent will it be?  That is harder to say. 
I think your best bet is to choose what makes you happy and work with that while gaining a working knowledge of other languages.  This will make you more agile in the long term and also give you more options in the short term.  
I pulled these numbers from YouWorth.  YouWorth is a free mobile app for both iOS and Android that tracks  .net and java developer salary data. Not only am I an ambassador for YouWorth, but I use it myself. The app allows anyone to import LinkedIn skills and track their job market value over time. YouWorth notifies me at any point there is a change in either my value or the value of skills I follow.  This is a great tool to use when looking into your own career and skill set for something like specific programming languages. 

2016加国最适合投资的城市出炉


加拿大的哪个城市最适合投资房地产?很多人立刻想到的多伦多、温哥华这两个房市最火热的地区。然而据本地理财杂志《MoneySense》最近公布的一份报告,虽然多、温两地房价增长迅猛,但是由于房价基数过高、难以负担,所以并非是最良好的投资点。在今年,一些中型城市、卫星城市、以及现在正陷入经济不景气的西部城镇,才是最适合房地产投资的地方。











《MoneySense》一共对全国35个城市进行了考察,其标准不仅仅是房价的平均增幅,而且还有可负担性、租金收入等方面,结果发现今年全国最适合投资的地方是安省北部的中型城市省雷湾(Thunder Bay)。


报告指,雷湾的基准房价只有21.6万元,而当地居民平均收入为8.1万元???。房价与收入比率低至2.7倍,属于容易负担的水平。


从经济的角度来说,雷湾也具有发展潜力,是一个值得投资的地方。在这些年,该市投入相当多的城市建设费用,成为安省北部枢纽中心,安省通往加西的一个门户城市及知识型经济中心,吸引医疗,教育及政府部门的工作职位,而且失业率较低,一些长期的经济表现指标强劲。


当业主在雷湾购买房屋之后,出租也较为容易。在10年前,该市成立了北安省药科学院(Northern Ontario School of Medicine),带来了大量的学生,并推动了当地的租务市场。事实上,由于雷湾的出租市场行情良好,令投资有巨大的回报潜力,租金过去5年上涨了22%。











排在“最适合投资城市榜”第二位的则是卡尔加里。在全球油价经历了长达一年多的走低之后,阿省的房地产市场可能已经走到了谷底,随着全球油价开始反弹,越来越多的投资人士的目光再度聚焦在这个西部重镇,准备抄底。


杜兰区及奥沙华则排在第十位。由于多伦多房价飞涨,房市的热点渐渐往外围转移,而位于东面、房价较为便宜的杜兰区渐渐为买家和投资人所关注。最近几期的房地产数据都显示,该区沿401高速公路的几个市镇房价增幅惊人,在整个大多伦多地区名列前茅。


多伦多、温哥华的排名则比较令人失望,分别为第12位和第18位。拖累其排名的是可负担性:多伦多的房价是平均家庭收入的5.6倍,而温哥华则高达9.1倍,已远远超过了普通人的负担能力。虽然多伦多的出租行情也还可以,但是在那里买一套房子的资金,在出租市场更加火爆的雷湾等中型城市可以买两三套,两者投资潜力自然不可同日而语。





附1:《MoneySense》2016年度“最适合投资城市榜”前十名:


1、Thunder Bay


2、Calgary


3、Barrie


4、Brantford


5、Edmonton


6、Winnipeg


7、Hamilton


8、Regina


9、Guelph


10、Durham/Oshawa

Thursday 21 April 2016

.net ii exam




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Threading;

namespace inventory
{
    public partial class Form1 : Form
    {
        public SortedList<int, data_format> db = new SortedList<int, data_format>();

        public static Object obj = new Object();

        public static bool gameclose = false;

        public static game_form game_window = new game_form();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.Items.Add("regular");
            comboBox1.Items.Add("used");
            comboBox1.Items.Add("bulk");
            comboBox1.SelectedIndex = 0;

            search.Enabled = false;
            add.Enabled = false;
            delete.Enabled = false;
        }

        private void save_Click(object sender, EventArgs e)
        {
            openFileDialog2.Filter = "Text|*.txt";

            string file_path=null;
            if (openFileDialog2.ShowDialog() == DialogResult.OK)
            {
                file_path = openFileDialog2.FileName;
            }

            FileStream stream = new FileStream(file_path, FileMode.Create, FileAccess.Write);

            StreamWriter writter = new StreamWriter(stream);

            foreach (int key_ in db.Keys)
            {
                double price_ = Math.Round(db[key_].price,2);

                string data = string.Format("{0,-5}{1,-10}{2, -10}{3,-20}", key_.ToString(), price_.ToString(), db[key_].manufacture, db[key_].description);

                writter.Write(data + "\n");
            }

            writter.Close();

            stream.Close();

            toolStripStatusLabel1.Text = "file saved";
        }

        private void part_number_TextChanged(object sender, EventArgs e)
        {
            //part # 0-99
            if (Regex.IsMatch(part_number.Text, "^[0-9]{1}$|^[1-9]{1}[0-9]{1}$"))
            {
                search.Enabled = true;
                add.Enabled = true;
                delete.Enabled = true;
            }
            else
            {
                part_number.Text = "invalid";
                search.Enabled = false;
                add.Enabled = false;
                delete.Enabled = false;
            }
        }

        private void price_TextChanged(object sender, EventArgs e)
        {
            //price type double

            try
            {
                double value =  Convert.ToDouble(price.Text);
                add.Enabled = true;
                delete.Enabled = true;
            }
            catch (Exception e1)
            {
                price.Text = "invalid";
                add.Enabled = false;
                delete.Enabled = false;
            }
        }

        private void add_Click(object sender, EventArgs e)
        {
            data_format item = new data_format();
            item.part_number = Convert.ToInt32(part_number.Text);
            item.price = Convert.ToDouble(price.Text);
            item.description = description.Text;
            item.manufacture = manufacture.Text;

            db[item.part_number] = item;

            toolStripStatusLabel1.Text = "part # added/updated";
        }

        private void delete_Click(object sender, EventArgs e)
        {
            int key = Convert.ToInt32(part_number.Text);

            if (db.ContainsKey(key))
            {
                db.Remove(key);
                toolStripStatusLabel1.Text = "part # deleted";
            }
            else
            {
                toolStripStatusLabel1.Text = "part # not found";
            }
        }

        private void search_Click(object sender, EventArgs e)
        {
            int key = Convert.ToInt32(part_number.Text);

            if (db.ContainsKey(key))
            {
                price.Text = db[key].price.ToString();
                manufacture.Text = db[key].manufacture;
                description.Text = db[key].description;
                toolStripStatusLabel1.Text = "deleted";
            }
            else
            {
                toolStripStatusLabel1.Text = "part # not found";
            }
        }

        private void refresh_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "#      $"+"\n";

            foreach (int key_ in db.Keys)
            {
                string newline = key_.ToString() + "        " + db[key_].price.ToString() + "\n";
                richTextBox1.Text += newline;
            }
        }

        private void load_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Text|*.txt";

            string file_path = null;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                file_path = openFileDialog1.FileName;
            }

            FileStream stream = new FileStream(file_path, FileMode.Open, FileAccess.Read);

            StreamReader reader = new StreamReader(stream);

            string data = reader.ReadLine();

            while (data != null)
            {
                int key_ = Convert.ToInt32(data.Substring(0, 2));
                double price_ = Convert.ToDouble(data.Substring(5, 10));
                string manufacture_ = data.Substring(15, 10);
                string description_ = data.Substring(25, 20);

                data_format item = new data_format();
                item.part_number = key_;
                item.price = price_;
                item.description = description_;
                item.manufacture = manufacture_;

                db[key_] = item;

                data = reader.ReadLine();
            }

            stream.Close();
            reader.Close();

            toolStripStatusLabel1.Text = "file loaded";
        }

        private void calculate_Click(object sender, EventArgs e)
        {
            Object selectedItem = comboBox1.SelectedItem;
            string purchase_type = selectedItem.ToString();

            int quantity_ = Convert.ToInt32(quantity.Text);
            double price_ = Convert.ToDouble(price.Text);
            double total_ = price_ * quantity_;

            switch (purchase_type)
            {
                case "bulk":
                 
                    if (quantity_ < 10)
                    {
                    }
                    else if (quantity_ < 20)
                    {
                         total_ -= 0.5 * quantity_;    //bulk purchase discount
                    }
                    else
                    {
                        total_ -=  quantity_;
                    }
                    break;

                case "used":
                    total_ *= 0.9;
                    break;

                default:
                    break;
            }

            total.Text = total_.ToString();
        }

        private void print_Click(object sender, EventArgs e)
        {
            printPreviewDialog1.Document = this.printDocument1;
            printPreviewDialog1.ShowDialog();

            DialogResult print = printDialog1.ShowDialog();
            if (print == DialogResult.OK)
            {
                printDocument1.PrinterSettings.PrinterName = printDialog1.PrinterSettings.PrinterName;
                printDocument1.Print();
            }
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Font f = new Font(new FontFamily("arial"), 10, FontStyle.Regular);
            SolidBrush b = new SolidBrush(Color.Black);
            e.Graphics.DrawString("student name", f, b, 0, 0);

            int column = 0;
            int row = 15;

            e.Graphics.DrawString("part#", f, b, column, row);
            e.Graphics.DrawString("price", f, b, column + 100, row);
            e.Graphics.DrawString("manufacture", f, b, column + 200, row);
            e.Graphics.DrawString("description", f, b, column + 300, row);

            int line = 1;
            foreach (int key_ in db.Keys)
            {
                e.Graphics.DrawString(key_.ToString(), f, b, column, row * (line + 1));

                e.Graphics.DrawString(db[key_].price.ToString(), f, b, column + 100, row * (line + 1));

                e.Graphics.DrawString(db[key_].manufacture, f, b, column + 200, row * (line + 1));

                e.Graphics.DrawString(db[key_].description, f, b, column + 300, row * (line + 1));

                line++;
            }

            e.HasMorePages = false;
        }

        private void game_Click(object sender, EventArgs e)
        {
            if (Form1.gameclose == true)
            {
                Thread.CurrentThread.Abort();     //abort previous game
                Form1.gameclose = false;
            }
         
            Form1.game_window.Show();

            ball_game x = new ball_game();
            Thread process = new Thread(new ThreadStart(x.move_ball));
            process.Start();        
        }


    }

    public class data_format
    {
        public int part_number;
        public double price;
        public string manufacture;
        public string description;
    }

    public class ball_game
    {
     
        Pen p = new Pen(Color.Black);      

        public void move_ball()
        {            
         
            //if ball hit wall, it will bonce back
           
                Graphics g = Form1.game_window.CreateGraphics();

                Random r = new Random();

                int turn = 0, x_move = 10, y_move = 10, x_position = r.Next(30, Form1.game_window.Size.Width - 60), y_position = r.Next(30, Form1.game_window.Size.Height - 60);
                           
                while (true)
                {
                    if (Form1.gameclose == true)
                    {
                        Form1.gameclose = false;
                        Thread.CurrentThread.Abort();
                    }

                    g.Clear(Form1.game_window.BackColor);

                    if (x_position > Form1.game_window.Size.Width - 60)
                    {
                        x_move = -x_move;
                    }

                    if (y_position > Form1.game_window.Size.Height - 60)
                    {
                        y_move = -y_move;
                    }

                    if (x_position < 0)
                    {
                        x_move = -x_move;
                    }

                    if (y_position < 0)
                    {
                        y_move = -y_move;
                    }

                    x_position += x_move;
                    y_position += y_move;

                    g.DrawEllipse(p, x_position, y_position, 30, 30);
                    Thread.Sleep(100);
                    turn++;
                }        
        }

 
    }
}

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace inventory
{
    public partial class game_form : Form
    {
        public game_form()
        {
            InitializeComponent();
        }

        private void game_form_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.Hide();  //can't close game_form, otherwise it won't be opened again
            Form1.gameclose = true;          
        }
    }
}