问题解决 - Your configuration specifies to merge with the ref xxx

原因

在执行git pull的时候会报错:
Your configuration specifies to merge with the ref ‘refs/heads/master’ from the remote, but no such ref was fetched
原因是,现在默认分支已更名为 “main”,但本地git仍试图从 "master "中提取,因此出现了此消息。

解决方案:执行以下脚本:

1
2
3
4
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a

Django 简版 Docker 发布流程

概述

想实现通过开发系统打包Docker,上传到私有部署的Hub。生产系统下载更新包,发布新版本,以下是对应的脚本文件。

开发系统打包上传

脚本文件:

1
2
3
sudo docker build . -t my-app:latest
sudo docker tag my-app:latest 192.168.50.188:5000/my-app:v1
sudo docker push 192.168.50.188:5000/my-app:v1

其中 192.168.50.188:5000 是私有仓库地址

生产系统下载发布

脚本文件:

1
2
3
4
sudo docker pull 192.168.50.188:5000/my-app:v1
sudo docker stop my-app
sudo docker rm /my-app
sudo docker run -it -d -p 8000:8000 --name my-app 192.168.50.188:5000/my-app:v1

测试成功,记录一下。

U型思考介绍-2-问挖破立

graph LR
  U型思考 --> 问
  U型思考 --> 挖
  U型思考 --> 破
  U型思考 --> 立

  问--> 认知差定胜负
  问--> 透视U型思考
  问--> 好问题的力量

  挖--> 追问法
  挖--> 框架法
  挖--> 类推法与假设法

  破--> 破界法
  破--> 升维法
  破--> 优势法

  立--> 飞轮法
  立--> 价值网法与画布法
  立--> 跨越未知之墙

Docker如何搭建私有Registry镜像仓库

概述

仓库(Repository)是集中存放镜像的地方。
一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 docker.io/ubuntu 来说,docker.io 是注册服务器地址,ubuntu 是仓库名。
大部分时候,并不需要严格区分这两者的概念。

私有仓库搭建

有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。

获取镜像/启动服务

说明:registry 镜像选择 registry:2 和 registry:2.4.1 都可以。
拉取私有镜像仓库

1
2
docker pull registry:2
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
More...

耦合度以及降低耦合度的方法

一、耦合度

模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。
降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所引起的“牵一发动全身”的水波效应,保证系统设计顺利进行

二、紧密耦合的系统在开发阶段有以下的缺点

一个模块的修改会产生涟漪效应,其他模块也需随之修改。
由于模块之间的相依性,模块的组合会需要更多的精力及时间。
由于一个模块有许多的相依模块,模块的可复用性低。

三、降低耦合度的方法

  1. 少使用类的继承,多用接口隐藏实现的细节。 java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的。
  2. 模块的功能化分尽可能的单一。道理也很简单,功能单一的模块供其它模块调用的机会就少。
  3. 遵循一个定义只在一个地方出现。(对一个功能、类只定义在一个地方)。
    • 修改时永远只修改这一个地方。
    • 增加功能时也只在一个地方修改。
    • 将变动只缩小到一个地方。
    • 一处修改,所有用它的地方都生效。
  4. 少使用全局变量。
    • 由于全局变量,程序运行期间,始终占有那块存储区,所以空间利用率比较低,大量的全局变量,很快就会把内存用光
    • 全局变量由于每个函数都可以使用,所以任何一个函数的修改,如果修改了全局变量,都有可能影响到其他函数,所以不利于调试
  5. 类属性和方法的声明少用public,多用private关键字(公共的就有可能被到处调用,到处new对象)
  6. 多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。
  7. 尽量不用“硬编码”的方式写程序,同时也尽量避免直接用SQL语句操作数据库。

系统性能调优-学习笔记1

基本知识

大型网站架构设计必备的三板斧:

  • 高性能架构设计: 熟悉系统常见性能优化手段比如引入 读写分离、缓存、负载均衡、异步 等等。
  • 高可用架构设计 :CAP理论和BASE理论、通过集群来提高系统整体稳定性、超时和重试机制、应对接口级故障:降级、熔断、限流、排队。
  • 高扩展架构设计 :如何拆分系统。按照不同的思路来拆分软件系统,就会得到不同的架构。

基本原则

合适优于先进 > 演化优于一步到位 > 简单优于复杂

常见的性能优化策略

性能优化之前我们需要对请求经历的各个环节进行分析,排查出可能出现性能瓶颈的地方,定位问题。

下面是一些性能优化时常见问题:

  1. 当前系统的SQL语句是否存在问题?
  2. 当前系统是否需要升级硬件?
  3. 系统是否需要缓存?
  4. 系统架构本身是不是就有问题?
  5. 系统是否存在死锁的地方?
  6. 数据库索引使用是否合理?
  7. 系统是否存在内存泄漏?
  8. 系统的耗时操作进行了异步处理?

4S方法设计系统

概述

所谓4S分析法中的4S是指:
Scenario(场景),Service(服务),Storage(存储),Scale(扩展)。
接下来,我们结合4S分析法来具体回答一道常见系统设计题:如何设计一个推特?

第一步:Scenario 场景

在这一步,需要考虑:需要设计哪些功能(也可以自己想),需要承受多大的访问量?
首先可以把Twitter的功能一个个罗列出来,很显然你无法在45分钟的面试中完成所有功能的设计,所以需要筛选出核心功能(Post a Tweet,Timeline,News Feed,Follow/Unfollow a user,Register/Login)。
然后需要继续考虑系统承受的QPS大概是多少?需要考虑并发用户,读频率(Read QPS)以及写频率(Write QPS)。记住重要的是你的思考和计算过程而不是计算结果。

第二步,Service服务

所谓服务可以认为是逻辑处理的整合,对于同一类问题的逻辑处理可以归并到一个服务中。这一步实际上就是将整个系统细分为若干个小的服务。
根据第一步选出的核心功能,我们可以将推特拆分成如下的几个服务:

第三步,Storage 存储

接下来就是4S分析法中最重要的一部分,存储。根据每个服务的数据特性选择合适的存储结构,然后细化数据表结构。
系统设计中可以选择的存储结构一般有三大类:数据库系统,文件系统,缓存系统。其中数据库系统又分为关系型数据库(SQL Database)和 非关系型数据库(NoSQL Database)。

确定存储结构后,我们需要细化数据表结构,面试中可以通过画图展示数据存储和读取的流程。

用过前3个步骤的分析,我们已经得到了一个可行方案,注意是Work Solution而不是Perfect Solution,这个方案可以存在很多待解决的缺陷。

第四步,Scale 扩展

这一步主要分两部分:

  • 一个是优化和迭代设计,包括解决设计缺陷,更多功能设计,后台管理功能以及一些特殊情况如何处理;
  • 另一个是维护,包括系统的鲁棒性和扩展性,比如有一台服务器/数据库挂了怎么办?如果有流量暴增,如何扩展?

U型思考介绍-1

什么是U型思维呢?

U型思维是指先向下挖掘出问题本质,然后基于本质再来做决策的思考方式。它与上面直线式的思考相对应,因为思维链路有点像U,所以叫它U型思维,也可以叫它本质思考或者第二性思考。

U-Theory

既然 U 型思维这么好,那么我们又如何能由直线思考升级到U型思考,从而拥有一眼洞穿本质的能力呢?

其实和学习其他新生事物一样的道理,我们首先需要掌握科学系统的训练方法,其次通过刻意练习,让U型思考这种思维方式形成习惯以后,存储到我们潜意识层,它也就变成了我们操作系统上又一个常用的思维框架 。后续每当你遇到方向性问题时,U型思维这个 思维框架 就会自动运转起来,它就是专门用来解决战略方向性问题的,帮助我们确立前行方向。所以擅长U型思考的人,往往也是战略高手。

具体的训练步骤可以分为以下三步:

  1. 找核心问题
  2. 找本质原因
  3. 找解决方案

助记词:
先问后挖,不破不立

conda 创建、激活、退出、删除虚拟环境 (Anaconda)

在Anaconda中conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。所以对虚拟环境进行创建、删除等操作需要使用conda命令。

conda 本地环境常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#获取版本号
conda --version 或 conda -V

#检查更新当前conda
conda update conda

#查看当前存在哪些虚拟环境
conda env list 或 conda info -e

#查看--安装--更新--删除包

conda list:
conda search package_name# 查询包
conda install package_name
conda install package_name=1.5.0
conda update package_name
conda remove package_name

conda创建虚拟环境

1
2
3
4
5
6
7
8
9
10
#创建名为your_env_name的环境
conda create --name your_env_name
#创建制定python版本的环境
conda create --name your_env_name python=2.7
conda create --name your_env_name python=3.6
#创建包含某些包(如numpy,scipy)的环境
conda create --name your_env_name numpy scipy
#创建指定python版本下包含某些包的环境
conda create --name your_env_name python=3.6 numpy scipy

激活虚拟环境

1
2
3
4
5
6
#Linux
source activate your_env_name

#Windows
activate your_env_name

退出虚拟环境

1
2
3
4
5
6
#Linux
source deactivate your_env_name

#Windows
deactivate env_name

删除虚拟环境

1
2
3
conda remove -n your_env_name --all
conda remove --name your_env_name --all

复制某个环境

1
conda create --name new_env_name --clone old_env_name

在指定环境中管理包

1
2
3
4
conda list -n your_env_name
conda install --name myenv package_name
conda remove --name myenv package_name

使用国内 conda 软件源加速

1
2
3
4
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes

请我喝杯咖啡吧~

支付宝
微信