13 October 2013

Eclipse快捷键与使用技巧总结

此文档主要介绍个人认为比较实用的技巧,常用技巧不做介绍。资料来源于网络,自己再集中整理的。
一、实用类快捷键
1 常用熟悉的快捷键
CTRL+C(复制)、CTRL+X(剪切)、CTRL+Z(撤销)、CTRL+F(查找)、CTRL+H(搜索文件或字符串)、CTRL+Y(重做)、CTRL+/(双斜杠注释)、ALT+/(提示)、CTRL+SHIFT+F(格式化代码)
2 编码辅助类
1)CTRL+D
删除当前行。
2)CTRL+ALT+Down(Up)
复制当前行到下(上)一行中。比CTRL+C单纯的复制功能要方便好用(省掉了粘贴步骤),主要是用在编写代码时,需要移动代码的地方。
3)ALT+Down、ALT+Up。
移动单行(多行)代码。也是比CTRL+C更好的快捷键。
4)ALT+SHIFT+J(建议要使用)
给类,方法,变量添加注释,在类,方法,变量首行,按下此组合键。之所以要建议使用,是为了代码的规范性。现在很多人都没有给自己写的类,方法,变量加上doc文档注释,根本无法生成api 文档。因此每个人在添加一个类、方法时,必须给它加上标准的doc文档注释。(添加类注释有更简便的方法,看后面的配置章节)
5)CTRL+1
Fixed 的快捷键,提示代码错误原因以及处理办法。跟双击代码中的红叉一样的功能。这是一个很常用功能。一般用于修改语法错误。但是个人觉得用在增加接口方法(或参数),类方法(或参数),更能体现出它的便捷之处。比如当你想为一个接口或类增加一个方法,只许在要调用的地方写上你的方法和参数(先不要定义),CTRL+1,选择 create method…就可以自动为你增加想要的方法,省了很多要写的代码。本质是先制造一个错误的语法,让系统自动修复功能帮我们完成代码。
6)CTRL+2
修改变量名,定义变量。按下快捷键,会弹出一个快捷键列表(窗口右下角),在选择你要的操作。
3 快速定位---快捷键
1)CTRL+SHIFT+R(非常好用)
在eclipse中快速定位文件(任何类型)。有了这个,只要记得文件的大概名字,就可以通过模糊查询,搜索出来。就不需要为了打开某个模块中的某个java类,得一个个文件的找了。在学习源码的时候,更是少不了它。
2)CTRL+O
在文件中查找变量或方法。我们一般的做法是,拉动滚动条一个个的找到自己的要的方法。现在只要输入方法的前面名字,就可以快速过滤出你所要的方法。
3)CTRL+Q
返回上次编辑的地方。有时我们打开太多的java类,当需要返回刚刚编辑过的地方时,这个键可以一步到位。非常好用。
4)CTRL+T
打开某个方法的声明。通过这个,可以快速找到这个方法所属的类或接口,查看该方法的内容。
5)CTRL+W。
关闭正在编辑的活动窗口。
6)CTRL+K(向下查找), CTRL+SHIFT+K(向上查找)
当选中某个字符串后,按这个快捷键,可以在当前文档快速定位到再次出现该字符窜的位置。CTRL+F(查找)好用吗?但跟这个相比,却要逊一筹。因为不需要打开查找窗口,不需要再输入查找的字符,仅仅是选中你要查找的内容。在查找变量,方法时非常实用。
7)CTRL+J
上面的查找功能有个限制,如果当前没有要查找的字符,需要手工输入时,就不好办了。CTRL+J,就可以帮得上忙了。只要按下此键,输入你想要的字符窜,你就可以看到光标在页面中不断跳转,定位到你所想要的。
8)CTRL+L
定位到第几行
9)CTRL+E
选择要激活的文件窗口
10)CTRL+, CTRL+. (或者ALT+Left,ALT+Right)
定位你上(前)一步浏览的那个位置(或错误)。你曾经浏览过几个java文件,当你转到其他文件后,又想回到刚才访问的文件,那就用这个键吧。或者通过工具栏上的按钮。
11)ALT+SHIFT+Z
选中一段代码,按下此键,看看出现什么??这应该是你想要的。
12)在package explorer视图 右上角的按钮
有左右箭头的按钮,该按钮处于按下状态时,可以使打开的文件和导航视图中的文件同步。
4 其他
1) CTRL+M  窗口最大化
2) CTRL+SHIFT+L (打开快捷键面板), CTRL+SHIFT+L(2) 快速按下L两次(打开快捷键配置面板)
3)ALT+SHIFT+T 重构功能的面板的快捷键
4)ALT+SHIFT+S 代码的编辑功能面板的快捷键
5) 多使用右键,多观察记住你经常使用的操作的快捷键。
此篇介绍的快捷键都是里面的默认配置,也紧紧是其中的很少 部分,更多,更好的快捷键,你都可以去体验。

二、 重构类快捷键
多使用重构功能,可以帮我们更快的修改代码,减少出错的概率。
1 ALT+SHIFT+R修改变量、方法名。
在编码过程中,我们最经常做的操作是,修改变量名称。当变量用于java类中很多地方的时候,修改就比较麻烦,如果没有重构,就得一个一个的修改。如果用重构修改名字,只需要修改一次修改操作。
2 重构菜单
1) 菜单-->refactor
2) 在编辑环境中,右键-->refactor (快捷键ALT+SHIFT+T)
三、配置eclipse
了解了这部分,可以减少我们的代码输入,提高效率,更快的完成我们的类,让你写代码更轻松,写出的代码更加规范。
1 模板配置
现在我们最常用的快捷键可能是ALT+/,或者在输入一个单词的一部分之后,让它弹出辅助代码。而这些都是通过模板来配置,打开菜单:window-->preferences-->java-->editor-->templates
在右边的列表中,可以看到系统中已经给我们预置了很多的模板。在我们写代码的时候,只要在空白地方使用快捷键ALT+/,就可以看到它们。如:sysout,systrace,main,test,还有很多for,while,if模板。还可以添加自己的模板进去,重复使用。这就相当灵活了。
自动生成注释的模板:除了以上的模板外,其实还有一个可定制的模板。就是当你用快捷键(ALT+SHIFT+J)为一个类生成doc注释的时候,eclipse也是通过模板来生成的。如果我们改了这个模板,以后就可以生成完全个性化的注释了。
打开菜单:window-->preferences-->java-->codestyle-->code template
一个最常用的功能时,给类添加注释的时候,会将作者的姓名,创建时间等个性化的信息写进去。
例如:打开右边面板的commentsàTypes 修改其内容为:
/**
*xx系统:<br>
*@authorXXX<br>
* ${date} ${time}
*${tags}
*/
当你为一个类添加注释时,你就会看到效果了。
或者当你fileànewàclass时,在新建面板的下边,会有一个选项Generate comments,选中。打开该新建类,就可以看到效果。
2 代码风格样式
当我们使用快捷键CTRL+SHIFT+F的时候,eclipse就会帮我们格式化代码,使代码更符合规范,更整齐。
修改样式模板:window-->preferences-->java-->codestyle-->formator-->右边面板的edit按钮。
转载请注明出处 http://blog.csdn.net/xn4545945

03 October 2013

高效的MySQL分页


PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的报告,有很多亮点,本文是在原文基础上的进一步延伸。
首先看一下分页的基本原理:
mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20\G ***************** 1. row ************** id: 1 select_type: SIMPLE table: message type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 10020 Extra: 1 row in set (0.00 sec)
limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。
文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候SQL语句可以是:
1SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20;
处理”下一页”的时候SQL语句可以是:
1SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 20;

不管翻多少页,每次查询只扫描20行。
缺点是只能提供”上一页”、”下一页”的链接形式,但是我们的产品经理非常喜欢”<上一页 1 2 3 4 5 6 7 8 9 下一页>”这样的链接方式,怎么办呢?
如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的”clue”做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,比如要跳到第8页,我看的SQL语句可以这样写:
1SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20,20;
跳转到第13页:
1SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;

原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。
注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。
已在60W数据总量的表中测试,效果非常明显。

30 September 2013

JS倒计时大全


<form name="form1">     <div align="center" align="center">         <center>离2012年<span class='wp_keywordlink_affiliate'><a href="http://lxy.me/tag/世界末日" title="查看 世界末日 中的全部文章" target="_blank">世界末日</a></span>还有:<br>             <input type="textarea" name="left" size="35" style="text-align: center">         </center>     </div> </form> <script LANGUAGE="javascript">     startclock()     var timerID = null;     var timerRunning = false;     function showtime() {         Today = new Date();         var NowHour = Today.getHours();         var NowMinute = Today.getMinutes();         var NowMonth = Today.getMonth();         var NowDate = Today.getDate();         var NowYear = Today.getYear();         var NowSecond = Today.getSeconds();         if (NowYear < 2000)             NowYear = 1900 + NowYear;         Today = null;         Hourleft = 00 - NowHour         Minuteleft = 00 - NowMinute         Secondleft = 00 - NowSecond         Yearleft = 2012 - NowYear         Monthleft = 12 - NowMonth - 1         Dateleft = 21 - NowDate         if (Secondleft < 0) {             Secondleft = 60 + Secondleft;             Minuteleft = Minuteleft - 1;         }         if (Minuteleft < 0) {             Minuteleft = 60 + Minuteleft;             Hourleft = Hourleft - 1;         }         if (Hourleft < 0) {             Hourleft = 24 + Hourleft;             Dateleft = Dateleft - 1;         }         if (Dateleft < 0) {             Dateleft = 31 + Dateleft;             Monthleft = Monthleft - 1;         }         if (Monthleft < 0) {             Monthleft = 12 + Monthleft;             Yearleft = Yearleft - 1;         }         Temp = Yearleft + '年, ' + Monthleft + '月, ' + Dateleft + '天, ' + Hourleft + '小时, ' + Minuteleft + '分, ' + Secondleft + '秒'         document.form1.left.value = Temp;         timerID = setTimeout("showtime()", 1000);         timerRunning = true;     }     var timerID = null;     var timerRunning = false;     function stopclock() {         if (timerRunning)             clearTimeout(timerID);         timerRunning = false;     }     function startclock() {         stopclock();         showtime();     }     // -->   </script>    

2.小时倒计时,可用于在线考试
<SCRIPT LANGUAGE="JavaScript">     <!--     var maxtime = 60 * 60 //一个小时,按秒计算,自己调整!       function CountDown() {         if (maxtime >= 0) {             minutes = Math.floor(maxtime / 60);             seconds = Math.floor(maxtime % 60);             msg = "距离结束还有" + minutes + "分" + seconds + "秒";             document.getElementByIdx_x("timer").innerHTML = msg;             if (maxtime == 5 * 60) alert('注意,还有5分钟!');             --maxtime;         }         else {             clearInterval(timer);             alert("时间到,结束!");         }     }     timer = setInterval("CountDown()", 1000);     //-->   </SCRIPT> <div id="timer" style="color:red"></div>  
3.简单倒计时(仅显示天数)
<Script Language="JavaScript">     var timedate = new Date("January 14,2013");     var times = "研究生<span class='wp_keywordlink_affiliate'><a href="http://lxy.me/tag/考试" title="查看 考试 中的全部文章" target="_blank">考试</a></span>";     var now = new Date();     var date = timedate.getTime() - now.getTime();     var time = Math.floor(date / (1000 * 60 * 60 * 24));     if (time >= 0) ;     document.write("<li><font color=#DEDBDE>现在离2013年" + times + "还有: <font color=red><b>" + time + "</b></font> 天</font></li>"); </Script>  
4.复杂版倒计时,带毫秒
<script language="JavaScript" type="text/javascript">     function d<span class='wp_keywordlink_affiliate'><a href="http://lxy.me/tag/js" title="查看 js 中的全部文章" target="_blank">js</a></span>() {         var urodz = new Date("11/12/2008");         var now = new Date();         var num         var ile = urodz.getTime() - now.getTime();         var dni = Math.floor(ile / (1000 * 60 * 60 * 24));         if (dni > 1)             num = dni + 1         else         if (dni == 1)             num = 2         else         if (dni == 0)             num = 1         else             num = 0         document.write(num)     } </script>
距某某开幕式还有 [ <script language="JavaScript" type="text/javascript">d<span class='wp_keywordlink_affiliate'><a href="http://lxy.me/tag/js" title="查看 js 中的全部文章" target="_blank">js</a></span>()</script>] 天 第五个:Javascript倒计时器 - 采用系统时间自校验 这次利用系统时间自校验倒计时, 无需手工调校使得倒计时更为精确, 代码及详细注释如下:
<span id="clock">00:01:11:00</span> <input id="startB" type="button" value="start countdown!" onclick="run()"> <input id="endB" type="button" value="stop countdown!" onclick="stop()"> <br> <input id="diff" type="text"> <input id="next" type="text"> <script language="Javascript">         var normalelapse = 100;     var nextelapse = normalelapse;     var counter;     var startTime;     var start = clock.innerText;     var finish = "00:00:00:00";     var timer = null;
    // 开始运行       function run() {         startB.disabled = true;         endB.disabled = false;         counter = 0; // 初始化开始时间           startTime = new Date().valueOf();
// nextelapse是定时时间, 初始时为100毫秒   // 注意setInterval函数: 时间逝去nextelapse(毫秒)后, onTimer才开始执行           timer = window.setInterval("onTimer()", nextelapse);     }
    // 停止运行       function stop() {         startB.disabled = false;         endB.disabled = true;         window.clearTimeout(timer);     }
    window.onload = function () {         endB.disabled = true;     }
    // 倒计时函数       function onTimer() {
        if (start == finish) {             window.clearInterval(timer);             alert("time is up!");             return;         }
        var hms = new String(start).split(":");         var ms = new Number(hms[3]);         var s = new Number(hms[2]);         var m = new Number(hms[1]);         var h = new Number(hms[0]);
        ms -= 10;         if (ms < 0) {             ms = 90;             s -= 1;             if (s < 0) {                 s = 59;                 m -= 1;             }
            if (m < 0) {                 m = 59;                 h -= 1;             }         }
        var ms = ms < 10 ? ("0" + ms) : ms;         var ss = s < 10 ? ("0" + s) : s;         var sm = m < 10 ? ("0" + m) : m;         var sh = h < 10 ? ("0" + h) : h;
        start = sh + ":" + sm + ":" + ss + ":" + ms;         clock.innerText = start;
// 清除上一次的定时器           window.clearInterval(timer);
// 自校验系统时间得到时间差, 并由此得到下次所启动的新定时器的时间nextelapse           counter++;         var counterSecs = counter * 100;         var elapseSecs = new Date().valueOf() - startTime;         var diffSecs = counterSecs - elapseSecs;         nextelapse = normalelapse + diffSecs;         diff.value = counterSecs + "-" + elapseSecs + "=" + diffSecs;         next.value = "nextelapse = " + nextelapse;         if (nextelapse < 0) nextelapse = 0;
// 启动新的定时器           timer = window.setInterval("onTimer()", nextelapse);     } </script>