0%

Bitwarden是一款开源的密码管理工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3.7'

services:
bitwarden:
image: bitwardenrs/server
restart: always
portss:
- 80:80
volumes:
- data:/data/

volumes:
data:

注意:在使用浏览器插件的时候需要必须配置ssl证书。

[partial][]: New function with partial application of the given arguments and keywords.

简单来说,便是为一个函数预设初始参数,并创建一个新的函数。大致相当于:

1
2
3
4
5
6
7
8
def partial(func, /, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = {**keywords, **fkeywords}
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc

示例如下:

1
2
3
4
5
>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18

vm.max_map_count表示一个进程可以拥有的VMA(虚拟内存区块)的数量。

查看当前值

1
sysctl -a | grep vm.max_map_count

修改

1
2
echo 'vm.max_map_count=655350' >> /etc/sysctl.conf
sysctl -p

安装

1
yarn add echarts @types/echarts

ECharts.vue文件

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
<template>
<div style="width: 400px; height: 300px;"></div>
</template>

<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator'
import echarts from 'echarts'

@Component
export default class ECharts extends Vue {
@Prop({ default: () => ({}) }) private options!: echarts.EChartOption | echarts.EChartsResponsiveOption
private _chart?: echarts.ECharts

protected mounted () {
this.draw()
}

@Watch('options', { deep: true })
private draw () {
if (!this._chart) {
this._chart = echarts.init(this.$el as HTMLDivElement)
}
this._chart.setOption(this.options)
}
}
</script>

VMware网络模式

VMware虚拟机有三种网络模式:

  • Bridged - 桥接模式
  • NAT - 网络地址转换模式
  • Host-Only - 仅主机模式

Bridged - 桥接模式

通过桥接模式网络连接,虚拟机中的虚拟网络适配器可连接到主机系统中的物理网络适配器。 虚拟机可通过主机网络适配器连接到主机系统所用的LAN。

桥接模式网络连接将虚拟机配置为在网络中具有唯一标识,与主机系统相分离,且与主机系统无关。 虚拟机可完全参与到网络活动中。它能够访问网络中的其他计算机,也可以被网络中的其他计算机访问,就像是网络中的物理机那样。

NAT - 网络地址转换模式

使用NAT模式网络时,虚拟机在外部网络中不必具有自己的IP地址。 主机系统上会建立单独的专用网络。在默认配置中,虚拟机会在此专用网络中通过DHCP服务器获取地址。

Read more »

在特定情况下,如果需要执行刷新操作,有四种可选方案:

  1. 借助router.go(0)方法,刷新整个页面
  2. 使用forceUpdate()方法,刷新当前组件
  3. 使用v-if标记,刷新子组件
  4. 使用:key属性,通过改变key的值来达到刷新子组件的目的
Read more »

几天前有朋友问到怎么对Django项目做单元测试,于是,我将以前随手记下的笔记整理了一下。

  • 测试用例继承django.test.TestCase
  • 如果在执行测试用例之前需要初始化全局数据,重写类函数setUpTestData()
  • 在测试用例中如果需要批量创建数据,请使用循环一个一个create(),不要使用bulk_create(),因为bulk_create()不会自动save()
  • 在测试过程中,灵活使用mock,推荐使用unittest.mock.patch,详细内容参见:patchers
  • 使用断言assert校验执行结果,不要使用if..else..判断,django.test.TestCase中已经内置一些assert,大家可以自由使用。
  • 如果被测试的代码中使用了缓存,可以使用django.core.cache.backends.dummy.DummyCachedjango.core.cache.backends.locmem.LocMemCache来防止缓存被污染。
  • 做接口测试时,使用self.client发起请求。
  • 测试需要登录时,使用self.client.force_login(user)进行登录。
  • 如果测试需要携带请求头时,可以修改self.client.defaults的值,它是一个dict,直接update就行。
  • 如果一个app下的测试用例代码非常多的话,建议将tests.py文件改成tests/文件夹。

随着业务的发展,用户的增长,原有的单一系统越来越复杂,越来越庞大。 此时,我们可以重新划分业务、拆解应用,使用微服务架构的方式来解决系统性能问题以及业务复杂问题。

那么什么是微服务?微服务是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对整理解决方案的解耦。

在微服务架构中,每个微服务通常有多个实例,每个实例具有不同的位置,而且实例会动态变化(动态伸缩、灾后重建等)。 因此在使用微服务架构开发应用时,需要通过服务注册和发现技术解决此问题。

  • 服务注册:允许服务实例将当前服务的信息注册到注册中心。
  • 服务发现:调用者可以从注册中心查询到服务实例的信息。

CAP理论

CAP理论是分布式架构中重要理论:

  • 一致性(Consistency):所有节点在同一时间具有相同的数据
  • 可用性(Availability):保证每个请求不管成功或者失败都有响应
  • 分隔容忍(Partition tolerance):系统中任意信息的丢失或失败不会影响系统的继续运作

CAP理论认为在分布式系统只能兼顾其中的两个特性,即只有CACPAP三种情况。

Read more »