Space - ISA


  • Home

  • Archives

C++ Review

Posted on 2019-10-16

Chapter 4 类和对象

利用类可以实现数据的封装、隐藏、继承和派生

封装

抽象

抽象的实现:通过类的声明

封装

将抽象出的数据成员、代码成员相结合,将它们视为一个整体。
实现封装:类声明中的{}

  • 注意:数据成员可以是指向自身类的指针(由于指针和引用所占存储空间大小与类型无关,所以编译器可以计算分配空间),但不能是自身类的对象(会出现无限初始化的问题)。也不能是auto,extern,和register类型。

为什么不能是auto, extern, register类型: auto/register/extern表示的是变量的存储位置和作用域。auto变量存储在函数的堆栈空间,register存储在寄存器,extern表示这里没有新定义变量,只是扩展了一个已有全局变量的作用域。类和结构体中的变量是成员变量,其存储位置和作用域由定义对象的函数决定,不由这些对象自己决定。
例如,你定义了一个类,complex,然后你在函数main中有如下语句:

1
auto complex c;

这就表示c这个对象在函数堆栈中存储。那么,c中的real和imaginary自然也在堆栈中了。同时,他们的生存期也仅限于函数内部。因此,你不需要,也不能单独给对象的成员变量规定存储位置和作用域。
this指针: 编译器改变每个类成员函数的调用,加上一个额外的实参,即被调用对象的地址。

访问控制

private

在类内部可以任意访问。外界只能通过对象的接口(具有public属性的成员函数)来访问。

protected

在派生类中,具有私有的或者保护的访问属性(private成分在派生类中是不可访问的)。

public

外界可以访问。
创建一个对象指针:

1
Clock *p = new Clock;

成员函数在内存中的存储方式

https://blog.csdn.net/fuzhongmin05/article/details/59112081

用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分配存储单元。 能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码? 显然,这样做会大大节约存储空间。C++编译系统正是这样做的,因此每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间。
看如下测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class D  
{
public:
void printA()
{
cout<<"printA"<<endl;
}
virtual void printB()
{
cout<<"printB"<<endl;
}
};
int main(void)
{
D *d=NULL;
d->printA();
d->printB();
}

问题:以上代码的输出结果是什么?

C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(即自由存储区)。全局数据区存放全局变量,静态数据和常量;所有类成员函数和非成员函数代码存放在代码区;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;余下的空间都被称为堆区。根据这个解释,我们可以得知在类的定义时,类成员函数是被放在代码区,而类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的。对于非静态成员变量,我们是在类的实例化过程中(构造对象时)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。

应当说明,常说的“某某对象的成员函数”,是从逻辑的角度而言的,而成员函数的存储方式,是从物理的角度而言的,二者是不矛盾的。

下面我们再来讨论下类的静态成员函数和非静态成员函数的区别:静态成员函数和非静态成员函数都是在类的定义时放在内存的代码区的,因而可以说它们都是属于类的,但是类为什么只能直接调用静态类成员函数,而非静态类成员函数(即使函数没有参数)只有类对象才能调用呢?原因是类的非静态类成员函数其实都内含了一个指向类对象的指针型参数(即this指针),因而只有类对象才能调用(此时this指针有实值)。

回答开头的问题,答案是输出“printA”后,程序崩溃。printA是成员函数,存放在代码段(.text),所以没有实例化类的时候仍然可以调用。printB是虚函数,关系到虚函数表和虚函数指针,虚函数指针存放在实例化的对象中,所以,未实例化对象时,不存在虚函数指针,所以调用虚函数会报错。类中包括成员变量和成员函数。new出来的只是成员变量,成员函数始终存在,所以如果成员函数未使用任何成员变量的话,不管是不是static的,都能正常工作。需要注意的是,虽然调用不同对象的成员函数时都是执行同一段函数代码,但是执行结果一般是不相同的。不同的对象使用的是同一个函数代码段,它怎么能够分别对不同对象中的数据进行操作呢?原来C++为此专门设立了一个名为this的指针,用来指向不同的对象。

需要说明,不论成员函数在类内定义还是在类外定义,成员函数的代码段都用同一种方式存储。不要将成员函数的这种存储方式和inline(内联)函数的概念混淆。不要误以为用inline声明(或默认为inline)的成员函数,其代码段占用对象的存储空间,而不用inline声明的成员函数,其代码段不占用对象的存储空间。不论是否用inline声明(或默认为inline),成员函数的代码段都不占用对象的存储空间。用inline声明的作用是在调用该函数时,将函数的代码段复制插人到函数调用点,而若不用inline声明,在调用该函数时,流程转去函数代码段的入口地址,在执行完该函数代码段后,流程返回函数调用点。inline与成员函数是否占用对象的存储空间无关,它们不属于同一个问題,不应搞混。

构造函数和析构函数

由系统自动执行,在程序中不可以显示地调用它们。
定义数组时,需要使用无参的构造函数。

拷贝构造函数

拷贝构造函数的参数常常是const类型本类对象的引用。当类具有指针类型的数据成员时,默认拷贝构造函数就可能产生指针悬挂问题,需要提供显示的拷贝构造函数。

析构函数

析构函数不可以重载,也就是每个类只有一个析构函数。当数据成员有指针或者指针数组时,在析构函数中应当将new出来的空间delete掉。

类的组合

前向引用声明

前向声明的类属于一个incompete type只能用于指针和引用传递,或者声明该类型为函数形参或者返回值。在提供一个完整的类声明之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象。

1
2
3
4
5
6
7
class Fred; //前向引用声明
class Barney {
Fred x; //错误:类Fred的声明尚不完善
};
class Fred {
Barney y;
};

数据的共享与保护

  • 这种生存期与程序的运行期相同。
  • 在文件作用域中声明的对象具有这种生存期。
  • 在函数内部声明静态生存期对象,要冠以关键字static。

类的静态成员

包括静态数据成员(类中所有对象间的数据共享)和静态成员函数(操作类的静态数据的函数)。
point
对public的静态成员的访问:
可以通过类Point::showCount();也可以通过任何一个对象a.showCount();。 对普通成员(非静态成员)的访问需要当前对象(*this),对静态成员的访问不需要当前对象。静态数据成员不是由构造函数创建的。
static

Travel to London

Posted on 2019-09-30
Royal Observatory at Greenwich
皇家格林尼治天文台

buildings

  • Greenwich Prime Meridian (格林尼治本初子午线)
    meridian
  • eastern hemisphere (东半球)
  • western hemisphere (西半球)
  • Visitors to the Observatory can stand in both the eastern and western hemispheres simultaneously. (游客可以同时站在东半球和西半球)
  • curator (馆长,负责人)
  • At the moment we are welcoming 850,000 visitors a year. Later on this year we’ll be opening some new facilities: an astronomy centre and a big planetarium, and we expect that our visitor figures will be over one million a year.(目前我们每年的游客数量为85万,今年晚些时候我们会开放一些新设施:一个天文中心和一个大型天文馆,我们预计我们的每年游客数量将超过100万)
    -------------------------------
    Big Ben
    大本钟

bigben

  • If I tell you that I’m standing in front of Big Ben, most of you will know at once that I’m outside the Houses of Parliament in London. Of course there’ll be a handful of listeners who think Big Ben is a wrestler or a grizzly bear, but you’re the ones who don’t get out much. Just about everyone knows that Big Ben is the Houses of Parliament’s clock tower, which means just about everyone is wrong. Because if truth be told, and I do like a bit of truth once in a while, Big Ben is actually the name of the bell, which through the magic of radio and a piece of good timing on my part, should start bonging away shortly!**
  • the Houses of Parliament(议会大厦,大本钟在议会大厦附近,英国政府的很多大事都是在这里决策下来的)
  • Big Ben is one of the most striking landmarks of London.(大本钟是伦敦最著名的景点之一)
  • a wrestler(摔跤选手)
  • a grizzly bear(灰熊)
  • They don’t get out much.(他们不经常出门,或者可以说他们孤陋寡闻)
  • Onomatopoeic, a word that is onomatopoeic is a word that, when spoken, resembles the sound that something makes. (象声词)
  • a cliché(陈词滥调)
  • gothic and medieval styles(哥特式的中世纪风格)
  • What a great sound! It was called big for obvious reasons. The bell weighs in at around 13,700 kilograms, over 13.5 tonnes. Which means that if it landed on you, the phrase “as flat as a pancake”, wouldn’t be a cliché, but an accurate description. It’s called Ben rather than Dave or Nancy because it got its nick name from a chap called Sir Benjamin Hall, who was in charge of maintaining The Houses of Parliament at the time.
------------------
British Museum
大英博物馆

museum

  • Egyptian mummies(埃及木乃伊)
  • ancient Greek statues(古希腊雕像)
  • Chinese Buddhist paintings(中国佛教画卷)
  • The British Museum is really the collection of the cultural achievement of humanity. So to be a bit more specific, it contains collections of material, objects made by people throughout time, across the centuries, across the globe.
  • Artefacts(艺术品)
  • The Egyptian mummies are always incredibly popular with children and adults alike because there’s obviously a fascination with ancient Egyptian culture, but we also have wonderful classical collections: material from ancient Greece. We have really iconic objects like the Rosetta Stone; and then we have really wonderful beautifully made objects that are perhaps less well-known, but things like extravagant turquoise mosaics from Mexico and we have wonderful sort of masks from Africa.
  • turquoise mosaics from Mexico(绿松石摩赛克双头蛇)
    snake
  • Terracotta Warriors(兵马俑)
  • highlight(精彩的展品)

Some Trics in Coding Practice

Posted on 2019-08-04

//TODO: 目前题目较少,先暂时这样整理,之后再整理归类

1

题目

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路

很容易想到一个会引起死循环的方法:

1
2
3
4
5
6
7
8
int NumberOf1(int n){
int cnt = 0;
while(n){
if(n&1) cnt++;
n >>= 1;
}
return cnt;
}

原因是负数的移位最高位总是1。
一个非常巧妙的思路是:
把一个整数 (无论正负或0)减去1,再和原整数做与运算,会把该整数最右边的一个1变为0,例如:110100减1后变为110011,二者进行与操作后,得到110000,最后边的1变为了0,而前面的位都不变。
这样,我们可以利用这这一结论来从左向右依次将整数的最右边的1变为0,当该整数的所有位为1的位均变为0之后,便统计到了该整数二进制中1的个数。

代码

1
2
3
4
5
6
7
8
9
int  NumberOf1(int n) {
int count = 0;
while(n)
{
count++;
n = n & (n-1);
}
return count;
}

参考

https://blog.csdn.net/ns_code/article/details/25425577

2

题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

思路

暴力法复杂度为O(n^3)。利用滑动窗口,比较容易想到的是下面这种O(n^2)解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int lengthOfLongestSubstring(string s) {
int res = 0;
int n = s.length();
if(n) res = 1;
for(int i = 0; i < n; i++){
map<char, int> mp;
mp.insert(make_pair(s[i], 1));
for(int j = i + 1; j < n; j++){
if(!mp.count(s[j])){
mp.insert(make_pair(s[j], 1));
res = max(res, j-i+1);
}
else{
break;
}
}
}
return res;
}

优化之后,可以把复杂度降为O(n):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int lengthOfLongestSubstring(string s) {
int res = 0;
int n = s.length();
map<char, int> mp;
for(int i = 0, j = 0; j < n; ){
if(!mp.count(s[j])){
mp.insert(make_pair(s[j], 1));
res = max(res, j-i+1);
j++;
}
else{
mp.erase(s[i]);
i++;
}
}
return res;
}

进一步优化,建立元素到索引的映射:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int lengthOfLongestSubstring(string s) {
int res = 0;
int n = s.length();
map<char, int> mp;
for(int i = 0, j = 0; j < n;){
if(!mp.count(s[j]) || mp[s[j]] < i){
// std::map插入已存在的key时,key对应的内容不会被更新
if(!mp.count(s[j])) mp.insert(make_pair(s[j], j));
else mp[s[j]] = j;
res = max(res, j-i+1);
j++;
}
else{
i = mp[s[j]] + 1;
}
}
return res;
}

3

排序相关

快速排序

Mark一个非常清晰的快速排序代码~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int partition(vector<int>& nums, int left, int right){
int i = left, j = right;
int base = nums[left];
while(i < j){
while(i < j && nums[j] >= base) j--;
if(i < j) nums[i++] = nums[j];
while(i < j && nums[i] <= base) i++;
if(i < j) nums[j--] = nums[i];
}
nums[i] = base;
return i;
}
void quickSort(vector<int>& nums, int left, int right){
if(left >= right) return;
int par = partition(nums, left, right);
quickSort(nums, left, par-1);
quickSort(nums, par+1, right);
}

Kibana中应用Timelion, X-pack, ML监测异常

Posted on 2019-08-03

Timelion

在表达式栏里,可以创建一个Timelion表达式以指向一个或多个数据源,而不仅限于Elasticsearch。Kibana仪表板唯一可能的数据源就是Elasticsearch,这是两者之间的一个主要区别。
点击Kibana面板上的Timelion即可进入编辑页面。

警报严重度监测

1
2
3
.es(index=filebeat-*, timefield='@timestamp', metric = 'max:suricata.eve.alert.severity', split=beat.name:5).label(regex='.* beat.name:(.*) > .*', label='$1').points(symbol=cross).legend(columns=2, position=nw),
.static(4, label='严重警报').color(#ff0000),
.es(index=alert-hsh*).label('Alert')

说明:

  • 如果一些数据出现缺失,可以利用fit函数,以特定的模式(carry, scale等)对数据进行插值。
  • 在图表中打印输出两个阈值,一条静态的直线表示警戒值,另一条线代表若被超过则问题严重。
  • 其中用到了正则表达式,是为了让图例中的文字更加精简。
  • 这里用到了自定义的索引alert-hsh*,这是与x-pack结合使用,如果x-pack发出警报,则在Timelion中Alert的值就为1,否则为0。 效果图:
    Timelion0

警报数目异常

1
2
3
.static(8).color(#FF9800).label(Warning),
.static(10).color(#F44336).label(Error),
.es(index=filebeat-*,q='suricata.eve.event_type:alert').color(#2196F3).label('Number of alerts over time').legend(columns=2, position=nw)</code>

效果图:
Timelion1

参考资料

https://segmentfault.com/a/1190000016679290

X-pack

验证X-pack是否安装成功(username和password是自己的用户名和密码):
curl -u username:password -XGET 'http://172.16.176.51:9200/_watcher/stats?pretty'
在Kibana面板依次点击Management->Watcher->Create advanced watch即可进入编辑页面。
CreateAWatch
下面是一个监测suricata.eve.alert.severity是否>3的watcher,当>3时,会创建一个名为alert-hsh*的索引。

Watcher

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
{
"trigger": {
"schedule": {
"interval": "30s"
}
},
"input": {
"search": {
"request": {
"search_type": "query_then_fetch",
"indices": [
"filebeat*"
],
"types": [],
"body": {
"aggs": {
"host": {
"terms": {
"size": 10,
"field": "beat.name",
"order": {
"alert_severity": "desc"
}
},
"aggs": {
"alert_severity": {
"max": {
"field": "suricata.eve.alert.severity"
}
},
"alert_signature": {
"terms": {
"field": "suricata.eve.alert.signature"
}
}
}
}
},
"query": {
"bool": {
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-{{ctx.metadata.window_period}}"
}
}
}
]
}
}
}
}
}
},
"condition": {
"script": {
"source": "if (ctx.payload.aggregations.host.buckets.size()==0) return false; def node=ctx.payload.aggregations.host.buckets[0]; return node.alert_severity.value>ctx.metadata.threshold;",
"lang": "painless"
}
},
"actions": {
"my-logging-action": {
"logging": {
"level": "info",
"text": "There are {{ctx.payload.hits.total}} documents in your index. Threshold is {{ctx.metadata.threshold}}. Test"
}
},
"index_payload": {
"transform": {
"script": {
"source": "def events=[]; def temp=ctx.payload.aggregations; for (int i=0;i<temp.host.buckets.length;i++) if (temp.host.buckets[i].alert_severity!=null){ def event=['@timestamp':ctx.trigger.triggered_time,'beat.name':temp.host.buckets[i].key,'alert.severity':temp.host.buckets[i].alert_severity.value]; events.add(event);} return ['_doc':events];",
"lang": "painless"
}
},
"index": {
"index": "alert-hsh",
"doc_type": "alert"
}
}
},
"metadata": {
"window_period": "30m",
"threshold": 3
}
}

参考资料

  1. https://yq.aliyun.com/articles/278046
  2. https://www.elastic.co/guide/en/elastic-stack-overview/7.2/how-watcher-works.html#watch-definition
  3. https://www.elastic.co/guide/en/x-pack/current/xpack-alerting.html
  4. https://blog.csdn.net/u012881331/article/details/88899420
  5. https://blog.csdn.net/dwyane__wade/article/details/80191106
  6. https://github.com/elastic/examples/blob/master/Alerting/Sample%20Watches/cpu_iowait_hosts/watch.json

ML, Raw Data与Graph配合使用

首先,在ML中创建Job,如果有Nginx服务,则会出现几个默认的Nginx有关的Jobs,启动就好。在下图中,可以看到有一个值的分数很高(代表这个值的异常度很高),说明这个IP地址在很短的时间内大量访问了net.bnu.edu.cn。 ml0
点击表格右边的类似螺丝钉的按钮ml1,再点击Raw Data,可以看到原始的数据,如下图所示。
ml2
此时,可以自行增加一些字段,使得数据的内容更加丰富,如下图所示。
ml3
此时,为了更进一步探究这些字段之间的关系,可以借助Graph工具。
在Graph工具中,需要选择index和想要探究的字段。这里,可以根据Raw Data中的字段来选择字段,如下图所示。
ml4
可以看到,/dokuwiki/lib/exe/ajax.php与POST之间的关系比较强烈,因为这两个节点之间的连线非常粗。点击连线,在右下角可以看到具体的数值,310代表包含/dokuwiki/doku.php?id=xmz:brlek&do=edit字段的文档数,5551代表包含POST的文档数,309代表同时包含两个字段的文档数。说明这个IP地址通过POST方法,对这个url进行了多次请求。

Elastic Stack

Posted on 2019-07-12

《精通Elastic Stack》阅读笔记
[印]Y.古普塔
[印]R.K.古普塔

Chapter 1 Elastic Stack 概述

ELK Stack —— Elasticsearch可以管理数据,Logstash可以读取不同来源的日志数据,Kibana能够可视化这些数据。
数据是由Logstash读取的,然后在Elasticsearch中完成索引。最后,我们能利用Kibana,从Elasticsearch中读取索引数据并以图表形式可视化数据。

1.1 ELK Stack简介

1.1.1 Logstash

Logstash是一个高灵活度的、具有丰富插件的、能从所选择的某个位置源读取数据的一种开源工具软件。它能按照所定义的配置信息来规范化数据,并根据需要将其发送到指定目的地。

1.1.2 Elasticsearch

Logstash读取的数据可输出到Elasticsearch中,完成数据的索引。Elasticsearch不仅用于数据的索引,还是一个全文检索的搜索引擎,具有高可扩展性,也能提供分布式系统的很多功能。Elasticsearch以索引的形式管理并维护数据,并通过相应的API实现对相关数据的查询、聚合分析等服务。

1.1.3 Kibana

Kibana使用Elasticsearch提供的API来读取/检索存放在Elasticsearch中的索引数据,并以图表等形式对这些数据进行可视化分析。Kibana是一种Web程序,能提供高度可配置的用户接口,能查询数据,生成大量用于可视化的图表及分析存储的数据。

1.2 Elastic Stack的诞生

Beats能以一种轻量代理Agents的方式,把数据输出到Logstash或者Elasticsearch中。如果需要,还可以通过使用libbeat库的方式,订制满足个性化需求的专属Beats。
为什么用Beats比较轻量,不消耗内存
Beats和Logstash用于搜集、解析、传输数据;Elasticsearch负责对数据的索引,而这些索引最后会被Kibana用于数据可视化。在基于Elastic Stack的数据处理管道中,其他工具则用于增加系统安全性,提供通知,完成性能监控,完成设置等。

1.3 谁在使用Elastic Stack

在过去的几年间,基于Elastic Stack的应用在快速增长。
如果我们看一下该组织的用户,就会发现那些热衷于大数据分析、商业智能、数据可视化、日志分析、数据科学处理与应用等方面的人往往会愿意使用这个工具。

1.4 竞争者

Elastic Stack提供了处理各种类型数据的功能,而非仅仅局限于日志管理。

Chapter 2 走进Elasticsearch

2.1 Elasticsearch的起源

源于Lucene,它是一个由Apache软件基金会支持的优秀项目。

2.2 了解Elasticsearch的体系结构

索引(Index)包含一个或多个类型,类型可以认为是关系型数据库中的一个表。类型有一个或多个文档,文档中有一个或多个字段,字段是由键值对构成的。

2.3 Elastic API

Chapter 3 探索Logstash及其组件

3.1 Logstash简介

Logstash起源于Jordan Sissel研发的一个智能工程产品。

3.2 为什么需要用Logstash

Logstash用于对数据的抽取、转换、载入(ETL),而ETL是一个在数据仓库和商业智能领域中使用广泛的词汇。Logstash能从多系统中抽取数据,并执行一些处理或转换日志数据的操作(例如在载入和处理数据后完成过滤数据、移除字段、增加字段、分析数据等操作)。
由于它含有大量的能从各种不同数据源中读取数据的INPUT插件、转换数据的Filter插件,以及存储、输出数据的OUTPUT插件,从而使得Logstash成为一款几乎能处理所有数据的常用工具。

Chapter 4 Kibana界面

4.1 Kibana及其功能

Kibana是可视化工具,它用于可视化存储在Elasticsearch中的数据。
Kibana是一个独立的进程,需要下载后独立部署,它只能绑定一个ES集群,无法同时查询多个ES集群的数据。
kibana数据可视化相关的界面主要是Visualize、Timelion和Dashboard。

4.7 探索Visualize页面

可视化的设计需要如下四个步骤:
(1)选择可视化类型,创建可视化统计图表
(2)选择索引的名称
(3)选择搜索数据源
(4)可视化画布

4.7.1 了解聚合

4.7.1.1 bucket聚合

Chapter 5 使用Beats

5.1 Beats简介

Beats不是作为ELK Stack背后的Elastic公司的一个项目开始的,而是始于Packetbeat项目。在这里,开发人员访问并统计各服务器之间的通信情况,并通过数据传输为其提供信息。
之前,他们在每台需要获取信息的服务器上运行Logstash程序时,遇到了JVM消耗内存和资源过大的问题。而Packetbeat因其轻量级的数据传输能力广受欢迎,它可以将数据传输到Elasticsearch而无须消耗太多的内存和CPU资源。
Beats是一种开源的轻量级数据传送工具,可以收集主机或服务器中的操作数据并发送到Elasticsearch或Logstash中。

5.2 Beats与Logstash的不同之处

  • Logstash会消耗大量的内存,并且需要较多的系统资源,Beats需要较少的系统资源,消耗的内存也很少。
  • 安装在需要收集日志的操作系统上的Logstash是一套体量相对较大的软件;Beats则是轻量级的数据传输工具,它可以在多个操作系统之间传输数据。
  • Logstash是基于Java语言编写的,它需要JVM的支持,而Beats是基于Go语言开发的。
  • 如果从多个系统收集日志,则不需要在每个操作系统中运行Logstash服务;Beats可以在所有需要传输数据的操作系统之间运行。
    简而言之,Logstash提供数据ETL(数据的提取、变换和加载)的功能;而Beats是轻量级的数据传输工具,能将数据传输到Logstash或Elasticsearch中,其间没有对数据进行任何转换。

5.3 Beats如何融入Elastic Stack

LIBBEAT将网络数据(Packetbeat)、日志文件(Filebeat)、指标(Metricbeat)传输到Elasticsearch或者Logstash中。

5.4 不同类型的Beats组件概述

5.4.1 Elastic团队开发的Beats组件

5.4.1.3 Filebeat

Filebeat组件的灵感来自于Logstash-forwarder项目,它已经被企业在生产环境中用了很长时间。通过以全新的方式对Logstash-forwarder重新封包,为Filebeat的发展铺垫了道路。
Filebeat是一个开源的日志传送工具,传输来自多个操作系统的日志,且消耗最少的资源。

5.5 Elastic 团队开发的Beats组件

5.5.1 了解Filebeat

Filebeat由两个主要组成部分组成:prospector和 harvester。这些组件一起工作来读取文件并将事件数据发送到您指定的output。
开始使用filebeat:
https://www.cnblogs.com/cjsblog/p/9445792.html
Nginx相关介绍:
https://www.cnblogs.com/wcwnina/p/8728391.html

Chapter 6 Elastic Stack实战

6.1 理解问题场景

考虑一个公司的内网,这个内网包括几个模块,用来帮助员工处理公司的事件和流程。这些模块如下:

  • 员工信息管理系统 :注册用户并完成信息提供。
  • 培训 :设置培训、培训注册、记录考勤等。
  • 绩效管理系统 :管理所有员工的评估周期和评估内容。
  • 休假管理 :员工使用这个模块申请、批准或拒绝休假。这个模块还可以有默认的休假类型及统计、假期列表等。
  • 博客 :由公司员工共享知识的内部博客
  • 论坛
  • Wiki :公司的Wiki,列出了项目、流程、策略等课共享的信息。
  • 文档库 :集中保存公司所有必需的文档,并为不同的文档设置相关权限。
  • 其他几个模块 :这些模块有助于向员工发送通知、生日、周年纪念等内容。

Berkeley Memory

Posted on 2019-07-01

随着《编译原理》考试的结束,我在伯克利(UC Berkeley)一学期的交换留学也结束了。8.22-12.14的这四个月,伯克利这所大学的风格也在我的心中日渐鲜明。它顶着计算机学科顶级学术重镇的光环,同时却是一个踏实稳重、严谨治学、友好和善的学术天堂。从学校的行政设置,到每一位教授的为师风尚,再到学生们的性格品质,都让人赞叹留念。

校园风光

landscape

学生活动

activity

图书馆自习区

library

我选的三门专业课都属于计算机学科的范畴,对应于国内高校的课程内容,分别是编译原理、人工智能导论和操作系统。这三门课兼具广度与深度,在同一个学期上负担还是有些重的。

编译原理的人数不到100,有一名教授和三名助教共同负责课程的教学。每周有两次课,一次课的时间是1小时20分钟,中间没有休息时间。一个学期我们总共有七次书面作业,三次项目(编程作业),两次期中考试,一次期末考试。其中,负担最重,但同时也让我最有收获的,是三次项目。项目的任务是一步一步实现一个编程语言的编译器,这次我们是要实现ChocoPy的编译器,这个语言是每过一段时间就会换一次,而今年是ChocoPy被使用的元年(所以我们做项目的时候总会遇到一些bug,会增加我们做项目的难度,不过报告一处bug会获得加分)。ChocoPy是伯克利的教学团队自己创造的一门编程语言,专门用于编译原理的项目作业,为了详尽描述这个语言,老师和助教写了这个语言的38页的参考指南,并且随着课程的进行,会一直更新参考指南的版本,由此可见伯克利对课程作业的设置是非常用心的。项目是组队进行,可以自由选择队友,两人一队逐步完成三个项目。回想起第一个项目我调试bug调试到凌晨三点,却仍然找不到bug而在自己的房间里抹泪,第二天早上仍然早早起来继续做项目,因为当天晚上十二点就要截止;第二个项目因为连续几天凌晨两三点睡,且不得不在白天整日坐在电脑前编程而腰酸背痛,甚至有些发烧;而第三个项目,我们吸取了前几次的教训,从而使得我们的工作效率大大提高,提交的时候并没有像前两次那样,赶在ddl之前的几分钟才交,反而提前了一两天就做完了,并且通过了所有的潜在测试,拿到了满分。

老师编写的指南

reference0
reference0

在学习的过程中,如果遇到各种问题,都可以在一个叫piazza的平台上进行提问,那里有同学、助教、老师的密切互动,可以互助解决疑惑。老师、助教,还有同学们会非常细致地回答你的问题,即使那个问题很简单,甚至老师在课上已经讲过。

课程论坛

piazza0
piazza1

我的编译原理的队友是一名伯克利的本科生,他有着褐色的皮肤,微卷的黑发,一米九几的个头,说话很柔和、淡定。在做项目的时候,他很注重效率,不会一开始就上手,而是细致地阅读ChocoPy的参考指南和项目的实现指南,并在文档中做一些笔记,此外,他还会自己阅读其他的线上资料。在做项目的过程中,他会把我们讨论的一些有难度的点和一些易错点记录在本子上,这样下次见面的时候就能很快回想起我们上次见面所讨论的内容,从而能够继续我们的进程。遇到一些瓶颈,我们更倾向于自己寻找解决的办法,有时候我们一下午的见面仅仅讨论出了项目中的一个小小的问题的解决方法,但是我们依然很开心,觉得很有收获。

伯克利的教授非常和蔼可亲,学术水平极高,且很负责任,这是我和我的同学的共识。上课的时候他们会以一种非常尊重学生、非常重视互动的态度进行授课,同学们在课堂上可以随意举手问问题,而老师们也会和他们共同探讨,并且会时不时停下来问同学们刚刚的内容是否有问题。操作系统的教授 Ion Stoica是业界的著名学者,也是Apache的联合创始人。这一个学期,他在上课的时候衣着十分朴素,我注意到他这一学期都穿的是同一双鞋子,并且是一双球鞋。下课的时候,有同学请教他问题,他会与学生亲切地讨论,有时候甚至会与男生“勾肩搭背”。

伯克利的校园充满了人文气息,在这里,你会感受到如家人般的温暖。有各种各样的组织关爱你的身心健康,在日常学习中,会有”peer advising”,也就是同学之间互相诉苦,互相提供建议;在复习周,很多地方都贴上了复习的锦囊妙计,比如:想知道如何才能在期末考试中取得A吗?充足的睡眠!复习周的图书馆里,会有一些学生组织发放免费的零食、水果;甚至在两天前考人工智能导论的时候,由于是8点就开考,考虑到很多人来不及吃早饭,有一个学生组织在早上七点半到达考场,送来了一箱面包。由于加州山火的肆虐,有好几天伯克利校园内的空气质量都不是很好(PM2.5指数200左右),于是学校取消那三天的所有课程和考试,人工智能导论的一次期中考试就因此取消。

伯克利的学生们有个性、有自己的思想。这不仅体现在学术上,还体现在其他方面,比如操作系统课的ppt上有一个动漫插图,上面是两个女生穿着有些暴露的女仆装,抱在一起。这幅漫画是为了形象地说明“死锁”的概念,但是却在piazza上引发了一系列激烈的讨论。一个学生匿名发表评论,认为这幅图有轻视女性的嫌疑,并不适合放在课件里,而一些学生发表声明说并没有这样觉得,且认为漫画让课间变得更有趣,并解释说在漫画中这样的形象很常见,可能只是那位举报的学生不喜欢动漫罢了。而那位举报的学生却说,他正是在观看动漫的过程中才发现了自己男同性恋的倾向。在复习周中,有一些学生自发组织“裸奔”活动,以释放压力,今年我的一些同学们就亲眼目睹了盛况。

伯克利让我感受到美式幽默。在伯克利学习,是不会感受到枯燥的。在可以讲话的自习区,会有非常激烈的讨论声,整个学习氛围十分热烈。如果遇到不懂的问题,会有同学、助教非常乐意与你一起讨论。同时,你会发现一些美式幽默。比如在考试中,当你做完一道问你如何纠正一个错误设计的题目后,突然出现一道问你会不会裁掉造成这个错误设计的员工(虽然是0分),而参考答案是:想想他的家人,还是仁慈一点,不要裁掉他。再比如,试卷上会让你画“笑脸”或者“哭脸”来反映你考试前和考试后的心理状态。还有就是会在试卷的最后让你画一下你的助教。

paper0
paper1

另外,在伯克利最宝贵的回忆,还包括认识了一些好朋友,比如操作系统项目的3个队友、编译原理的队友和人工智能导论项目的队友,以及我优秀的室友们,从他们身上我都学到了很多东西。在一起奋战项目的过程中,也发生了许多欢乐的事情。除了学习,我们还会互赠家乡的小礼物,还会一起去看NBA、一起去买自己做饭的食材。

如果有学弟学妹也想去交换的话,我是非常赞同的,因为不仅能学习到专业的知识,还能在多方面提升自我,是很值得的。有一些学弟学妹担心美国的安全问题,我个人觉得不需要过度担心,但也不能放松警惕。在校园内是很安全的,在上学、放学的路上,可能会遇到一些流浪汉,大概十几米就可以遇到一个,他们一般不会故意伤害你,当你路过的时候可能会向你乞讨,你可以给他一些硬币或者什么也不做。美国总体来说是一个自由、包容的国家,允许各种各样的人存在。在校园里,你会看到在路边弹钢琴的人,会看到边走边弹吉他的人,会看到好几个人聚在一起唱歌跳舞,也会看到一些人自发的举行抗议各种制度的演讲,我在交换期间就曾目睹伯克利后勤人员因不满待遇低而罢工。

还有一些学弟学妹会关心住宿、出行方式等。伯克利校园内没有学生公寓,所以大家都是在外面租房子住,一般是四五个人一个套间,有客厅、厨房、卧室等。平常吃饭的话可以选择自己做,也可以去学校周围吃,实名推荐“古月飘香”,一份午餐7刀左右,很美味,性价比很高。然后我住在伯克利南边两个街区的位置,一般上学是先走一段,然后坐公交车。晚上的话有shuttle,相当于校车,安全又舒适,又由于固定时间段到达,所以很方便。一般上/放学在路上花费的时间大约20分钟。(补充:每月住房租金约1000刀,每月食物花费约500刀)

总之,与伯克利的相遇,给了我非常美好的一段回忆,这些回忆,会陪伴着我、影响着我,走向之后的道路。

Isabel

6 posts
4 tags
© 2020 Isabel
Powered by Hexo
|
Theme — NexT.Muse v5.1.4