首页 文章 精选 留言 我的

精选列表

搜索[协同工作],共10000篇文章
优秀的个人博客,低调大师

年入50万的人是怎样工作的

1 小A,某外企部门经理,管理50多号人。 每天早上大约9点半到公司,每天估计开会(电话会议和现场会议)时间有6个小时,和领导和客户沟通时间估计2个小时,剩下的就是写ppt,邮件和跟进度了。一般来说,周末如果能有一天闲下来就不错了。 2 小B,某大厂架构师,技术牛人,分布式架构5年+经验,对于分布式系统里的反向代理,mq,数据库集群等组件有资深的实践经验。 每天平均开会时间+解决问题的时间,估计有6个小时,一般是下班后才有时间干自己的活,平时不怎么写代码,而是出方案,具体来说就是根据业务系统的现状设计组件,开发组件时遇到问题,得及时解决。而且需要手机一直开机,有问题得及时解决。 需要说明的是小B是资深架构,还没做到技术总监级别,如果能做到负责某个产品的首席架构或技术总监,年入估计要70万+了。 3 小C,有自己的公司,平时帮人出解决方案,卖自己公司的产品,顺带做监理,培训等等,反正什么活都干,平时经常在飞机上,不定时需要和别人去谈项目。而且,从谈客户到实施到问题解决到后继维护,大多都是自己解决。 4 小D,做培训的,培训内容涵盖PMP,数据库,AI等,做大班培训和企业培训,在行业内也比较有名气了,也是有自己的公司,而且做得时间比较长,有稳定的客户源,算下来,一年有100万+了。但每天也有见不完的客户和干不完的事。 5 小E,某创业公司(规模一般)的技术总监,年入55万+,老板的要求是,得解决任何技术问题,从带人开发到测试到上线部署到性能优化,全都得管,大到租服务器上线项目,中有选用分布式组件开发项目,小到代码review测试,没有不涉及到的。而且成天得提心吊胆,因为创业难。 归纳一个字,年入50万,忙。 但相比那些混吃等死无所事事的,这些人能用忙来换钱,也算是有本事了,至少本人愿意往这方面努力。

优秀的个人博客,低调大师

工作中的一些知识总结

判断h5页面是否App内打开 HybridMethod.isApp() 跳转 部分功能已封装至srcstatich5jsjshybridcomponent.js,可以直接调用 页面跳转 topage为跳转页面地址,若下表未给出目标页参数,topage直接为目标链接地址,否则为目标页参数 方法一 RainbowBridge.callMethod('JsInvokeAppScope', 'forward', { type: 'h5Web', //跳转类型native或h5Web或h5Native topage: 'showMallShake' }); 方法二 <div data-forwardBox> <div data-forwardNoRight-topage="<% webpath.h5 %>/help/qalist.html?q=0&a=2" data-forwardNoRight-title="产品计划" data-forwardNoRight-type="h5Web">加入的计划是如何计息和派息的?</div> </div> 弹窗 RainbowBridge.callMethod('JsInvokeAppScope','showAlert',obj,function(result){}) 显示loading loading:function(status){ RainbowBridge.callMethod('JsInvokeAppScope','loading',{status:status}); }, 弹出ActionSheet showThemeDialog:function(obj){ //参数是一个对象,只有一个属性dialog,属性值是一个数组,数组每项又是一个对象,分别有两个属性:link,title RainbowBridge.callMethod('JsInvokeAppScope','showThemeDialog',{ dialog : obj.dialog }); }, 结束刷新 RainbowBridge.callMethod('JsInvokeAppScope','endIntegralLoad',{}); 跳转登陆页 if(HybridMethod.isApp()) { RainbowBridge.callMethod('JsInvokeAppScope', 'goLogin'); } else { var _index = window.location.href.indexOf('event'); window.location.href = HybridParams.pc + '/event/login.html?backUrl=' + window.location.href.substring(_index); } 跳转注册页 if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'register' }) }else{ window.location.href = HybridParams.pc + '/event/register/beginnerwelfare/indexh5.html'; } or RainbowBridge.callMethod('JsInvokeAppScope','goRegister',{}); 跳转到app页面的时候可以给页面添加标题和其他文字 if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'register', UIHeader: { title: "分享领奖", //标题 right:{ //标题栏右边的显示 type:"word",//类型文字word或类型icon图片或share content:"中奖记录",//内容为文字或icon图片地址 action:{ //这个type点击后的跳转 type: 'h5Web',//跳转类型native或h5Web或h5Native topage: LOCATIONORIGIN + '/integral/prizeRecord.html', UIHeader:{ //点击后侧type内容跳转后的页面显示 title:"中奖记录"//标题 } } } } }) }else{ window.location.href = HybridParams.pc + '/event/register/beginnerwelfare/indexh5.html'; } 跳转个人中心 if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'user' }) }else{ window.location.href = HybridParams.h5 + "/download"; } 跳转投资页 if (HybridMethod.isApp()) { RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native', topage: 'invest' }); }else{ window.location.href = HybridParams.h5 + "/download"; } 已登录跳转到首页,没登录跳转到登录页 if(HybridMethod.isApp()){ if(HybridParams.token){ RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'home' //首页 }) }else{ RainbowBridge.callMethod('JsInvokeAppScope','goLogin'); } }else{ window.location.href= HybridParams.h5+'/download/'; } 跳转到充值 RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'recharge' }) 跳转到账户安全(设置页面) RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'showSettingActivity' }) 跳转到积分商城 RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'showMall' }) 关闭当前页面 if(HybridMethod.isApp()) { RainbowBridge.callMethod('JsInvokeAppScope','finish'); } 跳转到提现页面 var _li = $(this).closest('li'); if(HybridMethod.isApp()){ //这个页面已经不用了 RainbowBridge.callMethod('JsInvokeAppScope','goForwardWithParams',{ type : 'withdraw', lhhnum : '提现值' }); } 其他跳转例子 if(HybridMethod.isApp()){ var topage = params.h5 + "/user/bonus_receive.html?rcode="+rcode; RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'h5Web',//跳转类型native或h5Web或h5Native topage: topage, UIHeader:{ //跳转后页面的显示 title:"好友邀你领红包",//标题 } }); }else{ window.location.assign(params.h5 + "/user/bonus_receive.html?rcode="+rcode); } 设置当前页的标题 if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','setWebTitle',{ title: 'demo3-sub页面一前端设置当前页的标题', }); } 其他跳转总结: "experianceInvest"; 体验标投资"feedback"; 意见反馈"aboutUs"; 关于我们"myNotice"; 公告"message"; 消息 "myPrivilege"; 我的特权"productDetail"; 计划详情 -------------需要参数 参数key : id"getMoreByInvite";// 跳转多邀多的;页面为H5 但是因为有二级页面参数不好跳转 , 走本地页面流程"showMallShake"; //积分商城摇一摇 页面为H5 但是因为有二级页面参数不好跳转 , 走本地页面流程"moneyRecord";//资金明细 帮助中心功能 app内h5页面是否有“下拉刷新”功能 & “上拉加载更多”功能 type:1 下拉 type:2 上拉 type:3 both两个都有 RainbowBridge.callMethod('JsInvokeAppScope','setRefeshType',{ type : 1 }) 显示通用弹出框 var refreshdata = { "type": 9, "message": "线下充值可能延至48小时到账建议使用在线通道充值", "largebuttontext": "返回在线充值", "extraclicktext": "继续刷新余额", }; 复制操作 RainbowBridge.callMethod('JsInvokeAppScope','copyContent',{content:content}); 复制邮箱 $('.kefu_email').click(function(){ var txt = $(this).find('span').text(); HybridMethod.invokeEmail(txt); }) 调起邮箱 invokeEmail:function(email){ RainbowBridge.callMethod('JsInvokeAppScope','invokeEmail',{email:email}); } 粘贴到剪贴板 copyH5Content:function(content){ RainbowBridge.callMethod('JsInvokeAppScope','copyH5Content',{content:content}); } 复制微信号 $('.ylb_weixin').click(function(){ HybridMethod.copyH5Content('yonglibao'); }) 跳转在线客服界面 $('.kefu_online').click(function(){ RainbowBridge.callMethod('JsInvokeAppScope','toContactUs'); }) 拨打电话 $('.ylb_phone').click(function(){ HybridMethod.toCallUs('400-615-5566'); }) or toCallUs:function(phone){ RainbowBridge.callMethod('JsInvokeAppScope','toCallUs',{phone:phone}); }, 照相机 camera:function(callback){ RainbowBridge.callMethod('JsInvokeAppScope','camera',{},callback); } 判断android和ios isAndroid: function(){ var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端或者uc浏览器 return isAndroid; }, isIOS: function(){ var u = navigator.userAgent; var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 return isiOS; } 获取APP版本号 getAppVersion: function(){ var that = this; if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','getAppVersion',{},that.getAppVersionCallBack); } else{ window.location.href= HybridParams.h5+'/landing/'; } }, //获取APP版本号回调 getAppVersionCallBack: function(result){ var that = this; // result = { version: '5.1.4' }; alert('版本号为'+result.version); } 下载app function weixin(){ var ua = navigator.userAgent.toLowerCase(); //navigator是HTML中的内置对象,包含浏览器的信息;userAgent是navigator的属性方法,可以返回由客户机发送服务器的头部的值,作用就是返回当前用户所使用的是什么浏览器,toLowerCase()是将转换为小写 return ua.match(/MicroMessenger/i)=="micromessenger"; }; function ios(){ return /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent); } function downloadway(){ var self = this; if(!weixin()){ $('.download-btn').attr("href","http://a.app.qq.com/o/simple.jsp?pkgname=com.yonglibao.android"); }else if(ios()){ $('.download-btn').attr('href','https://itunes.apple.com/us/app/yong-li-bao-tou-zi-li-cai/id874240991?l=zh&ls=1&mt=8'); $('.download-btn').click(function(){ ga('send', 'event', '下载', 'iOS', { 'metric3': 1 }); }); }else{ //android $.ajax({ type:"POST", dataType:"json", url:params.url + '/option/getConfig', success:function(response){ console.log(response) if(response.code == 1000){ $("#device-browser").html("Andriod"); $('.download-btn').attr("href","https://yonglibao-app.oss-cn-hangzhou.aliyuncs.com/yonglibao_" + response.data.updateVersion.android_channel_version + ".apk"); $(".download-btn").click(function(){ ga('send', 'event', '下载', '安卓', { 'metric3': 1 }); }); }else{ alert(response.msg); } }, error:function(response){ alert(response.msg); } }) } } 分享 不需要回调的右上角分享 share: function () { var self = this; if (HybridMethod.isApp()) { //右上角分享 RainbowBridge.callMethod('JsInvokeAppScope', 'setShare', { 'needShare': 1 // 1: 需要分享按钮(默认); 2: 不需要分享按钮 }); HybridMethod.showAndSetRightShareBtn({ title: '“辞旧辞旧迎新送金喜 新榜提名赢好礼', content: '年终盛宴,延续惊2018鸿运当投,品牌金饰天天送,上榜更有豪礼拿,苹果手机 、投资金条、2018现金大红包,就等你来!', imgUrl: "https://pc104.ylb.net//event/2017/newyear/images/share.jpg", needShare: 1, shareUrl: "http://pc104.ylb.net/event/2017/newyear/index.html", useDefault:0, //0:分享内容由前端自定义;1:分享内容由app抓取 stayWhich: 'wechat,wx,qq', //分享支持哪几种方式;朋友圈,微信,qq delayShare:1, //延迟分享,默认为0,即调用方法就分享,为1时即只传分享的参数,不立即分享,用户点击默认分享按钮时才分享 isNeedCreate: 1 }); } } 需要回调的右上角分享 share: function () { var self = this; if (HybridMethod.isApp()) { //右上角分享 RainbowBridge.callMethod('JsInvokeAppScope', 'setShare', { 'needShare': 1 // 1: 需要分享按钮(默认); 2: 不需要分享按钮 }); HybridMethod.showAndSetRightShareBtn({ title: '“辞旧辞旧迎新送金喜 新榜提名赢好礼', content: '年终盛宴,延续惊2018鸿运当投,品牌金饰天天送,上榜更有豪礼拿,苹果手机 、投资金条、2018现金大红包,就等你来!', imgUrl: "https://pc104.ylb.net//event/2017/newyear/images/share.jpg", needShare: 1, shareUrl: "http://pc104.ylb.net/event/2017/newyear/index.html", callback: self.shareCallBack }); } }, // 分享回调 shareCallBack: function (res) { //在分享后点击返回永利宝会给res传值1,所以必须在分享后点击返回永利宝才成功 if (res == 1 && !this.isAct1End) { var zhis = this; $.ajax({ url: HybridParams.url + '/activity/ShareOpportunity', type: 'POST', headers: { 'Authorization': HybridParams.token }, dataType: 'json', success: function (res) {}, error: function (e) {}, complete: function () {} //ajax请求完成后执行 }); } } 页面中按钮分享 RainbowBridge.callMethod('JsInvokeAppScope','share',{ title: 'demo1页面中的分享按钮', content: 'demo1页面中的分享按钮', useDefault:0, stayWhich: 'wechat,qq', imgUrl:HybridParams.pc + '/event/2017/sharedemo/images/demo1.png', shareUrl:HybridParams.pc + '/event/2017/sharedemo/demo1.html?a=1&b=2\#asd', }); 微信分享 我们项目中用到的微信分享方法的调用; var weixin = require("../modules/weixin.jdk.js");//调用微信jdk weixin.config({ title: "标题", desc: "内容", imgUrl: 图片地址, link: 链接地址' },false); 积分商城 积分记录明细页面:https://h5.yonglibao.com/integral/integralRecord.html 登录状态通过url传参 参数名 描述 类型 token 用户登录token String dbnewopen 新窗口打开 Number App-H5相关 名称 链接 银行限额 https://h5.yonglibao.com/limit/limit.html 平台数据 https://h5.yonglibao.com/platformdata/dataindex.html 通过获取url参数定义相关页面跳转参数 比如:http://www.yonglibao.com/?towhichpage = produky var id = that.GetQueryString('towhichpage')||'', native = '', topage = '', id = '', number = '', title = '' if(id == 'produky'){//跳产品页 native = true; topage = productDetail; id = id; number = 2; }else if(id == 'baidu'){//跳百度页面 native = false; topage = 'http://www.baidu.com'; title = '百度一下'; }else if(id == 'recharge'){//跳充值页 native = true; topage = 'recharge'; } 安卓端 if (native == 'false') { window.location.href = 'yonglibao://JsInvokeAppScope:10025/forward?{"type":"web","topage":"'+ topage +'","UIHeader":{"title":"'+title+'"}}"'; }else{ if(str != ""){ window.location.href ='yonglibao://JsInvokeAppScope:10025/forward?{"type":"native","topage": "'+topage+'","params":{"'+id+'" : "'+number+'"}}'; }else{ window.location.href = 'yonglibao://JsInvokeAppScope:10025/forward?{"type":"native","topage":"'+ topage +'"}'; } } ios终端 if (native == 'false') { window.location.href = 'yonglibao://JsInvokeAppScope?port=10025&forward={"type":"web","topage":"'+ topage +'","UIHeader":{"title":"百度一下"}}"'; }else{ if(str != ""){ window.location.href ='yonglibao://JsInvokeAppScope?port=10025&forward={"type":"native","topage": "'+topage+'","params":{"'+id+'" : "'+number+'"}}'; }else{ window.location.href = 'yonglibao://JsInvokeAppScope?port=10025&forward={"type":"native","topage":"'+ topage +'"}'; } } 感悟:闲谈莫论他人非,每个人都有自己的思维,只有合不合适,没有对不对,不要把自己的观点强加给别人

优秀的个人博客,低调大师

Hadoop MapReduce工作详细流程(Partitioner/SortComparator/GroupingComparator)

转自:http://blog.sina.com.cn/s/blog_7581a4c30102veem.html map阶段 1. 使用job.setInputFormatClass(TextInputFormat)做为输入格式。注意输出应该符合自定义Map中定义的输出。 2. 进入Mapper的map()方法,生成一个List。 3. 在map阶段的最后,会先调用job.setPartitionerClass()对这个List进行分区,每个分区映射到一个reducer。 4. 每个分区内又调用job.setSortComparatorClass()设置的key比较函数类排序(如果没有通过job.setSortComparatorClass()设置key比较函数类,则使用key的实现的compareTo方法)。可以看到,这是一个二次排序。 5. 如果设置了Combiner(job.setCombinerClass)对output进行一次合并,从而减少对reduce的输出流量和预处理reduce的input数据。但不一定会执行,对于Combiner执行时机参考Reference[4]。 【说明】以上步骤省略了collect阶段、cache阶段等细节,更详细步骤参考Reference[3] reduce阶段 1. shuffle阶段 reducer开始fetch所有映射到这个reducer的map输出。 2.1 sort阶段 再次调用job.setSortComparatorClass()设置的key比较函数类对所有数据对排序(因为一个reducer接受多个mappers,需要重新排序)。 2.2 secondary sort阶段 然后开始构造一个key对应的value迭代器。这时就要用到分组,使用jobjob.setGroupingComparatorClass()设置的分组函数类。只要这个比较器比较的两个key相同,他们就属于同一个组,它们的value放在一个value迭代器,而这个迭代器的key使用属于同一个组的所有key的第一个key。 3.reduce阶段 最后就是进入Reducer的reduce()方法,reduce()方法的输入是所有的(key和它的value迭代器)。同样注意输入与输出的类型必须与自定义的Reducer中声明的一致。 【注意】reducers的输出是无序的。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册