Eclipse快捷键问题

Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复 制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用, 可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑 的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在 当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定 位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或 View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速 显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速 显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小 键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用 Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+J 正 向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一 个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关 闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变为大写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要 在匹配符里面,后面到前面,则反之)

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是 Alt+Shift开头的了)
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多 劳动力)
Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)
Alt+Shift+C 修 改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取 成一个变量,尤其是多处调用的时候)
Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)
Alt+Shift+I 合 并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药 (Undo)

编辑
作用域 功能 快捷键
全局 查找并替换 Ctrl+F
文本编辑器 查找上一 个 Ctrl+Shift+K
文本编辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全 局 恢复上一个选择 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅 助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+?
Alt+Shift+?
Ctrl+Shift+Space
Java 编辑器 显示工具提示描述 F2
Java编辑器 选择封装元素 Alt+Shift+↑
Java编辑器 选择上一个元 素 Alt+Shift+←
Java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J
文 本编辑器 增量逆向查找 Ctrl+Shift+J
全局 粘贴 Ctrl+V
全局 重做 Ctrl+Y

查 看
作用域 功能 快捷键
全局 放大 Ctrl+=
全局 缩小 Ctrl+-

窗口
作用 域 功能 快捷键
全局 激活编辑器 F12
全局 切换编辑器 Ctrl+Shift+W
全局 上一个编辑 器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全 局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本编辑器 显示 标尺上下文菜单 Ctrl+W
全局 显示视图菜单 Ctrl+F10
全局 显示系统菜单 Alt+-

导 航
作用域 功能 快捷键
Java编辑器 打开结构 Ctrl+F3
全局 打开类型 Ctrl+Shift+T
全 局 打开类型层次结构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资 源 Ctrl+Shift+R
全局 后退历史记录 Alt+←
全局 前进历史记录 Alt+→
全局 上一 个 Ctrl+,
全局 下一个 Ctrl+.
Java编辑器 显示大纲 Ctrl+O
全局 在层次结构中打开类 型 Ctrl+Shift+H
全局 转至匹配的括号 Ctrl+Shift+P
全局 转至上一个编辑位置 Ctrl+Q
Java 编辑器 转至上一个成员 Ctrl+Shift+↑
Java编辑器 转至下一个成员 Ctrl+Shift+↓
文本编辑器 转至 行 Ctrl+L

搜索
作用域 功能 快捷键
全局 出现在文件中 Ctrl+Shift+U
全 局 打开搜索对话框 Ctrl+H
全局 工作区中的声明 Ctrl+G
全局 工作区中的引用 Ctrl+Shift+G

文 本编辑
作用域 功能 快捷键
文本编辑器 改写切换 Insert
文本编辑器 上滚行 Ctrl+↑
文本编辑器 下 滚行 Ctrl+↓

文件
作用域 功能 快捷键
全局 保存 Ctrl+X
Ctrl+S
全 局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关 闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新建 Ctrl+N

项目
作 用域 功能 快捷键
全局 全部构建 Ctrl+B

源代码
作用域 功能 快捷键
Java编辑 器 格式化 Ctrl+Shift+F
Java编辑器 取消注释 Ctrl+\
Java编辑器 注释 Ctrl+/
Java 编辑器 添加导入 Ctrl+Shift+M
Java编辑器 组织导入 Ctrl+Shift+O
Java编辑器 使用 try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。
也可以使用Ctrl+1自动修正。

运 行
作用域 功能 快捷键
全局 单步返回 F7
全局 单步跳过 F6
全局 单步跳入 F5
全局 单步跳入 选择 Ctrl+F5
全局 调试上次启动 F11
全局 继续 F8
全局 使用过滤器单步执行 Shift+F5
全 局 添加/去除断点 Ctrl+Shift+B
全局 显示 Ctrl+D
全局 运行上次启动 Ctrl+F11
全局 运行 至行 Ctrl+R
全局 执行 Ctrl+U

重构
作用域 功能 快捷键
全局 撤销重 构 Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内 联 Alt+Shift+I
全局 移动 Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重 做 Alt+Shift+Y

=====================================================================

重点是红色部分:在选中代码上执行

Ctrl + Shift + /

可以实现块注释代码,比如选中:

String v = “test”;

int b = 1 ;

执行Ctrl + Shift + /  后

/*String v = “test”;

int b = 1 ;*/

如果这时候,我使用Ctrl + Shift + F 格式化代码,变成

/*

* String v = “test”;

* int b = 1 ;

*/

如果想使用Ctrl + Shift + \  来取消这个代码块的注释,变成

* String v = “test”;

* int b = 1 ;

也就是Ctrl + Shift + \ 不能去掉每行代码前的 * 号,这个应该是一个bug。


linux下一些有意思的命令

最近有人问我关于页面中的联系方式是怎么生成的,这个也是从我朋友那里受到的启发。

这个主要是为了告诉网络机器人“非诚勿扰”,其实大家把联系方式做成图片更好。

正题:

1. echo “xxxxx@gmail.com” | xxd -ps -u

得到:787878787840676D61696C2E636F6D0A

2. echo “ibase=16; 787878787840676D61696C2E636F6D0A” | bc

得到: 160132878550962084828530736251255352586

3. dc -e  160132878550962084828530736251255352586P

得到: xxxxx@gmail.com

当然还有更简单的,用base64编码

1. echo “xxxxx@gmail.com” | base64 -i

得到: eHh4eHhAZ21haWwuY29tCg==

2. echo “eHh4eHhAZ21haWwuY29tCg==” | base64 -d

得到:  xxxxx@gmail.com

ant + ivy + nexus + hudson 搭建团队开发环境

最近一直在搞ant + ivy + nexus + hudson 开发环境,遇到了一些问题,最后还是解决了,这里做一个笔记.

我这里不讨论为什么用ant + ivy 而不是maven ,就像你没有熟练使用过windows,就在那里大谈linux多么好一样,没意义,这两个软件本身的功能和面向的问题都不一样。

分别介绍一下这四个软件:

1. ant(项目主页:http://ant.apache.org

java世界里的make,一个成熟的java构建工具,用户众多。

2. ivy (项目主页:http://ant.apache.org/ivy

为ant而生的一个依赖管理工具.

3. nexus(项目主页:http://nexus.sonatype.org/

仓库管理工具,同类产品比较多,但没有使用过,初次使用nexus几乎连它的官方网站都没怎么看,直接就去下载了最新的1.6 war包来安装,看着菜单栏随便点击了一会就上路了,不由感叹了一下多么强大的软件啊。(软件本来就是做来让人用的,不是用来研究的,所以那些文档看起来都很晦涩的软件,基本都得不到很好的推广)

如果你已经使用ant + ivy 来开发java项目,那么eclipse插件IvyIDE你应该也知道了,一个很好用的东东。

4. nexus(项目主页:http://www.hudson-ci.org/

一个可扩展的持续集成服务。

——————————————————————-

这次搭建过程很多资料都是来自javaeye,参考资料:

IVY尝试

还有一个中文文档翻译

ubuntu环境下使用subclipse提示不能加载JavaHL Library

最近发现eclipse老弹出窗口说不能加载JavaHL 包,按照javaeye网友提示,sudo apt-get install libsvn-javahl 的时候发现根本找不到这个包,在ubuntu官方package里面搜索找到了libsvn-java

原来ubuntu10.04下的包名已经改成libsvn-java,而不是libsvn-javahl.

言不由衷的要感叹一下google的收录功能

最近自己在博客上写文章时候,无意用刚刚发布的文章的标题去google搜索,发现第一条记录就是自己刚发布的那条,很是惊讶,心想google的收录有这么快吗,我甚至将标题打乱再去搜索,都能在第一页看到我的文章、

我分析了一下,按常理对网络爬虫的理解应该是定时过来抓取的,不会一直监控我的博客,但google怎么做到的呢?

原来我发现google最近推出了一个新功能,网络历史记录,如果你的浏览器一直处于google帐户登录状态,你在右上方就能看到那个功能。

因为我发布文章后,都会去博客主页点击一下这篇文章,google就搜集到了我的网络访问历史,同时将这个访问记录提交到他的计算平台上,然后网络爬虫就过来了。

google的计算平台肯定很快,所以我能马上看到被抓取的结果。

感叹啊,这算不算google伟大的功能呢?

svn怎样目录合并

最近开发小组采用了分支开发,分支发开避免不了要合并的问题,合并的时候有这样的情况:

如果一个分支开发的时候只是在主干的某一个目录下做了修改,添加,删除文件的操作,而且这样操作到的文件比较多,合并人员这时候肯定是希望只在这个目录上来选择合并。

然而由于我们的svn服务端使用的是1.4.x的版本,svn客户端(eclipse下的subclipse)是1.6.x的,选择目录合并的时候服务端会提示:svn: Retrieval of mergeinfo unsupported by ‘xx.xx.xx.xx’

也就是说1.4.x的服务端是不支持目录合并。

这时候要升级svn服务端(升级到1.6.x),但是升级到1.6.x的后,发现还是不能目录合并。

经过分析,在升级之前,我的一个项目(project-a)源代码路径为:/abc/a/project-a,因为svn对所有目录都有版本号控制,所以升级服务端后还要对svn代码库也升级

#> svnadmin upgrade  代码库路径

升级后,终于可以合并目录了。

对于mysql中出现大量SHOW FULL COLUMNS FROM问题的跟踪

最近同事反映 mysql 的slow-query.log日志中发现很多查询语句后面带有

SHOW FULL COLUMNS FROM ….

而且是一个查询语句对应很多条这样的语句。
同事让我查明原因,同时提供了一个线索,我们之前用的mysql-connector-java是3.0版本没有出现这样的情况,升级到5.0.8后才出现的。
我当时分析应该是mysql-connector-java包的问题,后来用mysql-connector-java-5.0.8单独测试查询发现不会出现SHOW FULL COLUMNS FROM …,这个线索就变得没用了。
后来查找公司自己封装的一个公共数据库链接池包中,发现查询方法返回的是CachedRowSet,同时这是调用的com.cun.rowset.CachedRowSetImpl实现类。
翻看CachedRowSetImpl实现类源码,他中间有个方法initMetaData()

...
    md.setColumnCount(numCols);
             for (int col=1; col <= numCols; col++) {
                 md.setAutoIncrement(col, rsmd.isAutoIncrement(col));
                 if(rsmd.isAutoIncrement(col))
                     updateOnInsert = true;
                 md.setCaseSensitive(col, rsmd.isCaseSensitive(col));
                 md.setCurrency(col, rsmd.isCurrency(col));
...

这个isCaseSensitive(col)就是判断字段名是否大小写敏感,这个方法就会去调用mysql-connector-java的方法执行SHOW FULL COLUMNS FROM,而且从代码中看出这个sql的执行次数与数据库表的字段数相关。
如果字段很多,这样每select一次就会查执行很多SHOW FULL COLUMNS FROM,对于大量查询的系统肯定会导致mysql性能问题。

个人有些疑问:为什么每个字段都要去查询呢?不能一次查出来吗?

临时解决办法:将md.setCaseSensitive(col, rsmd.isCaseSensitive(col)); 改为md.setCaseSensitive(col,true);

总结:尽量不要使用sun公司的内部包,本来这就是不推荐的,发现bug都不好解决。
在mysql官方社区中找到了相关问题
===============================
经过上线测试,发现mysql性能明显提升,网络传输也大大减少.

ubuntu安装的初级建议

ubuntu是一个让人又爱又恨的桌面linux系统,爱的原因是它优秀的桌面,强大的可用性,稳定的周期性开发,大众华的社区支持,等等,那些热爱ubuntu的人可以说出一大堆好处。
那可恨的是什么呢?不同的硬件环境,始终不能做到平滑升级,尽管ubuntu的团队一直在努力,但是效果都不够理想,我尝试过几个版本的升级安装,多少都出了点状况,也许那些从来没有升级失败的人要站出来反驳,我接受,世界本来就有很多我不了解的,所以我每次的结果都是从光盘安装才取得成功,试想我每次都从光盘安装,最后那张光盘到底是ubuntu爱好者的历史纪念品还是废品呢,虽然微软也是光盘发布windows,可是一张盗版的xp可以用很多年,我甚至还有大学第一次安装xp的光盘,我们是不是该低碳呢?

好了,既然每次都光盘安装,那是不是我每次都要反复安装我习惯的软件,调整适合我自己的设置呢,答案是一定的,但是可以总结经验的。

下面的建议针对个人pc

1.安排合理的分区结构

/boot       1G (系统内核和grub存放位置,实际上256M都够了,硬盘空间都那么大了何必那么吝啬)

/             这个分区20G吧,这个分区主要存放系统,和一些你自己要安装的软件

/home     剩余的空间都分到这个分区,这是你经常使用到的分区。

还有就是swap分区,2G足够了,也有推荐说是物理内存的两倍,个人pc没必要那么大,除非你经常开很多软件,经常待机,linux真正使用到swap分区的时候,它已经变得很慢了。

当然还有人喜欢把/var  , /usr , /usr/local都单独分出来,那样做也可以,我没有这样做。

有了上面的分区,把一些个性配置都放到 /home个人目录下的 .XXX文件里面(比如: .vimrc),个人使用的开发工具都安装到个人目录,这样下次光盘全新安装的时候,就不会被删除,比如我经常使用的java jdk,eclipse,xmind都是自己指定安装路径,没有通过apt来安装。

2.做一些文件备份

一个朋友将修改过的一些系统配置文件(例如/etc/profile)都备份到个人目录,下次光盘安装后,再覆盖一下就可以了,其实ubuntu在升级安装的时候会去检测这些关键的配置文件是否被改动过,它会提示你是不是要覆盖你的修改,默认是不覆盖,但个人还是建议最好让它覆盖,你自己再来覆盖它。

说ubuntu很强大是因为你没必要太多的修改他的一些桌面环境,它已经做得很好了,如果你非要看起来不一样,就hack它吧。

Apache基金会被攻击,密码遭窃

首先见到这个消息是来自于朋友的网站开源中国社区,然后顺着消息的来源,找到了apache官方发言,这是一起典型的XSS跨站攻击(不清楚的同学可以google一下什么是XSS跨站攻击),整个过程apache官方描述得很清楚,最有趣的是,apache描述那家叫做http://www.slicehost.com虚拟主机的公司,

Unfortunately, SliceHost did nothing and 2 days later, the very same virtual host (slice) attacked Atlassian directly.

难道这是虚拟主机商的通病?个人在这里只是总结一下前辈们的经验。

  • 1.input is a devil (一位资深的安全专家感言)。
    特别是互联网上,对于所有来自于用户的输入,都应该先把用户想象成黑客,而不是你认为的忠实用户。
  • 2.密码的复杂度,和密码修改的策略。
    没有破解不了的密码,只是时间问题。
  • 3.计算机服务应该尽量保证独立。
    这就是虚拟机,虚拟服务等虚拟概念大行其道的原因。
  • 4.如果家里放了贵重的东西,那么出门前请锁好门,花点钱买一条好警犬,这样还不够,在家里装上监视器。
  • 5.计算机真正最大的安全问题,来自于内部(一位资深的安全专家感言)。
    这条规则虽然和本文关系不大,但是个人深有体会,黑客要花1小时,1天甚至1年才能破解的密码,内部人员却只需要几秒钟就能将它泄漏。

小贴士:推荐一款安全监控软件fail2ban

svn关键词BASE, HEAD, COMMITTED, PREV的深入理解

(@转载请注明出处:http://blog.csdn.net/cmatch)
svn关键词BASE, HEAD, COMMITTED, PREV可以很方便用于日常操作中,但是很多人对他们的工作原理和方式不是太了解。

在这里我将使用用例,诠释他们的作用和意图。

先给出svn手册中对他的解释:

“HEAD” latest in repository
“BASE” base rev of item’s working copy
“COMMITTED” last commit at or before BASE
“PREV” revision just before COMMITTED

HEAD表示在版本库中最新的版本,记住一定是版本库,而不是某个working-copy, 另外需要注意的是,这里提到版本库是指对应working-copy的那个分支或主干。

COMMITTED表示在working-copy中最近的一次提交版本。

PREV表示在working-copy中最近的倒数第二次提交版本,也就是COMMITTED – 1。

前面3个概念都是比较好理解的。

最后一个BASE有点不好理解,先给出例子,最后结论BASE的含义

1. -bash-2.05b$ svn co http://svn.corp/…/proxyio/
2. A proxylog/proxyio.procinfo
3. A proxylog/pi.cpp
4. A proxylog/Makefile
5. A proxylog/run.sh
6. Checked out revision 134057.
7.
8. -bash-2.05b$ svn st -v
9. 134057 134034 deyi.long .
10. 134057 102502 deyi.long proxyio.procinfo
11. 134057 134034 deyi.long pi.cpp
12. 134057 102674 deyi.long Makefile
13. 134057 114428 deyi.long run.sh
14. 备注:第一列表示BASE, 第二列表示COMMITTED

可以看出checkout一个working-copy后,svn会给这个working-copy分一个新的、统一的BASE版本号(如 134057)。

接下来可以修改pi.cpp代码,然后checkin,你就会发现这个文件的BASE和COMMITTED会同时增加,并且相等。如下

1. -bash-2.05b$ svn st -v
2. 134057 134034 deyi.long .
3. 134057 102502 deyi.long proxyio.procinfo
4. 134058 134058 deyi.long pi.cpp
5. 134057 102674 deyi.long Makefile
6. 134057 114428 deyi.long run.sh
7.

接下来在此目录下执行update动作,你就会发现所有文件的BASE都进行了升级,但是COMMITTED没有改变,如下

1. -bash-2.05b$ svn up
2. At revision 134058.
3.
4. -bash-2.05b$ svn st -v
5. 134058 134034 deyi.long .
6. 134058 102502 deyi.long proxyio.procinfo
7. 134058 134058 deyi.long pi.cpp
8. 134058 102674 deyi.long Makefile
9. 134058 114428 deyi.long run.sh
10.

通过上述用例,可以看出BASE表示在working-copy中每个文件基准版本,会经常变动,并且有统一working-copy的版本的意图。另外,也说明对每个文件来说,BASE就是COMMITTED的别名,但是它可以和其他文件BASE保持一致,用于统一,批量处理.

Page 1 of 212»