java中i=i++问题分析【转载】

java中i=i++问题分析【转载】

有这么一道java题目,让人觉得很费解:

1
2
3
int i = 0;
i = i++;
System.out.println(i);

i打印出的结果是0!!相同的表达式在C中则是我们所想象的1!!这个问题从字节码角度考虑就比较容易理解了。下面给出我搜到的一个分析的比较清楚的帖子,给大家看看:
原帖地址:http://piaoboqiu.blog.163.com/blog/static/123127827200910192122472/
具体测试一下以说明问题:
代码1:

1
2
3
4
5
6
7
public class Test{
public static void main(String[] args){
int i=0;
i=i++;
System.out.println(i);
}
}

结果i依然是0.分析其反编译后的代码:

1
2
3
4
5
6
7
8
9
10
11
public static void main(java.lang.String[]);
Code:
0: iconst_0 //0放到栈顶
1: istore_1 //把栈顶的值保存到局部变量1,也就是i中
2: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0
3: iinc 1, 1 //注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
6: istore_1 //把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return

值得注意到是i被修改了两次,第一次是i++;i变为1,最后一次是i=0;所以结果i是0
代码2:

1
2
3
4
5
6
7
8
9
public class Test2{
public static void main(String[] args){
int i=0;
int j=0;
j=i++;
System.out.println(i);
System.out.println(j);
}
}

这个结果肯定都知道,i是1,j是0.同样看反编译之后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1 //i=0
2: iconst_0
3: istore_2 //j=0
4: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0
5: iinc 1, 1 //局部变量1加1,也就是让i++了,此时i已经是1了,上面说过,此指令不会导致栈变化
8: istore_2 //把栈顶的值(注意是0)存入局部变量2,也就是j中,所以j=0
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return

很明显可以看出,java是先把i的值取出来放到栈顶,我们可以认为是引入了第三个变量int k=i;然后i++,这时候i为1了,然后让j=k;也就是0.结论,i的++运算是在对j这个变量的赋值之前完成的。
代码3:

1
2
3
4
5
6
7
8
9
public class Test3{
public static void main(String[] args){
int i=0;
int j=0;
j=++i;
System.out.println(i);
System.out.println(j);
}
}

结果大家也都知道,i=1,j=1
看操作过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1 //i=0
2: iconst_0
3: istore_2 //j=0
4: iinc 1, 1 //局部变量i加1,这时候i变成1了 。
7: iload_1 //把i的值放到栈顶,栈顶的值是1
8: istore_2 //j=1
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return

对比代码2和代码3,关键的差别就是iload_1   个iinc这两条指令的位置变了。
上面这个帖子偏重于底层,对于java字节码不熟悉的童鞋可能一时不会理解,没关系,下面我贴出另一个帖子,大家应该就明白了:
原帖地址:http://www.ticmy.com/?p=43

int i = 0``; i = i++;

结果还是0
为什么?
程序的执行顺序是这样的:因为++在后面,所以先使用i,“使用”的含义就是i++这个表达式的值是0,但是并没有做赋值操作,它在整个语句的最后才做赋值,也就是说在做了++操作后再赋值的,所以最终结果还是0
让我们看的更清晰点:

int i = 0``;``//这个没什么说的 i = i++;``//等效于下面的语句:
int temp = i;``//这个temp就是i++这个表达式的值 i++; //i自增 i = temp;``//最终,将表达式的值赋值给i

这是java里的实现,当然在其他的语言如c或是c++中可能并不是这么处理的,每种语言都有各自的理由去做相应的处理。
这警示我们:不要在单个的表达式中对相同的变量赋值超过一次
让我们从字节码层次看一看,源码如下:

public class Test { public static void main(String... args) { int i = 0``; i = i++; System.out.println(i); } }

使用javac编译后再使用javap -c Test反编译这个类查看它的字节码,如下(只摘取main方法):
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_1
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
这里,我从第0行开始分析(分析中【】表示栈,栈的底端在左边,顶端在右边):
0:将常数0压入栈,栈内容:【0】
1:将栈顶的元素弹出,也就是0,保存到局部变量区索引为为1(也就是变量i)的地方。栈内容:【】
2:将局部变量区索引为1(也就是变量i)的值压入栈,栈内容:【0】
3:将局部变量区索引为1(也就是常量i)的值加一,此时局部变量区索引为1的值(也就是i的值)是1。栈内容:【0】
6:将栈顶元素弹出,保存到局部变量区索引为1(也就是i)的地方,此时i又变成了0。栈内容:【】
7:获取常量池中索引为2所表示的类变量,也就是System.out。栈元素:【】
10:将局部变量区索引为1的值(也就是i)压入栈。栈元素:【0】
11:调用常量池索引为3的方法,也就是System.out.println
14:返回main方法

ubuntu下配置tmux

ubuntu下配置tmux

参考如下技术帖:
http://www.haogongju.net/art/1767128  http://linuxtoy.org/archives/alias.html  http://forum.ubuntu.org.cn/viewtopic.php?f=122&t=297928  https://wiki.archlinux.org/index.php/Tmux\
http://blog.sina.com.cn/s/blog\_8ea8e9d50101efb9.html  http://blog.csdn.net/yjj1s/article/details/6413172\
http://blog.sina.com.cn/s/blog\_6fb9802f0106an1u.html  http://jack-boy.iteye.com/blog/1586908\
http://blog.csdn.net/yjj1s/article/details/6413172\
tmux可以称得上为终端多窗口管理神器。tmux是一个可以在终端里开启多窗口的工具,它由 OpenBSD 团队基于C语言开发并维护的,是 OpenBSD 的基础系统软件之一,基于 BSD 许可证发布,可以称之为 GNU screen 的 BSD 替代版。除了 OpenBSD 外,它也可运行于 Linux 、Freebsd、AIX、IRIX,Opensolaris 等 OS 之上。目前的最新版为1.7.在这里就不做过多介绍,这里主要将如何配置,其实配置起来很简单,只要在/etc/tmux.conf和/.tmux.conf文件中按照规则写上配置信息即可,但需要注意的是,有时可能碰到命名在/.tmux.conf中写了配置信息,但配置不生效的情况,此时可以重启tmux或者在命令模式(按PREFIX : ,即按下ctrl+b,再输入一个“:”)输入
source-file ~/.tmux.conf
即可使配置生效。
我的配置其实挺简单,就是要将窗口分为3个部分,方便编程(一个文本编辑、一个编译运行查看运行结果、一个浏览文件系统).
我的配置信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
#打开utf8 支持
set -g status-utf8 on
setw -g utf8 on
# statusbar 自定义,具体可以查看man 文档,非常详细
set -g display-time 3000
set -g status-fg blue
new  -s work # 创建一个叫work的seesion(附带有一个window)
neww ranger #在当前session再创建一个window运行ranger
selectw -t 0 # 选择第一window
splitw -h -p 50 -t 0 # 水平切割第一个pane,百分比是50
splitw -v -p 50 -t 1 # 垂直切割第二个pane,百分比是50
selectp -t 0 # 选择第一个pane

这样配置后,只需要在命令行中运行“tmux attach -t work”即可进入到已经在配置信息中定义好的3窗口的界面。不过为了避免每次都输入“tmux attach -t work”,可以为这条命令起一个别名:

alias tmux2work=”tmux attach -t work”

之后直接输入tmux2work就可以了。

Android GridView控件第一个item不响应或显示不正常

Android GridView控件第一个item不响应或显示不正常

在使用Android的GridView控件时,很多人都会碰到这么个奇怪的问题:整个GridView中,所有item的响应都没问题,只有第一个item不响应,或是显示不正常,或是点完第一个item后不响应但再点其他的item后其他item会响应、同时第一个item也响应了(超诡异的现象……),stackoverflow上有不少帖子,如下面的帖子:
http://stackoverflow.com/questions/11778228/onclicklistener-not-working-for-first-item-in-gridview
http://www.cnblogs.com/over140/p/3999815.html
至少就我所看到的,出现第一个item有问题的情况,一般都有使用BaseAdapter,而出问题的地方一般都是getView的书写有问题,稍微整理归纳一下可能的解决方法,供大家参考:

  1. 检查getView方法中是否有动态设置LayoutParams的操作,如果有,那么注意不能new 一个新的LayoutParams,而应该调用getLayoutParams获取已有的LayoutParams。参见该帖中的最佳答案:http://www.4byte.cn/question/337904/android-gridview-checkbox-of-the-first-item-not-work-when-i-recycled-convertview.html  。如果getLayoutParams返回为空或是返回的LayoutParams不是AbsListView.LayoutParams,那就在getView之前用setLayoutParams方法设置一下。
  2. listener响应有问题:尝试使用GridView的onItemClickListener,如果是onItemClickListener响应有问题,检查setOnItemClickListener是否在setAdapter之后。尽量不要采用给每个item的View加onClickListener的方式,如果必须使用该方式,并且采用了ViewHolder的写法复用View,那么需要注意加onClickListener的位置,是加在convertVew==null的地方还是外面我就记不清了,我没试过,只看到有一个帖子说过这个。
  3. 如果还有问题,我看到的可能的解决方法有(没试过,不确定是否可行,但有人在相关帖子里提到的各种方法):(1)不用ViewHolder写法,每次getView都重新创建新的View    (2)GriView设置背景色为透明


但就我感觉,想要动态设置GridView的item宽、高,但直接new LayoutParams导致出问题的出现次数比较多,大家注意一下,具体为啥会这样就没细究了,有兴趣的童鞋欢迎讨论一下。

使用fdisk和resize2fs重置ubuntu系统分区表【转载】

使用fdisk和resize2fs重置ubuntu系统分区表【转载】

我只是个搬运工,刚好碰到虚拟机中ubuntu空间不够、需要扩大虚拟机磁盘,vmware怎么扩展网上帖子很多,不说了,但vmware扩展虚拟机磁盘后,文件系统中并没有反应处理,就需要我们来更新分区表啥的。然后这个我查了好多帖子,终于找到比较靠谱的帖子,遂转载一下,做个记录(话说度娘真搜不出东西啊,还是google还是……)
原帖地址:http://askubuntu.com/questions/24027/how-can-i-resize-an-ext-root-partition-at-runtime
另一个类似的帖子也贴出来:https://www.rootusers.com/how-to-increase-the-size-of-a-linux-lvm-by-expanding-the-virtual-machine-disk/
vmware倒是给出了修改RedHat/CentOS的修改方式:http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1006371
以下是帖子正文:
How can I increase the size of the root partition of a system at runtime?
I have a partition that is not allocated after the root partition (which is also ext4), how can I add that unallocated space to the space allocated to the root partition without having to shutdown the server?
 
There are two steps to this: First, the partition must be resized. If you’re using LVM, it’s easy; if you’re using classic partitions, it’s a bit more complicated, and might require a reboot (though you never have to boot another system or live CD).
One fragile but feasible approach (worked for me) is to use fdisk by first deleting the partition, then carefully recreating it with a larger size at the same position. You can do this while the partition is mounted, but you will need to reboot for the kernel to notice the changed partition table.
Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ sudo fdisk /dev/sda
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 9437183 4717568 83 Linux
Command (m for help): d
Selected partition 1
Command (m for help): p
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sda1 2048 10485759 5241856 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

Again, it is critical that the new partition starts at the same block as the old. The Id should also match (83 for Linux systems). Be prepared to lose all your data at the slightest typo.
Remember to add the boot flag again, if necessary.
By now it should be apparent why people recommend using a live CD. 😉
However, once the partition is resized (and the system rebooted, if necessary), it’s a simple matter of running resize2fs on the file system, and you can do this even when it’s mounted as the root partition.
Example:

1
$ sudo resize2fs /dev/sda1

有用的IT资源汇总

有用的IT资源汇总

打算写一个系列,把我看到的一些比较好的文章、博客资源都整理到一起,方便自己查,也方便自己的同学、朋友找,但一直没开始动手,拖到现在,嗯,废话少说,进入正题:
博客资源:
月光博客:www.williamlong.info,文章的质量一直很不错,国内很好的一个博客。
酷壳:http://coolshell.cn/,我个人觉得这个博客实在是很好,有不少对程序员的建议,也总结了不少学习资源,有时间一定得多看。
结构之法,算法之道:http://blog.csdn.net/v_JULY_v,专注于各种算法的一个博客,很不错,有不少面试题。
网站论坛:
51CTO,红联
算法库/类库:
The Archive of Interesting Code :http://www.keithschwarz.com/interesting/,牛人写的一个各种算法的实现,还没细看,但一眼望去就发现了Dijkstra’s Algorithm,估计应该会有用的,如果自己用到某些经典算法,或许可以到这个地方去找找,看人家如何实现至少可以给自己一些启发。
log4j:记录日志的java库。
Apache Commons:包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。可以看这里的简要介绍。
软件:
EndNote:鼎鼎大名的文献管理软件,不过是商业软件,开源软件也有很多不错的,参见这里
evernote:笔记软件,office里有个类似的软件OneNote,不过还是感觉evernote比较好使。
Total Commander:著名的文件管理器,用习惯后可以提高个人的工作效率。
To be continue……

程序员必读的一些经典书籍

程序员必读的一些经典书籍

这里写下一些我觉得比较经典的书籍,纯属个人建议,事先声明:其中有不少书我没看过,或是看的不细,但大概知道书里讲啥东西,也会在下面列出。

更新记录

本文是2014年甚至是更早的时候写的,肯定有些陈旧,不过还是有些价值的,现在简单更新、置顶一下,后续会进行更新。

  • 2017.2.28 初始版本
  • 2017.10.29 更新读书记录。

目前正在看或是打算看的书:

  • 《智能时代》 吴军博士 刚买,还没来得及翻
  • 《高可用架构》 10月才出的书,书明天到货,然后可以拜读了,看作者,一堆熟悉的业界大佬,质量应该有保证 🙂
  • 《图解HTTP》 看着比较轻松,补齐一些基础知识
  • 《深入分析Java Web技术内幕》 许令波著。阿里技术书系列。在看,可以用来补全一些有关java web的知识。JVM、编码、session与cookie、spring框架分析等,内容比较全,正看,暂时不做评价。

2017年已读完的书籍:

  • 《沃顿商学院最受欢迎的谈判课》 感觉对工作、生活都很有帮助,其实归根结底,说的都是一个词:同理心。想让别人按照你的意志去做某些事,就要先设身处地的从别人角度想问题。
  • 《分布式服务框架原理与实践》 李雪锋著。主要讲解了一个分布式服务框架在设计、实现中需要考虑的一些问题、设计思路、实践中可能遇到的问题。看着有点意思,回头单独写写读书笔记。

PS :顺便给出我读过的书以及想读的书的豆瓣链接(豆瓣上我自己的记录,不过并不全,没有仔细统计过自己读过哪些书,是该统计一下啊,好歹我读过的书也不少了,对这个俺还是有自信的,哇咔咔~~)


给出一些我目前已知的比较有名的书系,欢迎大家补充。
书系

  • O’Reilly书系:动物书,有口皆碑,可惜我看过的几本中文版的书翻译质量相当的糟糕(都是机械工业出版社翻的……),建议直接看英文,目前我就是这样,英文其实挺简单的。
  • head first书系:这个书系也很有名,书的编排、写作风格诙谐幽默,整个书系的定位就是入门书籍,通俗易懂。
  • in action书系:这个是最近发现的一个书系,貌似也很有名,没怎么读过这个书系的书,先不做任何评价,不过应该不错。
  • 图灵书系:感觉这个系列的书质量还是满不错的,讲知识点讲的比较细,而且翻译质量也不错。

书单
扩展视野

  • 《黑客:计算机革命的英雄》:可以算作一本历史书,讲了早期黑客(那时候还是hacker,不是现在cracker)的一些故事,可以看到黑客文化是如何一步步从无到有的。
  • 《程序员修炼之道》:大三的时候读过一遍,感觉不错,主要是给程序员提出一些比较实用的建议,比如说一年学1到2门新语言,使用版本控制系统,选择一个适合自己的文本编辑工具(如vim或是Emac)……这里就不一一列举了,我觉得如果你想知道作为一个程序员,应该怎样提高自己的话,最好先看看这本书。(PS:尤其推荐学计算机的女生看一看,因为就我个人的了解,好像相当一部分学计算机的女生,很多东西都不是很了解,比如说vim、svn,可能在接触实际项目前,连听都没听过……)
  • 《浪潮之巅》:不少人都推荐,吴军博士写的,看过一遍,主要讲目前IT行业中的几个大公司是如何诞生,以及正在衰落的公司是如何一步步走到今天这个地步的。相当不错的一本书。
  • 《数学之美》:2012年国庆的时候花了几天读完,也是吴军写的,介绍了数学理论如何在IT领域发挥其巨大的作用,通俗易通,强烈推荐。如果在大一大二的时候读了这本书,至少学计算机的童鞋们就会明白数学到底有多用。
  • 《黑客与画家》:硅谷天使投资人Paul Graham写的,想创业的同学可以看看,有不少给创业者的建议,当然,对于不想创业的人而言,也有一些参考意义。之前我草看过一遍,重点看了Paul给程序员的一些建议,最近重新翻阅了几页,发觉有新的体会。
  • 《UNIX编程艺术》:刚刚过去的寒假读了一下,感觉不错,介绍了有关UNIX的方方面面的知识。
  • 《七周七语言》:列举了几种经典的不同类型的编程语言,建议童鞋们有时间看看,毕竟我们平时接触的C/C++、 Java其实都属于命令式语言,多接触一下其他泛型的语言,还是很有好处的。
  • 《七周七数据库》:最近新出的书,主要介绍NoSQL数据库,还没细看,暂不做评论(在序言里作者直言是要模仿《七周七语言》)。
  • 《这就是搜索引擎》:介绍有关搜索引擎方方面面的技术,适合作为搜索引擎入门书籍。草草翻过一遍,感觉可以作为搜索引擎的入门书籍。
  • 《the architecture of open source application》:光是随便翻一翻就感觉这书太牛叉了,介绍了很多流行的开源软件的架构(没错,是架构),以架构师为目标的童鞋强烈推荐看看这书。可惜一直没什么时间拜读这本大作。

计算机系统以及系统管理相关

  • 《深入理解计算机系统》:这本书是老师推荐的,因为在开例会的时候老师说现在我们对计算机底层的实现还是太肤浅,推荐了这本书,结果整个实验室研二研三的几乎都买了……china-pub上这本书的评价是“价值超过等质量的黄金”(其实我更希望有人能用黄金跟我换),目前已经看了3章,感觉相当不错,对计算机各个方面的知识都有涉及,能补充不少大脑中有关计算机、编程的盲区。
  • 《maven实战》:其实我主要是想说明一下maven大致的功能——进行大型项目的管理,一个师兄在Adobe公司实习,在公司里他就是用这个进行Java开发,师兄说这本书不错,目前还没有细看,不做评论。
  • 《鸟哥的Linux私房菜》:这本书的大名,学过linux的人应该都听过吧,书写的通俗易懂,而且知识点很全。想了解Linux的话,这书是最佳的入门书籍。

算法

  • 《编程珠玑》:这个应该算是经典中的经典吧,抽时间读了下,感觉很容易读,但要深入理解就不是那么容易了,每章的题目也很难(也很有意思),应该有不少人都听过其大名。
  • 《算法导论》:这本书也是经典,写的很细,各种算法基本都有讲,砖头一样的厚度与重量,不是每个人都有勇气读下去的……借着上算法课的机会读了大部分章节,感觉其实如果能静下心来看书的话,这本书还是蛮容易读懂的。书上的算法描写的也很清楚。目前已经出到了第3版。
  • 《数据结构与算法分析》:刚刚读2章,感觉不错,貌似是有关算法的经典书之一。没多看,不做评论。
  • 《编程之美》:这本书……一般都是被人用作笔试前突击算法用的,相当一部分人是冲着这书的副标题去的,看过一部分,感觉有些题目还很有意思的,可以作为扩展自己编程思路的书籍。
  • 《剑指Offer》:推荐这本书还是因为笔试……听研三的师兄说,2012年招聘的时候,不少HR已经不看《编程之美》改看这本书了(毕竟《编程之美》已经出了很多年了~~),看了一遍,感觉有些题目还是蛮有意思的,可以看看。但建议对于找工作的童鞋,《编程珠玑》《算法导论》这种书才是王道啊。

程序设计语言

  • 《C程序设计语言》:C语言之父写的书,质量肯定是有保证的(自从第2版之后过了近20年都没做过什么修订),现在底层的东西还是要靠C来写,所以还有必要看看的。
  • 《C陷阱和缺陷》:讲了一些C中常见的“陷阱”。
  • 《C和指针》:读着和《C程序设计语言》性质一样的书,都是学习C的教材,但写的更细致一些,只看过一部分,不过多评论。
  • 《C专家编程》:没读过,不做评论。但这本书确实是C经典著作之一。
  • 《C++ Primer》:C++经典啊,我看的是大红皮的第4版,感觉很不错,看这本书可以了解到C++的一些细节,比如说我们平时写for循环,变量都是int i,而实际上,比较好的做法是用size_t或是size_type(这个记不清了,手头没带书……这里只是举个简单例子说明一下)。
  • 《Effective C++》:主要讲如何写出执行效率更高的C++代码,列出了不少原则,平时用C++比较多的童鞋可以看看。
  • 《STL源码剖析》:身边很多技术比较好的童鞋都推荐这本书,说应该看看STL是如何进行内存分配的。没读过,不做评论。
  • 《Java核心技术》:共两卷,我觉得第一卷就够用了,主要是用做工具书,平时要用了查一下,这本书刚好。
  • 《Java编程思想》:没怎么看,据说里面说的都是思想性的东西。想更深入了解Java的话,建议看一下。
  • 《Effective Java》:同样讲如何写出高效的代码,只不过这次针对的是Java。
  • 《深入理解Java虚拟机》:主要将JVM,因为研究方向的需要拜读了这本书,感觉写的不错,把JVM各个重要的方面基本上都介绍到了,而且还是蛮容易理解的。作为国人出版的原创书籍,已经相当不错了。不过要想深入理解JVM,还是得看规范啊(顺便提句,因为科研需要,我也翻过JVM规范,发现这书有一部分内容其实是翻译JVM规范,所以如果有地方看不懂,可以尝试看看JVM规范)。

框架

  • 《struts 2 in action》:我学struts的时候是看马士兵的视频,顺手借的这本书,没看内容,只看了下目录,从目录来看感觉还不错,一条条的知识点列的很清楚。
  • 《Data-Intensive Text Processing with MapReduce》:刚过去的这个暑期去北大上有关云计算的暑期课,老师用这本书作为教材,主要讲了MapReduce的编程模型,建议刚开始学习MapReduce和hadoop的童鞋看这本书,感觉讲的很清楚,国内貌似还没有,在网上可以找到电子版,也不厚。感觉对MapReduce编程模型讲解的很细致,有关算法的描述也很简洁。
  • 《hadoop权威指南》:学习hadoop的经典书籍,我个人觉得在懂的MapReduce模型后(尤其是看了《Data-Intensive Text Processing with MapReduce》这本书之后),hadoop权威指南更适合当做手册性质的书,需要的时候查查应该怎么使用hadoop提供的各种类。当然,平时没事的时候也应该翻阅一些这本书,看看hadoop都能做哪些事情。
  • 《hadoop in action》:这本书还没读,不过不少人学习hadoop的时候都是看这本书,所以也推荐一下。

数据挖掘

  • 《数据挖掘导论》:我学习数据挖掘的时候就是用这本书做教材,感觉书写的比较全面,可能因为当初读的是中文版,有些地方感觉行文的比较奇怪,豆瓣上评分蛮高的,而且大家都建议读英文版,说英文版比中文更加通俗易懂。
  • 《大数据——互联网大规模数据挖掘与分布式处理》:今年新出的书,chinapub上卖的蛮火的,目前买了还没翻阅,暂不评论。

设计模式

  • 《设计模式——可复用面向对象软件的基础》:GoF写的书,这本书可是第一次提出“设计模式”的概念,并总结了23种设计模式,如果是想以后当架构师,估计这本书需要深入钻研。
  • 《head first设计模式》:GoF写的那本我读了3~4章吧,实在有些不好理解,就没继续读,如果仅仅是想了解设计模式是什么,或者说想找本设计模式入门书籍的话,《head first设计模式》是个不错的选择,和head first系列其他书的风格一样,风趣幽默,简单易懂,轻轻松松让你明白设计模式是什么。建议读英文原版,中文版的我跟同学借来读过一点,感觉翻译很别扭,比如说Singleton模式,至少我看到过的帖子、视频,都是翻译成“单例模式”,GoF那本书的中文版也是“单例模式”,head first设计模式则翻译成了“单件模式”,还有Flyweight,一般都会翻译成“享元模式”,head first设计模式则翻译成了“蝇量模式”,感觉很别扭。所以,还是推荐看英文,反正英文版也很容易看懂。

软件工程

  • 《代码大全》:看过目录,感觉主要讲大型项目如何管理,这个离我比较遥远,所以也就没去看,但不少人都推荐,经典书。
  • 《重构:改善既有代码的设计》:没听说过,一同学告诉我的,豆瓣上评价很高,有时间拜读一下。
  • 《敏捷软件开发:原则、模式与实践》:Bob大叔的大作,讲敏捷软件开发,感觉对于刚刚参加实际工作的童鞋这本书很有用。目前读了2章。

to be continue……

可提高生产力的实用工具集锦

可提高生产力的实用工具集锦

工作中总是需要用到各式各样的软件,下面列一些我个人认为比较实用的工具,尽量以开源、免费工具为主,仅做简要介绍,详情请自行搜索。Ok,闲话少说,进入正题:

实用小工具

f.lux

f.lux能够根据时间变化自动调节电脑屏幕的亮度、色彩,让电脑屏幕始终适合保持在适合阅读的状态。目前f.lux支持 Windows、Mac 、 Linux和IPhone及IPad。
flux

  • 官网:https://justgetflux.com/
  • 是否免费:是
  • 适用平台:Windows、Mac 、 Linux和IPhone及IPad
  • 个人点评:一直在用f.lux,习惯了之后再关掉这个软件就会发现屏幕亮度很高、特别刺眼。目前类似的软件不少,建议大家在移动端(手机、平板)也使用这类软件,能过滤一部分蓝光,减少对眼睛的伤害,对于我等每天从早到晚都盯着屏幕看(~~o(>_<)o ~~)的程序猿/媛来说,这很有必要!!

Everything

Everything是voidtools开发的一款文件搜索工具,用于搜索本地磁盘文件,体积小巧,界面简洁易用,快速建立索引,快速搜索,同时占用极低的系统资源,实时跟踪文件变化,并且还可以通过http或ftp形式分享搜索。

  • everything官网:http://www.voidtools.com/
  • 是否免费:是
  • 适用平台:Windows
  • 个人点评:超实用!我想大多数人总会有这么个时刻:本想找某个文件,但就是记不起这个文件保存在了哪里,或是想不起这个文件的完整名称,用Windows文件系统的搜索功能全盘搜索的效率又太低(动不动就以小时为单位(⊙﹏⊙)b……)。Everything解决了这个问题,用户在输入文字的瞬间就会显示出符合条件的搜索结果(膜拜一下,搜索速度真的是甩Windows文件系统十几条街啊~~),支持正则表达式,但只能用于搜索文件、文件夹的名称(其实我觉得只搜名字这一点,在多数情况下已经够用了)。

Total Commander

简称TC,用于文件管理,一般的文件操作,如搜索、复制、移动、改名、删除等功能应有尽有,更有文件内容比较、同步文件夹、批量重命名文件、分割合并文件、创建/检查文件校验(MD5/SFV) 等实用功能。此处不再赘述。
tc

  • 官网:http://www.ghisler.com/
  • 是否免费:否
  • 适用平台:Windows
  • 个人点评:这个就不多说了,功能太多一时说不完(其实是我感觉自己一直还没入门……),推荐个网站,http://xbeta.info/tc/ ,各位亲们自己看吧,O(∩_∩)O~。

项目管理

目前有关项目管理的工具很多,可以参考如下链接:https://en.wikipedia.org/wiki/Comparison_of_project_management_software 。根据个人经验,推荐下redmine、trello这两个。

Redmine

Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据库,有不少自己独特的功能,例如提供wiki、新闻台等,还可以集成其他版本管理系统和BUG跟踪系统,例如Perforce、SVN、CVS、TD等等。这种 Web 形式的项目管理系统通过“项目(Project)”的形式把成员、任务(问题)、文档、讨论以及各种形式的资源组织在一起,大家参与更新任务、文档等内容来推动项目的进度,同时系统利用时间线索和各种动态的报表形式来自动给成员汇报项目进度。
redmine

  • 官网:http://www.redmine.org/
  • 是否免费:是
  • 适用平台:基于web,任何平台均可
  • 个人点评:相信很多童鞋都用过,不再赘述。

Trello

不知道你有没有想在浏览和整理任务清单时,希望能够在一块大白板上按顺序将各个列表排列出来。Trello就是一块这样的白板,你可以随意贴出列表,迅速查看和管理你的任务。
trello

  • 官网:https://trello.com/
  • 是否免费:是
  • 适用平台:基于web,任何平台均可
  • 个人点评:卡片式管理,条理清晰,个人认为比较适合小团队进行项目管理、团队协作,同时也比较适合作为个人的任务管理工具。目前已有程序猿推出了类似Trello的开源软件,可以在局域网中架设。

运维管理

tmux

tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机。
tmux

  • 官网:http://tmux.github.io/
  • 是否免费:是
  • 适用平台:linux
  • 个人点评:在操作linux终端时,很多情况下我们需要开多个窗口,并在窗口间来回切换,有了这个终端复用工具就能不必再来回切窗口了(而且是不是很有hacker的感觉,(^o^)/~),该软件需要在linux操作系统中安装(目前很多linux发行版已内置),但如果linux服务器无法联网安装tmux,那也可以在使用ssh连接服务器时用xshell(SecureCRT、putty等是否也有该功能不确定,读者可自行尝试),目前的xshell可以做到终端复用,如下图。

各种远程连接工具

TeamViewer、VNC、Splashtop等,平时用的不多,不再赘述。

开发工具

Sublime Text

Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),具有漂亮的用户界面和强大的功能,主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。
sublime

  • 官网:http://www.sublimetext.com/
  • 是否免费:否
  • 适用平台:Windows, Linux, Mac OS X
  • 个人点评:代码高亮功能非常棒,有着非常丰富的插件库,可以满足各种需求,被很多人认为是“最性感的文本编辑器”,非常适合前端开发,顺便推荐两个插件:Emmet(功能参考notepad++上的zencoding),sftp(允许用户直接在Sublime中编辑远程主机上的文件)。

Fiddler

Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大的帮助。
fiddler

  • 官网:http://www.telerik.com/fiddler
  • 是否免费:是
  • 适用平台:Windows
  • 个人点评:类似Charles,在需要抓包、查看请求内容时很有用。

有用的工具还有很多,想列完整是不可能滴,在此仅仅是抛砖引玉,多搜索、多尝试,相信你总会找到一款趁手的“兵器”。

使用vps+lnmp+wordpress搭建个人博客

使用vps+lnmp+wordpress搭建个人博客

购买VPS用于科学上网后,打算将个人博客移到VPS上,遂折腾了一下,遇到一些坑,整理一下给大家看看。
版权声明:我这篇文章主要是根据“vps+lnmp+wordpress搭建个人博客” 这篇文章,以及自己搜索到的一些帖子整理所得,算是一个all in one的版本,大家勤动手肯定都能查到。
搭建博客主要分为以下几个大的步骤:

  1. VPS设置
  2. lnmp设置
  3. 域名解析设置
  4. 搭建wordpress
  5. 安装wordpress后可能遇到的问题

so, 开始详细说明:
1**、VPS设置**
现在VPS选择很多,这里不一一列举,大家随意,看自己情况选适合自己的就好。我用的是搬瓦工(bandwagonhost.com)最便宜的套餐(256MB内存,12G硬盘,500G流量),一年100多软妹币,本是搭梯子用(科学上网速度还是可以的),打算wordpress后访问博客速度感觉尚可。
2**、lnmp设置**
有了VPS就需要开始假设web服务器了,搜了一下发现大家用lnmp(linux、nginx、mysql、php)比较多,所以我也就选这个啦,一键安装过程参见http://lnmp.org/install.html ,写的很细,一步步按教程来就好,教程里有提到创建虚拟主机这个步骤,一开始说实话我对这个概念不是很清楚,不过之前提过的“vps+lnmp+wordpress搭建个人博客” 里面说的挺清楚的,摘抄一下给大家看看:

lnmp环境搭建好后,需要设置虚拟主机。首先区分几个概念服务器,vps,虚拟主机。
服务器:一般理解就是一台电脑,有主板硬盘内存CPU的东西;
vps(Virtual Private Server 虚拟专用服务器):一台服务器通过软件划分成几台vps,每台vps在客户看来都是独立的服务器,其实是跑在一台物理机器上的;
虚拟主机:虚拟主机一般是针对网站说的,一个网站跑在一台虚拟主机上,也就是apache服务器 wwwroot/下面的一个文件夹,就是一个虚拟主机,比如  wwwroot/aaa  是个虚拟主机,wwwroot/bbb 是另外一个虚拟主机,是web服务器区分不同网站时的提法。
可以看到,从大到小,依次是服务器>vps>虚拟主机。
弄清楚了什么是虚拟主机,就明白了为什么要配置虚拟主机了,因为我们的vps上不是就跑一个网站,有可能要搭好几个网站(土豪自行忽略掉这句话),比如搭个博客,搭个下载站,等等很多。不过,一个ip地址最多解析5个顶级域名,所以最多就5个网站(二级域名不算)。
搭建虚拟主机教程  http://lnmp.org/faq/lnmp-vhost-add-howto.html

上面这段话说的挺清楚的,理解这些概念对后续操作很有帮助,认真看。
另外,lnmp已经安装了phpmyadmin,后续有数据库操作可以用这个。
3、域名解析设置
安装好lnmp环境后,接下来就该设置DNS域名解析了,购买域名的地方也有很多,不再赘述。我在godaddy上买的,顺便说句godaddy坑爹的地方,我之前的域名续费了两年,今年忘记续费,再去看时发现购买价格翻了3倍,原本每年100RMB左右,重新购买居然要300多RMB,真是坑爹啊_  ,而且最近貌似.io的域名价格一直很贵,本想买个.io提高下逼格,结果还是放弃了……扯远了,回归正题,购买域名后,需要配置域名解析,配置一下域名到IP的映射,这里再进行一下摘抄(来源如下:http://www.railgun.top/blog/?p=19),主要是给大家看一下解析类型:

A记录:将域名指向一个IPv4地址(例如:10.10.10.10),需要增加A记录。网站最基本的解析就是A记录 ,把域名解析到你自己的服务器ipv4地址,如138.xxx.xxx.xxx ,如果不添加主机记录www,就不能访问www.railgun.top,只能访问railgun.top\
CNAME记录:如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。如果想设置二级域名就要添加CNAME记录,比如blog.railgun.top ,参照上图设置,主机记录是blog,记录值就是你的主域名www.railgun.top\
MX记录:建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录
NS记录:域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录
TXT记录:可任意填写(可为空),通常用做SPF记录(反垃圾邮件)使用
AAAA记录:将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录
SRV记录:记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)
显性URL:将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址(例如:将www.net.cn显性转发到www.hichina.com后,访问www.net.cn时,地址栏显示的地址为:www.hichina.com)。\
隐性URL:与显性URL类似,但隐性转发会隐藏真实的目标地址(例如:将www.net.cn隐性转发到www.hichina.com后,访问www.net.cn时,地址栏显示的地址仍然为:www.net.cn)。

godaddy上需要设置DNS Zone File,如下图所示,在Points to的位置填上VPS的地址,如下图所示:
godaddy_set_dns
填写完、确认后,需要等一段时间DNS解析才能生效,可以过十来分钟之后ping 你的域名,能ping通即可。
4、搭建****wordpress
域名解析设置好后,接下来就是安装wordpress,这一步相对简单,参考wordpress官网给出的步骤即可,写的很清楚,地址:wordpress安装过程 注意,解压wordpress安装包后,记得给wordpress整个文件夹赋予读写权限,用chmod a+wr -R /wordpress 即可。
lnmp已安装了phpmyadmin,如果想用“域名/phpmyadmin”这种形式使用phpmyadmin,在/home/wwwroot/default文件夹下找到phpmyadmin文件夹,将该文件夹拷贝一份到你在lnmp中所设置的虚拟主机目录(和你的域名一样的那个目录,一般是/home/wwwroot/域名)下,即可使用。
5、安装wordpress后可能遇到的问题
按照官方教程安装完wordpress之后,可能遇到的问题以及解决方法如下(参考了如下帖子:搬瓦工VPS:LNMP环境下安装wordpress常遇到的问题及解决方法  ):

  • 后台只显示一个主题:主要是和scandir函数有关,解决方法也比较简单,修改
    /usr/local/php/etc/php.ini 。可以通过VI命令修改,或者下载到本地进行修改,找到disable_functions 后面的scandir删除掉这个函数。然后重启PHP即可。
    • ini路径 /usr/local/php/etc/php.ini
    • 重启命令:/etc/init.d/php-fpm restart
  • 后台安装插件或主题都提示需要输入FTP信息:出现这个问题,是因为文件目录权限问题。解决方法,SSH登录VPS,执行以下两条命令即可
    • chmod -R 755 /home/wwwroot
    • chown -R www /home/wwwroot
  • 安装后过了一段时间VPS硬盘爆满:lnmp安装时,mysql日志默认没有关闭,可能是这个原因(参考如下帖子:http://www.banwagong.com/176.html),修改一下**/etc/my.cnf文件。找到log-bin=mysql-binbinlog_format=mixed两行,在这两条的前面加一个#**号 ,将这两条语句注释掉即可。然后重启mysql   /etc/init.d/mysql restart

建议大家用上述方式建站后,去“搬瓦工VPS”这个网站上看看,列出了很多需要注意的事项,我就参考了好多帖子,推荐一下。
 
以上。\

could_not_find_the_main_class(eclipse不能运行类)【转载】

could_not_find_the_main_class(eclipse不能运行类)【转载】

最近做项目把JDK的版本升到了1.6,但是问题也就随之而来。
首先,在eclipse中启动Tomcat服务器,始终不能启动
clip_image002
java.lang.NoClassDefFoundError: jdk1/6/0/10
开始以为是版本不兼容,但是直接发布在Tomcat目录下,直接点击Tomcat的StartUp.bat是可以启动的,运行正常。
于是写了一个测试类,在eclipse中运行这个类,只是输出几个字符,居然也不可以,报错信息一样。
Google了些信息出来,无非是说设置path,classpath等,按照这个照做后,很遗憾,报错信息依旧,而且我原来用1.5版本时也没有配置这些变量。
整整一个下午的时间,头晕脑胀,却一无所获。
其实是一个地方的配置写错了。大家注意了:
clip_image004
红色框起来的地方,这里本来是输入vm参数的,结果我copy/paste,当成了jre的名字,这个参数jre当然不会识别了,但是jre提示的信息也有点过,你要是说“vm参数错误”不就好找了,偏偏说java.lang.NoClassDefFoundError: jdk1/6/0/10。
下面总结一下:
在用eclipse时无需在环境变量中配置path、classpath等。
在eclipse中配置jre
clip_image006
clip_image008
clip_image010
配置编译选项
clip_image012
再针对具体工程设置
[clip_image012[1]](http://images.cnblogs.com/cnblogs_com/evasnowind/201108/20110814134939908.jpg)\
clip_image014
clip_image016
clip_image018
运行时类配置
clip_image020
clip_image022
好了,完结。
希望对大家有帮助。

Google打不开的解决方法【转自月光博客】

Google打不开的解决方法【转自月光博客】

在Google.com里面进行搜索的时候,经常会遇到突然出现“该页无法显示”的提示,并且之后的十多分钟都无法正常连接Google,这里给出一些方法,可以解决大部分Google无法访问或进不去的问题。
1、最开始可以先尝试重新拨号的方法。如果是搜索过程中出现“该页无法显示”的提示,接着就无法访问Google,那么对于ADSL用户,可以尝试断开网络连接,然后重新拨号上网,这样你的IP地址就发生了变化,这时候就可以正常访问Google了。(其原理是防火墙只是针对IP封用户,而不是针对独立电脑)
2、如果一开始就无法访问Google,那么请把下面这一行:
216.239.63.104 www.google.com 或者 64.233.171.99 www.google.com 或者 216.239.53.99 www.google.com\
添加到:C:WINDOWSsystem32driversetchosts文件里,就着访问Google看看是否正常。(其原理是提供较为少用的Google镜像访问)
3、使用Google的镜像IP地址来访问Google,Google有很多IP地址,通过IP可以直接访问Google。
4、使用Google其他国家的域名来访问Google,例如Google日本的域名google.co.jp,不过请注意,Google其他国家的服务器也在美国,因此搜索词语的时候也会出现“该页无法显示”的可能。
5、如果碰到DNS劫持的封锁方法,那么需要选择正确的DNS服务器,将主DNS设置成国外根服务器的DNS,然后辅助DNS设置成国外的DNS。具体做法:在拨号网络或网卡属性里设置,主DNS设成 202.12.27.33,辅助DNS:202.216 .228.18(日本DNS),或者使用美国的OpenDNS,首选DNS服务器和备用DNS服务器分别设置为208.67.222.222和 208.67.220.220。大家还可以自己找一些快的国外DNS。 (其原理是DNS劫持只能够控制国内的DNS服务器,而对于国外的DNS服务器则无能为力,因此只要不使用国内的DNS即可)
6、对于 GMail,使用http访问访问的话最好不要选择“带有聊天功能的标准视图”,否则容易中断。尽量使用加密的https地址 https://mail.google.com 来访问GMail,这将极大提高访问的稳定性,并且在GMail里使用GTalk也很稳定。
7、使用加密的代理服务器软件(SSH,VPN)来访问Google,当然目前的一些免费的加密代理服务器都不是很稳定,速度也不是很理想,建议购买收费版。
8、使用HTTPS来访问Google,由于Google的Https域名encrypted.google.com也被DNS污染,因此需要修改 hosts文件,Windows系统中Hosts文件的优先级高于DNS服务器,操作系统在访问某个域名时,会先检测HOSTS文件,然后再查询DNS服务器。可以在hosts添加受到污染的DNS地址来解决DNS污染和DNS劫持。
Google无法访问
当然,上面的方法有时可能会实效,我觉得最稳定和有效的方法是HTTPS的Google搜索,HTTPS版本的Google一劳永逸地解决目前几乎所有的问题,https是安全访问网站的一个重要的方法,目前还没有看到能截获https的加密数据的防火墙,因此搜索任何关键字都没有问题,目前 Google的HTTPS搜索唯一的遗憾是没有图片搜索功能。