WangBooth's Logbook

王布斯的网络日志

0%

再烂的一年也值得总结。

每年年末总结,都觉得这一年过得好快。2021年更是如此。

1. 值得开心的事

1.1 搬入自己的房子

这一年最值得庆祝的事情,就是住进了自己的房子里,虽然这房子还是抵押给银行的,但毕竟是完全凭借俩人自己的能力攒钱、从朋友手里借钱付的首付,也算是圆了自己不啃老买房的梦。

房子是2019年10月份开始看,一开始还是不愿意开口找朋友借钱的,但后面开了口之后发现朋友们还是非常愿意给我借钱的,首付很快就凑好了。不过原房主是个奇葩,各种原因导致直到12月31号那天才正式把产证给办好,也算是2019年完成的一件大事吧。

今年年初疫情,再加上家里定做的家具还有味道,4月份才搬进去,住自己的家,踏实~~~

1.2 娃两岁了

娃今年身高长得真快,原来贴在桌子和墙边的防撞条,已经变矮了。

有自己的逻辑,模仿能力很强,学东西也非常快,唱歌、看绘本,很快就能记住。

周末有条件我都会带着娃开车出去浪一圈,弄得每过个周末娃的作息就会乱…

孩子的童年值得多记录一下,2021年计划多拍些照片、拍些 Vlog,给娃、给自己都留些记忆。

1.3 老婆整牙了

牙齿一直是老婆的心病,我倒觉得牙齿不整齐没啥影响,但心病就是这样,靠讲道理是很难释然的。今年最后一个月正好附近的牙科有优惠活动,把牙给整了。
疼肯定是要疼一段时间的,未来2-3年也要不停地收拾牙套,对她来说都是值得的。

一时间能想起的就这几件非常值得开心的事儿了,也是缺少记录,翻了翻手机照片,记录的内容太少了。

2. 难处理的事

我记得蔡崇信有说过类似的话:没有什么难过的事,倒是有一些难处理的事。

难过,就有情绪色彩了,这些人可以不带情绪地处理问题,是值得我学习的。

2020年也有几件难处理的事情。

2.1 降薪

年初上班时,老板病怏怏地躺在床上开着钉钉直播给大家公布了降薪的消息,由于买房还欠了朋友的钱,原本计划年终奖+涨薪能让我尽快把钱还完的,结果年终只拿了几千块,工资还降了…之后通过银行的低利息贷款,贷了点才把钱都还完,好在贷款可以3年后再还,也算是把还钱这件难处理的事儿给处理掉了。

企业降薪也是迫不得已的事情,今年年底又给涨回去了一点,能稍微宽裕一些了。

有些朋友因为降薪换了个公司合作,薪资当然也涨了不少,各有所向,换工作对我现在来说,还是有一定成本的。

2.2 工作上的安排

上半年的工作基本上属于硬扛,公司没融到钱,团队没法扩充,下半年组织架构上的调整比较失败,把前半年的成果估计都抹平了,2021年需要在团队人数上达到一个目标值,要敢于要人,死皮赖脸地要人!

3. 其他琐碎的事情

2020年也没坚持做啥事,运动方面倒是比2019年要加强了一些,但年底体检结果跟2019年比还是更差了…

2021年的展望

持续为他人输出价值,是2021年,或者说是今后10年,我做事的大方向。

不论价值大不大,都需要持续输出!

回想这3年,先是生了孩子,然后买车买房,基本的生活设施都已具备了,当然还有很大的优化空间,但今后一定不能盯着钱看,而是要盯着自己给他人带来多少价值

考工作赚钱,只要我稍微用点心,10年后肯定衣食不愁。但想要将自己的财富、影响力提升一个段位,就必须为更多的人带来价值。

技术方面的输出

除了工作之外,还必须能为公司之外的人带来价值。

  1. 2021年输出100篇技术文章,包括 LeetCode.Life、通用技术分享等;
  2. 发挥不要脸的体质,拉到500个粉丝,以微信公众号粉丝、视频号粉丝为度量;

工作上的输出

  1. 做一个可靠的支撑者,服务更多的同事,不甩锅,不打太极,不油腻,能帮忙的一定帮;
  2. 将同事转化为朋友,让对方信任我;
  3. 2021年加上80%同事的微信;

家庭成员身上的输出

  1. 调动家人一起记录生活,一起拍 Vlog,在拍 Vlog 的过程中达到学习、锻炼的目标;
  2. 为老婆输出一部新手机;
  3. 上半年为孩子输出一个培训班,可以与家人之外的人沟通交流;下半年上个幼儿园或者多个培训班;
  4. 家里添一些家具,比如投影仪、儿童学习桌椅等,后续更新。

2021,量化自己的输出!

我身边有许多杰出青年很不屑于用抖音和快手,提起「抖快」这类短视频应用往往表露出鄙视的表情,就跟城里人看到一个刚进城的乡下人一样。有一次我问老孟(我的大学同学),

我:你在美国用 TikTok 吗?
老孟:我不用,那玩意儿容易上瘾。

「那玩意儿」四个字让我感受到老孟对 TikTok 的反感(顺便说一下,TikTok 是字节跳动面向美国市场推出的美国版的抖音,国内正常途径是无法使用 TikTok 的)。

你可以不刷抖音,不玩快手,但你离不开微信。

微信视频号已经推出一段时间了,抖音和快手的玩家早已盯上微信视频号这块肥肉,不信你打开微信视频号看一看,完全跟抖快是一副尿性。相信大家的朋友圈很快就要被这些短视频给攻破了。

为什么有些人非常讨厌这些短视频,而同时又有那么多人沉迷于这些短视频呢?

其实是算法在作祟。

最近读了一本书:《短视频内容算法:如何在算法推荐时代引爆短视频》,作者叫张佳,并不是大众熟知的人物。这本书本是针对正在从事短视频创作或者即将从事短视频创作的人或企业看的, 通过讲述抖音短视频的内容创作算法以及内容分发算法,来帮助创作者更高效地实现内容营销;但作为普通人,或者说是观众,通过这本书也能一窥短视频算法的究竟,从而得知为什么总是给我推荐反感的视频,或者为什么我会沉迷其中无法自拔。

img

1\

观众丧失了”观看视频”的控制权

不论是快手、抖音还是微信视频号,这些短视频应用在播放视频时都有一个细节,你可能没意识到,但我说出来你一定会恍然大悟,那就是:这些短视频默认都不展示进度条。

一条短视频在播放的过程中,我们要么一直看下去,要么觉得不喜欢,划掉它去看下一个;几乎没有人会刻意暂停一个视频,甚至找到进度条将视频往回拖一段重新看。

没有进度条,你的大脑就必须跟着视频一直走,停不下来,任由信息灌输进来,容不得你深入思考。用作者的总结就是:我们失去了”单位时间内获取信息量”的控制权。

为什么进度条会有如此巨大的魔力呢?我觉得,进度条其实代表的是时间,没有进度条,就意味着我们无法控制时间,同时也让我们忘却时间。观众在观看视频时注意力的失控,根源就在于时间纬度上的失控。

2\

创作者丧失了”内容创作”的控制权

对于普通人,偶尔拍几个小视频记录下美好的生活,会显得十分惬意;但对于靠短视频谋生的创作者们,他们创作的内容,必须要有人看才行,今天拍出来的视频如果没人看,那明天就会饿肚子了。

在微信公众号上进行文字创作的时候,作者只需要通过优雅的文字将自己大脑中的画面描述出来即可;读者们可以细细品味文字的美,并且想象出文字描绘的画面。而视频创作并不能靠观众自己想象,而是必须将观众想看到的画面呈现出来,一旦视频画面与观众想象的不吻合,观众便会拒绝这个视频。

由于观众无法控制进度条,即便视频内容后半段极其吸引人,也会因为前半段不符合观众预期而被划掉。

所以,不光观众丧失了对视频的控制权,创作者也不得不放弃天马行空的想法,创作出每一帧都符合观众预期的画面。说白了,创作者要创作观众脑子里的画面,而不是自己脑子里的画面。

3\

如何创作出有流量的故事?

作者借助心理学、认知语言学等等一系列理论知识讲述了人类的基本认知与基本欲望,然后在此基础上教大家如何创作出有流量且吸引人的故事,我大致总结一下:如何创作出有流量的故事?在符合某一类人群的认知的基础上,创作出满足此类人群某些欲望的、且存在信息差的故事。

认知,其实容易理解。不同的人对同一件事的认识和理解是不一样的,比如你讲了一个实习生在生产环境 sudo rm -rf / 的故事,计算机从业者都能懂,但对于大部分英语专业的学生来说,完全不知所云;

欲望,不必解释。作者讲述了史蒂文·赖斯的人类 16 种基本欲望理论,回头去看抖音上的爆款视频,都至少满足了人类这 16 种欲望中的其中一个;

信息差,可以理解为:我知道我不知道的信息,以及 我不知道我不知道的信息。视频内容必须包含某些观众想知道但不知道的信息才能吸引人。

本章中,作者还讲述了故事创作的五要素以及短视频吸引力六法则,对于从事短视频创作的人来说,值得细细研究!

4\

短视频分发算法的原理是什么?

作者通过爬取大量的抖音数据后,总结了短视频分发算法原理,我概括为一句话:算法在识别出人和内容的基础上,将人与内容相连接

更专业一点的解释是:

  1. 算法需要给视频打上标签,比如这个视频是关于计算机的,或者关于养生的,又或者是关于某个城市的等等;
  2. 算法需要给观众打上标签,比如这个人是男生、程序员、单身、秃头等等;
  3. 算法需要将视频与观众匹配,比如将关于计算机的视频推送给程序员,将关于养生的视频推送给秃头的人等等。

作者解释了算法给视频打标签这一细节,其实并不是通过视频画面来给视频打标签的,而是通过视频的作者、视频标题、描述、评论信息、以及哪些人点过赞等等文字信息来给视频打标签的,为什么这么做呢?一方面是由于通过视频画面抽帧的方式来分析视频内容,技术并没有非常成熟;另一方面,在算法面前,你生产的内容是什么并不重要,你的内容被谁喜欢了才重要。举个例子,某个视频被 10 个程序员点赞了,那算法就会把这个视频推给更多的程序员,它并不关心这个视频的内容到底是不是跟程序员相关的。

img

此外,算法为了进行自我验证,会有一个冷启动的过程。简单来讲,算法会对一个陌生的视频先进行小范围的推广,比如推给 A、B、C 三类人群,每类人群推送 100 人;一段时间后,算法发现 B 类人群中有 80 个人点赞了这个视频,而 A 类和 C 类人群里点赞的寥寥无几,那算法就会继续往 B 类人群中再投放 200 人,继续观察,如果 B 类人群中又有 150 人点赞了,那么算法就会认为这个视频符合 B 类人群的口味,冷启动结束,这两天会使劲往 B 类人群身上推这个视频;而如果这次 B 类人群里只有 30 个人点赞,算法就会认为自己当初误判了,B 类人群并不是真的喜欢这个视频,冷启动结束,再也不推这个视频了(是的,再也不推了,因为算法忙着去找下一个优质视频了,在视频来源充足的情况下,是不会再眷恋这个视频了)。

作者将短视频的分发算法讲清楚后,又详细讲解了该如何迎合算法冷启动的过程,感兴趣的朋友可以仔细研究。这里重点说下普通人,也就是观众,如何来利用算法,让算法更好地给自己推荐符合自己口味的内容。

首先,让算法认识你。在个人介绍里简单描述下自己的爱好,比如爱看 NBA 或者喜欢汽车,这个描述信息尽量用计算机能轻易识别的文字来写,比如一个科比的粉丝,自我介绍写成”我是科蜜”,就不如写成”NBA 科比”这样对计算机友好;

然后,每当遇到自己喜欢的视频,点个赞,告诉算法,这个就是我喜欢的类型,没错,你看我都点赞了;

遇到自己反感的视频呢,不要急着划走,点一下”不喜欢”,明确告诉算法,这个我就是不喜欢。

日积月累,算法便会更加了解你,从而变得更加体贴了,如果它还敢给你推反感的视频,那基本上就能放弃这个算法了,也就是放弃这个平台了。

5\

从微信近期在视频号上的一系列动作上看,短视频领域确实十分火热了,超清晰的手机摄像头、简单的视频编辑 APP 以及高速网络带宽,都为短视频提供了非常好的基础;但另一方面,短视频里也充斥着大量乱七八糟、低俗、无聊的垃圾视频,让很多杰出青年望而却步。

我认为,未来不仅需要更好的算法来满足更好的推荐,也需要更多有意思的创作者来产出更好的内容,各位杰出青年值得尝试!

扫一扫,关注下我的视频号,我会时不时来个直播~

img

点击”阅读原文”,可以跳到京东购买这本书。

图|经 PIL 处理后的照片

手机里的照片和视频越来越多,已经有几十 GB 了,需要把内容备份出来。

但是备份到自己电脑上吧,也不太合适,本身电脑的硬盘也不够大;单独买个移动硬盘是可行的,只要硬盘不坏不丢就好。

网盘目前还是能用的,可以把手机里的内容上传到网盘上来做备份。网盘有个最大的顾虑,就是安全问题,万一泄漏了网盘密码就不好了。

所以,上传到网盘上的内容,我想先加密下,再传到网盘上,这样即使网盘的密码泄漏了,还有文件的密码可以保护一下的。

生成缩略图

为了更快地从网盘上找到想要的加密图片,我把图片压缩到很小,只能看到个图片轮廓,通过缩略图来确认自己想看的最终原图:

thumbnail.py

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from PIL import Image
import getopt, sys
import os
import cv2

img_type_list = ["jpg", "jpeg", "bmp", "gif", "tiff", "png", "raw", "psd"]
vedio_type_list = ["mp4", "mpeg", "mpg", "avi", "mov", "wmv", "mkv", "rmvb", "flv"]

def video2pic(video, img):
print("video2pic: {} to {}".format(video, img))
cap = cv2.VideoCapture(video)
# cap.set(1, int(cap.get(7)/2))
cap.set(1,2)
rval, frame = cap.read()
if rval:
cv2.imwrite(img, frame)
cap.release()

def thumbnail(in_file,out_file,size):
print("thumbnail: {} to {}, size: {}".format(in_file, out_file, str(size)))
im = Image.open(in_file)
im.thumbnail(size)
im.save(out_file)

def usage():
pass

def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "ht:i:o:s:", ["help", "in=", "out=", "size="])
except getopt.GetoptError as err:
print(str(err))
usage()
sys.exit(2)

_in = None
_out = None
_size = 96

for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-i", "--in"):
_in = a
elif o in ("-o", "--out"):
_out = a
elif o in ("-s", "--size"):
_size = int(a)
else:
assert False, "unhandled option"

if (None == _in) or (not os.path.exists(_in)):
print("in is not exists")
sys.exit(2)
if (None == _out):
print("out is not exists")
sys.exit(2)
if not os.path.exists(_out):
print("mkdir out dir")
os.mkdir(_out)

size = (_size, _size)


if os.path.isdir(_in):
files = os.listdir(_in)
for f in files:
src_file_path = _in+"/"+f

if os.path.isfile(src_file_path):
file_type = src_file_path.split(".")[-1].lower()
if src_file_path.split(".")[-1].lower() in vedio_type_list:
thumbnail_file_path = _out+"/"+f+".jpg"
video2pic(src_file_path, thumbnail_file_path)
thumbnail(thumbnail_file_path, thumbnail_file_path, size)
elif src_file_path.split(".")[-1].lower() in img_type_list:
thumbnail_file_path = _out+"/"+f
thumbnail(src_file_path, thumbnail_file_path, size)
else:
print("not img or vedio file: " + src_file_path)

else:
print("in need be a dir.")

if __name__ == "__main__":
main()

文件加密

encrypt.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh
# $1 is src dir
# $2 is the passwd

mkdir -p $1"/encrypt"

for i in `ls $1|grep -v encrypt`;
do
echo $i;
tar -zcf - $1"/"$i |openssl des3 -salt -k $2 |dd of=$1"/encrypt/"$i".tgz.des3";
echo $i.tgz.des3;
done

for i in `ls $1|grep -v encrypt`;
do
a=`md5 $i`;
echo $a
echo $a >> $1"/encrypt/md5.txt";
b=`md5 $1"/encrypt/$i.tgz.des3"`;
echo $b
echo $b >> $1"/encrypt/md5.txt";
done

文件解密

decrypt.sh

1
2
3
4
5
6
7
#!/bin/sh
# $1 is src file
# $2 is the passwd

echo $1

dd if=$1 |openssl des3 -d -k $2 |tar zxf -

目录结构

图 | 刚毕业那年在车库的工作情景

翻出来刚毕业那会儿工作时被派到地下车库干活儿的照片,当时是在做无线 AP 的测试,由于写字楼无线网络干扰严重,公司又没有专业的隔离实验室,就只好在地下车库这种干扰少一些的地方做无线测试了。当时觉得把自己派到地下真是憋屈,还安慰自己说在车库里工作过的后来都牛逼了…

正式开工

受2019冠状病毒疫情影响,这周一才正式复工,之前两周其实是在家里远程办公,效率一般,复工后的效率要高一些。

听说杭州很多企业受疫情影响都过得不太好,裁员、降薪之类的公司有不少,我们也降薪了,全员降10%,可自愿多降一些,但公司不白降你薪,会给你换双倍价值的期权。期权这东西,我认为信则有,不信则无。有意思的现象是:由于不能聚集到一起开会,老板在钉钉上视频直播讲这次降薪的决定,底下的人在群里纷纷表示自己愿意自降20%、自降30%等等,像极了斗鱼上美女主播唱歌表演时粉丝们刷弹幕刷礼物的样子,只不过这个主播不说谢谢。

关于软件测试

国内技术型的创业公司,不建议设专职的软件测试岗位。

这是我这两年的感受,技术型的创业公司要求先活下来再活得好,专职的软件测试岗位在创业公司比较尴尬:干的外包的活儿,拿着正式员工的钱。自己觉着不爽,公司也觉着不划算。

关于裁员

今天听说一个公司元老级的人物合同到期了,这个时间点正是公司困难的时候,就没有再跟他续签合同了,这个应该不算是被裁掉,只是觉得有些心寒。在我的印象里,他原先是个交互设计师,后面由于公司发展需要还兼任了产品经理,加班出差之类的事情也没见抱怨过,属于任劳任怨而且有一定的能力能产出成绩,对公司特别忠诚的那种人(老板经常讲对公司要忠诚)。

不续签合同,我想他也很无奈吧,这个时间点除了几个大厂在招人,其他公司基本都只出不进了,他能顺利进入大厂么?或许他当初就是被老板画的大饼吸引了才从大厂出来加入这个创业公司的吧。

如何在公司里不被裁,我有几个感受:

  1. 一定要跟对一个好老板

    这里的「老板」不是指 CEO,而是你的某个上司,这个上司必须得在公司有一定的地位,一但有人要裁你,他有能力保住你;

  2. 做跟公司方向一致的事情

    公司的最终目标都是赚钱,要么帮公司赚钱,要么帮公司省钱。每个月的个人收入如果是10000元,那公司在你身上的支出可能是15000~20000,你一年能帮公司赚到 (15000~20000)*12这么多钱吗?公司都是按钱算账的;

  3. 高调做事

    工作上做出来的成果,要高调宣扬,给自己打广告,告诉老板们你又帮公司实现了什么。一年只需有那么两三次高调的事情让老板们听到,并且没有非常大的黑点,你在老板心里的地位基本上就稳了;

  4. 保持好心态

    工作,其实是个人与企业做的一次长达 N 年的交易,这 N 年期间,企业为个人提供薪资,个人为企业提供产品(代码、服务等等)。个人随时可能出现不合规范的交易(比如交不出好的产品,或者突然提离职),企业也随时可能出现不合规范的交易(比如单方面解除合同,延期发工资等),双方都有能力对对方造成损失。企业为此做了充足的准备,比如一些关键岗位必须设置 backup,防止关键人物突然离职造成的业务停滞,将意外造成的损失最小化;而个人往往没有对此做足够的准备,一方面可能被企业宣导的「大家庭」理念误导了。所以,认清「人与企业之间是单纯的利益关系,而不是亲戚朋友的关系」这个事实,保持好心态,与企业公平交易即可。

ToB 的企业往往会有 私有化交付 的需求,也就是将企业内部的应用打包部署到客户的服务器上使用。最近在交付过程中遇到 传包 的问题,由于客户方的服务器不是随便能传文件的,必须经过一级一级领导审批才行,而且过程中对传入服务器的文件大小还有限制,整个流程大致是:

image-20190726171454923

而我们当前的 jar 包又特别大,一个大的可能有几百兆,往客户服务器上传文件比较坎坷,客户也经常抱怨:不是说就改几行代码么,干嘛传这么大的包?

jar 包为什么这么大呢?解压出来一个 jar 包看看:

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
29
30
31
32
33
34
35
36
37
.
├── BOOT-INF
│   ├── classes
│   │   ├── application-dubbox-provider.xml
│   │   ├── application.properties
│   │   ├── application-root.xml
│   │   ├── com
│   │   │   └── dtwave
│   │   │   └── dsource
│   │   │   └── biz
│   │   │   ├── config
│   │   │   │   └── SecurityConfig.class
│   │   ├── dsource.properties
│   │   ├── git.properties
│   │   ├── logback
│   │   │   └── default.xml
│   │   └── logback.xml
│   └── lib
│   ├── activation-1.1.jar
│   ├── dsource-common-4.4.0-SNAPSHOT.jar
├── dsource-common-4.4.0-SNAPSHOT.jar
├── dsource-service-provider-d-4.4.1.jar
├── META-INF
│   ├── dubbo
│   │   └── com.alibaba.dubbo.rpc.Filter
│   ├── MANIFEST.MF
│   └── maven
│   └── com.dtwave.dsource
│   └── dsource-service-provider
│   ├── pom.properties
│   └── pom.xml
└── org
└── springframework
└── boot
└── loader
├── archive
│   ├── Archive.class

待续…

basic_logstash_pipeline

需求

公司里目前各个服务部署在不同的服务器上,每个服务有自己的日志文件,日志缺乏统一查看的地方,平时看日志得去 SSH 到服务器上去才能看,不方便排查问题:

image-20190724205836242

另外,有些服务器对不同岗位的人权限是分开的,比如测试服务器上,只有测试人员才能通过 SSH 登录到服务器,开发人员是没权限登录的,开发人员想查问题就得找测试人员去一个个要日志了,测试人员也得陪着开发去一个个找,大家都难受。

所以,就想着通过 Logstash 将日志汇聚到 ES 里,让大家通过同一个口子—— kibana 来查看服务日志。

image-20190725163751321

测试环境

  • CentOS 7.5
  • Java 1.8
  • Logstash 7.2.0
  • ES 7.2.0
  • Filebeat 7.2.0
  • Kibana 7.2.0

安装

直接从官网下载压缩包解压即可,参考官网

Filebeat

监控文件的变化以及读文件,是通过 Filebeat 实现的,下载好 Filebeat 后,修改 Filebeat 的配置文件:

1
2
3
4
5
6
7
8
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/dubhe-master/logs/dubhe-master.info.log
- /data/dubhe-daemon/logs/dubhe-daemon e.info.log
output.logstash:
hosts: ["logstash服务器IP:5044"]

上述配置表明,Filebeat 将监控并读取两个日志文件,然后将日志内容传给 Logstash。

启动 Filebeat: nohup ./filebeat -e -c filebeat.yml -d "publish" >> filebeat.log 2>&1 &

Logstash pipeline

Logstash 是通过 pipeline 的方式来完成整个日志接收、处理和传送过程的,先创建一个空的 pipeline 文件 test.conf:

1
2
3
4
5
6
7
8
input {
}

filter {

}
output {
}

pipeline 中的 input 用于接收 Filebeat 传来的内容,Logstash 通过自带的 Beats input 插件来接收,在 input 中添加 beats :

1
2
3
input {
beats { port => 5044 }
}

filter 用于内容转换,暂时先放着不管。

output 为输出,这里将日志内容输出到 ES 中,在 output 中添加 ES 信息(ES 需提前安装好):

1
2
3
output {
elasticsearch { hosts => ["ES服务器IP:9200"] }
}

检查 pipeline 文件格式是否正确:

1
bin/logstash -f test.conf --config.test_and_exit

如果返回内容显示 Config Validation Result: OK. 则表名 pipeline 文件配置正确,否则需要检查 pipeline 文件内容。

启动 logstash:

1
nohup bin/logstash -f test.conf --config.reload.automatic >> logstash.log 2>&1 &

Kibana

打开 kibana,过滤查看字段 log.file.pathmessage 来查看日志内容:

image-20190725163443511

总结

通过简单的配置,练习了从 日志文件 -> Filebeat -> logstash -> ES -> Kibana 的过程,简单实现了最原始的需求:不同地方的日志从统一一个口子查看。

参考资料

ES 官方文档: https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html

(全文完)

图 | 2019年1月27日 杭州 梦想小镇


技术

  1. 测试金字塔

    测试金字塔,越靠近金字塔底层的测试越重要,也应该做得越多,但我们目前大部分还是倒过来的「冰淇淋」型,上层的测试反而更多。

  2. 产品和项目的区别

    可以理解为,产品是一个长远的目标,一个产品会有很大的需求池,而项目是为了实现这个长远目标而做的迭代,每次在需求池里取出一部分需求去实现。

  3. 密码学入门

    免费的密码学入门教程。

图 | 2019年1月15日 北京 某烤鸭饭店

有很多年没有正经吃过冰糖葫芦了,无籽,中间还有豆沙,很好吃~

资源

  1. The 2019 DevOps RoadMap

    DevOps 应该是 ToB 类企业里的程序员必备的技能,如果开发人员只专注于代码,而不关心产品的交付过程,感觉只有在大型的 ToB 类企业里才会活得舒服,最近半年深有感触!

  2. 2019,业绩就是尊严,其他都是扯淡!

    一篇鸡汤,今年很多公司年终奖都打了折扣,似乎大家都缺钱了,喝点鸡汤吧~

    挑了一段我喜欢的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    1、请你来是解决问题而不是制造问题。 

    2、如果你不能发现问题或解决不了问题,你本人就是一个问题。

    3、你能解决多大的问题,你就坐多高的位子。

    4、你能解决多少问题,你就能拿多少薪水。

    5、让解决问题的人高升,让制造问题的人让位,让抱怨问题的人下课。
  3. CES 2019: A Show Report

    CES:Consumer Electronics Show, 消费电子展。

    我当漫画的看~

  4. 技术团队效能动力模型如何搭建

    阿里大神的演说,学习下

  5. 内网穿透工具

    frpngrok,最近用 ngrok 比较多,省了 TeamViewer 的订阅费,frp 有时间也研究下~

技术

  1. Git 凭证

    前些天从 gitlab 上拉代码的时候,提示 remote: Not Found:

    1
    2
    3
    > git fetch origin
    remote: Not Found
    fatal: repository 'http://git.xxx.com/xxx.git/' not found

    字面意思是:远程仓库不存在。但是我对比了 URL, 远程仓库真的存在,而且在其他人电脑上是可以拉到代码的,我思来想去,应该跟我最近改了 gitlab 密码有关。

    Git 在使用 HTTP 协议时,每次与远程仓库交互,都需要输入用户名密码,很麻烦,于是 Git 便使用一套 凭证系统 来解决这个麻烦,凭证系统 有几种模式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    1. 默认所有都不缓存。 每一次连接都会询问你的用户名和密码。

    2. “cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除。

    3. “store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期。 这意味着除非你修改了你在 Git 服务器上的密码,否则你永远不需要再次输入你的凭证信息。 这种方式的缺点是你的密码是用明文的方式存放在你的 home 目录下。

    4. 如果你使用的是 Mac,Git 还有一种 “osxkeychain” 模式,它会将凭证缓存到你系统用户的钥匙串中。 这种方式将凭证存放在磁盘中,并且永不过期,但是是被加密的,这种加密方式与存放 HTTPS 凭证以及 Safari 的自动填写是相同的。

    5. 如果你使用的是 Windows,你可以安装一个叫做 “winstore” 的辅助工具。 这和上面说的 “osxkeychain” 十分类似,但是是使用 Windows Credential Store 来控制敏感信息。 可以在 https://gitcredentialstore.codeplex.com 下载。

    我用的 MacOS,所以使用了 osxkeychain 模式,当我在 gitlab 上的密码修改之后,系统 钥匙串 中的凭证是没有变的,所以我应该是认证失败了( git 的错误提示也很让人憔悴),删掉 钥匙串 之后再试一下,输入新的密码,这次 osxkeychain 里就有新的凭证了。

  2. NetCat 网络工具中的「瑞士军刀」

    最近在客户现场出差,生成环境的机器只能通过堡垒机访问,而且各个服务器直接的网络也限制得很严格,ssh_config 中限制了所有服务器都只允许堡垒机的 root 账户访问,想要在服务器直接传文件不能直接用 scp ,这个时候,nc 就能大显神威了!我常用的两个场景:

    1
    2
    3
    4
    5
    6
    1. 传文件
    [server] $nc -l 1567 > file.txt
    [client] $nc server_ip 1567 < file.txt

    2. 端口扫描
    $nc -z -v -n 172.31.100.7 21-25

图 | 2019年1月12日 北京 北海公园

作为一个北方人,见过结冰,但没见过河里结冰还能一群人上去玩的,这次开眼了~

北海公园,80块钱,不限时随意玩,可以:冰上碰碰车、亲子小板凳(我不知道该叫啥)、自己溜冰。

这次路过,下次有机会玩一下!

资源

  1. nullschool

    这个网站通过超级计算机的预告,可以在这个交互的动画地图上查看现在的风,天气,海洋和污染状况。每三个小时更新一次。

  2. SSH Examples, Tips & Tunnels

    有关 SSH 的各种用法示例,我们平时可能只是简单用一下 SSH,其实它还有很多能实现的功能,不一定用得上,但起码得知道,用的时候能想到。

生活知识

  1. 异地购车上牌的政策差异

    由于我在杭州工作,但户口还在老家,于是在杭州买了车要开回老家上牌,踩了个地区政策差异的坑,分享下:

    1.1 买车是要交「车辆购置税」的,在哪里上牌就在哪里交税;

    1.2 交税时,需要一个「车辆购置税申报表」,这张表,按地区不同,政策有所不同:要不要「表」?有些地区要,有些地区不要;「表」由谁提供?有些地区必须由4S店提供,有些地区可以到交税的地方领取;「表」的格式,有些地区要求必须有二维码,有些地区允许手写;

    1.3 到哪里交税?有些地区是去国税局交,有些是在车管所。

    上面的问题,需要提前问清楚,要有所准备,不要完全相信「官网」上的信息(几年不更新的)。另外,在我朝,花钱找黄牛,总是「靠谱」的。

  2. 超声心动图

    平时体检时,一般会作彩超,但没有做过心脏的彩超,超声心动图 可以检测心脏瓣膜区域功能、左右侧心脏不正常联系、瓣膜返流、以及心脏输出量的计算等。其他测量的参数包括心脏尺寸(管腔直径和室间隔厚度)和E / A比值。

    心脏作为人体的核心部件,必须好好照顾下,以后每年体检可以加上这一项。

  3. 如何跟压力做朋友

    「工作压力大」会导致各种疾病啥的,看人。用积极的态度对待压力,可能就没那么多毛病了。

技术

  1. docker tag的一次踩坑

    这次用 gitlab-ci + k8s 来打包,用了官方的 maven 镜像,一开始,ci 里直接用了 maven:latest ,前两天还能正常打包,后来就出问题了,一查才发现是 JDK 版本变了,maven:latest3-jdk-8 这个 tag 挪动到 3-jdk-11 了。

    所以,以后latest这个 tag 得慎重用,我觉得,有些保持向前兼容的,是可以一直用latest的。

今天在从本地往服务器传文件时,出现了一个诡异的问题:

1
2
3
> scp dist/test.tgz [email protected]:/opt/workspace/

scp: /opt/workspace/: Is a directory

这个命令我几乎执行过上千次了,同样的源文件,同样的目标路径,咋这次就出错了呢?

而且,目标服务器上 /opt/workspace/ 这个目录,是一直都约定好的目录,一直都用的这个,而且确实是 Is a directory,这 scp 的错误信息,我有点懵逼。。

于是登陆到远程服务器去看看,这个目录是咋回事,没权限了还是咋了?

登陆上去后才发现,他娘的这个目录被人重命名了,成了 /opt/workspace_4.3.0/,这个时候才恍然大悟,原来 scp 的错误信息没毛病:我是在将一个文件传输到远程服务器,传输到远程服务器上后对应的是一个目录,所以scp不干了。

不过,这种提示信息,我估计很多人都会懵逼,报错只报一半,不是个好的报错。