最近一直很忙碌,感觉时间过的很快,来上海有二年多了,记得刚来那会一直感觉自己年纪还小,没有很多顾虑,想法也很简单,找一份工作,做自己喜欢的事,每天就会很开心,总得来说还是蛮幸运的,没有那么多辛酸史。人是有思想的,不同的阶段想法都会不一样,现在最大的感受就是有时候就会感觉时间与精力不够用,更多的顾虑,在外面上班,money是一部分,更多的归属感,现阶段是这样子的感觉。
坚持与保持热情是一件很难的事,说实话有时候我也会质疑现在去深入学习一些技术有没有用,因为心态有时候会太浮躁,为什么要谈这个呢,因为从去年开始我听到最多的就是这些问题,上个月领导问过我这个问题,未来5年有什么职业规划? 其实按照我的想法比较简单,money多一些减轻些物质上的压力,多陪陪亲人,能有时间做自己喜欢的事就够了。
说一说工作,第一份工作做.NET ,后面转了JAVA ,JAVA相对来说开源成熟的解决方案确实要多很多,如spring,orm,soa,android,大数据等等, 不会像MS那么狭小,不过现在MS也在进步。现在的公司呢,主要工作还是.NET ,平时的工作强度还好,去年在公司做了一个网站,现在基本就是新增功能与维护,另外就是APP的接口,还有就是各种支付 支付宝 微信 银联 支付等等,后面感觉很繁琐,就基与WEBAPI封装了一套全支付接口。平时的工作强度还能接受,就是多而杂。技术上平时了解自己感兴趣的知识,折腾linux,了解点新语言 nodejs, golang 等等。
工作
简单先说说项目都用了哪些技术吧。
一.ASP.NET MVC
网站使用ASP.NET MVC 开发效率相对还是蛮快的,比如有如下的特性
1.使用模型的声明式验证 ,简化了表单验证
2.Razor视图或单独使用RazorEngine
3.拦截器 我习惯这样称呼,因为之前springmvc一般这样称呼,比如做一个自动登录的验证[cookies],全局的日志记录等
4.路由也是蛮重要的一个东西,特别是对有洁癖的开发人员来说,比如你就是喜欢要每一个访问的URL都要简短并且有意义,或SEO实现类似/shanghai的URL等等(开始mvc4试了特性路由 http://attributerouting.net/),ASP.NET MVC 5.1 后已经支持,调试路由的工具 Install-Package routedebugger 等
5.返回匿名类JSON,局部视图,扩展htmlhelper等等,这个功能非常方便,可以自定义扩展自己的方法
6.缓存 使用MvcDonutCaching ,功能还比原生的多一些,基本一致,另外缓存服务Redis或Couchbase
7.js与css的合并压缩,Bundle 确实要方便很多,无需管理js的合并与样式版本号问题
8.日志 使用了NLog个人感觉要笔log4j好很多,错误与异常级别记录文本,window事件,db,email,基本满足需求,另外Elman也是蛮好用
9.XSS 使用了AntiXSS,ValidateAntiForgeryToken 另外就是写代码的时候多注意
10.页面性能,使用 MiniProfiler 检查调试页面性能,貌似有时候会与 routedebugger 的样式混乱
二. WEBAPI
APP的接口与一些常用的接口之前是使用WCF的Rest,后面感觉比较臃肿,就换成了WEBAPI, 个人非常喜欢这个,相比WCF比较轻量,好扩展,相比ASP.NET MVC我改进了一点东西
1.使用Autofac作为IOC容器
2.使用特性路由定义接口URL
3.使用markdown书写接口文档
5.全局拦截器对参数约束验证
6.自动生成/help参数文档 Install-Package Microsoft.AspNet.WebApi.HelpPage
7.支持跨越访问 Install-Package Microsoft.AspNet.WebApi.Cors
8.路由调试 WebApiRouteDebugger 执行过程跟踪 Install-Package Microsoft.AspNet.WebApi.Tracing Update-Package Microsoft.AspNet.WebApi.WebHost
9.另外推荐个HTTP类库Flurl.Http个人感觉要比.NET 4.5自带的HttpClient要好用,支持Task异步 ;扩展方法 Z.ExtensionMethods类库,包含大多数常用的扩展方法
例:
/// <summary> /// 测试业务异步回调接口是否正确 /// </summary> /// <param name="notifyUrl">业务服务地址</param> /// <returns></returns> [HttpPost] [Route("notify")] public async Task<IHttpActionResult> PostJsonAsync(string notifyUrl) { if (notifyUrl.IsNullOrEmpty() || !notifyUrl.Contains("http", StringComparison.OrdinalIgnoreCase)) return Ok(new { IsError = true, Msg = "NotifyUrl IS EMPTY", Data = string.Empty }); //notifyUrl = notifyUrl.UrlDecode(System.Text.Encoding.UTF8); var payPal = new PayPalData { UserID = "test", Subject = "测试异步回调接口", OutTradeNO = "10086", CreateTime = DateTime.Now, GuidNO = Guid.NewGuid().ToString(), TotalFee = "0.01", Origin = "WEB" }; try { var data = await notifyUrl.PostJsonAsync(payPal).ReceiveJson<WebAPIResponse>(); logger.Info("PayPalController JsonAsync : " + payPal.SerializeJson(System.Text.Encoding.UTF8)); if (data.IsError) { return Ok(new { IsError = true, Msg = data.Msg, Data = data.Data }); } return Ok(new { IsError = false, Msg = string.Empty, Data = payPal.SerializeJson(System.Text.Encoding.UTF8) }); } catch (Exception ex) { return Ok(new { IsError = true, Msg = "PostJsonAsync Exception : " + ex.Message, Data = payPal.SerializeJson(System.Text.Encoding.UTF8) }); } }
列:Filter
/// <summary> /// http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api /// http://www.asp.net/web-api/overview/error-handling/exception-handling /// </summary> public class ModelValidFilter : ActionFilterAttribute { /// <summary> /// 模型验证 /// </summary> /// <param name="actionContext"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public override Task OnActionExecutingAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken) { if (actionContext.ActionArguments.Values.FirstOrDefault().IsNull()) { var data = new { IsError = true, Msg = "参数不能为空!", Data = string.Empty }; actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, data); return base.OnActionExecutingAsync(actionContext, cancellationToken); } if (!actionContext.ModelState.IsValid) { // 注意 !!!!: http://tmenier.github.io/Flurl/fluent-http/ HttpStatusCode.BadRequest var data = new { IsError = true, Msg = actionContext.ModelState.Values.FirstOrDefault().Errors.FirstOrDefault().ErrorMessage, Data = actionContext.ModelState.Keys.FirstOrDefault() + " :参数验证有误!!!" }; actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, data); return base.OnActionExecutingAsync(actionContext, cancellationToken); } return base.OnActionExecutingAsync(actionContext, cancellationToken); } }
另外推荐一个开源的Markdown编辑器 https://pandao.github.io/editor.md/ ,可以集成到项目中,写写接口文档。
三.StackExchange Dapper
推荐StackExchange的两款开源项目 StackExchange.Redis (https://github.com/StackExchange/StackExchange.Redis) 与 Dapper
使用Dapper,操作数据库的代码相比更简洁 ,同时也支持.NET 4.5 Task异步 ,示例具体git下来看下单元测试 https://github.com/StackExchange/dapper-dot-net ,不过要主要Dapper下的一个与MSSQL执行计划的问题
Be careful with varchars in Dapper :http://www.codeproject.com/Articles/594133/BepluscarefulpluswithplusvarcharsplusinplusDapper
四. Quartz
使用了Quartznet,寄宿window服务,运行一直很稳定。如果想不想使用服务方式可以试试 Install-Package Hangfire 可以集成MVC或OWIN等。
活动
杭JS2014
去年参加了杭JS2014 ,基本就是分享一些关于nodejs相关的东西,不得不说阿里不仅仅是JAVA帝国还是前端江湖的缔造者。
杭JS - 2014 JavaScript中国开发者大会: 2014-6-21 ~ 22
https://cnodejs.org/topic/53473dde502e5602740078bc
2014 杭JS大会 会议盛况与技术热点现场报道(直播)
http://segmentfault.com/a/1190000000584556
杭JS 2014 演讲视频合集
https://cnodejs.org/topic/53bbc408a3ccaece73467f11
PyConChina 2014
PyCon2014 这个票是gitcafe送的,一些主题 linux的线程 协程 回调与上下文切换; py与机器学习很厉害的样子;golang 的nsq消息列队
shanghai-osc-meeting-2014
shanghai-osc-meeting the docker way;go的持续集成
OSC上海源创会
http://115.29.174.111/shanghai-osc-meeting/
搭建服务
后面我还搭建了基于一个nodejs博客:http://115.29.174.111/ 与基于golang的git服务:http://115.29.174.111:3000/
现在
码了这么多字,都是一些零碎的东西,感觉也没啥主题,就是记录一些经历过程,年初的时候弄了台Mac Pro ; 现在在捣鼓啥呢
angularjs nodejs
objective-c golang
乱乱的,就这样子吧,关机睡觉。