Ctrl-N Class... (find by name) Ctrl-Shift-N File... (find by name) Ctrl-Shift-Alt-N Symbol... (find by name) Ctrl-G Line... (goto line) Ctrl-H Type hierarchy (hierarchy) Ctrl-Shift-H Method hierarchy (hierarchy) Ctrl-Alt-H Call hierarchy (hierarchy) Ctrl-Q Quick documentation Ctrl-Alt-I Auto-indent lines (indent) Ctrl-Alt-L Reformat code (line up) Ctrl-Alt-O Optimize imports (optimize) Ctrl-/ Comment with line comment (//) Ctrl-Shift-/ Comment with block comment (/*...*/) Ctrl-W Select word or block (word) Ctrl-D Copy line (duplicate line, yyp) Ctrl-X Cut line (dd) Ctrl-U Uppercase/lowercase (upper) Ctrl-J Insert live template Ctrl-Alt-J Surround with live template Ctrl-Alt-T Surround with (template) Ctrl-Shift-J Join lines (join) Ctrl-E Recent files (editions) Ctrl-Shift-E Recently changed files (editions) Alt-Shift-C Recent changes (changes) Ctrl-B Delcaration Ctrl-Shift-B Type declaration Ctrl-Alt-B Implementation(s) Ctrl-P Parameter info (parameter) Ctrl-Space Basic completion Ctrl-Shift-Space Smart completion Ctrl-Alt-Space Completion lookup Alt-Enter Auto-complete Alt-Insert Generate... Ctrl-Shift-Up/Down Move statement up/down Alt-Shift-Up/Down Move line up/down Ctrl-Up/Down Scroll up/down Alt-Up/Down Previous/next method F2 Next highlighted error Shift-F2 Previous highlighted error Ctrl-F Find Ctrl-R Replace F3 Next match Shift-F3 Previous match F4 Jump to source Ctrl-Alt-Shift-T Refactor this F5 Refactor copy F6 Refactor move Ctrl-F6 Refactor change signature Shift-F6 Refactor rename Alt-Delete Refactor safe delete Ctrl-Alt-V Refactor extract variable Ctrl-Alt-F Refactor extract field Ctrl-Alt-P Refactor extract parameter Ctrl-Alt-M Refactor extract method Ctrl-Alt-N Refactor inline
Java EE应用Q同旉|在两个Tomcat(5.5.27)实例上,前面放了个Apache(httpd-2.2.19-win32-x86-no_ssl)Q通过mod_jk(1.2.32)做负载均衡,同一台物理服务器Q操作系lؓ64位的Windows Server 2003 SP2。现象是60+客户端,q_每个客户端每U请求数2ơ,单个h正常响应旉?00ms以内Q即每秒冲进?20个请求,q发量最多在60上下QApache已不堪"?负,静态资源响应时间都过10sQ同时Tomcat和数据库服务器均正常。凭我的l验Q同L压力直接压到Tomcat也不至于q么隄。看来问题出在Apache?/p>
首先修改httpd.conf配置文gQ打开status模块Q?/p>
LoadModule status_module modules/mod_status.so
<Location /status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1 #需要的话也可放开为all
</Location>
q样我们p通过/status面查看服务器当前的状态信息,l果观察到worker(即线E?C?4Q坑爹啊Q难怪撑不住。我记得以前Windows下面的Apache默认U程数没q么的。找准问题,接下来就好办了:
<IfModule mpm_winnt.c>
  ThreadsPerChild 300
MaxRequestsPerChild 0
</IfModule>
E微解释一下:mpm_winnt.c是Apache为Windows NT提供的MPM (Multi-Processing Module)Q对应到Linux环境下,则有prefork.c(多进E?每进E?个线E?和worker.c(多进E?多线E?两种MPM可选。Windows下面只会有父与子两个q程Q因此单个子q程能同时v多少U程(ThreadsPerChild)成了调优的关键。另一个参数MaxRequestsPerChild的含义是单个子进E篏计最多处理到个hQ超q该值则退出重启,q是Z防止内存泄露慢慢拖垮整个服务器而做的防御性措施,0表示不做此限制?/p>
新配|上U后Q客L数量利冲上200+。Case closed.
今天帮同事解决一个邮件ؕ码的问题Q简C此?
邮g正文׃贴了Q有一D从上下文判断明昑ֺ该是"上v"Q却昄成了"?.."Q于是自然而然的拿??字和"?字来分析?
通过单的Groovy脚本对这两个汉字分别按gbk和utf-8~码Qƈ得到的byte[]转换成二q制表示输出如下Q?
== ?==
11001001 11001111
11100100 10111000 10001010
== ?==
11100100 10111000
11100110 10110110 10010011
注意"?字的W?排前两组??字第1排的两组byte正好相同Q于是问题迎刃而解Qؕ码是׃邮g以utf-8~码后被错误的以gbk解码Q随后又重新~码成utf-8Q造成的?/p>
关键代码Q?/p>
void showBytes(String input) {
println("== " + input + " ==")
b = input.getBytes("gbk")
b.each { print Integer.toBinaryString(it).substring(24) + ' ' }
println()
b = input.getBytes("utf8")
b.each { print Integer.toBinaryString(it).substring(24) + ' ' }
println()
}
和Swing应用的直接跨q_不同QSWT/RCP应用要想同时支持不同q_Q需要做些特D的配置Q不qƈ不复杂,记录在此Q希望能帮到有需要的朋友。目前win32?2位Linux?4位Linux和Mac OS X基本上就覆盖了所有主的桌面操作pȝQ本文将以同时支持这四种OSZ来进行讲解?/p>
首先是下载对应版本的RCP框架在不同操作系l的插gQ将它们攑֜同一个plugins目录Q比如你可以用win32为基Q然后添加针对其他^台的如下插g:
org.eclipse.core.filesystem
org.eclipse.core.filesystem.win32.x86
org.eclipse.core.filesystem.linux.x86
org.eclipse.core.filesystem.linux.x86_64
org.eclipse.core.filesystem.macosx
org.eclipse.core.net
org.eclipse.core.net.win32.x86
org.eclipse.core.net.linux.x86
org.eclipse.core.resources
org.eclipse.core.resources.win32.x86
org.eclipse.equinox.launcher
org.eclipse.equinox.launcher.win32.win32.x86
org.eclipse.equinox.launcher.gtk.linux.x86
org.eclipse.equinox.launcher.gtk.linux.x86_64
org.eclipse.equinox.launcher.carbon.macosx
org.eclipse.equinox.security
org.eclipse.equinox.security.win32.x86
org.eclipse.equinox.security.macosx
org.eclipse.swt
org.eclipse.swt.win32.win32.x86
org.eclipse.swt.gtk.linux.x86
org.eclipse.swt.gtk.linux.x86_64
org.eclipse.swt.carbon.macosx
接下来将不同q_下的eclipse可执行文?Windows下面是eclipe.exeQLinux下是eclipseQMac OS X下面是Eclipse.app)攑ֈ不同的子目录下,当然Q如果你的RCP应用有别的名Uͼ也可以重命名eclipse可执行文Ӟ按照不同q_的规范更换图标,然后修改.ini文g让它?startup?startup.libraray参数指向相对路径中正版本的插g卛_?/p>
最后分享一下我们Y仉|的机制: 按照前面介绍的方式打包的应用E序Q交到用h里ƈ不是很友好,因ؓ需要他/她自己再做一ơ判断,当前的操作系l是什么,然后打开不同的目录去点击不同的可执行文g。我们的做法是单独提供一个SwingE序Q在客户端自动判断OSQ然后自动调用不同版本的可执行文Ӟ同时Q这个SwingE序被做成Java Web StartQ把整个RCP客户端的下蝲和同步也处理掉,q样Q对用户而言Q整个过E就透明了,只需要一个JNLPQ剩下的工作完全自动化?/p>
在Linux或其他UNIX和类UNIX环境下,ps命o惛_大家都不陌生Q我怿也有不少同学写过 ps aux | grep java | grep -v grep | awk '{print $2}' q样的管道命令来扑ևJavaq程的pid。常a道,Javaq真的"跨^?Q它自己是q_。作为^収ͼ当然也有些基本的工具Q让我们可以用更单、更l一Q同时又是非侵入的方式来查询q程相关信息。今天我们就来认识一下其中的两个?/p>
jps
思义Q它对应到UNIX的ps命o。用法如?
jps [ options ] [ hostid ]
其中Qoptions可以?-q (安静) -m (输出传递给mainҎ的参? -l (昄完整路径) -v (昄传递给JVM的命令行参数) -V (昄通过flag文g传递给JVM的参? -J (和其他Java工具cM用于传递参数给命o本n要调用的javaq程)Qhostid是主机idQ默认localhost?/p>
jstat
用于输出l定javaq程的统计信息。用法如?
jstat -options 可以列出当前JVM版本支持的选项Q常见的?-class (cd载器) -compiler (JIT) -gc (GC堆状? -gccapacity (各区大小) -gccause (最q一ơGCl计和原? -gcnew (新区l计) -gcnewcapacity (新区大小) -gcold (老区l计) -gcoldcapacity (老区大小) -gcpermcapacity (怹区大? -gcutil (GCl计汇? -printcompilation (HotSpot~译l计)
假定你要监控的Javaq程h12345Q那?br /> jstat -gcutil -t 12345 200 300 卛_?00毫秒q箋打印300ơ带有时间戳的GCl计信息?/p>
单解释一? -gcutil是传入的optionQ必选,-t是打印时间戳Q是以目标JVM启动旉v点计的Q可选;12345是vmid/pidQ和我们从jps拿到的是一LQ必选;200是监控时间间隔,可选,不提供就意味着单次输出Q?00是最大输出次敎ͼ可选,不提供且监控旉间隔有值的话,是无限期打C厅R?/p>
具体输出明细的解释请参考官Ҏ?http://download.oracle.com/javase/6/docs/technotes/tools/share/jstat.html
代码是从guithub的gist上抄的,单改了改Q原始代码见: http://gist.github.com/66925
q段代码解决的是l典的汉诺塔问题Q通过一根中柱,左׃64个大依ơ叠加的圆盘全部Ud到右柱,要求整个q程中每ơ只能移动一个圆盘,且每个圆盘只能独立占据一Ҏ子或是叠加在比自w更大的圆盘上?/p>
单分析一下就知道Q这是一个递归问题(FP的英雄特?Q?/p>
很容易发C个patternQ那是UdN(N>1)个圆盘,可以通过以下三个步骤Q?/p>
在解释代码之前,先说说Scala的implicit隐式转换Q这是一个非常powerful的ideaQ当Scala~译器发现类型不匚wQ它不会直接failQ而是试从代码中指定的,在scope内的implicit转换定义Q来替换问题对象或表辑ּ以满类型要求,当然Qؓ了避免歧义,同一时刻Scala需要找到唯一的一个满x件的implicit定义?/p>
我们的代码首先定义了一个取得友好类名的ҎQ不LI它Q然后定义了一个正整数的序列,也不LI它了,你只需要当作他们是正整数就好,接触qFP的同学应该对此类定义不陌生,接下来定义了如下3个支持implicit传入参数的方法:
含义分别是:
单说明:Scala用[]表示cd参数Q区别于Java?lt;>Q另外,Scala的类型声明在变量/函数定义之后。Move[_,A,B,C]的含义是通过CQ从AUd圆盘到B?/p>
我们来模拟运行一下,Z演示效果Q用一个中{复杂的数目Q?个圆盘,从LeftUd到Right?/p>
run[_3,Left,Right,Center]Q对应Move[Succ[_2],Left,Right,Center]Q于是展开成三个MoveQ?/p>
Move[_2,Left,Center,Right]即Move[Succ[_1],Left,Center,Right]
Move[_1,Left,Right,Center]
Move[_2,Center,Right,Left]即Move[Succ[_1],Center,Right,Left]
然后l箋展开Move[_2,Left,Center,Right]和Move[_2,Center,Right,Left]Q得刎ͼ
Move[_1,Left,Right,Center]
Move[_1,Left,Center,Right]
Move[_1,Right,Center,Left]
--------------------------
Move[_1,Left,Right,Center]
--------------------------
Move[_1,Center,Left,Right]
Move[_1,Center,Right,Left]
Move[_1,Left,Right,Center]
q个时候已l全部都匚wMove[_1,A,B,C]Q于是我们很Ҏ得到以下输出Q?/p>
Move from Left to Right
Move from Left to Center
Move from Right to Center
Move from Left to Right
Move from Center to Left
Move from Center to Right
Move from Left to Right
希望本文能带lScala初学者一些感性认识和启发?/p>
String str = ...
if ("".equals(str)) {}