分类
Coding Experience

程序之路上的一些感悟

好久没有写东西了,转眼工作近7年了,趁着有激情,写一写这些年的工作感悟吧。

中心思想,还是围绕着如何走好程序之路,如何积累,如何提高,总结总结,少走弯路,站在前人的肩膀上,越走越远。

一项工作做的越久,就越能感受到工作的平凡。这话是什么意思呢,就是说,刚开始工作靠的是激情、速度,但越到后面,靠的越是方向、耐力。还在坚持的、剩下的人越来越少了。很多人上了年纪就转行了,剩下的人中,一部分也会因为成家了,有小孩了,很多心思和重心会放在孩子身上,追求工作和生活的平衡。所以也是“剩”者为王。就算是工作进取心较强的人,也会由于没有同龄的对手,只剩下自己和自己较劲了,所以,从主客观因素来看,工作是寂寞的,是平凡。

工作的越久,会发现技能、技巧的成分越少。刚毕业时,总能感受到某项新技术的震撼,特别牛。但久了会发现,真正牛逼的是深度,而不是某项技术。技术日新月异,XML之后又有JSON,Java之后又有grovvy, go, nodejs, swift,VMware之后又有docker。HTML5, Java8, Java9,等等。总之,新技术从来没停止过出现。如果只着眼于学习一种牛逼的技术,那么很可能会失望,等技术过气之后发现很无奈。相反,技术深度却永远不会过气,比如高并发架构,高可用,灾备,性能调优,等等,是每个技术都离开的话题。不同技术的差别,只不过不同场景的差别,简单来说就是适合干的事情不同,有牺牲性能提高可扩展性的,有牺牲性能提高开发速度的,但也有只注重性能的场景,根据业务需要,选择不同的技术,有条件可以做搭配,发挥各种技术的长处,扬长避短。

什么都会,其实就是什么也不会,精力被分摊了,或者说,如果你真有一样拿手的,你很难做到,也没必要做到什么都会。在差一个数量级的人的眼里才可能觉得有些人什么都会,其实不是的,人总要从自己身边的事情,工作需要,缘分,先接触到技术做起,而且先要有一门看家本领,所以掌握程度总会有较大差异。

其实就算是开发,也会有分化。有项目做的多的,客户需求,行业知识掌握的多的专家。有专攻通用技术框架,对时间复杂度、算法敏感的技术大牛。个人感觉,程序写多了,其实就是思维习惯的改变,越来越懂如何用程序将现实表达起来,也就是常说的业务建模。不管是行业专家,还是技术大牛,其实也有很多共性,就是持续学习。搞开发就像搞建筑,偏实践,动手能力。所以所谓的牛逼的技术,也许核心就是科研人员的一篇论文,懂实践的人用程序实现了。将精力花在自己擅长的环节,是一种聪明。

设计比编程重要,方向比设计重要,一切目的都是积累。如果谁能用技术将人类的智慧管理起来,每个人都干不同的事,最后大家又能无冲突的汇集起来,那人类就无敌了。其实编程没有难事,一切觉的难都是因为没有想明白,等想明白了也就不急着去做了,反而觉得浪费时间,想明白就是设计。然而技术之路能走多远,兴趣、身体健康状况、寿命长短、心态、正义等等都起决定作用,资源调配的合理才能走的远,有时有必要可以牺牲速度,这就是方向。最后看毕生成就的高度,或者技术的伟大程度就是看积累的总量,所以,哪怕一点点进步,但是坚实的,方向是向前的,都应该为自己庆贺!

洋洋洒洒,又写了这么多。也是最近1、2年来的所见、所思、所想。既然想走的远,总要迈出第一步。希望我的文字,能帮助到别人,值了。

分类
Coding Experience

我是如何坚持地走着技术道路的

PS:经过一段时间的蛰伏,动荡,迎来了短期的心态的平静。趁热打铁,离梦想更进一步。

随想:写代码如同写诗,他是思想的结晶,寄托着你想表达的情感。

我想说,喜爱很容易,坚持不容易。你可能因为兴趣,喜欢上某一件事,你想去做它。但世上少有不需要坚持就能做好的事情,总会有瓶颈,让你感到付出和回报不成比例。或者你尽力了,但效果不理想,很多时候,这种时候的这种想法,会成为我们放弃坚持的理由。

辩证的去思考,容易做的事情,大家都容易,喜悦感来的快,但也走得快。难的东西,大家都难,喜悦感来的慢,来的艰难,来的痛苦,但到来的时候,喜悦更强烈,更喜悦。想想高考,当年是如何挑灯夜战的,是如何坚持每天凌晨2点睡觉的,考完试是如何不悔的,拿到大学通知书是如何喜悦。你可能不够聪明,但更可能不够努力。压抑的越久,快乐到来时来的越强烈。

技术道路或多或少有相似的地方,走的人很多,坚持的人很少。我是如何坚持的?答案很简单,爱好。答案很虚伪,有人说了,好羡慕有人有这种爱好。这种爱好,不是天然的,是一种思辨,一种选择。眼观放长远,收入预期放低些,保持爱好的精神饱满体力放松,就像散步一样,想要走的远,千万不能跑,要健康的走。切记,不要急于求成。保持住这种状态,便会有源源不断的兴趣,源源不断的动力,一直坚持下去。

其实在选择之前,会问为什么,为什么走技术道路。技术是我进入社会的切入点,技术工作充满神秘,有一种敬畏。三观很正,具有常说的一些优点,比如工匠精神,钻研精神,和气,温柔。这样的人,建设出来的祖国,世界,也会充满温柔,关怀,充满爱。

我是本科毕业已经做了6年的技术,对事情初具自己的想法,看法。也具有一定独当一面的实力。其实,技术的职业道路可以说见仁见智,衡量的尺度很多种,不必追求唯一。始终有所收获即可,保持学习,保持成长,是最重要的。被面试过,也面试过别人,被鄙视过,也被抬举过,拒绝过别人。这些都没什么,最重要的是你自己对自己的看法。

其实一路走过来,也并不平坦。第一份工作在国内软件公司100强,写过C++,写过Java,也写过Flex,很杂,可以说公司需要你用什么,就学什么。好在日子过的扎实,项目经验极其丰富,短短4年做的项目、产品不下10个。调侃自己是:没待过互联网,但有些项目加班却加出了互联网的感觉,呵呵。1星期保持通宵状态,为了项目上线,我都挑了一根大梁,成功了。那次经历对我鼓励很大,启发也很大。当时很累,后来成为了宝贵的财富,值了!第二份工作也是现在,在一家刚进世界500强的外企。一切高大上了起来。因为前一段工作积累很扎实,所以第二份工作上手很快,适应很快。挑战都和技术无关了,反而是一些语言、工作方式上面的。研究的技术也前沿了许多,获取新知识的手段和渠道也宽了很多狠毒。夸张点说简直是做梦都会笑,呵呵。工作职能的安排上,也专注了很多,专业了很多,基本上只需要研究专属领域的技术了,不会再有像之前那样大的跨度了。目前一直专注在Java、云方面的技术了。

回头看来,只有坚持着,才会不断收割之前老天欠你的财富,只有眼光放长远,你才能走的更远。像我的经历的坎坷体现在,毕业错过了某大公司,刚毕业做的东西太杂哪一样都时间不够去学好,好不容易精通了Flex,Flex却死了。曾几何时也一度羡慕过混着互联网的同学,感觉身上个个带着光环。保持学习,不放弃,你会了,这事就成了。后来,又精通回去了Java。其实回顾以往工作中,有80%以上知识或技能是自学的,知识还好,其实最重要的是,养成了快速学习的习惯。后来发现,学的快其实才是我的核心竞争力。

当有了一定基础之后,回过头来,再看世界,再看问题,眼光和着重点又不同了。我不再用某一种语言,或者技术去思考,比如Java,之前有一个阶段,我会认为掌握某一种框架是能力,框架能做的事情,我再去做。但今日又有不同,更多是对问题的一种抽象,定义。也是所谓的建模。宏观上,实体定义好,关系定义好,微观上,流程定义好,策略定义好,最后统一考量安全性,高可用性,维护下,扩展性等方面。因为Java是一种最方便实现的语言,它有完善的作用域类型,足以抽象表达出各种业务场景。配合框架实现狠多基础架构的工作,你只需要定义好架构,接口,只需要实现业务逻辑就好。基础框架越完备,业务逻辑就可以越纯粹。

技术一直在发展,推陈出新,比如,时至今日,又热起来的微服务,使用Docker+Spring Boot去实现Java语言的系统重构,相应基础架构管理的Zookeeper+Kafka等技术。所以,仍然要跟上脚步,保持学习。

如果说重复是程序员的魔咒,那么只有不断学习,不断进步,才能始终保持做不同的事,以传帮带的精神,也不断有新人接过你用已掌握的旧的知识做的重复的事情,对于新人也是新的知识,也是新的挑战,这样就是一个健康的生态环境。

最后,再回归主题,说我是如何坚持地走着技术道路的。我想,就是用一种愉快的开放的心态吧,想着要人别人快乐,这样别人最后也会让你快乐。对未知的世界保持好奇,新鲜。保持学习,保持进步。以这样的一种方式去“爱好”。就像写这篇blog的出发点一样,把一种正能量的心态,成果,经验知识分享给更多人。

分类
Coding Experience

小谈关于WADL,ALPS和OData

标题中列举了3个,都实现了RESTFul接口描述的技术,觉得很有趣,想放在一起比较一下。

WADL,是我遇到的第一个,能把REST接口,描述清楚的语法。它是在学习Jersey时,遇到的一个技术,已经是在成为JavaEE标准的roadmap中了。可以参见:https://wadl.java.net。它是基于XML格式,类似WSDL的概念,模仿过来的。

OData,是遇到的第二个,是在工作中遇到的,一片新的天地,绝对强大的新天地。它是基于JSON格式的描述语言,叫做metadata。它不仅规定了DataType,而且还规定了operation类型,更加严格,也更加规范。当然,也缺乏灵活性。

ALPS,是今天才看到的,Spring Data Rest的内容,http://docs.spring.io/spring-data/rest/docs/current/reference/html/#metadata,也有规范作为依靠,https://tools.ietf.org/html/rfc6906。刚刚接触,不太了解,大概浏览了一下,也是基于JSON格式的描述语法。

WADL更像是WSDL的REST版本,是一种补充。OData更像是一种规范的ATOM的Web Resource,有点像Web层的DAO。ALPS更像一种API,类似与REST的Java Doc。

总的来说,语义的自我表述,是一种趋势。引申一步讲,规范,描述比技术,功能或实现,更加重要。我们更希望一个一目了然,一下子知道干什么的工具。其实,也解决了一个程序员的大问题,就是功能和描述不一致。总之,这总,利用技术手段,增强的一致性,才是大势所趋吧。呵呵。

分类
SAPUI5

SAPUI5中关于Route的配置介绍

        SAPUI5要实现页面的跳转,则需要借助Route实现。之所以想要写关于Route的配置的文章,是因为该组件的配置项比较抽象难懂。在我第一次接触的时候,就有很多疑惑,API简绍的也不够详细,后来随着学习的深入,发现SAPUI5有一个极佳的例子,专门讲述Route的用法,SAPUI5 SDK 里面Demo Kit里面有Dev Guide,其中Tutorial章节有个navigate的练习,专门讲述的Route相关的内容。

        Route主要有以下几个配置项,3个方面:

        第一个是Route类的配置。刚开始不理解的是,既然SAPUI5提供了标准的Route组件,为什么还要显示配置Route的classpath?因为标准的Route功能可能不全面,需要自己扩展,封装常用的Getter Setter方法,经常见到封装一个成MyRoute来使用的用法。

        第二个是routes的配置。routes是一个JSON数组类型配置项,里面的Item包含三个属性,pattern,name,和target,这里就有点要强调说明的了,这里的pattern属性,其实可以理解为显示在浏览器地址栏的URL,主要是为了实现在地址栏的可见,以及通过浏览器地址栏就可唯一定义到一个View。name是routes item的名字,主要是用于Route的调用navTo接口是,唯一标识一个route item,可以理解为route item的ID。容易混淆的是,有些人可能会问,Path属性和Name会不会有点重复,一般URL也能唯一标识一个View,其实的确,简单的规则的情况下,可以直接用pattern来作为ID,但有了name,pattern URL中就可以包含动态内容,参数化,这是主要目的。第三个属性是target,target即代表一个View(也可以是多个,多个情况一般是一个fregment作用view,比如top和content),确切的讲,是target的Item,target Item里面会定义View的classpath。

        第三个是targets配置。targets是JSON Object,key是target的ID,value是一个target item,其中包含,viewName,即view的classpath。  

       此外,还有些更高级的配置项没有讲到,比如target的viewLevel,transition,viewPath,controllerId,controllerAggression,留作以后再说。

分类
SAPUI5

解决HCP中Fiori Application工程odata service数据不加载问题

        最近在集中研究HANA Cloud Platform,简称(HCP),在使用HCP的SAP WebIDE开发SAPUI5 HTML5应用程序时,遇到过两次odata service数据不加载的问题。简言之就是odata service配置了,但是运行程序的时候现实没有数据。

        问题的答案很简单,前提是要对WebIDE中SAPUI5工程的配置文件有一定的了解,由于HCP本身就是比较新的东西,大部分人都没有接触过,还处于探索阶段,我作为先行者,在此把我的成果分享给大家。

对于SAPUI5开发者来说,SAPUI5的工程可能都比较熟悉,一般需要一个sap-ui-core.js,以及一个web环境就够了,但是WebIDE集成了一些便利开发的工具,比如,预览功能,使用mock data调试的功能,自动部署,或者自动打包的功能,也正是为了实现这些功能,WebIDE上面的SAPUI5工程也多了些额外的配置文件。

        主要有这几个:neo-app.json,.user.project.json,.project.json。

        neo-app.json里面定义了该工程会访问哪些destination,即前端程序要消费的odata service,以及index.html的位置。注意:该文件也是会导致odata service数据不加载的问题之一。表现为明明在app descriptor配置了,destination也在cockpit里面配置了,运行时报404。在cockpit的html5应用里面可以看到,destination的地方时缺失的。

        .user.project.json,该文件内容比较直白,类似ecplise里面的run configuration,定义了run功能如何去执行,用哪个index.html作为入口。

        .project.json,这个配置文件内容就比较多了,会包含工程相关的配置信息,包括参数,比如工程类型,版本,语言,mock data信息,如果是开发mobile手机程序,则还包括mobile service server地址等信息,使用了cordova那些硬件接口等信息。

        所以,第一点,neo-app.json中,要有destination的配置。

        其次,第二点,application descriptor里面(即manifest.json文件)要写对odata service model的url,是从/destinations/xxx_destnation/xxx_service_url.svc的/destinations根开始写起的,还要有destination的名字xxx_destination,最后才是odata service具体的url。

        然后就大功告成了。只要是通过ComponentContainer方式加载的SAPUI5应用,只要配置在app descriptor里面的model,就会自动的调用this.setModel(xxxModel, "xxxModelNameSpace"),不用再手动加载了,只需要再界面上进行绑定即可。

效果如下图所示:

Screen Shot 2015-11-20 at 2.58.13 AM.png

        最后,再值得一提的是和mock data的区别,mock data的方式是不需要连接后台的,只需要有service 的$metadata即可,即service的描述元数据,mock server 会根据描述数据自动生成假数据,一般的规则是属性名称+数字,比如,假如属性名是name,第一个item就是name1,第二个就是name2,依次类推,直到第N个就是nameN。反之,如果看到界面上的数据是1、2、3排列的,那就说明一定是用mock data方式在运行。

效果如下图所示:

Screen Shot 2015-11-20 at 2.58.17 AM.png

分类
Coding Experience

今天学了点SAP EP系统Web Dynpro工程的迁移

        这两天在本地出差,一个客户系统升级代码迁移过程出了点问题,请了位我司的专家来指导,我跟着来学习。避免遗忘,仅此记录一下。

        迁移是有指导手册的,说的也比较详细了,但现实情况往往更复杂,一般人照着弄,很容易出错。怎么说呢,虽然感觉我不会出那些个错,但毕竟我不是当局者(迷),而是旁观者(清)。归类错误,可分为以下几类:

  1. 没有一个好的例子做参照,不能做对比试验。对于一个陌生的且庞杂的系统,通常应该先基于一个运行良好的基础版本进行改动,而且改动幅度不能太大,一点点的改,遇到错误了,一点点回退,试也能试出来,改了哪导致不行的。该客户的情况是。。。代码管理出了问题,升级前的代码就不work,更何况升级后呢。

  2. 别一下子猜2步。发现客户的开发特别逗,喜欢猜,并且基于自己猜测的结果为前提,又开始第二步猜测,然而第二步猜测往往诡异而奇怪,比如,我看到错误提示日志里面我的模块名的前缀和我定义的不一样,我看到工程属性这个地方有显示,和日志里面的一样,感觉是改这里,但是!这里为什么编辑不了呢?好奇怪。。。我也觉得好奇怪,怎么能往这个方向猜呢。。。最后问题解决了,真正原因是有些更基础的基础包没有迁移。。。

  3. 没有理清原理就开始干,干一点,算一点。怎么说呢,就算我没用过SAP的产品,我用过Java,至少知道jar包之间是有依赖关系的,最底层的包要先部署,要先搞对。否则先搞上层的没有意义。Java里面有maven或gradle,专门解决这个问题。

        下面说说技术相关的经验:

  1. 越是奇怪的问题,导因往往越简单,简单到甚至是可能某个文件没有访问权限。。。

  2. 有顺序,或者依赖关系的事情,千万要按照步骤来,否则出了错都没意义,比如迁移过程,有些东西就要先做,有些后做,别存在侥幸心理,认为只是换了个顺序。

  3. 站在程序的角度想想,就好比让你做这个迁移工具,每一步需要知道什么信息,你是否提供了?否则不可能无中生有,巧妇难为无米之炊。

        综上,其实迁移这个过程可以这么理解,由于JDK版本升级了,以及部分产品接口模块重构了,所以导致旧的代码直接用不了,所以需要迁移,并且有些改动,已经不是工具能自动化完成了。然而Web Dynpro不仅仅是源码,而且还有生成的代码,所以要这么干:

        先把生成的代码清理掉,然后导入到新的工作空间,IDE会自动识别出旧版本的工程,并且提供了迁移按钮,有初始化向导,自动完成迁移,主要是工程配置文件的变更,先搬进新的工程,然后在新的工程下,代码会有错误,首先就是该JDK版本,其次按照指导手册里面的对应关系表,把新旧类改成新类名,等没错了,然后再编译生成新的代码,最后再部署到新系统。完成。

        我喜欢程序的思维,因为程序的思维缜密,有逻辑,而且不会偷懒,不会骗人,让人觉得放心,踏实。

分类
Technology

[转]st3实用插件集合

实在找不到比篇写的更好的文章了(还有动画效果图,感动)

原文链接:实用的sublime插件集合 – sublime推荐必备插件

不得不说,sublime是个神器,不得不说它所支持的扩展和插件,下面在介绍的同时将会奉上生动的动画配图。

前言

在阅读此文章之前,建议先阅读这篇:sublime text 2 神器

插件介绍

Package Control

功能:安装包管理

简介:sublime插件控制台,提供添加、删除、禁用、查找插件等功能

使用:https://sublime.wbond.net/installation

安装方法:

  1. CTRL+` ,出现控制台

  2. 粘贴以下代码至控制台

ST2:

1

import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')

ST3:

1

import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

其他方法:

如果以上方法不能安装,请使用下面的方法

  1. 选择菜单:Preferences > Browse Packages

  2. 打开sublime插件安装包文件夹

  3. 下载文件并复制到打开的文件夹

  4. 重启sublime

 

 

Emmet

功能:编码快捷键,前端必备

简介:Emmet作为zen coding的升级版,对于前端来说,可是必备插件,如果你对它还不太熟悉,可以在其官网(http://docs.emmet.io/)上看下具体的演示视频。

使用:教程-http://docs.emmet.io/cheat-sheet/http://peters-playground.com/Emmet-Css-Snippets-for-Sublime-Text-2/

emmet

 

 

JSFormat

功能:Javascript的代码格式化插件

简介:很多网站的JS代码都进行了压缩,一行式的甚至混淆压缩,这让我们看起来很吃力。而这个插件能帮我们把原始代码进行格式的整理,包括换行和缩进等等,是代码一目了然,更快读懂~

使用:在已压缩的JS文件中,右键选择jsFormat或者使用默认快捷键(Ctrl+Alt+F)

jsFormat

 

 

LESS

功能:LESS高亮插件

简介:用LESS的同学都知道,sublime没有支持less的语法高亮,所以这个插件可以帮上我们

使用:打开.less文件或者设置为less格式

less

 

 

Less2CSS

功能:编译Less

简介:监测到文件改动时,编译保存为.css文件

使用:打开.less文件,编写代码保存即可看到同时生成.css的文件,如果没有则需要安装node。不推荐用这种方法编译,要么用koala,要么就用grunt编译。

 

 

Alignment

功能:”=”号对齐

简介:变量定义太多,长短不一,可一键对齐

使用:默认快捷键Ctrl+Alt+A和QQ截屏冲突,可设置其他快捷键如:Ctrl+Shift+Alt+A;先选择要对齐的文本

align

 

 

sublime-autoprefixer

功能:CSS添加私有前缀

简介:CSS还未标准化,所以要给各大浏览器一个前缀以解决兼容问题

使用:Ctrl+Shift+P,选择autoprefixer即可。需要安装node.js。

其他设置如快捷键请参考:https://sublime.wbond.net/packages/Autoprefixer

prefixer

 

 

Clipboard History

功能:粘贴板历史记录

简介:方便使用复制/剪切的内容

使用:

  • Ctrl+alt+v:显示历史记录

  • Ctrl+alt+d:清空历史记录

  • Ctrl+shift+v:粘贴上一条记录(最旧)

  • Ctrl+shift+alt+v:粘贴下一条记录(最新)

keyboard

 

 

Bracket Highlighter

功能:代码匹配

简介:可匹配[], (), {}, “”, ”, <tag></tag>,高亮标记,便于查看起始和结束标记

使用:点击对应代码即可

highlight

 

 

Git

功能:git管理

简介:插件基本上实现了git的所有功能

使用:https://github.com/kemayo/sublime-text-git/wiki

git

 

 

jQuery

功能:jQ函数提示

简介:快捷输入jQ函数,是偷懒的好方法

jquery

 

 

DocBlockr

功能:生成优美注释

简介:标准的注释,包括函数名、参数、返回值等,并以多行显示,手动写比较麻烦

使用:输入/*、/**然后回车,还有很多用法,请参照

https://sublime.wbond.net/packages/DocBlockr

basic

 

function-template

 

 

ColorPicker

功能:调色板

简介:需要输入颜色时,可直接选取颜色

使用:快捷键Windows: ctrl+shift+c

i5KI6SBAfs7Qk

iY1DDCRG5TsyR

 

 

ConvertToUTF8

功能:文件转码成utf-8

简介:通过本插件,您可以编辑并保存目前编码不被 Sublime Text 支持的文件,特别是中日韩用户使用的 GB2312,GBK,BIG5,EUC-KR,EUC-JP ,ANSI等。ConvertToUTF8 同时支持 Sublime Text 2 和 3。

使用:安装插件后自动转换为utf-8格式

uy67y

 

 

AutoFileName

功能:快捷输入文件名

简介:自动完成文件名的输入,如图片选取

使用:输入”/”即可看到相对于本项目文件夹的其他文件

autofilename

 

 

Nodejs

功能:node代码提示

教程:https://sublime.wbond.net/packages/Nodejs

ZCFcC

 

 

IMESupport

功能:sublime中文输入法

简介:还在纠结 Sublime Text 中文输入法不能跟随光标吗?试试「IMESupport 」这个插件吧!目前只支持 Windows,在搜索等界面不能很好的跟随光标。

使用:Ctrl + Shift + P →输入pci →输入IMESupport →回车

c1608aa0gw1e9dmrd3vxpg209y08d75x

 

Trailing spaces

功能:检测并一键去除代码中多余的空格

简介:还在纠结代码中有多余的空格而显得代码不规范?或是有处女座情节?次插件帮你实现发现多余空格、一键删除空格、保存时自动删除多余空格,让你的代码规范清爽起来

使用:安装插件并重启,即可自动提示多余空格。一键删除多余空格:CTRL+SHITF+T(需配置),更多配置请点击标题。快捷键配置:在Preferences / Key Bindings – User加上代码(数组内)

1

{ "keys": ["ctrl+shift+t"], "command": "delete_trailing_spaces" }

 

spac

 

FileDiffs

功能:强大的比较代码不同工具

简介:比较当前文件与选中的代码、剪切板中代码、另一文件、未保存文件之间的差别。可配置为显示差别在外部比较工具,精确到行。

使用:右键标签页,出现FileDiffs Menu或者Diff with Tab…选择对应文件比较即可

diff

 

GBK Encoding Support

功能:中文识别

简介:Sublime Text 2可识别UTF-8格式的中文,不识别GBK和ANSI,因此打开很多含中文的文档都会出现乱码。可以通过安装插件GBK Support,来识别GBK和ANSI。

使用

  • Open a GBK File

  • Save file with GBK encoding

  • Change file encoding from utf8 to GBK or GBK to utf8

zxdcsaf

safsaf

 

GitGutter

简介:指示代码中插入、修改、删除的地方

cb42e7cddad0c04794b783742ee8f2085e95295a

 

版权归 轩枫阁 所有

本文标题:实用的sublime插件集合 – sublime推荐必备插件
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

分类
Coding Experience

程序员排错的第六感|老鸟谈经验

    作为一个4年工作经验的程序员,记录与分享下自己的排错经验。

    场景1:

    经常,我们会被派去研究一个新的问题,也许是刚入职不久,师傅让你自己先研究,也许是工作了一段时间,由于工作需要,要研究新的东西。我们常常觉得心里很没有底,感觉好像到处是吭,随便一个小怪就会把自己搞残血,不一会儿,就放弃了。。。

    尤其是刚入职的人来说,貌似被分配了一个很简单的任务,貌似自己研究要花费很久的时间,貌似导师很轻松就能搞定。。。越想自己越弱小,好像一直要给导师暗示出,看,导师你应该给花时间耐心的教我,不要让我自己搞,我搞不定,不然将要花很久。

    大部分时候,导师不会一板一眼的教自己,一副很拽的样子,只告诉你原理,原理往往是那种高大上,也听不懂的,往往不明觉厉东西。然后心里略带委屈的继续默默研究。

    我想说,我经历过新人,也经历过导师,我当新人的时候,是那种拽拽的新人,当导师时是那种弱弱的导师。下面分享我的经验。

    我作为新人,如何做到拽?拽不代表不负责任,不尊重导师,不代表很嚣张的样子,不听话的样子,恰恰相反,对待导师,一定要珍惜和他交流的机会,不轻易交流,一旦交流必有准备,必有自己的见解,必须对自己有提高,不要把导师的问题浪费在小怪身上,以至于大怪到没技能了或CD中。

    首先要听导师分配的任务,要相信,在入门阶段,你不会发现JVM的Bug,不会发现C++编译器的Bug,不会发现操作系统的Bug,唯一的Bug绝对来自你自己的代码,现象越奇怪的问题原因往往越简单,不要认为分号、大小写、申请了释放不释放,等等代码规则是很随意的。如果一个应该很简单的问题Try了半天没试出来,你就要分析下前进的方向了,是不是用错东西了?是不是没有访问权限?(新人的访问权限最低,最容易被坑)

    巧用百度验证,如果你遇到的问题,百度上很少,别人很少遇到,90%就说明你的用法不对,工具用错地方了。等你写多代码了会发现,自己的浅显,越来越不会怀疑环境,怀疑像JDK这种东西。当然,话无绝对,1000分之1的概率你给JDK提了一个Bug,在刚出道的时候成为标准的贡献者,高手在民间!(本人在第三年的时候才去研究开源框架代码的Bug,也是出于项目中出现了性能问题,不得不)

    时间就是财富,导师给你时间去研究,好好利用这个时间培养学习能力,天塌了有导师顶着呢,怕啥!一般公司不会让啥都不会的人上客户那里的,作死行为。。。

    写程序,解决问题前,先不要急着下手,先把思路,解题步骤写下来,用笔和纸就行了,一般写程序就像做生物的对比实验,好多东西都是试出来的,然后才理解的。总结出来的。(得承认,我不是那种思维特敏捷的,给我个再简单的问题,我都要花费分析的过程,但历史证明,我是效率最高的)

    和导师,闻道有先后,术业有专攻,长于己的地方就是好老师,不必尽信师。无私的教自己,要感恩。

    场景2

    比如电脑坏了,或者太慢了,很影响你工作效率,你想好好写代码,piu piu的写,电脑半分钟卡2个字出来,光标一直在转圈圈。。。你决定修电脑!拆开电脑看看,是不是灰多了?线坏了?这是发现自己没有螺丝刀!你准备去买螺丝刀,发现住的地方太高大上了附件没有卖的!只得在京东上买,真要买的时候发现京东账号和密码忘记了!你不记得记在那个邮箱了,要用电脑在邮箱里面搜。。。祸不单行,就这么纠结。比如再遇见买回来螺丝刀发现不够用,还有5角型的,还要再买。。。等等,最后发现灰清了,线插紧了还是慢。。。不得不送修。。。再比如小店还修不好,还要去苹果天才吧修。。。还要预约?怎么样,有点感觉了吧,初衷只是想好好写代码而已,却不得已绕这么大一圈。

    给程序排错的时候也是这样的,在领域经验较少,周围没有人可问的情况下,如何解决问题呢?

    解决这种问题要首先需要的是耐心,其次有这些建议:

    1. 条件允许,2个人一起找错,一个人改,一个人看,我c*o,效率超高,尤其在有个爱喷你的队友陪伴的情况下,更是如此。2个人不是用来扯淡的,因为这种问题最重要的是把我主线,不能扯的太远,要随时可以收敛,1个人研究,既想分支研究的专注,又想随时收敛,简直了,我个人认为是矛盾的,起码这种状态我坚持不了很久。想起了一些务虚的话,往往一些务虚的领导爱说,类似既要xx又要xx,N手抓,N手都要硬(N>3,声明:N=2的时候很合理)。什么好的都要做到,要求员工什么都要会,什么都要精,简直能量不守恒。

    2. 大多数情况,条件不用允许。。。那就多费点时间,做好记录工作,慢慢细心的试,同样,做对比实验,逐一排除问题。要有足够的耐心,搭建单元测试环境。往往搭建环境的时间,要远大于试一次的时间。这么做的目的是为了更快的重复问题。以及真正的理解问题。从根上解决。至于实验怎么设计,这个就不用说了,排除法么。如果B这句话有了,没问题,没有就有问题,说明B是少不了的。

    3. 结果导向解决问题。这点最难做到,因为度不好衡量。我见过不少这样的程序员,想法是好的,但是效率很慢。为何,他习惯弄懂了80%再下手,我觉得研究无人涉及的领域还好,说的过去,如果是有别人会的时候,就没必要了,Java核心卷1、2那么厚呢,深入了解MFC那么厚呢,不可能等你把书看完一遍再来写Java,再来写C++,纯理论的学习人会忘记。找到正确可执行的代码,先认为他是对的,先解决主要矛盾,如算法问题,流程逻辑问题,把边边角角的先忽略,比如工具的使用,配置项的配置,能编、能跑、能打印日志就Ok。界面什么的都不美观都先放放,把接口先定好。

    回归主题,扯得有点远,说说第六感。第六感就是遇到那种很基础,而且很少人遇到的问题时,你会发现8成是自己方向错了,或者某个工具用错了,至少这应该是件很简单的事。尽管前路都没走过,全是新的,但是你仿佛知道该如何选择,或者如何判断自己走错了,耐心与时间,你将走出荆棘,前路一片辉煌。

分类
PHP

实现了用百度ueditor替换wordpress默认编辑器tinymce

之后效果如下:

wp-editor-use-ueditor.png

之前效果如下:

wp-editor-use-tinymce.png

步骤概述:

  1. 界面matter。找到调用原有editor的代码位置。edit-form-advanced.php,将旧的editor替换为新的。经过上一步,界面效果即可完成。下来是处理逻辑层面。

  2. 输入matter。模仿原有editor的html div命名、嵌套层次使用新的editor,当有两层命名一致时,wordpress已能够捕捉输入。

  3. 输出matter。找到输出变了post->content让其通过ueditor的输入api获取到文章内容。

——详细步骤明日再说——

分类
Technology

[转]vim 常用快捷键整理

Basics

:e filename Open filename for edition
:w Save file
:q Exit Vim
:q! Quit without saving
😡  Write file (if changes has been made) and exit
:sav filename Saves file as filename
. Repeats the last change made in normal mode
5. Repeats 5 times the last change made in normal mode

Moving in the file

k or Up Arrow move the cursor up one line
j or Down Arrow move the cursor down one line
e move the cursor to the end of the word
b move the cursor to the begining of the word
0 move the cursor to the begining of the line
G move the cursor to the end of the file
gg move the cursor to the begining of the file
L move the cursor to the bottom of the screen
:59 move cursor to line 59. Replace 59 by the desired line number.
20| move cursor to column 20.
% Move cursor to matching parenthesis
[[ Jump to function start
[{ Jump to block start

Cut, copy & paste

y Copy the selected text to clipboard
p Paste clipboard contents
dd Cut current line
yy Copy current line
y$ Copy to end of line
D Cut to end of line

Search

/word Search word from top to bottom
?word Search word from bottom to top
* Search the word under cursor
/\cstring Search STRING or string, case insensitive
/jo[ha]n Search john or joan
/\< the Search the, theatre or then
/the\> Search the or breathe
/\< the\> Search the
/\< ¦.\> Search all words of 4 letters
/\/ Search fred but not alfred or frederick
/fred\|joe Search fred or joe
/\<\d\d\d\d\> Search exactly 4 digits
/^\n\{3} Find 3 empty lines
:bufdo /searchstr/ Search in all open files
bufdo %s/something/somethingelse/g Search something in all the open buffers and replace it withsomethingelse

Replace

:%s/old/new/g Replace all occurences of old by new in file
:%s/onward/forward/gi Replace onward by forward, case unsensitive
:%s/old/new/gc Replace all occurences with confirmation
:2,35s/old/new/g Replace all occurences between lines 2 and 35
:5,$s/old/new/g Replace all occurences from line 5 to EOF
:%s/^/hello/g Replace the begining of each line by hello
:%s/$/Harry/g Replace the end of each line by Harry
:%s/onward/forward/gi Replace onward by forward, case unsensitive
:%s/ *$//g Delete all white spaces
:g/string/d Delete all lines containing string
:v/string/d Delete all lines containing which didn’t contain string
:s/Bill/Steve/ Replace the first occurence of Bill by Steve in current line
:s/Bill/Steve/g Replace Bill by Steve in current line
:%s/Bill/Steve/g Replace Bill by Steve in all the file
:%s/^M//g Delete DOS carriage returns (^M)
:%s/\r/\r/g Transform DOS carriage returns in returns
:%s#<[^>]\+>##g Delete HTML tags but keeps text
:%s/^\(.*\)\n\1$/\1/ Delete lines which appears twice
Ctrl+a Increment number under the cursor
Ctrl+x Decrement number under cursor
ggVGg? Change text to Rot13

Case

Vu Lowercase line
VU Uppercase line
g~~ Invert case
vEU Switch word to uppercase
vE~ Modify word case
ggguG Set all text to lowercase
gggUG Set all text to uppercase
:set ignorecase Ignore case in searches
:set smartcase Ignore case in searches excepted if an uppercase letter is used
:%s/\<./\u&/g Sets first letter of each word to uppercase
:%s/\<./\l&/g Sets first letter of each word to lowercase
:%s/.*/\u& Sets first letter of each line to uppercase
:%s/.*/\l& Sets first letter of each line to lowercase

Read/Write files

:1,10 w outfile Saves lines 1 to 10 in outfile
:1,10 w >> outfile Appends lines 1 to 10 to outfile
:r infile Insert the content of infile
:23r infile Insert the content of infile under line 23

File explorer

:e . Open integrated file explorer
:Sex Split window and open integrated file explorer
:Sex! Same as :Sex but split window vertically
:browse e Graphical file explorer
:ls List buffers
:cd .. Move to parent directory
:args List files
:args *.php Open file list
:grep expression *.php Returns a list of .php files contening expression
gf Open file name under cursor

Interact with Unix

:!pwd Execute the pwd unix command, then returns to Vi
!!pwd Execute the pwd unix command and insert output in file
:sh Temporary returns to Unix
$exit Retourns to Vi

Alignment

:%!fmt Align all lines
!}fmt Align all lines at the current position
5!!fmt Align the next 5 lines

Tabs/Windows

:tabnew Creates a new tab
gt Show next tab
:tabfirst Show first tab
:tablast Show last tab
:tabm n(position) Rearrange tabs
:tabdo %s/foo/bar/g Execute a command in all tabs
:tab ball Puts all open files in tabs
:new abc.txt Edit abc.txt in new window

Window spliting

:e filename Edit filename in current window
:split filename Split the window and open filename
ctrl-w up arrow Puts cursor in top window
ctrl-w ctrl-w Puts cursor in next window
ctrl-w_ Maximize current window vertically
ctrl-w| Maximize current window horizontally
ctrl-w= Gives the same size to all windows
10 ctrl-w+ Add 10 lines to current window
:vsplit file Split window vertically
:sview file Same as :split in readonly mode
:hide Close current window
:­nly Close all windows, excepted current
:b 2 Open #2 in this window

Auto-completion

Ctrl+n Ctrl+p (in insert mode) Complete word
Ctrl+x Ctrl+l Complete line
:set dictionary=dict Define dict as a dictionnary
Ctrl+x Ctrl+k Complete with dictionnary

Marks

m {a-z} Marks current position as {a-z}
' {a-z} Move to position {a-z}
'' Move to previous position

Abbreviations

:ab mail mail@provider.org Define mail as abbreviation of mail@provider.org

Text indent

:set autoindent Turn on auto-indent
:set smartindent Turn on intelligent auto-indent
:set shiftwidth=4 Defines 4 spaces as indent size
ctrl-t, ctrl-d Indent/un-indent in insert mode
>> Indent
<< Un-indent
=% Indent the code between parenthesis
1GVG= Indent the whole file

Syntax highlighting

:syntax on Turn on syntax highlighting
:syntax off Turn off syntax highlighting
:set syntax=perl Force syntax highlighting

———我是分割线———

原文转自:http://www.catswhocode.com/blog/130-essential-vim-commands

vim 官方文档  : http://www.vim.org/docs.php

vim 官方帮助手册 : http://vimdoc.sourceforge.net/htmldoc/usr_toc.html