出售shadowsocks代理帐号,分摊vps费用【长期有效】

Dubbo简介

Dubbo是一个开源分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

其核心部分包含:

  • 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  • 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  • 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo能做什么?

  • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  • 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
  • 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

dubbo用户指南:http://alibaba.github.io/dubbo-doc-static/User+Guide-zh.htm
开发指南:http://alibaba.github.io/dubbo-doc-static/Developer+Guide-zh.htm

String、StringBuilder、StringBuffer的区别

String、StringBuilder、StringBuffer三者都实现了CharSequence接口,所以它们在使用中可以相互替换,但是内部的实现是不同的

String

String是不可变的对象,一旦创建就不能改变。String被存放在字符串常量池中,Java中每一个不可变对象都是线程安全的,所以String也是线程安全的。

String  demo = ” a ” ; // 对象被放在常量池中,它的值不能被修改
demo=”b” ;     //新的b字符串在常量池中创建,被demo变量引用,a字符串在常量池中仍然存在,它的值没有被修改,但是没有变量引用它

StringBuffer

StringBuffer是可变的,我们可以改变它的值。new StringBuffer创建的对象被放在堆中,StringBuffer和StringBuiler有相同的方法,但是StringBuffer的每个方法都有synchronized,所以StringBuffer是线程安全的

正因为如此,StringBuffer的方法不能被两个线程同时访问,所以StringBuffer在性能上不如StringBuilder。 阅读详细 »

天下大事必作于细

(选自《职场“蘑菇族”的华丽转身》;七七 编著;中国社会出版社2013年出版)

老子曰:“天下大事必作于细,天下难事必作于易”。针对工作中的小事,我们要在小中做细,细中求精,在精细中尽显自己的优势,这样,我们才能早日练就做大事的本领。
在工作中,我们总会发现一些粗心大意的蘑菇族,他们认为要成大事就要不拘小节,否则就会被小节拖累。其实这种想法是不对的。许多事实证明,在职场中不拘小节就无以成大事。一个细节在某种程度上可以决定我们工作上的成败,如果我们平时不注意的话,很有可能某个细节就会成为我们事业上的“短板”,我们也将功亏一篑,难成大事。
一粒米中见世界,一滴水里看阳光。你的一言一行、一举一动都可以成为你职场命运的偏旁部首。在我们的职场中,并不是每一个细节都需要关注,也不是每一件小事都需要投入全部精力,然而,对于那些对工作有重要意义而又经常被你所忽视的小节,你必须认真地对待、做好,只有这样,你才有可能改变自己的职场命运。
但是,同样是面对小事,人与人之间在智力和体力上的差异并不是如人们想象的那么大,成功者与失败者之间究竟有多大的差别呢?其实,一个人能做,另外的人也能做,只是做出来的效果不一样,往往是一些细节上的工夫,决定着完成的质量。
有一家知名企业正在向社会公开招聘采购主管。一天,有三个人前来应聘:第一名是从某知名大学的管理学院毕业的,另一名毕业于某商学院,而第三名则是一家民办高校的毕业生。他们三人都是信心十足地面对考官,心想自己能够胜任这个工作。 阅读详细 »

Mac实用技巧——在Finder中显示文件完整路径

Finder默认是不显示路径的,进入某个文件夹时只会显示当前文件夹的名字。

通过下面的命令可以在finder顶部的标题栏上显示完整路径。

在终端输入以下命令并回车:

defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES

把finder关了再打开,在标题栏中即可显示文件的完整路径,而且对着路径最左边的小图标点右键,就能快速访问路径中的任意一层

命令行中使用Sublime打开文件

只需创建一个软链接
ln -s /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl
每次直接输入文件路径即可
subl /etc/hosts

MySql按月,按周,按日分组统计数据

select DATE_FORMAT(create_time,'%Y%m') months,count(id) count from orders group by months; 
select DATE_FORMAT(create_time,'%Y%u') weeks,count(id) count from orders group by weeks;  
select DATE_FORMAT(create_time,'%Y%m%d') days,count(id) count from orders group by days;  

这里主要使用的是DATE_FORMAT(date,format) 函数
根据format字符串格式化date值。下面的修饰符可以被用在format字符串中(注意区分大小写):
%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。

java8新特性——Lambda表达式

Lambda简介

lambda表达式(又被成为“闭包”或“匿名方法”)是Java8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。
Lambda表达式还增强了集合库。 Java8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。总的来说,lambda表达式和 stream 是自Java语言添加泛型(Generics)和注解(annotation)以来最大的变化。

Lambda语法

lambda表达式的语法由参数列表、箭头符号->和函数体组成。函数体既可以是一个表达式,也可以是一个语句块:

(parameters) -> expression

(parameters) ->{ statements; }

简单举例

(int x, int y) -> x + y  //接收2个参数,返回他们的和

() -> 42  // 不需要参数,返回值为42

(String s) -> { System.out.println(s); }  //接收一个String对象,打印到控制台

下面两段代码分别是:使用匿名内部类来排序和使用lambda表达式来排序。

List<String> names = Arrays.asList("ranger", "java", "c", "c++");

Collections.sort(names, new Comparator<String>() {

@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
Collections.sort(names, (String o1, String o2) -> o1.compareTo(o2));

这个例子可以很明显的看出lambda表达式简化代码的效果。 接下来展示lambda表达式和Stream的配合。
下面的三段代码是将集合内容全部转化为大写,
普通青年:

List<String> names =Arrays.asList("ranger", "java", "c", "c++");
List<String> uppercases = new ArrayList<>();
for (String name : names) {
    uppercases.add(name.toUpperCase());
}

文艺青年:

List<String> uppercases = Lists.transform(names, new Function<String, String>() {
    @Override
    public String apply(String name) {
        return name.toUpperCase();
    }
});

lambda:

List<String> uppercases = names.stream().map((String name) -> {return name.toUpperCase();}).collect(Collectors.toList());

这里map方法就是接受了一个lambda表达式

总结

Java SE 8提供的新语言特性并不算多——lambda表达式,方法引用,默认方法和静态接口方法,以及范围更广的类型推导。但是把它们结合在一起之后,开发者可以编写出更加清晰简洁的代码,类库编写者可以编写更加强大易用的并行类库。

参考

http://ifeve.com/lambda/

 

google-perftools安装方法

google-perftools是用来查看堆外内存的一个工具。用来分析nio应用的内存泄露问题

https://github.com/gperftools/gperftools

安装gcc

yum install gcc gcc-c++  make

安装libunwind

wget http://ftp.yzu.edu.tw/nongnu/libunwind/libunwind-1.1.tar.gz
./configure
make
make install

安装google-perftools

wget -c -O gperftools-2.4.tar.gz  https://github.com/gperftools/gperftools/releases/download/gperftools-2.4/gperftools-2.4.tar.gz
./confighre
make
make install
vim /etc/ld.so.conf.d/usr_local_lib.conf 加入/usr/local/lib
/sbin/ldconfig

修改tomcat启动文件startenv.sh

加入export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
加入export HEAPPROFILE=/tmp/test (导出的文件放在哪里)

heap文件分析

usr/local/bin/pprof –text /home/q/java/default/bin/java mem_6774.0001.heap

cheat——linux命令好帮手

问题

使用linux命令时经常记不住选项,尤其是使用了很多复杂选项的,有的人习惯查看man pages,但man pages里的描述太冗长了,太影响效率,这个时候使用cheat是个不错的选择

cheat

什么是cheat

cheat工具是一款非常适合Linux系统管理员的工具,他能帮助你很简单快捷的熟悉Linux下系统命令的使用方法

tar命令举例

我们经常会使用tar命令,但是很少有人能直接写对tar后面的选项,这时看看cheat怎么做的

➜ /Users/ranger &gt;cheat tar
# To extract an uncompressed archive:
tar -xvf /path/to/foo.tar

# To create an uncompressed archive:
tar -cvf /path/to/foo.tar /path/to/foo/

# To extract a .gz archive:
tar -xzvf /path/to/foo.tgz

# To create a .gz archive:
tar -czvf /path/to/foo.tgz /path/to/foo/

# To list the content of an .gz archive:
tar -ztvf /path/to/foo.tgz

# To extract a .bz2 archive:
tar -xjvf /path/to/foo.tgz

# To create a .bz2 archive:
tar -cjvf /path/to/foo.tgz /path/to/foo/

# To list the content of an .bz2 archive:
tar -jtvf /path/to/foo.tgz

# To create a .gz archive and exclude all jpg,gif,... from the tgz
tar czvf /path/to/foo.tgz --exclude=\*.{jpg,gif,png,wmv,flv,tar.gz,zip} /path/to/foo/

# To use parallel (multi-threaded) implementation of compression algorithms:
tar -z ... -&gt; tar -Ipigz ...
tar -j ... -&gt; tar -Ipbzip2 ...
tar -J ... -&gt; tar -Ipixz ...

cheat会列出常用的一些例子,简单明了

更多cheat安装和使用请自行github查看

https://github.com/chinageek/cheat.git