python drf之Serializer

What is serializers? serializers主要作用是将原生的Python数据类型(如 model querysets )转换为web中通用的JSON,XML或其他内容类型。 DRF 提供了一个Serializer类,它为您提供了种强大的通用方法来控制响应的输出,以及一个ModelSerializer 类,它为创建处理 model instance 和 serializers 提供了一个序列化的快捷方式。 Reference drf serializers manual How to Declaring Serializers? 序列化一个django model python 1 2 3 4 5 6 7 class Comment: def __init__(self, email, content, created=None): self.email = email self.content = content self.created = created or datetime.now() comment = Comment(email='leila@example.com', content='foo bar') 声明Serializers,可以用来序列化与反序列化对象 Comment的属性及值。 python 1 2 3 4 5 6 from rest_framework import serializers class CommentSerializer(serializers....

python django使用

路由匹配 django中默认匹配页 text 1 url(r'^$', views.login), django中404匹配 text 1 url(r'^$', views.login), # 需要放置最后,不过一般不推荐,都是通过异常捕获处理 named group 名称组 https://docs.djangoproject.com/en/1.11/topics/http/urls/#named-groups text 1 url(r'^test[0-9]{4}',views.login) 反向解析 别名不能出现冲突 text 1 2 from django.shortcuts import reverse reverse(xxx) 名称组反向解析 无名分组 python 1 2 3 4 5 6 # 路由部分 url(r'^index/(\d+)/', views.home, name='xxx') # 前端 <a href="{% url 'id' obj.id %}" class="btn btn-primary btn-xs">remove</a>s # 后端 print reverse('id', args=(id,)) 有名称分组 python 1 2 3 4 5 6 7 8 # 路由部分 url(r"^userdel/(?...

由PIPE size 引起的线上故障

sence:python中使用subprocess.Popen(cmd, stdout=sys.STDOUT, stderr=sys.STDERR, shell=True) ,stdout, stderr 为None. 在错误中执行是无法捕获 stderr的内容,后面将上面的改为 subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True),发现是可以拿到 stderr, 但是会遇到大量任务hanging,造成线上事故。 为此特意查询subprocess的一些参数的说明。 stdin stdout stderr 如果这些参数为 PIPE, 此时会为一个文件句柄,而传入其他(例如 sys.stdout 、None 等)的则为None 正如这里介绍的一样,subprocess 。 而使用 PIPE,却导致程序 hanging。一般来说不推荐使用 stdout=PIPE stderr=PIPE,这样会导致一个死锁,子进程会将输入的内容输入到 pipe,直到操作系统从buffer中读取出输入的内容。 查询手册可以看到确实是这个问题 Refernce Warning This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that....

mysql5.6 innodb_large_prefix引起的一个异常

phenomenon: Specified key was too long; max key length is 3072 bytes 在修改一个数据库字段时,字段容量被限制为了表前缀的大小而不是本身的容量大小 查了一下innodb_large_prefix究竟是什么? 动态行格式DYNAMIC row format 支持最大的索引前缀(3072)。由变量innodb_large_prefix进行控制。 By default, the index key prefix length limit is 767 bytes. See Section 13.1.13, “CREATE INDEX Statement”. For example, you might hit this limit with a column prefix index of more than 255 characters on a TEXT or VARCHAR column, assuming a utf8mb3 character set and the maximum of 3 bytes for each character....

django ORM

https://www.cnblogs.com/Dominic-Ji/p/11516152.html 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 django中仅测试ORM 导入model,然后直接使用对应对象进行ORM操作。 text 1 2 3 4 5 6 7 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") import django django.setup() from xxx import models models.User.objects.all() 连接数据库 django配置数据库 python 1 2 3 4 5 6 7 8 9 10 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'USER': 'root', 'PASSWORD': '111', 'HOST':'127.0.0.1', 'NAME': 'book', 'CHARSET': 'utf8' } } 可选:pymysql 使用模块连接MySQL数据库::在项目中__init__.py 文件中添加配置: python 1 2 import pymysql pymysql....

运维类面试题收集

如何优化 Linux系统(笼统) 不用root,添加普通用户,通过sudo授权管理 更改默认的远程连接SSH服务端口及禁止root用户远程连接 定时自动更新服务器时间 配置国内yum源 关闭selinux及iptables(iptables工作场景如果有外网IP一定要打开,高并发除外) 调整文件描述符的数量 精简开机启动服务(crond rsyslog network sshd) 内核参数优化(/etc/sysctl.conf) 更改字符集,支持中文,但建议还是用英文字符集,防止乱码 锁定关键系统文件 清空/etc/issue,去除系统及内核版本登录前的屏幕显示 基础命令 ps aux 中的VSZ代表什么意思,RSS代表什么意思 VSZ:虚拟内存集,进程占用的虚拟内存空间 RSS:物理内存集,进程战用实际物理内存空间 shell下32位随机密码生成 text 1 cat /dev/urandom | head -1 | md5sum | head -c 32 >> /pass 将生成的32位随机数 保存到/pass文件里了 统计出nginx的access.log中访问量最多的5个IP text 1 cat access_log | awk '{print $1}' | sort | uniq -c | sort -n -r | head -5 web与lb 讲述一下LVS三种模式的工作过程 LVS负载的原理,和Nginx负载有啥区别 VS/NAT:(Virtual Server via Network Address Translation)...

网络基础面试题收集

域名相关 什么是DNS劫持 DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。 通俗来讲:DNS劫持就是指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。范例,网通、电信、铁通的某些用户有时候会发现自己打算访问一个地址,却被转向了各种推送广告等网站,这就是DNS劫持。 DNS劫持症状:在某些地区的用户在成功连接宽带后,首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问Google域名的时候出现了百度的网站。这些都属于DNS劫持。 解决:对于DNS劫持,可以采用使用国外免费公用的DNS服务器解决。例如OpenDNS(208.67.222.222)或GoogleDNS(8.8.8.8)。 什么是DNS污染 DNS污染是指在DNS服务器中修改DNS解析结果的过程,以便将用户重定向到恶意网站或欺骗性网站,而不是所期望的目标网站。 攻击者可以通过多种方式进行DNS污染攻击。最常见的手段是在用户的网络中添加一个恶意DNS服务器,或者在受感染的计算机上运行一个恶意DNS服务器。当用户试图连接到互联网上的某个网站时,计算机将查询DNS服务器以查找目标网站的IP地址。如果攻击者控制的恶意DNS服务器已将相应的IP地址修改为攻击者的网站,则用户将被重定向到恶意网站或欺骗性网站。 DNS污染发生在用户请求的第一步上,直接从协议上对用户的DNS请求进行干扰。 DNS污染症状:目前一些被禁止访问的网站很多就是通过DNS污染来实现的,例如YouTube、Facebook等网站。 解决: 可靠的DNS服务器,但这种方式效果不佳 手动修改Hosts文件 使用VPN或域名远程解析 加密通信:VPN可以加密整个通信过程,这意味着攻击者无法窃取UDP数据包中的任何信息,包括DNS查询请求和响应。这样可以避免DNS查询被篡改的风险。 虚拟IP地址:VPN会给每个用户分配其所连接的虚拟IP地址,使用户的真实IP地址不会暴露在公共互联网中。这样,DNS服务器只能看到VPN服务器的IP地址,而无法识别用户的IP地址。这意味着攻击者无法跟踪用户的访问历史,从而减少遭受DNS污染攻击的风险。 总结: DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。范例,访问Youtube、Facebook之类网站等出现的状况。 什么是域名被墙 这种情况一般出现在解析为国外地址的域名上,假如域名下的网站非法信息多,敏感,又不整改,会直接被G.F.W墙掉,就是通常所说的被封锁、被屏蔽、被和谐,结果就是访问域名是打不开的,但是解析是正常的。此时域名在国内是无法使用的,国外可以访问和使用。 主要有以下几种情况: ip 被墙 解决:换 ip 。 域名被 url 重置(访问时出现ERR_CONNECTION_RESET 或 “连接重置” 换域名 做301跳转,(有专门服务商),域名通过解析到国内301服务商,重定向到真是国外IP,以减少流量和权重的丢失。 上 https或域名备案,智能解析分国内,国外 。 可以使用HTTPS;一般来讲解析到国外的IP的域名,有敏感词会被重置,GFW可以进行敏感词检测(http为明文),使用https加密GFW无法检测数据包内容 ,(客户端与服务端默认会有公钥私钥,而GFW没有)。 域名被国家出口 dns 污染,解决:用国内 dns ,备案回国。 域名被省级 dns 污染,解决:能做到这个这里可能为内部或对应运营商被黑(只能进行dns清洗,一般大流量域名了) 什么是DNS清洗? DNS清洗是一项旨在阻止访问特定网站和域名的措施,在该措施中,Internet服务提供商(ISP)通过其服务器筛选特定网站的DNS查询,并将查询重定向到一个错误的IP地址(通常是一个不存在的地址),从而防止用户访问该网站。这种措施通常是由政府、公司或组织实施,旨在防止用户接触到不适当、危险或非法的内容。 网络攻击相关 什么是TCP的SYN攻击?如何预防? TCP SYN攻击是一种利用TCP协议三次握手机制的攻击。攻击者发送大量伪造的TCP SYN请求(数据包),然后在TCP三次握手建立连接的第二步时停止(使服务器不断地向攻击者发送SYN-ACK确认,但攻击者不回复ACK确认),从而导致服务器等待客户端的确认信号很长时间,最终占用服务器的资源而无法处理新的请求。 为了预防TCP SYN攻击,可以采取以下措施: 服务器操作系统的设置:可以设置TCP的连接数和时间等参数,限制每个IP地址的连接数,设置连接超时时间。 防火墙设置:可以设置防火墙规则,根据IP地址、端口等信息对连接进行过滤,控制IP地址的访问等。 加强网络监测:使用入侵检测系统(IDS)对流量进行实时监控,并对异常流量进行报警处理。 使用SYN Cookies:SYN cookies是一种可以防止SYN攻击的技术,它通过特殊的算法对TCP连接进行加密,并保存在服务器端,当客户端发送响应时,服务器端可以对连接进行识别和验证,从而防止SYN攻击。 增加硬件设备:可以增加具有流量分析和过滤功能的硬件设备来协助防御SYN攻击,这种设备可以通过分析流量实现精细化的流量分析和识别。 ddos攻击的类型 DDoS攻击(Distributed Denial of Service)是一种利用许多计算机和网络设备构成的“僵尸网络”对一个或多个目标服务器发起攻击,从而占用大量的网络资源,耗尽系统资源,导致服务拒绝的攻击方式。DDoS攻击的类型可以分为以下几种: 带宽攻击(Bandwidth-based Attack):利用大量的数据流或报文,通过消耗目标系统的网络带宽使其服务不能正常传输。 应用层攻击(Application-Layer Attack):利用正常流量模拟合法用户的请求,通过消耗服务器CPU和内存资源使其无法处理合法请求。 反射式攻击(Reflection Attack):使用伪造的IP地址向网络中的一个或多个服务器发起请求,这些服务器会响应请求,但响应信息将被发回目标服务器,从而形成了一次反射式攻击。 慢速攻击(Slowloris Attack):利用HTTP协议的设计漏洞,向目标服务器发送大量不完整请求,从而占用目标服务器处理请求的线程资源。 IoT攻击(IoT Attack):通过侵入大量的物联网设备,如路由器、摄像头、智能家居等,利用这些设备来发起攻击,构建大规模的“僵尸网络”。 DNS Amplification攻击:攻击者向域名服务器发送请求,利用伪造的IP地址和请求报文,让服务器向目标主机发送大量的DNS解析响应数据包,从而使目标系统在短时间内遭受网络拥塞。 NTP Amplification攻击:攻击者伪造IP地址,向其余互联网上安装有网络时间服务器(Network Time Protocol,NTP)软件的服务器发送请求,从而获取大量NTP响应包,最终将其转发到目标IP地址,从而占用目标系统的网络带宽。 SYN Flood攻击:攻击者向目标服务器发送大量的TCP SYN请求,但却不发送客户端的应答确认,造成服务器长时间处于等待状态,无法接受正常的TCP连接请求。 HTTP Flood攻击:攻击者利用HTTP叠加攻击、HTTP POST攻击等手段,向目标系统发送大量HTTP请求和数据包,造成目标系统资源的耗尽,从而导致服务不可用。 ICMP Flood攻击:攻击者向目标系统发送大量的ICMP数据包,造成目标系统CPU和内存资源的消耗,从而导致系统缓慢或崩溃。 什么是反射式攻击 反射式攻击(Reflection Attack)是一种利用网络协议的设计缺陷进行攻击的方式。攻击者通常会利用一些可以进行源地址欺骗或反射的协议,例如Domain Name System(DNS),Simple Network Management Protocol(SNMP),和Network Time Protocol(NTP)等。攻击者利用这些协议在网络中进行广播,构造一些请求消息,伪造源IP地址为目标IP地址,将请求消息发送给网络上的服务器,要求其向目标IP地址回送响应。这样攻击者就可以通过伪造的IP地址对目标系统进行攻击,占用它的网络带宽和资源,极大地降低了目标系统的可用性。...

监控类面试题

Prometheus的四种数据类型 Counter(计数器类型) Counter类型的指标的工作方式和计数器一样,只增不减 Gauge(仪表盘类型) Gauge是可增可减的指标类,通常用于反应当前应用的状态。 Histogram 主要用于表示一段时间范围内对数据进行采样 Summary(摘要类型) Summary类型和Histogram类型相似,主要用于表示一段时间内数据采样结果 Prometheus 的局限 Prometheus 是基于 Metric 的监控,不适用于日志(Logs)、事件(Event)、调用链(Tracing)。 Prometheus 默认是 Pull 模型,合理规划你的网络,尽量不要转发。对于集群化和水平扩展,官方和社区都没有银弹,需要合理选择 Federate、Cortex、Thanos等方案。 监控系统一般情况下可用性大于一致性,容忍部分副本数据丢失,保证查询请求成功。这个后面说Thanos 去重的时候会提到。 Prometheus 不一定保证数据准确,这里的不准确一是指 rate、histogram_quantile 等函数会做统计和推断,产生一些反直觉的结果,这个后面会详细展开。二来查询范围过长要做降采样,势必会造成数据精度丢失,不过这是时序数据的特点,也是不同于日志系统的地方 采集组件 All IN One Prometheus 体系中 Exporter 都是独立的,每个组件各司其职,如机器资源用 Node-Exporter,Gpu 有Nvidia Exporter等等。但是 Exporter 越多,运维压力越大,尤其是对 Agent做资源控制、版本升级。我们尝试对一些Exporter进行组合,方案有二: 通过主进程拉起N个 Exporter 进程,仍然可以跟着社区版本做更新、bug fix。 用Telegraf来支持各种类型的 Input,N 合 1。另外,Node-Exporter 不支持进程监控,可以加一个Process-Exporter,也可以用上边提到的Telegraf,使用 procstat 的 input来采集进程指标。 合理选择黄金指标 采集的指标有很多,我们应该关注哪些?Google 在 “Sre Handbook” 中提出了“四个黄金信号”:延迟、流量、错误数、饱和度。实际操作中可以使用 Use 或 Red 方法作为指导,Use 用于资源,Red 用于服务。 Use 方法:Utilization、Saturation、Errors。如 Cadvisor 数据 Red 方法:Rate、Errors、Duration。如 Apiserver 性能指标 Prometheus 采集中常见的服务分三种:...

操作系统类面试题收集

Linux 基础 进程 如何查找特定进程消耗多少内存 bash 1 ps aux --sort=-%mem 按住 ctrl + c 会发生什么 按下 Ctrl + C 时,会向当前正在运行的前台进程发送一个信号,具体来说是 SIGINT 信号(Interrupt Signal,中断信号)。这个信号的作用是请求进程中断执行,通常会导致进程终止。信号编号是 2。 如果程序有处理信号,那么将不会发生任何事情。 守护、僵⼫、孤⼉进程的概念终端 【答】 守护进程:运⾏在后台的⼀种特殊进程,独⽴于控制终端并周期性地执⾏某些任务。 僵⼫进程:⼀个进程 fork ⼦进程,⼦进程退出,⽽⽗进程没有 wait/waitpid⼦进程,那么⼦进程的进程描述符仍保存在系统中,这样的进程称为僵⼫进程。 孤⼉进程:⼀个⽗进程退出,⽽它的⼀个或多个⼦进程还在运⾏,这些⼦进程称为孤⼉进程。(孤⼉进程将由 init 进程收养并对它们完成状态收集⼯作) 进程间通讯方式有哪些? Pipe:无名管道,最基本的IPC,单向通信,仅在父/子进程之间,也就是将一个程序的输出直接交给另一个程序的输入。常见使用为 ps -ef|grep xxx FIFO [(First in, First out)] 或 有名管道(named pipe):与Pipe不同,FIFO可以让两个不相关的进程可以使用FIFO。单向。 Socket 和 Unix Domain Socket:socket和Unix套接字,双向。适用于网络通信,但也可以在本地使用。适用于不同的协议。 消息队列 Message Queue: SysV 消息队列、POSIX 消息队列。 Signal: 信号,是发送到正在运行的进程通知以触发其事件的特定行为,是IPC的一种有限形式。 Semaphore:信号量,通常用于IPC或同一进程内的线程间通信。他们之间使用队列进行消息传递、控制或内容的传递。(常见SysV 信号量、POSIX 信号量) Shared memory:(常见SysV 共享内存、POSIX 共享内存)。共享内存,是在进程(程序)之间传递数据的有效方式,目的是在其之间提供通信。 BASH和DOS控制台之间的主要区别在于3个方面: 答案: BASH命令区分大小写,而DOS命令则不区分; 在BASH下,/ character是目录分隔符,\ 作为转义字符。在DOS下,/ 用作命令参数分隔符,\ 是目录分隔符 DOS遵循命名文件中的约定,即8个字符的文件名后跟一个点,扩展名为3个字符。BASH没有遵循这样的惯例。 Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的? 答案:...

kubernetes面试题收集

Kubernetes概念 Ingress和LoadBalancer的区别 Ingress通常用于将HTTP(S)流量路由到Kubernetes群集内部的服务,支持复杂路径路由和负载均衡算法 LB则是通过提供商提供一种外部流量引入到集群内的组件,通常为2 3层 Ingress本身是基于service的,引入流量时依赖 kube-proxy LB则是独立的组件,最小接入单元也是service,而通过2 3层的广播等功能可以提供多节点的引入 功能:Ingress是一个规范,LB则是一种实现 实现方式:ingress通过扩展Kubernetes API+controller, 而LB除此外还需要外部设备提供(软硬件,云组件) kubernetes之最小单元 Pod最小可调度单元,最小部署单元 容器:容器是最小的执行单元 Namespace:最小隔离单元 Service:最小接入单元 etcd用的什么算法,简单解释一下 raft算法 强一致性 同一时间只能有一个leader,所有的操作都在leader上。 Pod 的生命周期 Pod 状态始终处于一下几个状态之一: Pending: 部署 Pod 事务已被集群受理,但当前容器镜像还未下载完或现有资源无法满足 Pod 的资源需求 Running: 所有容器已被创建,并被部署到节点上 Successed: Pod 成功退出,并不会被重启 Failed: Pod 中有容器被终止 Unknown: 未知原因,如 kube-apiserver 无法与 Pod 进行通讯 Kubernetes有哪些不同类型的服务? cluster ip Node Port Load Balancer Extrenal Name 什么是ETCD? Etcd是用Go编程语言编写的,是一个分布式键值存储,用于协调分布式工作。因此,Etcd存储Kubernetes集群的配置数据,表示在任何给定时间点的集群状态。 什么是Ingress网络,它是如何工作的? Ingress网络是一组规则,充当Kubernetes集群的入口点。这允许入站连接,可以将其配置为通过可访问的URL,负载平衡流量或通过提供基于名称的虚拟主机从外部提供服务。因此,Ingress是一个API对象,通常通过HTTP管理集群中服务的外部访问,是暴露服务的最有效方式。 什么是Headless Service? Headless Service类似于“普通”服务,但没有群集IP。此服务使您可以直接访问pod,而无需通过代理访问它。 什么是集群联邦? 在联邦集群的帮助下,可以将多个Kubernetes集群作为单个集群进行管理。因此,您可以在数据中心/云中创建多个Kubernetes集群,并使用联邦来在一个位置控制/管理它们。 联合集群可以通过执行以下两项操作来实现此目的。请参考下图。 kube-proxy的作用 kube-proxy运行在所有节点上,它监听apiserver中service和endpoint的变化情况,创建路由规则以提供服务IP和负载均衡功能。简单理解此进程是Service的透明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上。 kube-proxy iptables的原理 Kubernetes从1....

go面试题收集

数据结构 数据类型总结 Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。 基础数据类型包括: 基础类型: 布尔型、整型、浮点型、复数型、字符型、字符串型、错误类型。 复合数据类型包括: 指针、数组、切片、字典、通道、结构体、接口。 什么是反射 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。 在go中,编译时不知道类型的情况下,可更新变量、运行时查看值、调用方法以及直接对他们的布局进行操作的机制,称为反射。 场景:无法透视一个未知类型的时候,这时候就需要有反射来帮忙你处理,反射使用TypeOf和ValueOf函数从接口中获取目标对象的信息,轻松完成目的。 rune与byte的区别 byte是uint8、rune为uint32,一个仅限于ascii码的值,一个支持更多的值。rune比byte能表达更多的数。 golang默认使用utf8编码,一个中文占用3字节,一个utf8数字占用1字节,utf8字母占用1字节 切片 切片的扩容:切片扩容,一般方式:上一次容量的2倍,超过1024字节,每次扩容上一次的1/4 切片的截取:在截取时,capacity 不能超过原slice的 capacity new() 与 make() 的区别 new(T) 和 make(T, args) 是Go语言内建函数,用来分配内存,但适用的类型不用。 new函数用于分配指定类型的零值对象,并返回指向其内存地址的指针。例如,new(int)将分配一个类型为int且值为0的对象,并返回一个指向该地址的指针。可以使用*运算符访问指针指向的值。 make函数用于创建和初始化内置类型(如map、slice、channel)的数据结构,并返回其指针。它比new函数更加复杂很多,因为它需要知道类型的大小和结构,以便为其分配内存并初始化其字段或元素。例如,make(map[string]int)将创建一个空的map。它有一个string类型的键和一个int类型的值。 nil切片和空切片指向的地址一样吗? nil切片和空切片指向的地址==不一样==。nil空切片引用数组指针地址为0(无指向任何实际地址) 空切片的引用数组指针地址是有的,且固定为一个值 什么是Receiver Golang的Receiver是绑定function到特定type成为其method的一个参数,即一个function加了receiver就成为一个type的method。 构体方法跟结构体指针方法的区别(Receiver和指针Receiver的区别) T 的方法集仅拥有 T Receiver。 *T 方法集则包含全部方法 (Receiver + *Receiver)。 sync.once 是 Golang package 中使方法只执行一次的对象实现,作用与 init 函数类似。但也有所不同 init 函数是在文件包首次被加载的时候执行,且只执行一次 sync.Onc 是在代码运行中需要的时候执行,且只执行一次 当一个函数不希望程序在一开始的时候就被执行的时候,我们可以使用 sync.Once 实现:sync.Once 的源码实现非常简单,采用的是双重检测锁机制 (Double-checked Locking),是并发场景下懒汉式单例模式的一种实现方式 首先判断 done 是否等于 0,等于 0 则表示回调函数还未被执行 加锁,确保并发安全 在执行函数前,二次确认 done 是否等于 0,等于 0 则执行 将 done 置 1,同时释放锁 疑问一: 为什么不使用乐观锁 CAS 简单的来说就是 f() 的执行结果最终可能是不成功的,所以你会看到现在采用的是双重检测锁机制来实现,同时需要等 f() 执行完成才修改 done 值 疑问二: 为什么读取 done 值的方式没有统一 比较 done 是否等于 0,为什么有的地方用的是 atomic....

WSL与Windows环境共享

在使用 wsl 时,总是需要执行 windows 的 cmd,但是windows命令行对于大多数人使用起来还是不习惯,微软提供了在 windows 中Linux与Windows的命令互通,即可以使用cmd shell执行Linux命令,也可以使用bash shell来执行windows命令。 WSL可对 Windows 与 Linux 之间的集成操作: 从 Linux shell(如 Ubuntu)运行 Windows 工具(任意 .exe)。 从 Windows shell(即 PowerShell or cmd )运行 Linux 命令(如 cd ls grep)。 在 WSL与windows之间共享环境变量。 (版本 17063+) 满足上述要求,可以很好地使用windows的软件在WSL中畅快的操作,即空WSL环境拥有了python解析器 docker等操作。 如何在 WSL和 Windows 之间共享环境变量 从Build 17063 开始,可以利用 WSLENV 来增强 Win/WSL 之间的环境变量互操作。 什么是WSLENV WSLENV 是一个以冒号分隔的环境变量列表,当从 WSL 启动 WSL进程或 Win进程时包含的变量 每个变量都可以以斜杠作为后缀,后跟标识位以指定它的转换方式 WSLENV 可以在 WSL 和 Win32 之间转换的路径 WSLENV。在WSL中,是以冒号分隔的列表。在Win中,是以分号分隔的列表 可以在.bashrc或者windows自定义环境变量中设置WSLENV 例如:一个WSLENV应该设置为 text 1 WSLENV=GOPATH/l:USERPROFILE/w:SOMEVAR/wp 在17063之前,WSL访问Windows环境变量唯一方法是使用全路径(可以使用全路径从WSL下启动Win32可执行文件)。但是没有办法在WSL中设置环境变量,调用Win进程,并期望将该变量传送到进程。...

windows递归复制指定时间后修改过的文件

因为在拷贝web站点时,也会存在更新,需要定期覆盖新的内容,就是上次覆盖的时间和到这次时间内修改过的文件都复制。 实现命令xcopy text 1 2 3 4 5 6 xcopy src dest $ xcopy D:\WWW\back1\* D:\WWW\back4 /D:05-22-2018 /F /E /y D:\WWW\back1\db_qbe.php -> D:\WWW\back4\db_qbe.php D:\WWW\back1\docs.css -> D:\WWW\back4\docs.css D:\WWW\back1\test\changelog.php -> D:\WWW\back4\test\changelog.php 复制了 3 个文件 /D:mm-dd-yyyy /F 打印复制过程 /E 递归复制目录和子目录包括空目录 /Y 禁止提示

python使用虚拟环境venv

venv模块支持使用自己的站点目录创建轻量级“虚拟环境”,可选择与系统站点目录隔离。每个虚拟环境都有自己的Python二进制文件(与用于创建此环境的二进制文件的版本相匹配),并且可以在其站点目录中拥有自己独立的已安装 Python 软件包集。 3.6 版后已移除: pyvenv 是 Python 3.3 和 3.4 中创建虚拟环境的推荐工具,不过 在 Python 3.6 中已弃用。 在 3.5 版更改: 现在推荐使用 venv 来创建虚拟环境。 创建venv虚拟环境 如果使用python2,则需要安装virtualenv模块 text 1 2 pip install virtualenv python -m virtualenv {name} python3内置了 venv 模块,可以直接使用 text 1 python3 -m venv {name} 进入虚拟环境 linux text 1 venv\Scripts\activate windows text 1 venv\Scripts\activate.bat 退出环境 text 1 2 venv\Scripts\deactivate.bat venv\Scripts\deactivate 使用venv环境安装软件报错 Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host=‘pypi....

python中的signal

什么是信号 信号(signal)– 进程间通讯的一种方式,也可作为一种软件中断的方法。一个进程一旦接收到信号就会打断原来的程序执行来按照信号进行处理。 简化术语,信号是一个事件,用于中断运行功能的执行。信号始终在主Python线程中执行。对于信号,这里不做详细介绍。 Python封装了操作系统的信号功能的库 singal 的库。singal 库可以使我们在python程序中中实现信号机制。 https://zh.wikipedia.org/wiki/Unix%E4%BF%A1%E5%8F%B7) Python的信号处理 首先需要了解Python为什么要提供 signal Library。信号库使我们能够使用信号处理程序,以便当接收信号时都可以执行自定义任务。 Mission:当接收到信号时执行信号处理方法 可以通过使用 signal.singal() 函数来实现此功能 Python对信号的处理 通常情况下Python 信号处理程序总是会在主 Python 主解析器的主线程中执行,即使信号是在另一个线程中接收的。 这意味着信号不能被用作线程间通信的手段。 你可以改用 threading 模块中的同步原语。 Python信号处理流程,需要对信号处理程序(signal handling )简要说明。signal handling 是一个任务或程序,当检测到特定信号时,处理函数需要两个参数,即信号id signal number (Linux 中 1-64),与堆栈帧 frame。通过相应信号启动对应 signal handling ,signal.signal() 将为信号分配 处理函数。 如:当运行一个脚本时,取消,此时是捕获到一个信号,可以通过捕获信号方式对程序进行异步的优雅处理。通过将信号处理程序注册到应用程序中: py 1 2 3 4 5 6 7 8 9 10 11 import signal import time def handler(a, b): # 定义一个signal handling print("Signal Number:", a, " Frame: ", b) signal....

P2P打洞技术

P2P 概述 相比于 C/S B/S 架构来说, P2P 是由 Peer 组成。每个Peer同时是客户端也是服务器。这意味着,P2P网络中的peer点为每个其他的peer提供服务,所有节点直接相互通信,没有中心节点,并共享资源源相互联系。 P2P有结构化的P2P网络和非结构化P2P网络。如TomP2P (Java的一个框架,一个分布式哈希表,提供去中心化的键/值基础设施)。而Gnutella (第一个分散式P2P文件共享网络),是非结构化 (unstructured)P2P网络的。另外还有两种类型的P2P网络,即集中式(centralized)P2P网络(Napster)和混合(hybrid p2p)peer网络(如Skype)。 NAT网络 由于NAT的网络模型,破坏了主机 Peer之间的端到端连接,因此P2P网络需要穿过NAT网络,而穿过NAT网络是目前为P2P技术面临的一个很大的挑战。 网络地址转换,NAT (Network Address Translation)是一种模糊指明的机制,可以将两个IP连接在一起,一个NAT设备总是拥有至少两个IP地址,(公网IP,私网IP),NAT就是将数据包上的IP地址在传输时,将私网IP转换为公网IP。每个NAT设备会维护一个NAT表,该表存储了所有活动的连接。 在创建网络映射后,NAT将源IP地址和端口更改为外部源IP地址和端口。NAT保留端口,不将新端口分配给外部源。一旦创建了映射,只要映射存在,与之联系的设备就能够发回消息。不存在NAT映射的所有来自外部的通信请求都是无法穿越NAT。因此,在P2P环境中,如果两个peer位于在NAT之后,两者都无法直接联系,因为它们之间不知道外部IP地址和源端口,NAT表中并没有其所维护的映射信息。所以NAT穿越中的主要问题之一是网络地址转换问题。 NAT网络类型 一般来讲, NAT网络可以分为四种类型: nat type 全锥型(Full Cone) 受限锥型(Restricted Cone), 或者说是IP受限锥型 端口受限锥型(Port Restricted Cone), 或者说是IP + PORT受限锥型 对称型(Symmetric) Full Cone NAT 全锥形 全锥形网络(Full Cone NAT) 的工作原理类似于 IP 地址一对一映射。 内部 IP 和端口映射到相同的外部地址和端口。 之后,任何外部源都可以通过向外部地址发送数据包来访问内部主机。 这意味着,一旦创建了映射,任何外部主机都可以联系内部主机。如下图 地址受限形的锥形NAT Address Restricted Cone NAT 地址受限形锥形 NAT是,仅当内部主机先联系外部主机时,受限锥形 NAT 才会为相应的内部主机分配外部IP。 外部主机然后能够通过分配的外部地址联系内部主机。 对称型 Symmetric nat 对称 NAT 是最难穿过的NAT,因为对称将随机端口分配给映射。 如果外部主机首先与内部主机连接,则外部主机只能知道外部映射。 在 P2P 场景中, 如果两个Peer(主机)位于 NAT 后面,则它们无法互相通信以让另一个对等体知道所使用的映射。 此外,对称 NAT 几乎不可能知道分配的端口以通过打孔(hole Punching)建立连接。...

awk常用案例

工具命令集合 长期总结 - Linux日志查询命令 长期总结 - Linux网络命令合集 长期总结 - Linux性能分析命令 awk常用案例 bash shell常用示例 探索kubectl - 巧用jsonpath提取有用数据 探索kubectl - kubectl诊断命令集合 ##AWK运算符 运算符 说明 赋值运算符 = += -= *= /= %= ^= **= 逻辑运算符 || 逻辑或 && 逻辑与 正则运算符 ~ !~ 匹配正则表达式和不匹配正则表达式 关系运算符 < <= > >= != == 关系运算符 算术运算符 + - 加,减 *** / &** 乘,除与求余 + - ! 一元加,减和逻辑非 ^ *** 求幂 ++ – 增加或减少,作为前缀或后缀 其他运算符 $ 字段引用 空格 字符串链接符 ?...

macos python安装mysqlapi集合

记录一下,接了一个python2 django1.x的项目,很老了导致很多扩展无法安装 os version:macos catalina python version: 2.7.18 而django后端使用sqllite以外需要对应客户端引擎,而安装时编译依赖C客户端即实际mysql组件。 使用的数据库后端。 内建的数据库后端有: ‘django.db.backends.postgresql’ ‘django.db.backends.mysql’ ‘django.db.backends.sqlite3’ ‘django.db.backends.oracle’ 并且修改配置实例 text 1 2 3 4 5 6 7 8 9 10 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'USER': 'mydatabaseuser', 'NAME': 'mydatabase', 'TEST': { 'NAME': 'mytestdatabase', }, }, } brew unlink mysql error: command ‘gcc’ failed with exit status 1 text 1 2 3 4 5 6 creating build/temp.macosx-10.9-x86_64-2.7 gcc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -g -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -Dversion_info=(1,2,5,'final',1) -D__version__=1....

Linux VMware Tools详解

VMware Tools描述 VMware Tools 中包含一系列服务和模块,可在 VMware 产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机系统进行无缝交互。 在Linux虚拟机中安装VMware Tools 安装前准备 虚拟机必须打开cd/dvd驱动器,否则安装VMware Tools的选项无法选择 VMware Tools安装程序是使用Perl编写的,必须确认操作系统中安装Perl。 安装步骤 在虚拟机菜单中右键单击虚拟机,然后单击客户机 > 安装/升级 VMware Tools。 要创建一个挂载点 mkdir /mnt/cdrom 要装载 CDROM,mount /dev/cdrom /mnt/cdrom 要将安装文件文件复制到临时目录:cp /mnt/cdrom/VMwareTools*.tar.gz /tmp/;其中,* 部分是 VMware Tools 软件包的版本号,故以替代*。 解压文件:cd /tmp && tar -zxvf VMwareTools*.tar.gz 运行PERL脚本以安装VMware Tools:cd vmware-tools-distrib && ./vmware-install.pl,若要求选择,一路回车即可。 安装完成后清理 rm -fr {/tmp/VMwareTools*,/tmp/vmware-tools-distrib} ; yum remove perl -y,如不需要perl可以卸载 命令集合 bash 1 2 3 4 5 mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom cp /mnt/cdrom/VMwareTools*.tar.gz /tmp/ cd /tmp && tar -xf VMwareTools*....

基于混合云模式的calico部署

开始前准备 确定calico数据存储 Calico同时支持kubernetes api和etcd数据存储。官方给出的建议是在本地部署中使用K8S API,仅支持Kubernetes模式。而官方给出的etcd则是混合部署(Calico作为Kubernetes和OpenStack的网络插件运行)的最佳数据存储。 使用etcd作为calico数据存储的好处: 允许多平台混用calico,如Kubernetes OpenStack上运行Calico Kubernetes资源与Calico资源分离 一个Calico群集,该群集不仅仅包含一个Kubernetes群集,如可与多个kubernetes集群互通。 坏处: 安装步骤繁琐 无法使用Kubernetes RBAC对calico资源的控制 无法使用Kubernetes资源对calico进行管理 下载calico部署清单 text 1 curl https://docs.projectcalico.org/manifests/calico-etcd.yaml -o calico.yaml 修改Pod CIDR Calico默认的Pod CIDR使用的是192.168.0.0/16,这里一般使用与controller-manager中的--cluster-cidr 保持一,取消资源清单内的 CALICO_IPV4POOL_CIDR变量的注释,并将其设置为与所选Pod CIDR相同的值。 calico的IP分配范围 Calico IPAM从ipPool分配IP地址。修改Pod的默认IP范围则修改清单calico.yaml中的CALICO_IPV4POOL_CIDR 配置Calico的 IP in IP 默认情况下,Calico中的IPIP已经禁用,这里使用的v3.17.2 低版本默认会使用IPIP 要开启IPIP mode则需要修改配置清单内的 CALICO_IPV4POOL_IPIP 环境变量改为 always 修改secret yaml 1 2 3 4 5 6 7 8 9 10 11 # Populate the following with etcd TLS configuration if desired, but leave blank if # not using TLS for etcd....