options has an unknown property ‘disableHostCheck‘. These properties are valid:

提示:options has an unknown property ‘disableHostCheck’. These properties are valid:
在这里插入图片描述
根据报错提示
在webpack 5 中disableHostCheck应该被遗弃了
查看文档了解到需将 disableHostCheck:true
替换为
historyApiFallback: true,
allowedHosts: “all”,

重新配置vue.config.js

devServer: {
historyApiFallback: true,
allowedHosts: “all”,
}

console.log not work

In my case, all console messages were not showing because I had left a string in the “filter” textbox.

Remove the filter it by clicking the X as shown:

enter image description here

如何解决在 Python 中运行 Lambda 代码时收到的“Unable to import module”错误?

简短描述

通常情况下收到此错误的原因是 Lambda 环境在 Python 代码中找不到指定的库。这是因为 Lambda 没有预先封装所有 Python 库。

要解决此错误,请创建一个部署程序包或 Lambda 层,其中包含要在 Lambda 的 Python 代码中使用的库。

重要提示:确保把为 Python 导入的库放在 /python 文件夹中。

解决方法

注意:以下步骤展示的是如何创建 Lambda 层,并非部署程序包。这是因为您可以跨多个 Lambda 函数重复使用 Lambda 层。每个 Lambda 运行时将特定的 /opt 目录文件夹添加到 PATH 变量中。如果该层使用相同的文件夹结构,则 Lambda 函数的代码可以在不指定路径的情况下访问该层内容。

最佳实践是在建立 Lambda 运行时的同一操作系统上创建 Lambda 层。例如,Python 3.8 基于 Amazon Linux 2 Amazon Machine Image (AMI)。但是,Python 3.7 和 Python 3.6 以 Amazon Linux AMI 为基础。

要为 Python 3.8 库创建 Lambda 层,请执行以下操作:

1.    在 AWS Cloud9 控制台中,使用 Amazon Linux 2 AMI 创建一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例。有关说明,请参阅《AWS Cloud9 用户指南》中的创建 EC2 环境

2.    创建一个 AWS Identity and Access Management (IAM) 策略,其将赋予调用 PublishLayerVersion API 操作的权限。

示例,IAM 策略语句将赋予调用 PublishLayerVersion API 操作的权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:PublishLayerVersion",
            "Resource": "*"
        }
    ]
}

3.    创建一个 IAM 角色将 IAM 策略附上到该角色。然后,将 IAM 角色附上到 Amazon EC2 实例

注意:您的 EC2 实例现在拥有权限,可为 PublishLayerVersion API 调用上载 Lambda 层。

4.    打开您的 AWS Cloud9 Amazon EC2 环境。然后,通过运行以下命令安装 Python 3.8 和 pip3:

$ sudo amazon-linux-extras install python3.8
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3.8 get-pip.py --user

5.    通过运行以下命令,创建一个 python 文件夹:

$ mkdir python

6.    通过运行以下命令,将 Pandas 库文件安装到 python 文件夹中:

重要提示:将 Pandas 替换为您要导入的 Python 库的名称。

$ python3.8 -m pip install pandas -t python/

7.    通过运行以下命令,将 python 文件夹的内容压缩到 layer.zip 文件中:

$ zip -r layer.zip python

8.    通过运行以下命令发布 Lambda 层:

重要提示:将 us-east-1 替换为您的 Lambda 函数所在的 AWS 区域。

$ aws lambda publish-layer-version --layer-name pandas-layer --zip-file fileb://layer.zip --compatible-runtimes python3.8 --region us-east-1

9.    向您的 Lambda 函数添加层

Govmomi获取虚拟机列表

基本思路

先获取所有虚拟机信息,再根据虚拟机所属集群分类,但实际操作中并未在虚拟机信息中查找到所属集群信息。
退而求其次,先获取主机和虚拟机信息,根据虚拟机所属主机分类,导出后手动对其集群分类。

安装Govmomi

1go get -u github.com/vmware/govmomi

链接到vSphere

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var client *vim25.Clien
var ctx = context.Background()
const (
VSPHERE_IP = “xxx”
VSPHERE_USERNAME = “xxx”
VSPHERE_PASSWORD = “xxx”
Insecure = true
)
// NewClient 链接vmware
func NewClient() *vim25.Client {

u := &url.URL{
Scheme: “https”,
Host: VSPHERE_IP,
Path: “/sdk”,
}

u.User = url.UserPassword(VSPHERE_USERNAME, VSPHERE_PASSWORD)
client, err := govmomi.NewClient(ctx, u, Insecure)
if err != nil {
panic(err)
}
return client.Client
}

获取主机信息

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// VmsHost 主机结构体
type VmsHost struct {
Name string
Ip string
}
// VmsHosts 主机列表结构体
type VmsHosts struct {
VmsHosts []VmsHost
}
// NewVmsHosts 初始化结构体
func NewVmsHosts() *VmsHosts {
return &VmsHosts{
VmsHosts: make([]VmsHost, 10),
}
}

// 虚拟机表
type Vm struct {
gorm.Model
Uuid string `gorm:”type:varchar(40);not null;unique;comment:’虚拟机id'”`
Vc string `gorm:”type:varchar(30);comment:’Vcenter Ip'”`
Esxi string `gorm:”type:varchar(30);comment:’Esxi Id'”`
Name string `gorm:”type:varchar(90);comment:’Vm名字'”`
Ip string `gorm:”type:varchar(20);comment:’Vm ip'”`
PowerState string `gorm:”type:varchar(20);comment:’Vm state'”`
}

// AddHost 新增主机
func (vmshosts *VmsHosts) AddHost(name string, ip string) {
host := &VmsHost{name, ip}
vmshosts.VmsHosts = append(vmshosts.VmsHosts, *host)
}
// SelectHost 查询主机ip
func (vmshosts *VmsHosts) SelectHost(name string) string {
ip := “None”
for _, hosts := range vmshosts.VmsHosts {
if hosts.Name == name {
ip = hosts.Ip
}
}
return ip
}

// GetHosts 读取主机信息
func GetHosts(client *vim25.Client, vmshosts *VmsHosts) {
m := view.NewManager(client)
v, err := m.CreateContainerView(ctx, client.ServiceContent.RootFolder, []string{“HostSystem”}, true)
if err != nil {
panic(err)
}
defer v.Destroy(ctx)
var hss []mo.HostSystem
err = v.Retrieve(ctx, []string{“HostSystem”}, []string{“summary”}, &hss)
if err != nil {
panic(err)
}
// fmt.Printf(“主机名:\t%s\n”, hss[0].Summary.Host.Value)
// fmt.Printf(“IP:\t%s\n”, hss[0].Summary.Config.Name)
for _, hs := range hss {
vmshosts.AddHost(hs.Summary.Host.Value, hs.Summary.Config.Name)
}
}

获取虚拟机信息

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
35
36
37
38
39
40
41
// GetVms获取所有vm信息
func GetVms(client *vim25.Client, vmshosts *VmsHosts) {
m := view.NewManager(client)
v, err := m.CreateContainerView(ctx, client.ServiceContent.RootFolder, []string{“VirtualMachine”}, true)
if err != nil {
panic(err)
}
defer v.Destroy(ctx)
var vms []mo.VirtualMachine
err = v.Retrieve(ctx, []string{“VirtualMachine”}, []string{“summary”, “runtime”, “datastore”}, &vms)
if err != nil {
panic(err)
}
// 输出虚拟机信息到csv
file, _ := os.OpenFile(“./vms.csv”, os.O_WRONLY|os.O_CREATE, os.ModePerm)
//防止中文乱码
file.WriteString(“\xEF\xBB\xBF”)
w := csv.NewWriter(file)
w.Write([]string{“宿主机”, “虚拟机”, “系统”, “状态”, “IP地址”, “资源”})
w.Flush()
for _, vm := range vms {
//虚拟机资源信息
res := strconv.Itoa(int(vm.Summary.Config.MemorySizeMB)) + ” MB ” + strconv.Itoa(int(vm.Summary.Config.NumCpu)) + ” vCPU(s) ” + units.ByteSize(vm.Summary.Storage.Committed+vm.Summary.Storage.Uncommitted).String()
w.Write([]string{vmshosts.SelectHost(vm.Summary.Runtime.Host.Value), vm.Summary.Config.Name, vm.Summary.Config.GuestFullName, string(vm.Summary.Runtime.PowerState), vm.Summary.Guest.IpAddress, res})
w.Flush()
}
file.Close()

// 批量插入到数据库
var modelVms []*Vm
for _, vm := range vms {
modelVms = append(modelVms,&Vm{
Uuid: vm.Summary.Config.Uuid,
Vc: VSPHERE_IP,
Esxi: vm.Summary.Runtime.Host.Value,
Name: vm.Summary.Config.Name,
Ip: vm.Summary.Guest.IpAddress,
PowerState: string(vm.Summary.Runtime.PowerState),
})
}
}

AWS EC2 启用 IPv6 小记

日期:2018-04-30
更新:2018-04-30一开始以为 AWS EC2 启用 IPv6 会像 DigitalOcean 那样简单粗暴,创建实例的时候打个勾就好。没想到 AWS 家大业大,各个组件相互关联,折腾了一圈才弄明白,特此备份。需要协同修改有五个地方,分别是 VPC 、SubnetSecurity groups 和实例的网络设置,理论上只有第一个实例需要如此折腾,之后相同 VPCSubnet 和 Security groups 的实例应当可以直接获取 IPv6 的地址。VPC找到当前实例所属的 VPC 然后选择 Edit CIDRs然后点 Add IPv6 CIDR 就完事了:新建的 VPC 直接选择 Amazon provided IPv6 CIDR block 就可以了:Subnet同样的,找到当前实例所属的 Subnet 然后选择 Edit IPv6 CIDRs新建的 Subnet 直接输入想要的 IPv6 block 就可以了(一般从 00 开始,多个 Subnet 后续可以指定 0102,诸如此类):Security groups如果用户想要通过 IPv6 访问实例,还需要设置防火墙的相应规则,一般来说允许所有地址就是在 Inbound 的 Source 里设置 ::/0实例网络设置进入当前实例的 Networking – Manage IP Addresses,然后选择 Assign new IP 即可:参考引用IPv6 Support for EC2 Instances in Virtual Private Clouds

补充一下,如果需要开启 IPv6 公网访问,需要添加一条路由规则,具体见:
https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html#vpc-migrate-ipv6-routes

Android Studio编译报错:“ java.lang.OutOfMemoryError: Java heap space”

前言:

最近换了工作,到了新东家,厂子大了,人也多了,希望在新的环境中不断成长。在上家公司电脑是最好的,新的公司就是一般配置,内存只有8G,因此Android Studio3.5编译报错:java.lang.OutOfMemoryError。

原因:

java.lang.OutOfMemoryError: GC overhead limit exceeded 则表示程序消耗了太多的可用内存,并且GC屡屡没能有效回收清理。一次GC后大部分的堆空间任然被占用,GC的频繁调用将使CPU的一直处于高负荷状态,由于GC过度频繁运行,客户程序也将无法正常往下运行导致程序崩溃。

解决方法:
1.在build.gradle中的android{}添加如下脚本:

defaultConfig {

    ...

    dexOptions { 
        javaMaxHeapSize “4g” 
    }

}

2.在gradle.properites文件中添加如下配置:

# 解决OutOfMemoryError
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx5120m