VS Code 的一些Keyboard shortcuts

VS Code 的一些Keyboard shortcuts 目前VS Code是我在Mac平台使用的主力文本编辑工具(基本上替代了之前使用的TextWrangle,Textmate)。到目前为止,使用感受完美。 对我来说,完成对一个陌生工程师水平判断的第一个方式就是看他如何使用文本编辑器: 如果是在Unix/Linux环境,他在用什么编辑器?如果是vi,操作是否熟练? Windows/Mac环境,用的什么编辑器?是否熟悉正则表达式? 你对着文本编辑器,敲击键盘时的细节,就是你表现出来的工程师气质。直接会影响甲方对你的印象和信心。 Multiple selections(multi-cursor) 传统的文本编辑器里,操作游标只有一个(表示你当前操作文本位置的那个一闪一闪的光标)。VS Code以及很多现代编辑器里,为了实现“同时”编辑多个位置,都支持多游标(multi-cursor)。在VS Code中,你可以通过Alt+Click添加新的游标。每一个游标都可以在其所在的上下文中独立操作。常见的添加新游标的方式还有⌥⌘↓ 或者 ⌥⌘↑,在当前位置下方或者上方添加游标。 ⌘D会选定游标位置处的单词,继续按下⌘D,会选定下一出该单词: 收缩、扩展选择内容 在一些程序文本中,文本内容有其结构,可以使用⌃⇧⌘← 和 ⌃⇧⌘→,来扩展、收缩当前选择的文本——具体解决了什么问题,感受一下就清楚: 列模式(box selection) 鼠标选择同时按下Shift+Alt,可以进行列模式选择。 列模式操作,是以前在Windows平台一直使用UltraEdit的最主要原因。 格式化文本内容 Format Document (⇧⌥F) - 格式化当前文档 Format Selection (⌘K ⌘F) - 格式化选定文本内容. Folding 阅读、编辑程序代码时,如果不支持Fold、Unfold,或者像有些编辑器,只能在Function级别支持Fold,那都是没法用的。 VS Code会智能的在行号和行开头显示Fold图标(只要它判断这里可以进行Fold、Unfold) 相关快捷键: Fold : ⌥⌘[ Unfold: ⌥⌘] 递归的Fold: ⌘K ⌘[ 递归的Unfold: ⌘K ⌘] Fold所有: ⌘K ⌘0 0级别递归 Unfold所有: ⌘K ⌘J 缩进 默认情况下,VS Code使用4个空格替代Tab键。

AngularJS 与jersey进行通讯备忘

DPA应用使用angular 的$http与Jersey的RESTFul接口进行ajax访问,之前一直比较顺畅,没出过什么问题。近日在**电信的计费库部署时发现,部分功能不能正常使用。检查jersey端输出: Apr 02, 2018 5:37:37 PM org.glassfish.jersey.server.ServerRuntime$Responder writeResponseSEVERE: An I/O error has occurred while writing a response message entity to the container output stream.org.glassfish.jersey.server.internal.process.MappableException: org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Broken pipe (Write failed) at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:96 at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:149 at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1139 at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:574 at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:381 at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:371 at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:262 at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271 at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267 at org.glassfish.jersey.internal.Errors.process(Errors.java:315 at org.glassfish.jersey.internal.Errors.process(Errors.java:297 at org.glassfish.jersey.internal.Errors.process(Errors.java:267

DPA在电信计费系统故障诊断案例

3月20日中午,电信客户的计费系统故障,所有操作响应缓慢,应用无法正常运行。现场DBA已经迅速将应用连接转移到RAC集群的另一节点,恢复应用服务,我们使用DPA来回看事故现场,此时离故障发生,已经一小时了…… 回溯负载情况,如下图   问题最严重时,实例堵塞了近700个连接操作…针对此时间段,进一步点击、下钻分析当时系统发生了什么 系统先是每分钟4~5次堵塞(像是咳嗽),到了13:40后,就处于长时间“梗”住的状态,对于外部业务来说,数据库实例已不可用了。   利用DPA,继续下钻,查看堵塞原因: 1654#会话导致80个会话被堵塞,这80个会话的等待事件是 sga:allocation forcing component growth,这80个会话中的一些会话又堵塞了一些其他会话,如下图 266号会话堵塞了3个会话,这三个会话的等待事件都是cursor:pin s wait on x,这个等待事件一般都是跟sql parse相关,所以,现场工程师开始查看oracle 自己的ADDM报告,说是解析有问题,建议应用分析解决问题…被误导了   至此,DPA下钻后清晰显示,堵塞的根源是1654号会话,DPA显示是MMAN进程,它堵塞了80个会话,这些会话又堵塞了更多其他会话,是一个3级的堵塞关系,幸好DPA以“树型”显示方式,把这种多层级堵塞关系显示的非常清晰。 结论:Oracle MMAN进程进行过于频繁的SGA内存组件(本例中是share pool)resize操作,导致了问题…   这张图中显示的share pool内部情况,看官能看出异常么?   “划一条线1美元,知道在哪里划线9999美元”。 至此,后续我们如何解决这个问题的就不再讨论了,解决问题从来不是难事,难的是发现问题。 后记: 从DPA的负载雷达上,我们看到在系统出现问题之前的一小段时间内,系统负载不正常的降的很低,其后负载飙升上去…… 那段时间负载异常降低,说明了什么? 应用程序发生了什么…… 这些从Database Performance Analyzing层面,就无从知晓了。

在MAC平台编译安装遇到的问题

在Unix/Linux平台编译源代码安装软件遇到的问题 Changzheng-Hes-MacBook-Pro:rems2-3.4.7-new changzhenghe$ make installCDPATH="${ZSH_VERSION+.}:" && cd . && /bin/sh /Users/changzhenghe/tmp/rems2-3.4.7-new/missing aclocal-1.14 -I m4/Users/changzhenghe/tmp/rems2-3.4.7-new/missing: line 81: aclocal-1.14: command not foundWARNING: 'aclocal-1.14' is missing on your system. You should only need it if you modified 'acinclude.m4' or 'configure.ac' or m4 files included by 'configure.ac'. The 'aclocal' program is part of the GNU Automake package: http://www.gnu.org/software/automake It

使用proguard混淆Java代码

对于Java Web项目,使用Netbeans作为IDE环境,想实现自动混淆class文件。因为Web项目,所以一些类是不能混淆的: 1. web.xml中涉及的类名称、package名称2. 返回前端的数据涉及到的类名称、属性名称… proguard的运行方法是执行proguard.sh @<cfg_file.cfg> web项目,一般输入需要混淆的是WEB-INF/classes/下的相关class文件,要把WEB-INF/lib/下的相关jar文件都设置为libraryjars proguard配置文件示例: -injars /Users/xxx/NetBeansProjects/yyy/build/web/WEB-INF/classes-outjars /Users/xxx/neto_classes -dontshrink-dontoptimize -libraryjars /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/rt.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/asm-all-repackaged-2.2.0-b21.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/cglib-2.2.0-b21.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/cglib-2.2.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-beanutils-1.8.0.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-codec-1.3.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-collections-3.2.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-digester-2.0.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-fileupload-1.2.2.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-httpclient-3.0.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-io-2.0.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-lang-2.5.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-logging-1.1.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-logging.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-pool-1.6.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/commons-primitives-1.0.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/eclipselink.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/ezmorph-1.0.6.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/guava-14.0.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/hk2-api-2.2.0-b21.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/hk2-locator-2.2.0-b21.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/hk2-utils-2.2.0-b21.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/javax.annotation-api-1.2.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/javax.inject-2.2.0-b21.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/javax.servlet-api-3.0.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/javax.ws.rs-api-2.0.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/jaxb-api-2.2.7.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/jersey-client.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/jersey-common.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/jersey-container-servlet-core.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/jersey-container-servlet.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/jersey-entity-filtering-2.5.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/jersey-media-moxy-2.5.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/jersey-server.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/json-lib-2.4-jdk15.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/ojdbc5.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/org-apache-commons-logging.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/org.osgi.core-4.2.0.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/osgi-resource-locator-1.0.1.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/persistence-api-1.0.jar-libraryjars /Users/changzhenghe/NetBeansProjects/RmsPlus/build/web/WEB-INF/lib/spring-aop-3.2.7.RELEASE.jar-libraryjars

量化感知一切IT设备: 使用脚本监控PDU

PDU: Power Distribution Unit 电源分配单元 在REMS2的实施过程中,我们遇到了这样的需求: 客户需要监控很多台PDU的指标,所使用的PDU有一个WEB访问接口,输入用户名和口令后可以进行PDU的远程操作和状态查看. PDU并没有SNMP服务之类功能. 该类型PDU能够提供4个监控指标: 电流,电压,功率,温度.思路: 在Script中模拟浏览器访问(模拟用户名口令输入,查看指标页面), 对于获取到的HTML代码使用python进行处理. 效果: $ ./mon_pdu.py -h   Usage: mon_pdu.py [options]     Options: -h, --help show this help message and exit -H HOST, --host=HOST pdu admin address -p PORT, --port=PORT pdu admin port -u USER, --user=USER pdu admin username -P PASSWORD, --passwd=PASSWORD pdu admin password

Getting Started with Logstach 2

Parsing Logs with Logstash 之前,我们已经通过一个最基础的Logstash pipeline,验证了我们的Logstash环境已经准备就绪。在现实世界里,那样基础的pipeline没有什么存在的价值,我们需要更加复杂的pipeline:一般都会包含多个input、filter以及output插件。 在这个章节,我们会创建一个Logstash pipeline,使用Filebeat读取Apache的日志作为输入,并对日志进行解析、创建指定的命名字段信息,再将解析过的数据写入到Elasticsearch。这次不在命令行中配置pipeline,咱使用配置文件。 开始之前,下载sample数据,在接下来会用。 配置Filebeat,将日志信息发送给Logstash 开始创建Logstash pipeline前,得先配置Filebeat,负责将日志中的文本行发送给Logstash。Filebeat用来搜集服务器上的文件,并转发给Logstash示例进行处理。Filebeat具备可靠、低延迟的设计特性 默认的Logstash安装会包含Beats input插件。这个插件让Logstash具备接收Elastic Beats框架发来的 事件 ,诸如PacketBeat、MetricBeat都可以向Logstash发送 事件  本文略过Filebeat的安装过程。 安装好Filebeat后,需要为Filebeat提供配置文件。Filebeat配置文件使用YAML格式。创建filebeat.yml文件,内容如下: filebeat.prospectors: \- type: log paths: \- /path/to/file/logstash-tutorial.log output.logstash: hosts: \[“localhost:5043\] 为了简化配置,这里没有使用TLS/SSL设置——真实世界里,我们需要安全设置。 启动Filebeat: sudo ./filebeat -e -c filebeat.yml -d “publish” Filebeat会尝试连接5043端口,因为目前为止,Logstash以及Beats plugin还没有启动,所以不会从这个端口得到应答。 配置Logstash来接受Filebeat输入 下面是Logstash pipeline的配置文件主干: ``` The # character at the beginning of a line indicates a comment. Use

Getting Started with Logstash 1

Stashing your first event 让我们启动logstash的学习! 通过运行一个最最基础的Logstash pipeline来验证一下我们的Logstash安装。  pipeline: 管道, 这个就是Linux/Unix中管道的概念。此处不做解释 Logstash 管道需要两个元素: input、output,经常还会配置可选元素:filter。 输入、过滤、输出,这就是一个标准的信息处理组件、很多个这种组件chain起来,就可以完成复杂的功能需求。在Logstash中,input、output、filter分别有许多plugin(插件),通过输入插件,从数据源中读取数据,filter插件按照配置修改数据,输出插件将数据写入目标端…… 为了测试我们安装的Logstash,我们来运行一个最基础的Logstash管道: logstash -e 'input { stdin {} } output { stdout {} }' 上例中,-e 选项让我们直接从命令行中获取logstash配置(一般是用配置文件的),这个基础示例中,我们从标准输入(stdin)中获取输入数据,将数据输出到标准输出(stdout)—— 输出时会使用logstash结构化后的格式(最起码得添加个时间戳对、主机名吧?) Logstash启动并不迅捷,等到看到“Pipeline main stated”才表示启动完毕,我们输入 hello word [2017-11-19T22:32:20,445][INFO ][logstash.pipeline ] Pipeline started {"pipeline.id"=>"main"} The stdin plugin is now waiting for input: [2017-11-19T22:32:20,471][INFO ][logstash.agent ] Pipelines running {:count=>1,