Java JIT性能调优

JVM自动监控这所有方法的执行,如果某个方法是热点方法,JVM就计划把该方法的字节码代码编译成本地机器代码,同时还会在后续的执行过程中进行可能的更深层次的优化,编译成机器代码的过程是在独立线程中执行的,不会影响程序的执行;除次以外,JVM还对热点方法和很小的方法内联到调用方的方法中,减少方法栈的创建。这些就是JIT(just in time)。

JIT编译器有近100种优化方式

JIT编译器有近百种优化方式
JIT编译器有近百种优化方式

其中以下三种方式效果非常明显:

  • 把bytecode编译成本地代码(native code):编译后的代码保存在一个特殊的堆上,除非相关的类被卸载,或者本地代码的优化被取消。这个cache有一定的大小限制(可通过启动参数-XX:ReservedCodeCacheSize来修改cache的大小),如果这个cache被装满,则JVM无法编译出更多的本地代码,但通常说不会碰到这种情况的。
    • hot method:默认情况,方法执行次数超过10000次的方法,jvm会编译成本地二进制代码,这个数值可以通过设置启动参数-XX:CompileThreshold=10000来修改。
    • On Stack Replacement (OSR):如果某个循环执行的次数非常多,那么这个循环体代码也可能会编译为本地代码
  • 分支预测(Branch Prediction):降低分支条件判断的结果的随机性,使CPU指令流水线缓存命中率提升
  • 方法内联(inlining,对性能的提升很大):方法内联可以减少方法调用,从而减少方法栈的创建。相信大家都知道循环的速度比递归快很多,就是这个原因,另外方法内联后,还使得一些JIT更深入的优化变成可能。jvm可以通过两个启动参数来控制字节码大小为多少的方法可以被内联:
    • -XX:MaxInlineSize:能被内联的方法的最大字节码大小,默认值为35Byte,这种方法不需要频繁的调用。比如:一般pojo类中的getter和setter方法,它们不是那种调用频率特别高的方法,但是它们的字节码大小非常短,这种方法会在执行后被内联。
    • -XX:FreqInlineSize:调用很频繁的方法能被内联的最大字节码大小,这个大小可以比MaxInlineSize大,默认值为325Byte(和平台有关,我的机器是64位mac)。

这些优化方法通常是层层依赖的,所以当JIT优化后的代码被JVM应用,就会开始尝试进行更上一层次的优化。因此我们写代码的时候,应该尽量往这些优化方式上面靠。

输出JIT编译和内联过的方法

在JVM启动参数中添加三个启动参数,比如下面的命令,把编译信息输出到inline.log文件中,便于后续使用grep命令分析:

inline.log中内容类似这样:

  • 第1列  31:为JVM启动后到该方法被编译相隔的时间,单位为毫秒
  • 第2列  23:编译ID,用来跟踪一个方法的编译、优化、深度优化
  • 第3列  s!:s是指该方法是synchronized,感叹号是指该方法有对异常的处理
  • 第4列  sun.misc.URLClassPath::getLoader:被编译的方法和类名
  • 第5列  (136 bytes):方法的字节码大小
  • 第6列 inline(hot):表示该方法被内联了,且调用频率很高,这一列还有其他值,比如:
    • inline (hot): 该方法被内联了,且调用频率很高
    • too big: 该方法没有被内联,因为方法字节码比-XX:MaxInlineSize的值大
    • hot method too big: 该方法被调用的频率很高,但是方法的字节码比-XX:FreqInlineSize的值大

inline.log文件内容中的方法还以tab缩进的方式来体现方法调用链的层次结构,非常易懂。

输出JIT编译的细节信息

通过添加参数-XX:+PrintCompilation,可以看到的信息其实并不具体,比如:那些方法进行了内联,内联后的二进制代码是怎么样的都没有。而要输出JIT编译的细节信息,就需要在JVM启动参数中添加这个参数:

输出的编译信息,默认情况是在启动JVM的目录下一个名为:hotspot_pid<PID>.log的文件

如果想指定文件路径和文件名的话,可以再添加一个启动参数:

输出的是一个很大的xml文件,可能有几十上百兆,下面摘出部分内容如下(文件中的汇编代码太长,就不贴了):

这些内容很难读懂,建议使用JITWatch(https://github.com/AdoptOpenJDK/jitwatch/)的可视化界面来查看JIT编译的细节信息。同时JITWatch还可以给出很多优化建议,给我们有效的优化代码提供参考,详见下文。

JIT编译模式

上面的输出的细节编译信息inline.log文件中,有个字段上“compiler=C2”,这里的C2就是JIT的编译模式,C2表示这个方法进行了深度优化。下面介绍下JIT的编译模式

C1: 通常用于那种快速启动的GUI应用,对应启动参数:-client

C2: 通常用于长时间允许的服务端应用,对应启动参数:-server

分层编译模式(tiered compilation):这是自从Java SE 7以后的新特性,可通过添加启动参数来开启:

这个特性在应用启动阶段使用C1模式以达到快速启动的效果,一旦应用程序运行起来以后,C2模式将取代C1模式,以进行更深度的优化。在Java SE 8中,这个特性是默认的。

JITWatch

前面也提到了,JITWatch可以通过可视化界面来帮助我们分析JVM输出的JIT编译输出日志,还可以帮助我们静态分析jar中的代码是否符合JIT编译优化的条件,还可以以曲线图形的方式展示JIT编译的整个过程中的一些指标,还给我们的代码提意见和建议,非常好用的工具。

下载

JITWatch需要在github上把代码clone下来,然后用maven来运行,地址为:https://github.com/AdoptOpenJDK/jitwatch/

安装hsdis

如果在jvm的启动参数中添加了下面的启动参数:

但是你发现启动你的java程序后,有如下的报错信息:

或者启动啦JITWATCH后,打开了某个编译信息log文件,但是看不到每个方法编译后的汇编信息,且那么你就需要安装hsdis。hsdis可以帮助我们查看编译后的本地代码,具体可以参考JITWatch提供的文档,根据自己的系统类型来选择安装:https://github.com/AdoptOpenJDK/jitwatch/wiki/Building-hsdis,如果你是mac,可以参考这篇文章:http://nitschinger.at/Printing-JVM-generated-Assembler-on-Mac-OS-X/

如果安装了hsdis库后,仍然在JITWatch中看不到汇编信息,那你检查下环境变量配置是否正确,实在不行可以尝试下重启电脑。

运行JITWwatch

在代码根目录下执行launchUI.sh(Linux/Mac)或则launchUI.bat(windows)

如果你使用maven,也可以在代码根目录下这样运行(其他运行方式,请参考JITWatch的github首页)

如果你使用的是mac,而且idk版本是jdk7,且运行mvn clean compile exec:java时出现下面的错误和异常时: 

请在org.adoptopenjdk.jitwatch.launch.LaunchUI类的main函数开头处添加下面的代码(或者直接使用我fork修改好的JITWatch):

然后重新运行即可看到JITWatch的界面。

用JITWatch来帮助优化代码

首先点击“Open Log”按钮,选择前面提到过的hotspot_pid<PID>.log文件,然后点击“Start”分析该文件。随后就会在左边生成程序运行过程中加载的类及其目录结构。选择某个类后,右侧会展示该类对应的方法。这些方法中可能部分方法前面有个绿颜色的勾,这说明这个方法被编译成本地代码,选中这个方法后,可以在下方看到该方法具体信息,比如方法调用次数,方法大小等。如下图所示:

jitwatch加载JIT编译log文件
jitwatch加载JIT编译log文件

这个界面中,顶部的工具栏都可以自己尝试一下,个人觉得“TopList”和“Suggest”比较直接,我们根据这两个就可以快速的定位需有优化哪些代码了,大体是什么原因导致未编译或者未内联。

选中方法后,点击“TriView”即可查看该方法和字节码和编译后的汇编代码,如下图:

jitwatch方法字节码和编译后的本地代码查看
jitwatch方法字节码和编译后的本地代码查看

如果你左边的java代码看不到,那你就需要在上一个界面中点击“Config”来添加源码路径或者源码文件以告诉JITWatch从哪里找源码;如果你右边的汇编代码看不到,说明你上面的hsdis未安装好,请重新安装。

此时,点击上面的“Chain”按钮,即可看到该方法调用了哪些方法,以及这些方法是否被编译了,是否被内联了。如下图所示:

JITWatch查看方法编译和内联状态
JITWatch查看方法编译和内联状态

总结

JIT的功能能显著提升java程序的性能,尤其是编译为本地代码和内联功能。内联需要方法比较小,也就是说写代码时就尽量把方法写得更小,让方法的复用度更高,复用的越多,就越可能被编译为本地代码。高性能的框架和类库针对JVM的JIT功能进行优化是非常有必要的,JVM提供的调试输出参数和JITWatch这样友好的工具能大大帮助我们快速的发现和定位需要优化的代码,大大提升了效率。

尽管我们可以手动调整JIT相关的一些参数,来让我们的更多的方法被编译和被内联,但一般不建议这么做(大牛都这么说)。

JIT编译成本地代码的过程也是需要消耗时间的,而且编译后本地代码不一定会使用(made not entrant,如果JVM根据一段时间的执行后进行了某项优化,但是在后来的某次执行时验证之前的优化是不完备的,那么JVM会取消这个优化,继续用解释执行的方式来执行字节码),所以并不是把所有或者大部分代码都编译一定会性能最优,那有可能也是灾难。

我所了解的JVM JIT性能调优的大致原理和方法就是这些,如有错误请指出。

性能优化永远是最后一步,不要提前过早开始性能优化。

Reference

如果你有耐心,就看看下面的文章吧,因为它们比我写的更详细

http://www.oracle.com/technetwork/articles/java/architect-evans-pt1-2266278.html

https://www.chrisnewland.com/images/jitwatch/HotSpot_Profiling_Using_JITWatch.pdf

http://www.docklandsljc.uk/presentations/2015/ChrisNewland-JITWatch.pdf

http://blog.csdn.net/hengyunabc/article/details/26898657

https://advancedweb.hu/2016/05/27/jvm_jit_optimization_techniques/

JVM启动参数:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

JITWatch使用文档:https://github.com/AdoptOpenJDK/jitwatch/wiki (右侧的页面目录分类很清晰)

https://advancedweb.hu/2016/05/27/jvm_jit_optimization_techniques/

https://advancedweb.hu/2016/06/28/jvm_jit_optimization_techniques_part_2/

mac输入法切换快捷键用不了

新买的mac各种不好用不会用,拼音输入法居然不能和英文通过快捷键自由切换。网上各种搜也没有找到我想要的问题。因为大家都说按command+space就可以切换,但是我的却不行。

后来在System Preference > Keyboard中发现,拼音输入法的切换按钮上ctrl+space,但是实际上ctrl+space是打开的spotlight,mac系统初始化做得真够烂的,应该是快捷键冲突了。

于是我重置了快捷键,发现spotlight变成command+space了,输入法变成了ctrl+space,试了试,spotlight可以用,但是输入法不能切换。晕,mac默认的快捷键都不能正常工作。

于是我尝试把spotlight和输入法的快捷键换一下,勾选了输入法切换快捷键,修改快捷键为command+space,然后勾选spotlight快捷键修改成ctrl+space,经测试,都ok了。

总结下:

spotlight快捷键这样设置:ctrl+space

输入法快捷键这样设置:command+space

我的系统版本:10.11.5 (15F34)

 

macbook-pro安装adobe-flash-player后仍然不能看视频

想用刚买的mac pro看看优酷,结果提示需要安装flash player插件,然后我按照提示安装了adobe flash player,重启了safari,结果还是看不了视频,仍然提示未安装flash player。重启了机器后仍然是不行。

各种百度google搜索都没有找到办法。后来自己摸索,整好久才发现,原来默认插件安装是PPAPI Plug-in,它不是针对safari浏览器的,而是针对opera和chrome的。而NPAPI Plug-in这个才是真对safari、firefox、遨游的。要检查你安装的flash player插件是否支持safari可以这样看:系统偏好(System Preference)> Flash Player > Updates里面,效果如下:

Flash Play设置
Flash Play设置

如图所示,如果你的两个插件中NPAPI插件为安装,那么你就需要安装这个插件,安装方法如下:

首先几点上图中的install now,然后会自动打开一个adobe的网站,

安装flash player
安装flash player

 

不要点install now,因为那样会再次安装PPAPI插件,而这个插件对safari没用。应该点击左边的一个链接“Need Flash Player for a different computer”,点了以后看到的效果应该是这样的:

安装支持safari和遨游的flash player
安装支持safari和遨游的flash player

如上图的方式选择NPAPI,然后点击Downloading Now,后续按照提示一步步进行即可,然后重启浏览器就可以看视频了。

说实话,mac系统真心不如windows来得简单直接,不知道是转型mac不习惯,还是真的不好用~~

 

eclipse全面提速

你是否经常在等待eclipse的一些操作完成?

eclipse loading
eclipse loading

如果你看到这里,说明答案是yes。如果你苦于eclipse中响应很慢的功能,并且想给eclipse提速让开发更舒服些,就请看看下面的内容。

注意:可能一般人都建议加大内存。如果可以,你可以买个cpu好点的机器。弄个SSD让你的文件操作更快。我们假设你买不起这些,你所能做的就是启动eclipse实例,所有ubuntu的设置都是基于eclipse 4.3.0版本,build id:I20121031-2000,当然其他平台的版本的设置都差不多。

Eclipse优化

插件

当我第一次找到强大的插件时,我非常高兴。我安装的越来越多后,eclipse就用起来不舒服了。所以你可以从众多的插件中禁用一些不常用的插件,禁用不代表删除,你仍然可以启用他们。

 

禁用不常用的eclipse启动插件
禁用不常用的eclipse启动插件

一些插件可能在尝试体验时用一用,但是后来可能在也不用了,这种情况可以把它删掉。

卸载eclipse插件
卸载eclipse插件

eclipse.ini

下面的优化都需要修改eclipse所在目录下的eclipse.ini文件。

  • 给eclipse执行jvm。它可以让你使用自己的jdk,而不是系统环境变量所指定的jdk
  • 使用最新的jdk来运行eclipse。使用最新的jdk要好很多。
  • 使用sun的jdk来运行ecipse。原因同上。
  • 配置jvm虚拟机的启动参数。你可以自定义虚拟机参数,如果你觉得他们更合适(虚拟机参数介绍)。我使用下面的启动参数来增加堆的大小至768Mb,perm区设置为256Mb(内存总大小为3Gb)

你可以添加-Xverify:none参数来跳过jvm对class文件的校验,以此提升eclipse的启动速度,但这是很不安全的。

你还可以通过测试不同的垃圾回收器策略、server参数来测试eclipse的性能差异。以下为实验过程中使用的部分参数:

可以在这里查看所有的eclipse运行时参数,选择适合你的参数。

禁用动画

动画很酷,但如果可以的话,我总是在所有的工具中禁用动画。所以classic主题是我最常用的主题。

设置eclipse主题
设置eclipse主题

禁用label decoration

label decoration是项目、文件、类层级上的小图标,它可以有益于显性化文件的状态。比如:文件是否已经提交到git。很多插件都提供了这个功能,但很少有用。你可以仅留下你想要的,其他的禁用。

设置label decoration
设置label decoration

自动补全

有时在性能较差的机器上,或者当你有很多类的时,自动补全功能性能就会很差。一个很小的优化是减少自动补全的proposal。我仅保留了Java Proposals和Template Proposals:

eclipse Content Assist,eclipse自动补全设置
eclipse Content Assist,eclipse自动补全设置

取消验证器

如果你对自己的技术很自信,就可以暂停所有的校验器。就算出现问题,你也可以靠自己的能力定位问题,节省了你的开发时间。

取消eclipse校验器
取消eclipse校验器

关闭不相关的工程

如果你仅开发部分eclipse中的工程,那你最好把其他功能关闭掉。他们不会出现在eclipse索引中。你可以在workspace中手动关闭不相关的工程(Close unrelated projects)。但我推荐使用Working Set,你可以添加多个工程到一个Working Set中,这样就可以快速的在Working Set件切换。

关闭编辑器中不用的tab

编辑中太多的tab会导致eclipse性能下降,可以这样控制下tab的个数:

勾选 Close editors automatically 并设置 Number of opened tabs 为10。

控制eclipse编辑器中tab的个数
控制eclipse编辑器中tab的个数

禁用拼写检查

你还是个程序员吗?我觉得没有任何理由需要拼写检查功能。取消这个功能吧:

禁用auto build

如果你在意什么时候build你的工程,可以这样设置:

快捷键

仁者见仁,智者见智。就算你用超快的IDE功能,但如果你要花10个动作才能实现一个操作,那你的开发过程就不算快。把你最常用的动作配置成快捷键,并记住他们,几周的使用后,你的开发效率将由显著提升。

为了逼着自己使用所有的快捷键,我直接把工具栏给禁用了。

参考链接

 

本文译自:http://mishadoff.com/blog/eclipse-speedup/

 

精品工具收集(一)

精品工具收集(一)
精品工具收集(一)

收集了一些平时开发工作中好用的软件,我一直在用的,帮助我提升效率。现在分享给大家:

  1. 免费好用的数据库的客户端:heidisql:http://www.heidisql.com/download.php,免费而小巧
  2. 免费好用的SSH客户端:xshell:http://rj.baidu.com/soft/detail/15201.html?ald,免费的哦
  3. xshell经典配色方案:http://blog.csdn.net/loveaborn/article/details/10012103,用了这个配色,你再也不想用putty和securityCRT了
  4. 知识管理软件(记事本软件):为知(Wiz):http://www.wiz.cn/,支持web、PC、pad、iphone、android,方便的管理自己的知识,最大的亮点是支持超过3层的文件夹,复制粘贴网页和代码样式保持的很好,比印象笔记、有道笔记、麦库、mybase等都强很多的,不信你试试。
  5. 最简单小巧好用的编辑器:notepad++:http://rj.baidu.com/soft/detail/13478.html?ald,启动和打开速度比sublime、ultraEdit都快不少,作为临时编辑的软件非常方便,插件也有一些哦,我之前写过两篇文章介绍notepad++的:《notepad++的好用快捷键整理》,《只要工具用得好,没有效率提不高
  6. windows下的命令行工具:powercmd:http://www.powercmd.com/,比dos好用太多了,你就像编辑notepad一样敲命令,同时还支持自定义快捷指令
  7. 文件、文件夹名称快速搜索软件:everything:http://rj.baidu.com/soft/detail/17239.html?ald,这款软件的大小之小,速度之快,简直令人瞠目结舌。它可以在几十秒的时间里就可以把你硬盘里面的所有文件的索引建立好,然后你可以使用它来查找任何文件和文件夹,查找不费时间,太好用了。
  8. 帮你找到你的文件被哪个程序占据了:unlocker:http://rj.baidu.com/soft/detail/12918.html?ald,经常删除文件,发现删除不了,windows又不告诉你到底是被哪个程序占用了,这个软件只需要在文件上右键一下就可以找到被那个软件占用了,还可以强制解绑。
  9. 遨游浏览器:http://www.maxthon.cn/,用过各种浏览器,以前最好用的是世界之窗,后来世界之窗被360收购后,就不再更新了。后来发现现在的遨游已经学会了世界之窗当初精髓,可以把浏览器做的如此的极致,你可以把界面自定义成很精简的样子,浏览器打开和运行的速度都非常不错。他的书签是最亮的地方,也有手机版\linux版的,支持开发者工具,可用于前端开发,很多功能需要你去发现,我现在一直在用遨游。

 

这里只是抛砖引玉,如果你也有不错的软件,请评论添加。

 

 

如何自定义eclipse代码格式化(Ctrl+Shift+F)

使用eclipse的都知道它有一个快捷键Ctrl+Shift+F,用来格式化代码,但是eclipse默认自带的格式化效果也有不完美的地方。所以有时候你需要自定义eclipse代码格式化,下面举例说明:

java代码的多个属性默认情况是左对齐的,看起来效果是层次不齐的,见下图:

java代码格式化——多个属性层次不齐
java代码格式化——多个属性层次不齐

如果对齐是什么样的效果呢:

eclipse java代码格式化——多个属性对齐
eclipse java代码格式化——多个属性对齐

那如何配置,其实eclipse自带了完整而全面的配置功能,进入路径为:Preferences–>Java–>Code Style–>Formatter–>New(取个自己想要的名字)–>右边的Edit,这个界面里面有丰富的java代码格式化配置功能,上图的配置就只需要把Indentation中的Align field in columns勾上即可。其他的一些配置都可以在这里找到,而且该界面提供了丰富的所见即所得的配置效果,大家可以玩一玩,或许有意想不到的效果。如下图:

eclipse java代码格式化——配置界面
eclipse java代码格式化——配置界面

如果是J2EE版的eclipse,那么它还自带了HTML、JS、CSS的代码格式化配置功能。如下图中的路径:

eclipse代码格式化——js、css、html
eclipse代码格式化——js、css、html

上图,将input从inline Elements中移除,那么input就会单独占用一行,这样可以避免input被中途换行的情况,另外,可以将Line width调大一点,比如:100,这样,就不会有那么多的换行了。代码就比较容易在格式化后,仍然是你想要的效果。

 

eclipse中文乱码问题解决方案汇总

eclipse中文乱码都是因为字符编码与默认的编码不符合导致的,有很多的方法可以解决,不需要安装任何插件就可以搞定。针对不同的情况,需要使用不同的方案,下面就针对一些案例讲解如何解决乱码问题。解决乱码问题的主要思路是设置正确合适的编码,如果不知道目标文件原本的编码,可以进行一定的尝试,通常尝试下GBK和UTF-8这两个编码即可。

1. 设置单个文件的字符编码,解决单个文件的乱码问题

有时候不小心copy来的单个文件编码与你workspace的默认编码不一致,就导致了单个乱码。解决办法:在Pakcage Explorer或者Project Explorer视图里面,右键点击该文件–>选择“Properties”–>”Text file encoding”–>给”Other”项设置相应的编码。(需要注意的是,如果copy来的文件在eclipse中显示的是正常,但是编码与其他文件不一致,若你想统一编码,就需要在设置编码前,记得先把文件内容copy一下,然后设置好编码,再把copy的内容粘贴到编码修改后的文件中,这样会不乱码;一修改编码文件内容就会乱码),如下图:

eclipse设置单个文件的字符编码
eclipse设置单个文件的字符编码

2. 设置第三方jar包的字符编码,解决整个jar的乱码问题

第三方jar包的编码问题可能是最常见的问题,其解决方案与单个文件的比较类似,在Pakcage Explorer或者Project Explorer视图里面,右键第三方jar包–>选择“Properties”–>给”Encoding”项设置相应的编码,如下图:

在eclipse中给jar包设置字符编码
在eclipse中给jar包设置字符编码

3. 分别设置不同类型文件的字符编码

有时候为了统一所有工程的编码,可能需要提前设置好各类型文件的字符编码,比如:把所有的jar类都设置为GBK编码,把所有的xml设置为UTF-8编码等。这时候就需要有针对性的给不同类型的文件设置不同的编码。步骤是这样的:Windows–>Perferences–>General–>Content Types–>选择文件类型–>设置“Default encoding”项。如图下:

在eclipse中给指定类型的文件设置字符编码
在eclipse中给指定类型的文件设置字符编码

4. 设置整个workspace的文本文件的默认字符编码

往往workspace都有一个默认的字符编码,如果你的工程大部分或者全部是另一个编码,那么你可以重新设置一个默认的字符编码,后续新建工程就不需要再去设置编码了。步骤是这样的:Windows–>Perferences–>General–>Workspace–>Test file encoding–>给“Other:”设置相应的编码,如下图:

在eclipse中设置workspace的字符编码
在eclipse中设置workspace的字符编码

个人经验

其实一般开源的代码都是UTF-8编码的,我们平时开发的时候最好也都统一使用UTF-8,在开发初期直接把workspace的文本文件的编码设置为UTF-8,这比较省事。在开发过程中,如果发现添加进来的三方jar包编码不是UTF-8,那么可以针对这个jar设置其编码;若copy某个源码文件到工程中发现是乱码的,那么可以仅设置这一个文件的编码成正确的编码。

解决mysql命令行的字符编码问题

mysql命令行的字符编码问题是很常见的,也是比较麻烦的问题,但其实解决的方法比较简单,只需要知道哪些地方需要设置编码,并把这些编码设置成统一的就行了,比如:在使用mysql的命令行工具时,就需要设置命令行工具的字符编码与数据库的编码保持一致。

查看和设置数据库的字符编码

首先需要知道数据库的编码是怎么样的,可以使用下的命令,效果如下图:

show variables like ’character_set_%’;

查看数据库的编码
查看数据库的编码

除了charaacter_set_filesystem以外,其他的最好保持一致。可以看到我的数据库的字符编码设置都是utf8的。

这里的设置正确以后,就需要保证客户端的编码和数据库的编码一致,这样客户端才能正常显示数据库中的中文数据,数据库才能正确的识别客户端发来的带有中文的查询语句。

如果你的编码设置不一致,请使用类似下面的语句来设置编码:

set character_set_client=gb2312; // 客户端编码方式
set character_set_connection= gb2312; // 建立连接使用的编码
set character_set_database= gb2312; // 数据库的编码
set character_set_results= gb2312; // 结果集的编码
set character_set_server= gb2312; // 数据库服务器的编码

下面图文解释如何设置命令行工具的字符编码:

secureCRT的字符编码设置

在一个连接上右键,选择“属性”,如下图设置编码:

 

设置secureCRT的字符编码
设置secureCRT的字符编码

xshell的字符编码设置

如果你使用的是xshell作为你的命令行工具,那么你可以这样设置,在一个会话上,右键点击“属性”,然后按照如下设置你数据库对应的字符编码即可,我的数据库是用utf8,所以我设置了utf8:

 

xshell的字符编码设置
xshell的字符编码设置

Reference

远程桌面字体平滑设置

以前远程桌面链接的时候,看到字体很丑,很粗糙,字体不平滑,看着很不爽,今天才发现,原来是可以设置的,点“远程桌面连接”–>点击左下角“选项”–>选择“体验”–>选择适合自己的宽带(网速越好效果越好)–> 勾上“字体平滑”,ok,完成了。如下图:

远程桌面连接字体平滑设置
远程桌面连接字体平滑设置

 

当然如果你的网速很好,你可以把其他几个都勾选上,把显示里面的“颜色”选择最高的深度,那效果就跟没远程链接效果一样了。

很多人一直在忍受那样难看的字体,但不曾去解决这个问题,其实多看看多试试还是有办法的~

只要工具用得好,没有效率提不高

notepad++就像瑞士军刀,简单好用,功能多
notepad++就像瑞士军刀,简单好用,功能多

只要工具用得好,没有效率提不高。现在工具一大堆,各有所用,但是按照2/8原则,大家其实大多时候只用到了其中的20%的功能,如果能多用几个功能,同时结合多个工具一起配置,则能达到1+1>2的效果。

昨天碰到一个事,一个同学需要统计最近一段时间的团队经费最后的余额,由于当初记录每笔支出和收入的时候,只用记事本随便记了一下时间、金额以及少许备注,大致有一点格式:

面对这些记录你想统计最后余额,会用什么办法?可能大部分人会老老实实的一个个的加减吧。

其实日常比较简单的统计软件比如excel,但是excel需要比较规整的格式,上面的这个数据就不能直接复制到excel来求和的。不过上面的数据还是有规律可循的,比如所有金额前面都有冒号;所有金额后面要么是空格,要么是元字;支出和收入有区分。这样一来就可以巧用notepad++的替换功能来简单的编辑一下,让其符合excel的要求。操作如下:

1. 把金额数字区分出来,使用notepad++的替换功能,把所有的”:”全部替换成“:\t\t”,然后把所有的单一空格替换成“\t\t”,这样做主要是为了把我想要的金额提取出来,注意替换时要选择“扩展”(后续的替换功能都需要选中这一项),如下图所示:

巧用notepad++的替换功能
巧用notepad++的替换功能

替换后效果如下:

2. 由于支出的金额在统计时应该用负数表示,所以需要把支出的金额前面添加负号,操作为:把“支出:\t\t”替换为“   :\t\t-”,这样就变成了下面的样子:

3. 使用notepad++一个很实用的列选择功能,来把金额所在列抠出来,即按住ALT键后,选择金额这一列即可,然后复制到另一个新打开的notepad++标签中,继续编辑,看到的效果如下:(当然其中有一点不太规整的地方可以手动调整一下,比如,里面有一行中有两个金额相加,可以调整为两行)

4. 现在的数据除了元,其他都是金额了,现在需要把元子去掉,把多余的换行也去掉,操作如下:把“元”替换为空字符串“”,然后把连续的两个换行“\r\n\r\n”换成一个换行”\r\n”(如果一次换行不能达到效果,就再替换一次)。得到如下的效果:

5. 现在数据,就很清晰了,这个数据,就可以直接粘贴到excel里面,使用其各种统计功能了,比如:求和。

从这个例子中可以看到,只要原始数据本身有规律,基本都可以使用notepad++的替换和列选择功能来达到抠数据的目的,甚至可以达到一些更复杂的目的。若要写程序恐怕不是一会儿的事吧。

一点心得,我经常用替换和列选择功能来做一些数据量不太大的文本抽取,有时碰到的情况是,需要把一行有规律的字符串中的某些字段抠出来,常用的做法是先把字段前面的标记替换成“\r\n\t\t\t”,然后把字段后面的标记替换成“\t\t\t”,这样就又可以使用列选择功能直接抠出这一列字段了。另外有时间字段前后的标记不统一,这时候就可以考虑更高级的“正则表达式”替换功能。巧用notepad++事半功倍,当然notepad++有这些有意思的功能,相信很多其他的编辑器也有类似的功能可以用,在此抛砖引玉。。。