0%

Preface

生活中,我们应对一系列的身份识别和授权的问题,比如门卫需要检查证件(authentication),再问你要找谁(authorisation),比如取钱时的银行卡也是authentication,海关查验护照等等。

在做应用开发时,有时会被权限的问题搞得很烦,不得不花大量的时间处理一系列的 _access denied_,但由于缺乏对权限系统的了解,往往陷入 keep trying until it works 的境地,影响开发效率,解决过程中并没有习得什么系统性知识。

不可否认的一点,安全性对商业系统至关重要,作为程序员,根据实际需要,或多或少需要了解一些相关知识和术语,如HTTPS, certificate, CA, X509, OAuth, IAM不等。

在K8s中也不例外,尤其是当我们自己搭建K8s集群,部署自己服务到K8s时,需要处理一系列权限问题,就需要我们对K8s授权系统有全面了解。

最近在小组内做了一次关于K8s RBAC的分享,系统的梳理了下K8s内部的authentication和authorisation,希望内容对大家有帮助。

阅读全文 »

Preface

最近工作转向k8s,自己比较满意,之前很久就有兴趣,也看完了一本kubernetes up and running, 但并没有进一步深入研究。这次参与公司的k8s cluster升级项目,收获良多,算是正式入门了,看来深入的掌握知识果然还是得learning by doing,压力动力具备,目标导向,才能高效的学习。后续也会推出k8s, istio系列blog。

回归正题,在升级到k8s v1.13时,需要开启RBAC模块提升安全性,对每个service account(以下简称sa)赋予least priviledge。这需要建立特定的role/cluster role,并将其bind到service account。这就涉及到授权作用于哪个namespace的问题(namespace是k8s的一个机制:可以将k8s集群进一步分成子集群,起到隔离的效果)。

阅读全文 »

题目

3Sum^1, Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

分析

本题要求返回value的triplets,并不是index,为避免$O(n^3)$的复杂度,可以先排序。

遍历数组,固定第一个数nums[i],相当于在剩余数组找符合2Sum的问题,即符合$$nums[j] + nums[k] = targer-nums[i]$$的pair即可,用双指针left, right,从两边向中间扫描:,

  • 2sum < target,left ++
  • 2sum > target, right –
  • 2sum == target: left ++, right –

即可找到所有满足条件的pair。

同时注意到target为0,因此只要发现nums[i] > 0即可以退出循环,因为nums[j], nums[k]均>nums[i]>0,因此肯定不满足相加为0的条件。

题目要求不能出现重复的triplets,其实这个本题的一个难点,我们可能会考虑用array: [3]int作为map key来去重(注意golang slice并不能作为map key,因为没有定义slice的equal),但是[]int包含相同元素但乱序也视为相等,这条思路不通,因此只能我们遍历求结果时,自动跳过重复的三元组,不将其插入到最终结果中即可。

那如何做呢?首先考虑什么情况下会产生重复结果,以下讨论的前提是已经对输入数组排序

第一个元素重复

考虑{-1, -1, 0, 1}:

如果两次都将-1固定为首元素,那会将两个{-1, 0, 1}加入结果集。我们只需要在固定第一个元素时,检查前一个元素是否和当前第一个元素是否相同,相同跳过即可。

第二个元素重复

考虑{-1, 0, 0, 1},同样我们在选第二个元素时,检查是否重复,我们需不需要担心第三个元素重复呢?不需要,前两个元素都没有重复的答案,第三个元素相等代表两组triplet的和不同。

Solution

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
func threeSum(nums []int) [][]int {
var res [][]int
if len(nums) < 3 {
return res
}
sort.Ints(nums)
for i := 0; i < len(nums)-2; i++ {
if nums[i] > 0 {
break
}
if i > 0 && nums[i] == nums[i-1] {
continue
}
target := -nums[i]
j, k := i+1, len(nums)-1
for j < k {
if j > i+1 && nums[j] == nums[j-1] {
j++
continue
}
v := nums[j] + nums[k]
if v > target {
k--
} else if v < target {
j++
} else {
res = append(res, []int{nums[i], nums[j], nums[k]})
j++
k--
}
}
}
return res
}

背景

在悉尼找IT工作与在北京找互联网工作有不一样的套路,这边IT中小型公司较多,常常给你做一个具体的assignment,往往是实现一个简化版的系统,大约花2-6小时不等,然后下一轮面试主要基于此问问题。更看重的是系统设计,一般工程实现能力,及coding style, test等细节,不像大厂那样上来几轮算法,看你是不是他们要找的够smart的人。

阅读全文 »

Preface

Linux下的SSH程序相信大家一定非常熟悉,可以说是登录远程服务器,执行远程命令的首选。有时我们还需要加入一些额外的逻辑来扩展标准SSH的功能,比如同时在一百台机器执行某个命令,或者在允许访问前,检查当前用户的额外权限,或者是否过期等等。

如何做到呢?我们可以利用golang的SSH library来实现一个定制化的SSH程序,然后再基础上加入我们的business logic,就可以啦。用Golang封装良好的SSH library实现一个最基本的SSH client并不难,网上也有很多相关博客,但用起来相比标准的SSH不少问题:

阅读全文 »

Preface

接上篇 Clean Architecure in Go (1),本文将会包含如下内容:

  • Clean Architecture层次划分依据
  • 实现Dependency Inversion: Dependency Injection
  • 采用Clean Architecture的prject layout示例
  • A simple demo: Clean Architecture实践
阅读全文 »

Preface

当我们最初建立一个Golang项目时,很自然问题是:应该怎么layout比较好:即我们怎么应该组织项目代码,在Golang中有什么组织代码的约定”套路”吗?从这个看似简单的问题,表面上是我们如何安排目录结构,其实背后涉及到另一个有趣的问题:我们应该如何architect一个新项目,因为layout其实是project architecture的反映,architecure变化肯定会让layout产生变化。

本文中,我们先看大型golang项目在layout方面的普遍做法,即大型项目的目录结构。基于此进一步深入思考:这种做法能否得出一个清晰的project architecure:来得到更好的项目架构内在指标:低耦合度,可维护性/扩展性,可测性。 如果不能,怎样做才能更好的解决上述软件架构中的pain points? 本文给出的答案是Uncle Bob提出的Clean Architecure。

最后我们会通过一个简单的case来看我们如何实现Clean Architecture。

阅读全文 »

前阵子在小组内做了一个关于concurrency的分享,绝大部分材料来源于 Concurrency in Go 一书。

很不错的书,梳理知识,开阔思路,内容大致分为三块:

  • Golang提供的concurrency机制
  • Concurrency Patterns
  • Advanced stuff
阅读全文 »

Preface

我们在初学shell时,经常会纠结于参数分割,是否需要加引号,单引号还是双引号,有时单引号工作,有时又得双引号。稍不注意,就会得到很unexpect的结果。而经常也会感叹于变量引用的灵活:$PATH $(date) `ls`,让人眼花缭乱。更别提在我们用grep,sed时,那让人目眩的一大串转义字符了,WTF is that?

1
2
3
4
5
# search in vim
/([0-9]\{3\}) [0-9]\{3\}-[0-9]\{4\}
# sed to process
sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\
)$/\3-\1-\2/' distros.txt
阅读全文 »