Git Product home page Git Product logo

arts's People

Contributors

hitolz avatar hyponet avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

arts's Issues

Netty In Action

Netty实战英文版。
中文版读起来感觉理解有点费劲,2333

CoreDNS 使用与架构分析

原文:https://zhengyinyong.com/coredns-basis.html

Kubernetes 的服务发现功能有两种,一种是环境变量注入,一种是 DNS。CoreDNS 在 1.3 版本后取代了 Kube-dns 成为了 Kube 的默认 DNS 服务器。

文章主要介绍了 coreDNS 的安装、Corefile 组成及其处理 DNS 请求的过程。Corefile 部分介绍的比较详细,可以对 coreDNS 配置文件有初步的全局化的认识,并可尝试对 CoreDNS 的 configMap 添加自定义配置,支持 pod 间互相访问的*操作。

Codeforce #574 解题报告

就写了两题_(:з」∠)_

A 题

思路与 @Coderhypo 一致,不过在接收输入的时候,用 map 进行存储,省掉了统计的过程。

package main

import "fmt"

func drinkChoosing(sNum int, dNum int, sFav map[int]int) int {
	result := 0
	t := 0
	for _, v := range sFav {
		result += v - v % 2
		t += v % 2
	}
	result += t / 2 + t % 2
	return result
}

func main() {
	var sNum, dNum int

	_, err := fmt.Scanln(&sNum, &dNum)
	if err != nil {
		fmt.Println(err)
	}

	sFav := make(map[int]int)
	for k := 0; k < sNum; k++ {
		a := 0
		_, err := fmt.Scanln(&a)
		if err != nil {
			fmt.Println(err)
		}
		sFav[a] ++
	}
	result := drinkChoosing(sNum, dNum, sFav)
	fmt.Println(result)
}

B 题

思路一

i:加糖果的步数;
j:吃糖果的步数(即最后所求);
a:当前所有加的糖果(1+2+3...+i);
candy:当前盒子里的糖果;

满足的条件:

  1. i + j = moveNum
  2. a >= j
  3. candy = a - j
package main

import (
	"fmt"
)

func main() {
	var moveNum, candyNum int

	_, err := fmt.Scanln(&moveNum, &candyNum)
	if err != nil {
	}

	for i := 1; i <= moveNum; i++ {
		j := moveNum - i
		a := (i +1) * i /2
		if a < j {
			continue
		}
		candy := a - j
		if (candy - candyNum) == 0 {
			fmt.Println(j)
		}
	}

}

然后没过, test 11 挂了,不懂_(:з」∠)_
到第二天才知道 test 11 是 999999994 108004280,发现可能是 a := (i +1) * i /2 这一步 乘法溢出了。

尝试了两种方法:

  1. 将所有涉及到运算的变量,转换成 int64。---> 超时了
  2. 分成奇偶数求 a 值:
package main

import (
	"fmt"
)

func main() {
	var moveNum, candyNum int

	_, err := fmt.Scanln(&moveNum, &candyNum)
	if err != nil {
	}

	for i := 1; i <= moveNum; i++ {
		j := moveNum - i
		a := 0
		if i%2 == 0 {
			a = (i + 1) * (i / 2)
		} else {
			a = ((i + 1) / 2) * i
		}
		if a < j {
			continue
		}
		candy := a - j
		if (candy - candyNum) == 0 {
			fmt.Println(j)
		}
	}
}

这才过了,但耗时太长,1809 ms 。
发现以 i 求循环不妥,因为 i 的取值通常比 j 大,所需循环次数更大,所以换成了 j 求循环,最后耗时 1747 ms,节省了近 100ms,但还是很大。

思路二

将上述条件全部换成成以 j 为变量的方程,直接对 j 求方程:

package main

import (
	"fmt"
)

func candyPut(moveNum int, candyNum int) int {
	var j int
	a := 2*candyNum - moveNum*moveNum - moveNum
	for j = 0; j <= moveNum; j++ {
		if (j*j - 3*j - 2*moveNum*j) == a {
			return j
		}
	}
	return j
}

func main() {
	var moveNum, candyNum int

	_, err := fmt.Scanln(&moveNum, &candyNum)
	if err != nil {
	}

	fmt.Println(candyPut(moveNum, candyNum))
}

耗时 686 ms。

总结

  1. 尽量避免乘法运算
  2. 将公式推导到最后一步 = = !

kubelet 报错:孤儿 pod volume path 一直存在

通过 cronjob 产生的 pod 完成后状态变成了 completed,此时变成了孤儿 pod。如果其用了 volume,他的 volume path 没有被删除,根本原因是 kubelet 的 housekeeper 逻辑被删除。

该问题没有被彻底解决,workarond:将 pod 的元数据(/var/lib/kuebet/pods/<pod_id>)删除。

Educational Codeforces Round 69

A 题

给了 n 个木板,求最大能搭建几节梯子,题目很简单,被 GO(或者后台测试数据格式)坑了

最后用 Py 过的:

def main():
    test_case = int(input())
    while test_case:
        test_case -= 1
        num = int(input())
        p = list(map(int,input().split()))

        p = sorted(p)

        m = p[-2]
        print(min(num - 2, m - 1))


if __name__ == "__main__":
    main()

@BLF2 修改过的 Go 代码,据说能过了:

package main

import (
	"fmt"
	"sort"
)

func main() {

	var testCase int

	if _, err := fmt.Scan(&testCase); err != nil {
	}

	for testCase > 0 {
		testCase -= 1
		var plankNum int
		if _, err := fmt.Scan(&plankNum); err != nil {
		}

		planks := make([]int, plankNum)
		for i := 0; i < plankNum; i += 1 {
			if _, err := fmt.Scan(&planks[i]); err != nil {
			}
		}

		if plankNum < 3 {
			fmt.Println(0)
			continue
		}

		sort.Ints(planks)
		m := planks[plankNum-2]

		if m-1 < plankNum-2 {
			fmt.Println(m - 1)
		} else {
			fmt.Println(plankNum - 2)
		}
	}
}

win10 Home安装注意事项

1.win10 Home版包含在customer edition中,下载镜像要选择带customer edition的
2.win10 Home安装要选择Legency模式,选择UEFI的话,安装U盘不会被识别
3.原装出厂的系统最适合当前笔记本,一般都是经过厂家做过兼容性测试的

golang 的内存分配

原文:https://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653372575&idx=1&sn=b9ec90402e6f8777f9fa19557404bb56&chksm=bce4a0858b932993c09f37d65697ce9d12fc1825fa51d04771159186131ed6ddb5a34099c81b&mpshare=1&scene=1&srcid=#rd

图解 Golang 内存。
内存包括:span(存储指针,指向 areana 中的对象) + bitmap(标记 areana 中存储的对象是否有地址及是否被 gc) + arena(堆,分页存放)

go的内存管理组件主要有: mspan、 mcache、 mcentral 和 mheap

Consul Service Mesh 的7层网络可观察性

原文地址:https://www.servicemesher.com/blog/layer-7-observability-with-consul-service-mesh/

如果说容器以及编排平台解决了分发、调度、配置等静态的问题,那么 Service Mesh 将是着手于 流量、鉴权、观察等动态的问题。

Consul 本身是一个流行的配置/注册中心,支持 KV 存储,基于 DNS 的服务发现等,在 1.2 后推出的 connect 开始布局 Service Mesh。

现在的 Service Mesh 就像 16 年左右的编排平台一样,布局的人很多,很难说谁会成为主流,但是将 复杂而常用的能力 下降到平台、到基础设施是大势所趋,比如原来靠注册中心才能有的服务注册于发现,Kubernetes 原生自带,靠对接 tracing 才能拿到的调用链,Service Mesh 可以实时生成。

Istio 以及 Service Mesh 的入门可以看我的一篇总结:
https://blog.ihypo.net/15445280820219.html

AuthN/AuthZ with OIDC and a Little Help From Keycloak

原文链接:https://medium.com/@mrbobbytables/kubernetes-day-2-operations-authn-authz-with-oidc-and-a-little-help-from-keycloak-de4ea1bdbbe

文章详细介绍了在 Kubernetes 中使用 OIDC 协议。

K8s 只提供了配置 OIDC 的入口,他并不是 Identity Provider;对 kube 来说,用 oidc 通常是要支持 AD/LDAP 的,可以对 kube 做用户管理,而权限控制是 kube 内置的,不需要 OIDC 来做;对 K8s 原生支持的 OIDC 功能来说,使用起来并不人性化,需要用户自己将 ID token 和 refresh token 填写进 kubeconfig 文件,不过现在已经有相当多周边工具可以配置 kubectl 来实现这一步的自动化。

文章不仅详解了 OIDC 的过程,在 K8s 中的配置,还细数了支持 K8s 使用 OIDC 的周边工具,好文。

Codeforces Round #575 周赛

A 题

A 题就是两个人平分三份糖果,保最后两人一样多,全加起来除以 2,再向下取整。

代码不贴了。

B 题

题意:给你 n 个数据,把他们分成 k 组,每组和为奇数,如果满足不了要求,就输出 NO,如果可以分,输出 YES 和任何一种分法。
思路:找出所有奇数所在位置,组成数组 result[],该数组长度为 l;
1. 如果 l < k,直接输出 NO;
2. 如果 (l-k) % 2 == 1,也输出 NO;
3. 如果 (l-k) % 2 == 0,输出 YES,并取 result 的前 k-1 个和 n 为最后输出。

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	input := bufio.NewReader(os.Stdin)
	var num int

	_, err := fmt.Fscanf(input, "%d\n", &num)
	if err != nil {
	}

	for num > 0 {
		num -= 1
		var n, k, j int

		_, err := fmt.Fscanf(input, "%v %v\n", &n, &k)
		if err != nil {
		}

		var arr = make([]int, n)
		var result = make([]string, n)

		for i := 0; i < n; i++ {
			_, err := fmt.Fscanf(input, "%v", &arr[i])
			if err != nil {
			}

			if arr[i]%2 == 1 {
				result[j] = strconv.Itoa(i + 1)
				j++
			}
		}
		_, err = fmt.Fscanf(input, "\n")
		if err != nil {
		}

		if j < k || (j-k)%2 != 0 {
			fmt.Println("NO")
			continue
		}
		fmt.Println("YES")

		total := result[:k-1]
		total = append(total, strconv.Itoa(n))

		fmt.Println(strings.Join(total, " "))
	}
}

总结:Go 语言获取输入要用 bufio,否则数据量大起来就超时了。

Pod 中的 pause 容器不可以被 docker restart

在 Kube 中的 Pod,一般是 pause 容器 + 业务容器。其中,pause 容器尽量不要用 docker restart 重启,因为重启后 docker 会将其网络配置重置,由于没有走 pod 创建的正常流程,kubelet 不会为其配置预设的网络配置。

leetcode第一题解题报告

地址:https://leetcode-cn.com/problems/two-sum/
`public int[] twoSum(int[] nums, int target) {

    int[] re = new int[2];
    Map<Integer,Integer> map = new HashMap<>();
    for(int i = 0;i < nums.length;i++){
        map.put(nums[i],i + 1);
    }

    for(int i = 0;i < nums.length;i++){
        int sub = target - nums[i];
        if(map.containsKey(sub)){
            re[0] = i;
            re[1] = map.get(sub) - 1;
            if(re[0] == re[1]){
                continue;
            }
            break;
        }
    }
    return re;
}`

本题可以暴力求解,也可以用Map**来解题,一开始有一种情形没考虑到,导致一次失误,
[3,2,4] 6
期望值是[1,2],而我的结果是:[0,0],还需要多多考虑一些特殊情况啊。

Educational Codeforces Round 69

昨天死在 A 题上了_(:з」∠)_

A 题

题意:给你 n 个木棍 ,求出可以组成楼梯的最大台阶数。
根据题意可列出方程:

  1. k <= max2 -1 (max2 为第二大数)
  2. k <= n - 2
    即求得 max2 - 1 和 n - 2 取最小就好了。
package main

import "fmt"

func main() {
	var tesNum int

	_, err := fmt.Scanln(&tesNum)
	if err != nil {
	}

	var vKey = 0
	for i := 0; i < tesNum; i++ {
		_, err := fmt.Scanln(&vKey)
		if err != nil {
		}
		var vValue = make([]int, vKey)
		var max = [2] int{0, 0}

		for j := 0; j < vKey; j++ {
			_, err = fmt.Scan(&vValue[j])
			if err != nil {
			}

			if vValue[j] > max[0] {
				max[1] = max[0]
				max[0] = vValue[j]
				continue
			}
			if vValue[j] > max[1] {
				max[1] = vValue[j]
			}
		}

		v1 := max[1] - 1
		v2 := vKey - 2
		if v1 <= v2 {
			fmt.Println(v1)
		} else {
			fmt.Println(v2)
		}
	}
}

然后!第一个 case 就挂!!最后经 @BLF2 同学指导,发现是输入可能以空格结束,用 Scan 可以,用 Scanln 就不行。(╯‵□′)╯︵┻━┻

后来用 Py 过的:

if __name__ == "__main__":
    test_num = int(input())
    while test_num:
        test_num -= 1

        arr_num = int(input())
        arr = input()
        num = [int(n) for n in arr.split()]

        num = sorted(num)
        result = min(num[-2] - 1, arr_num - 2)
        print(result)

总结:
不用 Scanln 获取输入!!!

https://codeforces.com/contest/1199/problem/A

前x天,后y天,中间这天降雨量最少,求这天的数组下标。
一开始的思路是分割数组找两边最小的值与中间值进行比较,比较麻烦,也没AC。后面看了两位大佬的。。。


import java.util.Scanner;
 
public class Cf576A {
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n, x, y;
        n = scanner.nextInt();
        x = scanner.nextInt();
        y = scanner.nextInt();
        int[] a = new int[n + 1];
 
        for (int i = 1; i < n + 1; i++) {
            a[i] = scanner.nextInt();
        }
 
        boolean exist = false;
        for (int i = x; i <= n; i++) {
            int minBefore = findMin(a, i - x, x);
            if (a[i] > minBefore) {
                continue;
            }
            if (i + y <= n) {
                int minAfter = findMin(a, i + 1, y);
                if (a[i] > minAfter) {
                    continue;
                }
            }
            System.out.println(i);
            exist = true;
            break;
        }
        if (!exist) {
            System.out.println(n);
        }
 
    }
 
    private static int findMin(int[] a, int startIndex, int num) {
        int min = 999999999;
        for (int i = startIndex; i < startIndex + num; i++) {
            if (min > a[i]) {
                min = a[i];
            }
        }
        return min;
    }
}

Go 中函数间传递数组的注意事项

Go 中函数间传递数组,尽量避免用数组,用指针和切片更好。
原因:函数间传递参数传递的是值,直接传递数组会增大不必要的内存;用指针传递的话只会开辟一个指针的内存,而切片也是只占用头指针的内存。
如下:

func test(a [12]int){} // 避免
func test(a []int){}
func test(a *[12]int){}

Codeforces Round #576 周赛

看错时间错过了比赛_(:з」∠)_,想起来的时候做了两题,权当比赛了。

A 题

题意:已知夏天有 n 天,市长有未卜先知的能力,知道每天的降雨量,要选出一天 d 当庆祝盛典的节日,要求这一天 d 的前 x 天和前 y 天内,d 的降雨量最少。需要注意的是 d < x 和 d + y > n 都是可以的。
解法:没啥特殊技巧,应算。

package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
)

func main() {
	input := bufio.NewReader(os.Stdin)
	var n, x, y int

	_, err := fmt.Fscanf(input, "%d %d %d\n", &n, &x, &y)
	if err != nil {
	}

	arr := make([]int, n)
	min := math.MaxInt32
	var xx, yy, index int
	index = 1
	for i := 0; i < n; i++ {
		_, err := fmt.Fscanf(input, "%v", &arr[i])
		if err != nil {
		}

		if (xx >= x || index-x <= 0) && yy >= y {
			fmt.Println(index)
			return
		}

		if arr[i] < min {
			min = arr[i]
			index = i + 1
			xx += 1
			yy = 0
		} else {
			yy += 1
		}

	}
	fmt.Println(index)
	_, err = fmt.Fscanf(input, "\n")

}

B 题

题意:一株睡莲,垂直生成的话高出水面 h,斜着长到刚好贴着水面,距离垂直位置长度为 l,求水深,要求误差不超过 1e-6。
解法:勾股定理求出表达式即可。

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	input := bufio.NewReader(os.Stdin)
	var h, l int64
	var result float64

	_, err := fmt.Fscanf(input, "%d %d\n", &h, &l)
	if err != nil {
	}

	result = (float64(l*l) / float64(2*h)) - float64(h)/2.0
	fmt.Printf("%.13f", result)

}

需要注意的是,要先把 int 转成 float,再带入公式运算,否则会有整形溢出的问题。

Building your own kubernetes CRDs

原文:https://itnext.io/building-your-own-kubernetes-crds-701de1c9a161

这篇文章讲解如果通过 kubebuilder 构建自己的 CRD,CRD 是 Kubernetes 里的自定义资源,随着 K8s 对核心 API 精简,越来越多的功能会以 CRD 的方式提供,而逐渐完善的周边功能,允许用户自己定义 controller 来拓展 Kube 集群

kubebuilder 是一个 controller 的快速构建工具,核心功能就是在 informer 注册,然后让用户自己实现一个 handle

查看日志尽量少使用vim

查看日志尽量少使用vim,尤其是日志文件比较大的时候。
因为vim操作会加载整个文件到内存中。
替代命令lessmoregrep -n

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.