ARTS-WEEK13

2019-06-19

本周ARTS

本周ARTS打卡内容:

  1. Algorithm 来源 LeetCode33
  2. Review 分享 The 5 Levels of Logging
  3. Tip 分享 iptables与firewalld使用,区别与联系
  4. Share 分享 前端的微服务化

Algorithm

Leetcode的33题 在旋转的排序数组中查找

https://leetcode.com/problems/search-in-rotated-sorted-array/

把一个升序数组,绕某个点旋转以下,比如[0,1,2,3,4,5,6,7],变成了[4,5,6,7,0,1,2],在这个旋转后的数组中查找目标值,如果存在则返回其所在位置,不存在则返回-1。

解法:

本题要求时间复杂度为O(log n),所以很明显要求使用二分查找法。

首先想到可以用递归解决。旋转的数组局部是有序的,所以需要分情况处理,第一种情况:二分查找的前部分是升序的,后半部分是先升后降。如果目标值在前部分,对前部分使用递归找出其位置,返回位置,如果在后部分,对后部分使用递归找出其位置,加上后部分数组的第一个元素的位置。第二种情况:前半部分是先升后降,后半部分是升序,如果目标值落在前半部分,对前半部分套用递归,如果目标值落在后半部分,对后半部分套用递归,返回同上一种情况,代码如下:

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
func search(nums []int, target int) int {
var i int
ln := len(nums)
if len(nums) == 0 {
return -1
}

if len(nums) == 1 && nums[0] != target {
return -1
}

if target == nums[ln/2] {
return ln/2
}
if nums[0] <= nums[ln/2] && target >= nums[0] && target <= nums[ln/2] ||
nums[0] > nums[ln/2] && (target >= nums[0] || target <= nums[ln/2]) {
i = search(nums[:ln/2], target)
if i == -1 {
return -1
} else {
return i
}
} else {
i = search(nums[(ln/2+1):], target)
if i == -1 {
return -1
} else {
return ln/2 + 1 + i
}
}
}

Review

本周分享 The 5 Levels of Logging

很多系统都会有自己的日志分级策略,作者在文中讲了下他本人认为重要的5个方面,包括各级日志的颜色。

  • Error。发生错误的情况。使用这个来定义需要注意的错误情况。Error下的大多数的抛出异常不能优雅的处理。推荐使用红色标记。例如:找不到“crucial.dat”文件;错误数据:[stack trace and debug message];连接数据库异常
  • Warning。可能发生错误的情况。可能需要人们关注的。可能是当前潜在的错误或者未来的问题(例如响应慢,连接丢失,低内存等),也可能是程序处理错误的声明。推荐使用黄色标记。例如:连接关闭,2s后重连;找不到“logging.conf”文件,回滚到默认配置;尝试连接30s超时等等。
  • Info。告知用户的操作或状态改变。用户能接触到的最冗长日志级别。包含很少的技术细节。推荐使用白色标记。例如:客户端初始化;保存“yeti02”;输入变形速度;当前目录为“/tmp”;上行链路建立;渲染完成,花费42.999s。
  • Debug。这是保存日志文件的原因,可以用来修复bug的。debug是转储程序流和其他技术疑难杂症的首选级别。除非日志太多或者更高级别的更合适,否则建议保留。推荐使用灰色或米色标记。例如:从“/etc/octarine/octarine.conf”读取配置文件;使用“/home/aib/.octarinerc”覆盖原有配置;分析完成,构建图像;使用“user”连接server:4242;发送2个信息;渲染时间分解:Foo 0.990s,Bar 42.009s
  • Trace。包含详细的技术细节。很多是你并不想要的,包括那个函数被调用,客户端收到什么样的网络包等。有助于捕获低级错误,但是通常需要先将它的位置缩小到两条调试信息之间。推荐使用深灰色。例如:->GET / HTTP/1.1\nHost: localhost\n\n;Got: <?xml version=”1.0” encoding=”UTF-8” ?>\n\n […]
  • Fatal。发生严重错误,需要停止应用。建议使用紫色。例如:内存溢出;磁盘空间不足;license过期等。

Tip

iptables与firewalld使用,区别与联系:

https://leitty.github.io/2019/06/14/iptables%E4%B8%8Efirewalld/

Share

Uber 大数据平台的演进

https://www.itcodemonkey.com/article/15133.html