linux 下 CURL POST JSON 数据

纯粹做个记录,在 Jenkins 的 pipeline 脚本中,需要 curl post 一个 json 数据到远端应用,临时实现如下:

steps {

sh '''\
echo $TEST_URL/$JOB_NAME/$BUILD_ID
while [[ $(curl -sL -w "%{http_code}" -H "'Content-type':'application/json'" -X POST "$TEST_URL/$JOB_NAME/$BUILD_ID" -d '{"image":"'$MY_TAG'","kelu":"'test'"}' -o /dev/null) != "200" ]]; do
echo "backend is unavailable - sleeping"
sleep 5
done
'''

}

需要注意的是 -H 、 -X 和 -d 参数。如果不带 -H 参数,则 -d 中传递的是普通的 POST 参数,远端使用 json 解析是解析不出来的。


上海不相信互联网 - 朱思码记

原文链接:https://mp.weixin.qq.com/s/ekD6daXqnxF4WLcxn7F9Bg,来自公众号:朱思码记

img

「弱小和无知从来不是生存的障碍,傲慢才是」

上海互联网,真的快不行了吗?

6个月内,3代上海互联网龙头企业仓促完成了历史性的交接班。

2018年2月8日,腾讯投资30亿元入股“18岁”的盛大游戏,让这家曾极度辉煌又一度迷失的首任上海互联网龙头最终选择与曾经的对手携手共进,江湖恩怨就此画上圆满句号。

2018年8月2日,上海拉扎斯信息科技有限公司更新了其最新股权信息,来自上海交大并获奖无数的创业四人组:邓高潮、张旭豪、康嘉和汪渊已经全部退出,新任股东为杭州阿里巴巴创业投资管理有限公司。这标志着4个月前95亿美元的超级收购案的最终落下,“10岁”的饿了么成为阿里旗下的外卖平台。

北京时间2018年7月26日晚间,上海寻梦科技有限公司成功登录纳斯达克,市值突破200亿美元,“3岁”的拼多多正式接棒饿了么成为第三任上海互联网公司龙头。

上海是中国最有腔调的城市之一,上海人也是全中国最讲究“卖相”和生活品质的一个群体,而今天拼多多这家来自杭州的年轻互联网公司带着中国第三大电商平台的头衔和恶评如潮的舆情成了上海互联网公司的代名词,不知道算不算是对上海本土互联网行业和这座城市的莫大的讽刺?

据2018年1月31日中国互联网信息中心发布的《中国互联网发展状况统计报告》显示在102家互联网上市公司中,注册地上海的占比18.6%排名全国第二,而估值10亿美元以上的77家独角兽中上海占比23.4%,同列第二。乍看来,上海互联网行业发展总体上是好的,甚至远超杭州,深圳。但台面上的数据统计像极了老底子上海人发明的“假领头”一样:表面光鲜,外套一脱吓死人。

据权威数据显示,上海市2017年GDP高达3.013万亿元,同比增长6.9%,继续排名全国第一,但据内部相关人士透露上海市互联网产业仅仅只占上海GDP的5%左右甚至以下,对比杭州2018年上半年信息经济增加值1592亿增长14.7%,信息经济占GDP25%,其中电子商务、软件与信息服务增速均超过20%。

互联网+是当下中国的既定国策之一,任何否定未来趋势的个人、群体、组织甚至国家都将随着时间的推移而为此付出惨烈的代价。谈笑间,与上海城市性格接近的日本东京,新加坡,乃至香港都已经被中国大陆互联网大潮甩了不止10年,儿时羡慕的亚洲四小龙现在已经全部沦为了中国广大中产阶层日常旅行观光和购物的目的地之一。

上海会是下一个吗?

对比历史上那个“二线旅游城市”的杭州,因为互联网行业的迅速崛起产生最大的影响莫过于杭州的人才年均净流入率以13.6%高出第二名3.36个百分点而领跑全国。在彻底甩掉那个侮辱性的标签——“上海的后花园”、”乡下”后,杭州互联网人甚至开始向上海发起了挑战。“沪杭一家亲”只是一句善意的谎言,稍有常识的老上海人或者老杭州人都明白:沪杭从来都是谁也不服谁的对手。

爱时髦的上海人显然热爱互联网,但极力追求稳定和低风险的上海却始终不相信互联网。

历史上曾拥有盛大领衔的一众上海系网游公司(后文称“上海系”)吊打腾讯多年,拥有过淘宝死敌的易趣网,拥有京东商城早年的敌人易迅、新蛋,也拥有大众点评,1号店,土豆网,以及饿了么等一系列耳熟能详的互联网企业,可是今天这些公司又在哪里,他们又所属何人?明天的拼多多,bilibili,携程,小红书,沪江,喜马拉雅,陆金所这些硕果仅存的企业在面对未来当地监管的大棒,以及外部资本的推动下,又该走向何方?上海互联网人自嘲多年“上海没有互联网”的说法值得商榷,但更值得深思其背后真正的逻辑。

弱小和无知也许从来不是生存的最大障碍,傲慢才是。


2018年8月3日-6日,上海新国际博览中心举行的CHINAJOY2018是广大游戏爱好者和游戏制作公司们的年度盛会,历史上除了2003年首届CJ在北京举行外,上海已经连续承办了后续十五届CJ展会,从某种意义上肯定了上海在游戏制作和发行产业居于中国互联网行业里不可撼动的霸主地位,著名的1号馆也见证了国内一线游戏公司间过去十几年来的角逐、夺冠、黑马、让位和离场。

然而今年12号台风云雀的突袭上海没有浇灭参加CJ展会的玩家和制作方的热情,但却意外的摧毁盛大互娱的经典作品——《传奇》中具有象征意义的那把屠龙刀。更为吊诡的是6个月前,腾讯将一度吊打自己多年的盛大纳入了自己的游戏版图中——今天腾讯互娱帝国在中国游戏产业中唯一能配得上对手称号的只剩下了网易,而当年威震华夏的六大上海系游戏公司几近全灭。


屠龙刀的断裂归为天意,「上海系」的瓦解实为人谋。

如果我们翻阅上海互联网行业的起家史,首先必须感谢两家堪称黄埔军校的国外互联网公司:一家是来自美国的Ebay,一家是来自法国的育碧。前者输送了几乎所有上海互联网电商平台和O2O项目的早期人才,而后者培育了几乎所有后来上海游戏公司的早期团队。甚至今天腾讯在上海布局最大的部门——“北极光“工作室群,其负责人于海鹏的早年履历中最醒目的一条就是育碧上海。

2009年前,国内游戏公司的竞争如同战国末年一般胶着。盛大在彼时依靠《热血传奇》、《泡泡堂》、《梦幻国度》等一系列作品的成功占据榜首地位,网易则依靠《梦幻西游》、《大话西游2》等游戏名列次席,巨人网络依靠《征途》牢居第三,腾讯在彼时尽管名列第四位,但其后是拥有《劲舞团》的久游公司、拥有《魔兽世界》的第九城市,拥有《跑跑卡丁车》的世纪天城,以及《传奇3》的运营商光通在内的4家上海系游戏公司,他们每一家都非常不好对付。

彼时国内前8家游戏公司里,6家都出自上海系显然不是什么偶然巧合而是明摆着的实力写照。与此同时在2008年之前腾讯手上其实连一款特别叫座的游戏作品都很难找出来——毕竟腾讯只是一家做QQ起来的产品型互联网公司,腾讯至今仍然并不是一家纯正血统的游戏公司。

然而不可思议转机发生在2009年Q2季度,彼时腾讯财报显示其游戏收入在过去1年时间里猛然暴涨并迅速超越盛大,从第四逆袭到了第一。从那以后,腾讯就没掉下来过。

「2008年诞生了腾讯内部的游戏 ‘四大名著’——《QQ飞车》1月上线,《QQ炫舞》5月上线,《地下城与勇士》6月上线,《穿越火线》7月上线,最后还有10月份上线的《寻仙》,一套组合拳打下来全部命中目标,且这些作品的同时在线人数都破百万级,关键还不是像我们当时那样在特定节日测算的。」

一位业内人士告诉朱思码记,在他看来腾讯推出4款百万级爆款确实有些许运气成分外,但逆袭背后更大原因显然是出自腾讯战略决策上的调整,以及「上海系」与生俱来的那些问题正在被不断放大的恶果,内外因素的同时爆发导致了上海系自2008年后便走了下坡路。

六国破灭,非兵不利,战不善,弊在赂秦。——「六国论」

即便是在盛大最盛之时,上海系游戏公司也是保持长期以来的各自为政,甚至远交近攻,最终今天上海系基本包括盛大在内都已经沦为腾讯和网易的合作对象。

那么,彼时上海系六大游戏公司究竟存在哪些问题?

爆款作品一枝独秀,战略极度短视。上海系的优势是每个公司都有一个特别火爆的现象级作品,但每个公司似乎都指望着靠这一个游戏赚钱。实际上游戏发行和电影发行有着极为接近的血缘,因为都属于创意项目,任何一家发行公司都没有实力保证在稳定出产的情况下每一部作品都火爆,即便是前作火爆的情况下续集玩砸的概率也不低,因此对于一家游戏公司而言你应该优先保证产品间彼此的新老交替,即便是成熟生命周期较长的产品也需要考虑其后续替代品,但上海系赚快钱思路偏向保守,6大游戏公司绝大部分都是依靠角色扮演游戏起家的,因此这类一条路走到黑的恶果是一旦爆款类型作品出现问题,公司会瞬间崩溃。

一位业内人士向朱思码记举例依靠引进暴雪旗下网游作品《魔兽世界》而迅速崛起并在2004年登陆纳斯达克上市的上海系网游公司代表——第九城市,因为与暴雪合同到期后又在与网易竞标中失败,而彼时旗下除去《FIFA ONLINE》外引进清一色的角色扮演游戏均表现平平,使得丢失《魔兽世界》代理权后对第九城造成的“极恶影响”是其股价跌幅高达87%。而腾讯的情况则是四大名著分别属于竞速、音乐、动作、射击四个点,即使其中任何一方面出问题,也不影响整体业绩的走强。


强调代理模式赚快钱,忽视独立创作。整个游戏行业存在一种共同现象是重代理,轻创作:因为游戏公司花一笔钱代理引进后进行市场投放测试,如果反响较差则可以再次引入新的作品进行投放测试,但若是独立创作需要付出较高的研发制作成本和数年之久的时间成本,而市场显然是不等人的。绝大部分的上海系公司都采取了急功近利的纯引进模式,或极个别例外的会冒着高风险选择一条道走到黑的自主研发但又无法顾及市场走向。

腾讯采取的模式是引进+独立研发错位递进的模式,特别是当一个代理项目成功时,作品数年之久的游戏生命周期可以同时为多个团队提供数年时间的研发周期来创作后续替代作品。举例当前《王者荣耀》作为腾讯天美工作室群于2015年前后研发的独立作品,但腾讯在2017年推出的两款《绝地求生》则是从韩国蓝洞工作室引进后联合开发的作品,这种一代引进+一代自主创新的模式非常类似于国防工业层面对高尖端技术兵器的军购与独立研发工作,归根结底还是将立足点放在降低成本风险,同时发展方向可控两个基本点上。

img

中国空军遵循一代引进一代研发的思路:上-90年代初引进俄制苏27 下-2004年服役的国产歼10

内部管理混乱,大企业病横行,制度低效而无序。盛大与腾讯在早期战术上极为接近,它也是国内彼时不多见的拥有引进+自主研发能力优质作品能力的游戏公司,同时它在大文娱的多个赛道上投钱又投人的做法也一度让腾讯颇感吃力,但要追述最终为何逐步走向衰退的根源,很大程度上是出自内部架构陈旧导致的管理低效与混乱引发的大企业病。据腾讯互娱的一位工作人员介绍,内部曾发生两次重大架构调整:

  • 第一次:2009年开始率先进行组织架构调整,将过去的项目组演变为工作室制度,其架构隶属于腾讯公司,但介于项目组和公司之间对内完成统筹安排,向上完成对接,实际上保证了自由度,使得工作室可以有足够空间探索新的方向。
  • 第二次:2012年底,开始实行工作室群制度,目前全国拥有四大工作室群:天米、北极光、光子、魔方。调整前一个工作室拥有300~400人,动辄100人级的大型项目仍然过于低效且反应迟缓,这次调整后四大工作室群旗下拥有20多个小工作室,平均每个工作室人数变成几十人,由于更多的放权所导致的结果就是小工作室更大的自由度,让工作室逐步走向自负盈亏道路而非公司持续由输血的好处是自己有了核算成本的能力,除去上缴的部分利润外,对整个工作室的收入调配空间也更高。

腾讯在占据领先地位的同时通过革新工作室-工作室群制度极大的提升了效率,但盛大这边却仍然按照陈旧的项目组模式继续进行,加之陈天桥后续退出核心决策团队后产生的内乱,胜负只是时间问题。

img

「王者荣耀」开机画面显示其隶属于成都天美工作室群L1 工作室

看到趋势,却没有更多进展。移动互联网还没到来前,手游时代即将来临是公认的大方向,特别是在彼时《我叫MT》和《刀塔传奇》两款手游的出色表现让人看到了智能机的未来,这点上海系想必也非常清楚这个赛道在今后的变现能力,但最终迟迟没有更大的动作的核心点还是策略上的求稳而不敢放手一搏。

据一位业内人士称在上海系公司内部,手机端项目通常是由公司新组建的项目组由新人来尝试性的去做一些开发和市场投放,但整体还是要以老业务维持稳定作为主基调,这样做的好处是如果这个手机游戏只是一阵风,那么试错成本或许能最小化,但手游却是决定未来十年中国游戏市场走向的超级赛道,上海系公司直接错过了一个时代。而另一头占据优势的腾讯则是拿出了all in的气势,只保留现有《英雄联盟》业务稳定的情况下,让四大工作室群下辖的十几个工作室展开手游项目的终极赛马(可类比2011年”微信”项目all in)。

值得注意2011年曾在微信项目赛马中因为晚了一个月而败北于张小龙广州邮箱团队的成都游戏团队,其中隶属于天美工作室群下原本只在2007年产出过《QQ三国》的L1 工作室一度因为表现不佳而即将解散,但正好是在这一轮手游赛马中L1工作室绝地反击的做出了《王者荣耀》这款现象级的作品,上演“终场绝杀”。

千军易得,一将难求。

很显然,上海系被腾讯打垮后所产生的影响远不止行业排名变化那么简单,更为严重的后果是上海系公司中高端人才逐步开始外流。当中最典型的代表:一位是前光通公司总经理,因为引入《传奇3》而名声大噪的马晓轶于2007年加盟了腾讯,现任腾讯公司高级副总裁,总管腾讯全球游戏发行业务;另一位来自前盛大网络首席财务官张勇,2007年加入阿里巴巴的他是现任阿里巴巴集团CEO兼董事局董事,「逍遥子」。

img

上-腾讯高级副总裁 马晓轶 下-阿里巴巴集团CEO 张勇

「上海系衰落后没有新的游戏跟上是人才流失的一个关键,然后腾讯网易起势以后,游戏人才开始愿意去深圳、杭州、广州,甚至成都,紧接着腾讯又在上海布局北极光工作室群本部+两个天美的工作室,那最后结果就是整个上海游戏行业的顶尖人才逐步被瓜分完,这就是当下的情况」

来自前巨人网络的一位工作人员告诉朱思码记,在他看来上海未来所面临最坏的结果就是只将上海当作是一个应用与消费的市场或场景,但却会因为高房价、高物价、人才外流短缺而导致本土创业公司无法生存:只长了几棵外人种的参天大树,其余四周寸草不生。显然上海系游戏公司的弊病并非本行业所独有,因此这一赛道从崛起到短短10年间被腾讯、网易瓜分只是上海互联网衰败的一个缩影。

一切只是刚开始。


2018年4月1日,饿了么创始人张旭豪在内部信《大鹏一日同风起 扶摇直上九万里!》里第一次对外宣布公司正式被阿里巴巴集团全资收购,这封信当然也可以解读为一封告别信。自2016年4月饿了么获得第一笔12.5亿美元投资,到2017年4月,第二笔4亿美元的投资完成时,阿里已经占股32.94%,成为最大股东后实际已经可以取代饿了么管理团队,并拥有一票否决权。

自阿里资本进入的那一刻起,张旭豪和原管理层的出局就已经进入了倒计时,毕竟天下只有王兴一个例外。

「应该是签署了对赌协议,时间到今年3月底,然后要求是2018年Q1要完成盈利,因为我记得2017年6月到2018年4月份这个时间整个公司都在说要把帐做平,甚至最后说要每一单都盈利,做不到也没有办法,尽管张旭豪还是每个季度都会说一次这个季度的战役要打响了然后鼓舞一下士气,我想他真的已经尽力了」

来自前饿了么的一位工作人员告诉朱思码记,即使身为在上海本土作战的本土企业,饿了么的渗透率也只有60%左右,尤其对这家2014-2015年才起势的公司来说,2015年O2O风口结束后没有更多的融资就意味着没有办法去打二三线市场,而美团本身的地推优势就明显要大于饿了么,跑赢千团大战的王兴绝不是吃素的,拥有成熟的手法预测市场商家潜力,还有来自阿里中供铁军的嫡系血统,更重要的是背后还有腾讯的流量+资本支持的优势。

「但至多也就是在上海能与美团打一打,一出上海城以后所遭遇的问题和大众点评是一模一样的状况——也就是上海互联网公司的通病:成本高的不喜欢成本低的。上海的地推成本是非常低的,因为商业环境很成熟,但是你其他地方的情况是需要跟当地监管执法部门处理关系,还有补贴吸引商家入驻,事实上饿了么BD拓展的市场时候给到的商家补贴和拉新成本远高于上海本土,这样的亏损是避免不了的,但是面对称为‘商业环境不文明’的地区,美团玩了那么多年地推很清楚如何针对性的在同等环境下用差不多一样的资源来尽可能把帐做平,饿了么野路子肯定要交学费,但是两大外卖平台可是日均千万单俱乐部的成员,边际成本那么高所以注定也只有阿里能接盘买单」

面对王兴这个凶悍的对手,张旭豪的公司之所以能够存活如此长的时间并杀出一条血路在很大程度上是因为饿了么是一众上海互联网公司中极为罕见的拥有「路子野,作风强硬,敢打仗敢拼」的特性,而这个“唯一”的头衔一直保持到2015年后拼多多出现后才被逐步替换。

img

作风强悍的饿了么曾与美团外卖在线下多次爆发冲突

张旭豪和其创始团队从上海交通大学创业起家,拿过校级、区级、市级在内创业大赛一等奖,可以说是由上海市政府一手栽培起来最纯正的本土互联网公司,但张旭豪却多次在内部与外部场合发表关于「我是上海人,但是我不招上海人」的言论。值得玩味的是据一位接近上级部门的人士向朱思码记透露,该言论酿成的后果便是招致了领导们的对饿了么特别是对张旭豪本人的不满。

「我想他的本意还是批判上海本地人不愿意拼,毕竟工资都不低,有腔调的上海人都热爱生活,时薪概念很强,如果累的死去活来换来高工资,然后又缴那么重的税,我干嘛那么玩命而不做一个轻松但薪水不低的活呢?更何况本地人基本都不需要买房。」

一位来自香港的新上海人告诉朱思码记,在最近2~3年,香港的豪车销售量迅速攀升,同时香港本地居民的出境游比例也不断攀升,且受众都是30岁以下的年轻人,显然在无法承担高房价的情况下,香港年轻人试图用提高生活品质的方式来缓解买不起房的痛苦,这点恐怕对于同属国际大都市的上海人同病相怜。

归根结底,上海的互联网公司对比北京、杭州、深圳会有哪些的异样?

不相信加班文化。长期崇尚西方工作制度,因此上海公司除去日企、台企以外绝大部分的外籍公司都不鼓励在公司加班而是建议把工作带回家处理,外企显然更十分注重员工在8小时上班时间内的工作效率,而不关心加班时到底有没有在认真工作,简单的说法就是会跟公司玩命的比例较低。

朱思码记随机调查了携程、饿了么等上海互联网公司员工加班时间和正常下班时间,发现其比例基本保持55开,至多也就是要求手机24小时开机以便于随时联系沟通。这对于整天拍杭州淘宝城、北京西二旗后厂村,和深圳滨海大厦凌晨灯火通明的互联网人来说,没有996的生活简直就是不可思议。不过当前上海互联网公司中唯一例外的是“拼多多”疯狂的加班行为被全国各地的人力资源同僚和行业猎头评价为沪上“有钱没命”的典型企业。

上海选择互联网行业的大多为中等以上人才,但不一定是最顶尖的。上海是长三角的金融航运工业中心,教育水平优良,人才密集的同时汇聚了大量世界五百强企业在上海的入驻,这也使得人才在院校毕业后的选择空间远高于杭州,深圳,乃至北京。由于西化程度较高,外语普及率位居全国之首,出国留学比例也位居全国前列。如此看来,上海的人才被国企、外资企业、金融系统、政府公务员等几道筛完后,余下的才有互联网公司的机会,而上海唯独没有BAT这样的大型互联网公司,所导致的结果就是互联网行业并非当地人才的首选,甚至备选。“类似当班上考满分的人都走完以后,老师只能把考卷的难度要求降到足够让80分的人能够拿到满分,不然考试将无法进行下去”。

上海互联网公司的离职率远低于全国平均水平。互联网行业是离职率较高的行业,原因不外乎业务的发展高速度决定了公司潜在的风险和回报的概率几乎一致,这导致的结果是公司几年就解散或者公司几年就上市的概率近乎1:1,而上海的情况是互联网公司虽多,但BAT这样的巨头却是一家也没有。

朱思码记饿了么员工的平均在职时间基本都在2年左右,这在上海互联网行业已经算是离职率非常高的公司了,而对比携程的员工在职时间平均动辄都是6~8年,这意味本地真正发展稳健且又业务良好的互联网公司其实极少,在上海互联网圈跳槽选择不多的情况下离职率自然下降了,但稳健的发展只应属于上市公司或者传统企业,对于中小型互联网公司来说——“稳健发展”四个字绝对不是VC,老板自己,甚至互联网行业所希望看到的那样。

「上海生存压力真的大,可以说是中国国际化程度最高的一座城市,因此这座城市对于互联网的态度跟国外很多城市遇到状况是类似的:我得先看到有什么,所以我才要什么;但是北京,杭州他们面对新生事物不会过于谨慎,因此他们对待互联网的态度是:我听说国外有什么,所以我想要什么。综合说起来,上海还是太现实了点。」

来自上海的一位互联网创业者告诉朱思码记,上海最先起来的互联网公司之所以出自做游戏的盛大和做本地生活的饿了么,其核心不外乎是上海本土的传统经济过于发达导致线下大饼已经被彻底瓜分完的情况下,不得不在基础极佳的环境下寻找那些细分的切入口。这也是为什么阿里、滴滴、腾讯这类找到大方向、大市场的公司不可能诞生于上海的原因:

上海的互联网总在微创新,也就是不打破既有的成熟游戏规则下所进行的小调整,不触及规则就属于怎么规矩怎么来,但实际上互联网的使命就是要革命与颠覆,为此上海互联网公司总是纠结与矛盾的共同体,往往导致的结果只是乐坏了北深杭那些豺狼虎豹般“等着你自己犯错”的竞争对手们。

「A和B是一样聪明的两个孩子,A需要从90分提到100分,B开始是希望从40分提到90分,很可能最后出现的结果是A一分没提,B却在短时间里提了40~50分,如果是老师,我相信老师会认为B比A更努力,但A不是不努力只是做出来的结果没B的好看,可结果为导向的互联网行业里A就是不如B的,你可以把AB分别看作上海的饿了么和北京的美团」

随着阿里管理团队上任饿了么,新任CEO亲自送餐走秀上头条,是是非非的收购案大幕算是彻底落下了,而美团与饿了么的大战显然还将继续下去,王兴的对手从野路子张旭豪变成了马云亲自点将的王磊。饿了么的断腕求生,可叹但不可惜,毕竟这场依靠补贴和地推进行的惨烈大战在某种意义上说已经超越了本地生活O2O这个赛道真正的商业价值和潜力,而是上升到了王兴与阿里多年未了的私人恩怨。

送走了饿了么,但迎来了拼多多,十里洋场至今仍然还是大侠们的乐园,但上海却不一定欢迎小虾米。


2018年7月26日晚间,拼多多创始人黄峥缺席了纽约当地时间的敲钟仪式而改在上海地标性建筑物——上海中心进行远程敲钟,这种极度反常的举动成了国内众多媒体关注的焦点的同时也成了一桩悬案。

直到副市长出席拼多多敲钟仪式,和几天后“拼夕夕”的横空出世,疑案似乎就此被解开——显然这是一次精心策划的GR秀,其目的是为了做实“上海新经济代表”的这个拼多多急需的title,因为自知存在这样那样问题的拼多多需要在舆论风暴来临前通过GR手段来获取一个官方庇护的许诺甚至是一个保证。

从本质上说,拼多多是一家由杭州籍创始人于杭州创办起家后,带着原杭州拼好货团队在最近几年才“移民”上海的“上海公司”。上市当天黄峥接受采访时说移民上海是为了招人方便或许只是一个说法,实则腾讯投资的大背景和业务上与阿里的直接冲突而选择远离其杭州大本营势力范围而移植上海的拼多多,根基并不稳。

拼多多需要上海,上海也需要试着相信一下类似拼多多这样能「胜天半子」的互联网公司。这一幕就像18年前的阿里巴巴和杭州一样熟悉。

相比于上海互联网公司,杭州互联网公司通常更善于也更重视处理政府关系,当然这与两座城市的在当下所采取的策略在历史上是有直接关联的。

1843年11月17日,上海开埠后英国人率先在上海设立租界,现南京路西路以北区块为原英租界势力范围,该地区奉行自由主义的放任模式。而6年后,法国人开辟法租界,南京西路以南为法租界势力范围,该地区争锋相对的奉献国家主义,即以大资本家、大企业和大工厂的税收利润支撑起福利和保障的社会主义模式。上海人在彼时选择了腔调十足的法租界,而隶属于法租界的徐家汇成了老上海乃至今天繁华的市中心。追溯今天上海为什么会拥有如此之多的大型跨国公司,其根源便是出自法租界模式。

但从现在看来,杭州则是选了英租界的自由主义模式。

2000年后,杭州还是一个依靠观光旅游业+中大型民营企业作为经济核心推动力的二线城市,甚至为了拓展杭州观光旅游业的市场天花板,市政府连续数年举办西湖博览会+休闲博览会的同时还于2002年10月1日起免除了西湖风景区周围130个景点的门票,并拆除了西湖风景区围栏,实行永久免费开放的策略,可谓用心良苦。然而娃娃哈、万向集团在内的一系列大型民营企业在彼时出现了这样那样问题导致了企业发展速度迟缓。

既然连鲁冠球、宗庆后都靠不住了,时任杭州市委书记王国平也只能靠马云碰碰运气了。随后几年来杭州开始扶持小微企业,尤其着力于是打造天堂硅谷并重点培养互联网企业,后续阿里巴巴和一票杭州互联网公司崛起的故事我们都看到了。

上海核心还是一个非常精打细算的城市,核心说法就是路径依赖程度很低,即使是在经济最落后的金山区你也看不到杭州余杭区那种互联网产业高度集中的业态。对于政府而言,互联网是甜品而金融贸易和工业才是主菜,但要衡量吃甜品还是吃主菜,抛开喜好的直接因素就是真金百银的税收——法租界就是税收比英租界好。趋势?趋势能多交税么?!」

一位上海互联网创业者向朱思码记举例上海著名的「张江高科」:该产业园区真正涉及纯互联网行业的公司少之又少,而绝大部分入驻企业都是医疗、航天工业、半导体芯片、精密仪器制造等尖端技术的公司,对于这些直接卖了可以带来收益和税收的公司,政府当然会扶持,可是类似饿了么这样能够间接带动多少就业岗位,为多少餐厅提供营收的互联网概念,对于上级部门而言是没办法写入工作报告的,有时候可能还不如一家跨国企业入驻上海来的有效。

「你看南京西路上一个又一个大型的商场和高端shopping mall:久光百货、苪欧百货、嘉里中心、中信泰富、太古汇,这些哪一个是我们上海本土的零售品牌?可对于政府来说这并不影响税收地租和周围带动的经济效益。再去看看杭州,清一色的银泰集团。前几天我自己的公司被罚了10万,就是宣传文案多打了一个“最”字,这就是上海的思维模式:这里是一个特别不care小微企业的城市,大门只为强者而开」

监管一直都是互联网公司的头顶的一把刀,而上海监管执法力度让本地的互联网公司的内心凉了半截。仅过去2个月,拼多多和携程被约谈是事出有因,上海联璧金融被查还在意料之中,可Bilibili被下架就有些突然,好奇心日报被封一个月就属于出乎大多数人意料。一系列上海籍互联网企业在享受着这座城市带来荣耀的同时,也遭受着中国近乎最严苛的执法力度和规章制度。

来自出行行业的一位业内人士甚至向朱思码记透露,2015年上海市交委曾经颁发了一张滴滴上海的准生证,而滴滴方面为此付出的代价是在彼时放弃其在上海的快车与顺风车两大业务,同时为了保障上海出租车行业定价的稳定,也在上海放弃了司机端的加价,甚至阉割了显示目的地这样重要的功能,所作的一切只是为了配合上海当地政策和规章制度。不过在付出业务上牺牲的代价后,上海市又重新开展了打击专车乱象的专项行动,而2015年滴滴的那张准生证则被官方否决作废了。于是包括Uber在内的一众竞争对手,就是找准了在上海市场满口没牙的滴滴往死里打,美团打车于2018年开年以来在上海频频得手的真正原因,实际上出自滴滴的无奈——上海是全中国滴滴渗透率最低的城市。

因为上海不相信互联网,维稳是这座城市的根基。

「上海和北京的差异可以在地铁安保上做个对比,上海绝大部分的市民都普及了地铁卡,而上海的地铁安保力度是全国最好的,那意味着上海愿意守规则的市民占了绝大多数,而北京刷卡比例明显低于上海不是说北京人不守规矩,而是说明北京的规则依然是严格的,但是在执行力度上是却是有一定弹性的」

显然站在地方角度看,上海本地极高的公务人员优秀素质保障了条款政策的清晰与滴水不漏,可是规则毕竟只对被规则的人有效,而制定规则的人从来不会制定不利于自己的规则。守规则的人愈多,社会的秩序性也就愈强,但所造成的结果是秩序井然下的冷漠与无情。因为事物是永远都是发展的,只有经过一定的过程才能实现自身的发展。

「前阵子我有个朋友做了一个类似INSTAGRAM的照片墙社交平台,后来因为有用户自己上传涉黄内容而被上级部门处罚,开始我朋友觉得就是整改,罚款至多如此了,互联网公司刚起步谁不是野蛮的呢?结果一看处罚通知:300万元罚款,平台永久封掉。现在我终于明白为什么那么多互联网人都去杭州了」

既然上海对互联网选择了质疑,那么杭州势必会继续选择相信。如同张五常先生论文里所说的那样——只有曲线竞争才是中国发展的动力,今天上海与杭州在经济、人才、互联网三方面的角逐如同美国东海岸的纽约和西海岸的洛杉矶一样,此消彼长的胜负其实没有任何意义,但只有竞争,才会发现不足,也只有竞争才会拥有新的对手。

《财经》杂志2018年8月刊中《少年头条对垒中年腾讯》一文里曾写道:这场战役让腾讯内部兴奋了起来。中年腾讯在过去7年没有打过像样的公关战,且过去4年因为战略转型成功而一路凯歌猛进未尝败绩,如此突入起来的大战在猝不及防之余势必会推动腾讯内部重新思考自身问题以及在短视频和内容方面的产品思路,或许只有让素来好战的腾讯产品团队通过赛马制来祭出杀手锏级的产品,接下来行业的发展才能走得更好。

谦逊往往基于力量,只有傲慢基于无能。

同理上海互联网的发展,只有像杭州这样的城市把上海彻底打醒,中国互联网行业才能走得更健康,上海互联网创业者才会更多的机会拥抱变化。

因为未来的互联网是去中心化的,而去中心化的中国互联网绝不能没有上海。


呼伦贝尔·记

最近跑了趟呼伦贝尔,沿着中俄边境走了一遭,记录一下路线图,有想法的朋友可以亲身体验下。

注意

呼伦贝尔以呼伦湖和贝尔湖得名,与蒙古国、俄罗斯相接壤,是中俄蒙三国的交界地带。这次出来玩我是冲着呼伦贝尔大草原来的。

呼伦贝尔的旅游旺季是每年8月,据当地朋友介绍,7月份的景色也会好点,草更绿、向日葵油菜花都是盛开的时候,旅游价格和体验会好很多,如果时间安排的开的话可以考虑7月份过来。

有一些注意事项:

  • 蚊虫多,备好防蚊虫药水
  • 草原比较晒,备好防晒产品。我回来黑了好多Orz
  • 早晚温差大,带件长袖
  • 备一点洗漱用具,住宿的时候不一定有
  • 普通的一顿饭人均是50-70rmb,吃饭最好赶早,正常时间等饭要1-2小时,上菜顺序是一桌一桌上,所以等的很久
  • 小镇上和蒙古包住宿是非实名制的,到达目的地后先开好房间(旺季)

这次旅游的路线图如下:

从沈阳坐火车(睡一晚)到海拉尔,沿着箭头走了4天,海拉尔、黑山头、满洲里,最后从海拉尔火车(睡一晚)到哈尔滨结束行程。海拉尔、满洲里都有机场,有飞机直达的话直接飞也很不错。

路线风光

第零天

  1. 沈阳 -> 齐齐哈尔 -> 海拉尔

第一天 出发 向着大草原

到达海拉尔,往室韦走,晚上睡在黑山头。

  1. 到达海拉尔

  2. 金帐汗

  3. 莫日格勒河

  4. 湿地

  5. 去室韦,晚上住下

第二天 边境线 走走停停 策马奔腾

第二天沿着边境线走了一天,最美的景色就是这一天看到的了。下午骑马,人多的话晚上可以点个烤全羊。

额尔古纳河:

额尔古纳河


如何使用 Laravel Collections 类编写神级代码

转自 laravel-china.org: 如何使用 Laravel Collections 类编写神级代码

Laravel 提供了一些超赞的组件,在我看来,它是目前所有 Web 框架中提供组件支持最好的一个。它不仅提供了开箱即用的视图(views)、身份认证(authentication)、会话(sessions)、缓存(caching)、Eloquent、队列(queues)、数据校验(data validation)等组件。甚至还提供了开发工具(Valet 和 Homestead)。

但是,这个框架功能中最强大的一个特性常常被萌新们视而不见 - Collection(集合) 类。在这篇文章,我们将探寻如何使用集合提升编码效率、代码的易读行,及编写出更精简的编码。

预览

最初接触到使用集合的场景来自于研发人员使用 Eloquent 执行数据库查询,并从返回数据中使用 foreach 语句遍历获取模型集合。

不过,初学者可能并没有注意到,集合提供了超过 90 个以上的方法来操作底层数据。更妙的是几乎所有的方法都支持链式操作,能够让你的代码读起来就像一篇散文一样。这样使得你的代码更易阅读,无论是你还是其他使用者都是如此。

还没有进入正题?好吧,让我们回顾一个简单的代码片段,来看看我们如何使用集合编写粗、快、猛的代码吧。

代码示例

让我们构建一个真实的世界。假设我们查询某些 API 接口并获取到如下以数组保存的结果集:

<?php
// API 请求返回的结果
$data = [
    ['first_name' => 'John', 'last_name' => 'Doe', 'age' => 'twenties'],
    ['first_name' => 'Fred', 'last_name' => 'Ali', 'age' => 'thirties'],
    ['first_name' => 'Alex', 'last_name' => 'Cho', 'age' => 'thirties'],
];

我们看到数组包含名字(first name)、姓氏(last name) 和年龄(age)范围。现在,我们假设从记录中获取一名 年龄(age)30 岁(thirties) 的用户,然后依据 姓氏(last name) 进行 排序(sort)。最后,我们还希望返回的结果为 一个字符串(single string),这样每个用户独占 一行(new line)。最后,我们还希望返回的结果为

这个需求看起来不难实现,现在让我们看看使用 PHP 如何实现这一功能:

// 依据姓氏排序
usort($data, function ($item1, $item2) {
    return $item1['last_name'] <=> $item2['last_name'];
});

// 依据年龄范围分组
$new_data = [];

foreach ($data as $key => $item) {
    $new_data[$item['age']][$key] = $item;
}

ksort($new_data, SORT_NUMERIC);

// 从年龄为 30 岁组里获取用户全名
$result = array_map(function($item) {
    return $item['first_name'].' '.$item['last_name'];
}, $new_data['thirties']);

// 将数组转换为字符串并以行分隔符分隔
$final = implode("\n", $result);

// 译注:原文是 $final = implode($results, "\n"); implode函数接收两种顺序的参数,为了保持与文档一致所以我这边做了调整。

我们的实现代码超过 20 行,并且很不优雅。移除掉注释及换行相关代码,这段代码会变得难以阅读。再者,我们还需要借助临时变量以及 PHP 中内置的不友好的 sort 方法。

现在,让我们看下借助 Collection 类实现起来是多么简单吧:

collect($data)->where('age', 'thirties')
                 ->sortBy('last_name')
                 ->map(function($item){
                    return $item['first_name'].' '.$item['last_name'];
                 })
                 ->implode("\n");

哇哦!我们的代码从 20 行变成了 6 行。现在的代码不仅顺畅不少,并且在方法实现时无需借助注释告诉我们它们在处理什么问题。

不过,还存在一个问题阻止我们的代码不如完美阶段… 就是用于比较 first name 和 last name 的 map 方法。坦白说,这真的不是什么大问题,但是它为我们探索 macro(宏) 概念提供了动力。

扩展集合(Extending Collections)

Collection 类,同其它 Laravel 组件一样,支持宏(macroable),就是说你可以给它添加方法随后使用。

提示: 如果你希望新方法随处可用,你应该将它们添加到服务提供中。我喜欢创建一个 MacroServiceProvider 实先这个功能,对于你来说随你喜欢就好。

让我们添加一个方法它会连接由数组提供的任意数量的字段并返回字符串结果:

Collection::macro('toConcatenatedString', function ($fields = [], $separator = ' ') {
    return $this->map(function($item) use ($fields, $separator) {
        return implode($separator, array_map(function ($el) use ($item) {
                return $item[$el];
            }, $fields)
        );
    })->implode("\n");
});

添加完这个方法后,我们的代码基本上就完美了:

collect($data)->where('age', 'thirties')
              ->sortBy('last_name')
              ->toConcatenatedString(['first_name', 'last_name']);

我们的代码从混乱的 20 多行精简到了 3 行,代码干净整洁功能清晰任何人都可以立马理解。

又一个示例

现在让我们看下第二个示例,假设我们一个用户列表,我们需要基于角色(role)过滤出来,然后进一步如果他们的注册时间为 5 年或以上且 last name 以字母 A-M 开始的仅获取第一个用户。

数据类似如下:

<?php
// API 请求返回的结果
$users = [
    ['name' => 'John Doe', 'role' => 'vip', 'years' => 7],
    ['name' => 'Fred Ali', 'role' => 'vip', 'years' => 3],
    ['name' => 'Alex Cho', 'role' => 'user', 'years' => 9],
];

如果我们使用的是 PHP 实现,我们的代码看下来如下:

$subset = [];
foreach ($users as $user) {
    if ($user['role'] === 'vip' && $user['years'] >= 5) {
        if (preg_match('/\s[A-Z]/', $user['name'])) {
            $subset[] = $user;
        }
    }
}
return reset($subset)

注意: 你可以将第二个 if 语句移至第一个里面,但是我个人喜欢在单个 if 语句中使用不超过两个条件语句,因为我认为超过 2 个条件语句回事代码难以阅读。

这段代码不至于太糟糕,但是我们依然需要使用临时变量,我们还需要使用 reset 函数将指针重置到第一个用户。我们的代码还有四层缩进,这使得代码解析变得更有挑战性。

相反,我们来看看集合是如何处理这个问题的:

collect($users)->where('role', 'vip')
              ->map(function($user) {
                  return preg_match('/\s[A-Z]/', $user['name']);
              })
              ->firstWhere('years', '>=', '5');

我们将代码简化到了之前的一般左右,每一步过滤处理清晰明了,并且我们不需要引入临时变量。

遗憾的是目前集合还不支持正则匹配,所以我们使用 map 方法,不过我们可以为这个功能创建一个宏:

Collection::macro('whereRegex', function($expression, $field) {
    return $this->map(function ($item) use ($expression, $field) {
        return preg_match($expression, $item[$field]);
    })
});

得益于宏方法,我们的代码现在看起来如下:

collect($users) -> where('role', 'vip')
                -> whereRegex('/\s[A-Z]/', 'name')
                -> firstWhere('years', '>=', 5);

注意: 为了简单起见,我们的红仅仅适用于数组集合。如果你计划让它们可以在 Eloquent 集合上使用,你需要在此场景下做相应的代码处理才行。

不同的视角

我们可以继续列出无数的示例,但仍然无法涵盖所有可用的集合方法,并且这从来都不是本文的真正目的。

需要注意的是,通过使用 Collection 类,您不仅可以获得一个方法库来简化编程工作,还可以选择一种从根本上改善代码的方法。

你会情不自禁的将你的代码结构从代码块重构简化成一行,同时减少代码的缩进,临时变量的使用和技巧性方法,另外你还可以使用链式编程方法,这让你的代码更加便于阅读和解析,此外最重要的是减少了编码工作!

查看官方文档获取更多这个迷人的类库的使用细节:https://laravel-china.org/docs/laravel/collections

提示: 你还可以获取这个 Collection 类独立安装包,在使用非 laravel 项目是会非常有帮助。感谢 Tighten Co 团队做出的努力 https://github.com/tightenco/collect


Error - Jenkins detected running multiple instances

我使用的 Jenkins 放在 kubernetes 中运行。今天出现了漂移的现象,因为没有做共享存储,运行时数据全都没有了。二话不说把数据迁移了过来,没想到运行时在web界面上显示了以下错误:

Jenkins detected that you appear to be running more than one instance of Jenkins that share the same home directory '’. This greatly confuses Jenkins and you will likely experience strange behaviors, so please correct the situation.

This Jenkins: 17485453 contextPath="" at 1264@< MachineName >
Other Jenkins: 15621395 contextPath="" at 13424@< MachineName >

原因是我在转移数据的时候没有重启服务,导致系统运行前后数据不一致,重启容器即可解决 。

参考资料


1 2 3 4 5 6 7 75 76