1、父类【静态成员】和【静态代码块】,按在代码中出现的顺序依次执行;
2、子类【静态成员】和【静态代码块】,按在代码中出现的顺序依次执行;
3、父类【构造代码块】和【普通成员变量被普通成员方法赋值】,按在代码中出现的顺序依次执行;
4、子类【构造代码块】和【普通成员变量被普通成员方法赋值】,按在代码中出现的顺序依次执行;
5、执行子类的构造方法;

说明

  • 构造代码块: 直接在类中定义且没有加static关键字的代码块称为构造代码块;

一、在Google Cloud创建一个VM实例

二、搭建shadowsocks代理

1、修改root密码
$ sudo passwd
2、切换到root用户
$ su - root
3、安装shadowsocks
# apt update && apt upgrade
# apt install docker.io
# docker run -d -p 1989:1989 oddrationale/docker-shadowsocks -s 0.0.0.0 -p 1989 -k ${password} -m aes-256-cfb

三、配置对应端口防火墙
依次点击 “产品和服务” -> “VPC服务” -> “防火墙规则” -> “创建防火墙规则”,其中IP地址范围0.0.0.0/0, 协议/端口tcp:1989, 保存并提交

1、在手机上下载Linode软件、SSH连接工具(比如Termius)

2、新建一个5美元的Ubuntu 16.04的VPS(如果没有账号请先注册)

3、使用SSH连接工具连上购买的VPS

4、搭建shadowsocks代理

# apt update && apt upgrade
# apt install docker.io
# docker run -d -p 1989:1989 oddrationale/docker-shadowsocks -s 0.0.0.0 -p 1989 -k {password} -m aes-256-cfb

1、windows下显示目录结构

tree /F
D:\Program Files\Hexo\source>tree /F
文件夹 PATH 列表
卷序列号为 00000200 E077:4672
D:.
│ CNAME
├─about
│ index.md
└─_posts
config-hexo-in-windows.md
learn-from-others.md
show-dir.md
think-more-ways-less-questions.md

2、Linux下显示目录结构的方法

find . | sed -e 's;[^/]*/;|___;g;s;___|; |;g'
admin@admin-PC MINGW32 /d/Program Files/Hexo/source
$ find . | sed -e 's;[^/]*/;|___;g;s;___|; |;g'
.
|___about
| |___index.md
|___CNAME
|____posts
| |___config-hexo-in-windows.md
| |___learn-from-others.md
| |___show-dir.md
| |___think-more-ways-less-questions.md

老板最近写了一封邮件寻找加西亚,这篇文章很火,上了很多网站的头条,看了老板的文章感觉这传说中的孔令贤是一个很牛的人,在2014年被连升过3级,所以在网上搜到了他的博客,没想到他当时的状态和我类似(当然,我距离他的水平有一定距离),都是内心惶恐,做了越来越多管理的活,每天忙于向领导汇报、揣摩领导心思,已经很难完全静下心来钻研技术了。

我司现在导向其实非常鼓励大家技术转管理,带领大家走向成功,但当这种导向太过突出的时候,员工都已经将重心放到如何技术转管理上,真正的技术专家越来越少,软件的水平也就可想而知了。说白了就是指挥的人越来越多,干活的越来越少,真正写代码的大都是新员工、合作方兄弟。现在干脆连代码review都很少做了,遇到有责任心的兄弟还好,遇到那种责任心和技术都不太好的兄弟,代码简直不忍直视,说是小学生写得代码也不为过。所以在这种状况下,线上问题不断,兄弟们不断加班,然后最奇葩的事情是,真正做的质量好,可以早点下班的兄弟因为要陪着大家加班,最后也变得不注重代码质量,最后通通混指标了事。

其实我很佩服孔令贤,因为他懂得自己真正想要什么,并付出行动去实现目标。公司破格给他提了三级,基本是坐上了火箭的状态,可以想象在我司会有很好的前途,但是依然能够走出舒适区,去追求真正自己喜欢的东西,非常的难能可贵。我虽然没有他那样的水平,但我也不想未来把自己变成一个只会每天扯皮,不断要求同事加班的领导。所以见贤思齐,趁着自己年纪还不大,争取在未来半年找到一个更有挑战性的岗位,实现自己更大的价值。

最后,见贤思齐,希望自己也能够多写博客,利用github给的这么好的平台,把在公司写博客的热情拿出来,提高自己,也照亮他人。

查看有哪些表

list

查看HBase的状态

status

创建表

create_namespace 'sogou'
create 'sogou:search_detail', {NAME => 'detail'}, {NAME => 'detail2'}

查看表的结构

describe 'sogou:search_detail'

删除表

disable 'sogou:search_detail'
drop 'sogou:search_detail'
说明: 删除表之前必须disable表

删除表中所有数据

truncate 'sogou:search_detail'

修改表的结构

alter 'sogou:search_detail', {NAME => 'detail', TTL => '1024'}, {NAME => 'detail2', METHOD => 'delete'}

新增数据

put 'sogou:search_detail', 'rowKey001', 'detail:title', '陋习', 'detail:retOrder', '2', 'detail:cliOrder', '1', 'detail:url', 'www.ihunter.me'

查询单条数据

get 'sogou:search_detail' 'rowKey001'
get 'sogou:search_detail', 'rowKey001', 'detail:title'

查询多条数据

scan 'sogou:search_detail', {LIMIT => 10}

统计表中数据的行数

count 'sogou:search_detail' {INTERVAL => 100, CACHE => 500}

删除数据

delete 'sogou:search_detail', 'rowKey001', 'detail:title'
deteteall 'sogou:search_detail', 'rowKey001'

最近有一个需求,需要实时展示页面访问量排名,主要的实现思路如下。

为什么使用redis存储实时统计的数据?

1、实时统计的数据属于查多写少的类型
2、Redis的SortedSet数据结构天然可以非常快的得出topn的数据

如何使用redis存储Spark的实时统计数据?

(1)考虑到Spark直接操作Redis的话,各个组件之间的耦合会比较严重,所以我们将Spark的实时统计数据先推到kafka里面,然后不断的取出kafka的数据插入到redis中。

(2)进一步的,如果把所有的统计结果都放到redis里面的话,由于数据量比较大可能会对redis的性能有比较大的压力,而实际上我们需要查看的统计结果是有限的,所以只需要将topn的数据存放的redis中即可,可以根据当前的实时数据统计情况,设置插入的阈值,从而减少redis的性能压力。

#取出当前排名1k的统计值,获取当前插入数据的阈值
ZREVRANGE title_count 1000 1000 WITHSCORES

如何删除超时的统计数据?

既然是实时的统计数据,如果没有删除超时数据的机制,统计的结果实时上就变成了历史单位时间段的排名了,所以需要定时删除超时的统计数据。

但其实redis中SortedSet中的子元素是不能设置超时时间的,所以我们使用了另外一个SortedSet来存储子元素的插入时间,然后定时去扫描有没有子元素已经超时,超时的子元素集会在原始的统计表中被清理掉。

#查询超时的元素集,其中1534562250为超时的时间戳阈值
ZREVRANGEBYSCORE title_count_ttl 0 1534562250
#删除超时的元素集
ZREM title_count baidu.com bing.com

总结

整个方案在删除超时统计数据上还是有一些瑕疵,毕竟这个SortedSet TTL的实现方案需要插入两次数据,如果朋友们有更好的解决方案欢迎一起讨论,谢谢。

这几天有了解到Guava的LinsteningExecutorService可以设置线程执行完成后的回调方法, 联系到我们在进行多线程编程的时候都需要去拿到这个返回值做回调,所以很感兴趣Guava是怎实现这个机制的,遂调查了一下Guava的源码。

Guava里面实现线程回调也非常简单, 核心的逻辑就是新建一个Futures.CallbackListener的线程,这个线程会通过future.get阻塞拿到线程的返回值,拿到返回值之后就调用用户设置的onSuccess方法。

如果在线程的执行过程中发生异常,则会调用用户设置的onFailure方法,将线程执行的异常信息返回给用户。

核心逻辑的源代码如下:

@Override
public void run() {
final V value;
try {
value = getDone(future);
} catch (ExecutionException e) {
callback.onFailure(e.getCause());
return;
} catch (RuntimeException | Error e) {
callback.onFailure(e);
return;
}
callback.onSuccess(value);
}

买了电脑之后,除了第一天写了一个Hexo的配置方法外,就没有再写过东西了,一方面是因为工作太忙,另一方面也可能是因为个人有点浮躁,没有静下心来,想点事情,写点东西;

这一个月以来工作上遇到了一些事情,主要情况是领导突然不给工作了,搞得我心里很慌也很迷茫,然而去年的绩效也是B+,按理来说不应该出现这种状况,所以内心很纠结,思来想去,决定每两天给领导及其他同事发双日报,解决现在内心恐慌的这种状态。

多想办法,少提问题。以此自勉。

换了Windows电脑,之前Macbook下的markdown文件暂时还找不回来,所以无奈只能把之前的博客都删掉了,也鉴于之前的文章写得实在有点。。
话不多说,这篇文章的主要内容讲的是在Windows下如何配置Hexo,踩得坑比较多,大家将就着看。

1、配置github

2、安装Node.JS

3、安装Hexo

(1)指定npm的镜像

npm install -g cnpm --registry=https://registry.npm.taobao.org

(2)安装hexo

cnpm install hexo-cli -g
cnpm install hexo --save

(3)cd到博客文件夹

cd <folder>

(4)初始化hexo

hexo init
cnpm install

3、配置Hexo

(1)配置_config.yml文件
将_config.yml文件的deploy项修改为类似如下内容:

deploy:
type: git
repository: git@github.com:hunterzhang86/hunterzhang86.github.io.git
branch: master

(2)配置CNAME文件
在source目录下新增CNAME文件,里面的内容填写为自己的域名(如www.ihunter.me),如果没有域名可跳过该步骤

4、新建md文件生成博客并提交到github

(1)在source/_posts目录下新建一个md文件

(2)生成博客

hexo c
hexo g

(3)提交博客

hexo d

FAQ

1、如何卸载hexo

cnpm uninstall hexo

2、如何使用hunter主题

git clone https://github.com/hunterzhang86/hunter.git themes/hunter

修改博客根目录下的配置文件 _config.yml,把theme的值修改为 hunter.

3、升级到hexo 3.0后deploy出现 error deployer not found:git 错误
执行以下命令安装插件即可

cnpm install hexo-deployer-git --save

4、使用hexo 3.0后deploy出现 fatal: Not a git repository (or any of the parent directories) 错误
原因是hexo默认是以项目根目录下的.deploy_git作为git仓库,所以我们得把这个仓库与线上的xxx.github.io仓库绑定,如果绑定过其它目录下的仓库,可以直接把隐藏目录.git复制到.deploy_git目录下。

5、如何初始化gitment评论系统
首先需要在git上添加一个repo,然后需要在OAuth Apps里面添加应用权限授予我们的个人网站,具体可参考Hexo博客框架下Gitment取代多说评论