1 | 拉所有分支 |
git代码ssh方式部署linux服务器
1. 创建用户
1 | # 创建用户, -m 创建用户家目录 |
2. 在git项目服务器添加ssh公钥
3. 在部署服务器用户家目录添加ssh密钥
1 | mkdir ~/.ssh/ |
pycharm2vscode.md
c++从入门到放弃.md
download
- Windows10下载MinGW
- 点击页面中的
x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z进行下载 - 下载完成后把
bin目录放入系统环境变量即可在终端使用c++命令进行编译.cpp源代码
Hello World
MyFirstApp
1 | #include <iostream> |
1 | # 编译 |
换行
\n或<< endl;编译命令
g++ [source file] -o [output filename]
Variables
- 命名
- 构成: 下划线, 字母(区分大小写), 数字(不可数字开头)
- 一般用小驼峰命名法
Data types
| 类型 | 定义 | size(bytes) | 说明 |
|---|---|---|---|
| 整数 | int | 4 | -2147483648 to 2147483647 |
| 字符 | char | 1 | 单引号为字符 ‘a’ |
| 字符串 | string | 双引号为字符串 “character” | |
| 布尔 | bool | 1 | true / false |
| 浮点数 | float | 4 | |
| 大浮点数 | double | 8 |
Data type overflow
- 变量的值超过其内存空间, 类似钟表指针, 13 点 = 1 点 (INT_MAX + 1 = INT_MIN)
ASCII table
- asign characters to number (it’s for American)
- ASCII extends: utf-(1-16) (for others)
- 字符转换为ASCII数字
(int)'a'和int('a')两种写法
Condition Statement
语法
if(){}elif(){}else(){}
- 注: 如果
{}内只有一行代码, 可以不写{}
1 | #include <iostream> |
Operators
1 | #include <iostream> |
三目
1 | #include <iostream> |
switch case
注意每个case后面必需接break退出, 因为程序只判断一次case条件, 进入一次后, 其他的case不会再判断, 会运行下面的所有case.
1 | #include <iostream> |
源码安装mysql
源码安装Mysql
系统: CentOS 8
1. 下载
官网找指定版本下载源码包
1 | wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.34.tar.gz |
2. 解压编译
1 |
|
编译时命令 cmake . 报错汇总
1 | # 报错: undefined symbol: archive_write_add_filter_zstd |
二进制安装
1. 下载
https://downloads.mysql.com/archives/community/
Operating System: Linux-Generic
OS Version: Linux-Generic(glibc 2.12) (x86, 64-bit)
1 | wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz |
2. 安装
先查看下系统磁盘绑定情况, 再决定mysql data目录
命令: df -h
2.1. 创建用户, 用户组, 数据目录
1 | groupadd mysql |
2.2. 下载, 解压
1 | cd /home/mysql |
2.3. 配置启动
1 | # 初始化配置 |
启动mysql可能出现的错误:
1 | # error while loading shared libraries: libncurses.so.5 |
计算机网络从入门到放弃
一. 基础
1. 性能指标
速率
- 即数据率或称数据传输率或比特率
| 速率(千,兆,吉,太)(kb, Mb, Gb, Tb) | 存储容量(KB, MB, GB, TB)(1Byte = 8bit) |
|---|---|
| 千 1kb/s = 10**3 b/s | 1KB = 2**10B = 1024B = 1024 * 8 b |
带宽
- 指网络的通信线路传送数据的能力, 通常是指单位时间内从网络中的一点到另一点所能通过的 最高数据率。
- 单位: 比特每秒, b/s, kb/s, Mb/s, Gb/s, 网络设备所支持的最高速度
吞吐量
- 表示单位时间 内通过 **某个网络(或信道、接口)**的数据量
- 单位: b/s, kb/s, Mb/s等
- 吞吐量受网络的带宽或网络的额定速率的限制
时延
指数据(报文/分组/比特流)从网络(或链路)的一端传送到另一端所需的时间,也叫延迟,单位s
- 发送时延(传输时延):从发送分组的第一个比特算起, 到该分组的最后一个比特发送完毕所需的时间
$$
发送时延 = \frac{数据长度}{信道带宽}
$$
- 传播时延:取决于电磁波的传播速度和链路长度
$$
传播时延 = \frac{信道长度}{3 * 10^8}
$$
- 排队时延:等待输出/输入链路可用
- 处理时延:检错、找出口
时延带宽积
- 又称为 以比特为单位的链路长度, 即 某段链路现在有多少比特, 是指链路中某一时刻的比特容量
$$
时延带宽积(bit) = 传播时延(s) \times 带宽 (b/s)
$$
往返时间RTT
- 从发送方发送数据开始, 到发送方收到接收方的确认(接收方收到数据后立即发送确认),总共经历的时延
- 如 ping 的time = 33ms
- RTT越大,在收到确认之前,可以发送的数据越多
- RTT包括
- 往返传播时延 = 传播时延 * 2
- 末端处理时间
利用率
- 信道利用率
$$
信道利用率 = \frac{有数据通过时间}{(有+无)数据通过时间}
$$
- 网络利用率: 信道利用率加权平均值
加权平均值即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。加权平均值的大小不仅取决于总体中各单位的数值(变量值)的大小,而且取决于各数值出现的次数(频数),由于各数值出现的次数对其在平均数中的影响起着权衡轻重的作用,因此叫做权数。
2. 分层结构
- 实体:第n层中的活动元素称为 n层实体。同一层的实体叫 对等实体。
- 协议:为进行网络中的 对等实体 数据交换而建立的规则、标准或约定称为网络协议。
- 接口(访问服务点SAP): 上层使用下层服务的入口。
- 服务:下层为相邻上层提供的功能调用。
2.1. OSI参考模型
目的:支持 异构网络系统 的互联互通。
国际标准化组织(ISO) 于1984年提出开放系统互连(OSI)参考模型。
| OSI 七层 | 说明 |
|---|---|
| 应用层 | 数据子网(数据处理) |
| 表示层 | 数据子网(数据处理) |
| 会话层 | 数据子网(数据处理) |
| 传输层 | |
| 网络层 | 通信子网(数据通信) |
| 数据链路层 | 通信子网(数据通信) |
| 物理层 | 通信子网(数据通信) |
- 应用层
- 定义:所有能和用户交互产生网络流量的程序
- 典型应用层服务:
- 文件传输:FTP
- 电子邮件:SMTP
- 万维网:HTTP
- 表示层
- 定义:用于处理在两个通信系统中交换信息的表示方式(语法和语义)
- 功能:
- 数据格式变换
- 数据加密解密
- 数据压缩和恢复
- 会话层
- 定义:向表示层实体/用户进程提供建立连接并在连接上有序地传输数据。这是会话, 也是建立同步(SYN)
- 功能:
- 建立、管理、终止会话
- 使用校验点可使会话在通信失效时从 校验点/同步点 继续恢复通信,实现数据同步。(适用于传输大文件)
- 传输层
- 定义:负责该机中 两个进程 的通信,即端到端 的通信。传输意念是报文段或用户数据报。
- 功能:
- 可靠传输、不可靠传输
- 可靠:先建立连接,确认机制,如握手,再传输数据
- 不可靠:无建立连接,直接传数据
- 差错控制
- 流量控制
- 复用分用
- 复用:多个应用层进程可同时使用下面传输层的服务
- 分用:运输层把收到的信息分别交付给上面应用层中相应的进程
- 可靠传输、不可靠传输
- 网络层
- 定义:主要任务是把分组从源端传到目的端,为分组交换网上的不同该机提供通信服务。网络层传输单位是数据报
- 功能:
- 路由选择:最佳路径
- 流量控制:限制发送端
- 差错控制
- 拥塞控制:若所有结点都来不及接受分组,而要丢弃大量分组的话,网络就处于拥塞状态。因此要采取一定措施,缓解这种拥塞。
- 数据链路层
- 定义:主要任务是把网络层传下来的数据报组装成帧。传输单位是帧。
- 功能:
- 成帧(定义帧的开始和结束)
- 差错控制:帧错+位错
- 流量控制:限制发送端速度
- 访问(接入)控制:控制对信道的访问
- 物理层
- 定义:主要任务是在物理媒体上实现比特流的透明传输。传输单位是比特。
- 透明传输:指不管所传数据是什么样的比特组合,都应当能够在链路上传送。
- 功能:
- 定义接口特性
- 定义传输模式
- 单工、半双工、双工
- 定义传输速率
- 比特同步
- 比特编码:用什么电压表示1, 什么电压表示0
2.2. TCP/IP模型
| TCP/IP 四层 | 协议栈 |
|---|---|
| 应用层 | HTTP,FTP,DNS,SMTP |
| 传输层 | TCP,UDP |
| 网际层 | IP |
| 网络接口层 | Ethernet, ATM, Frame Relay |
2.3. OSI与TCP/IP对比
- 相同点
- 都分层
- 基于独立的协议栈的概念
- 可以实现异构网络互联
- 不同点
- OSI定义三点:服务、协议、接口
- OSI先出现,参考模型先于协议发明,不偏向特定协议
- TCP/IP设计之初就考虑到异构网互联问题,将IP作为重要层次
| OSI | TCP/IP | |
|---|---|---|
| 网络层 | 无连接 + 面向连接 | 无连接 |
| 传输层 | 面向连接 | 无连接 + 面向连接 |
面向连接分为三个阶段:
- 建立连接,在此阶段,发出一个建立连接的请求。
- 只有连接成功建立之后,才能开始传输数据, 这是第二阶段
- 当数据传输完毕必须释放连接
无连接直接进行数据传输
2.4. 5层参考模型
| 5层参考模型 | 说明 | 协议 |
|---|---|---|
| 应用层 | 支持各种网络应用 | FTP、SMTP、HTTP |
| 传输层 | 进程-进程的数据传输 | TCP、UDP |
| 网络层 | 源主机到目的主机的数据分组路由与转发 | IP、ICMP、OSPF |
| 数据链路层 | 把网络层传下来的数据报组装成帧 | Ethernet、PPP |
| 物理层 | 比特传输 |
3. 通信基础
物理层基本概念
- 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流, 而不是指具体的传输媒体
- 主要任务: 确定与传输媒体接口有关的一些特性
- 机械特性:
- 电气特性:
- 功能特性:
数据通信基础

- 数据: 传送信息的实体, 通常是有意义的符号序列
- 信号: 数据的电气/电磁的表现, 是数据在传输过程中的存在形式
- 数字信号: 代表消息的参数取值是离散的
- 模拟信号: 代表消息的参数取值是连续的 (正弦波)
- 信源: 产生和发送数据的源头
- 信宿: 接收数据的终点
- 信道:
- 按传输信号分类:
- 按
- 三种通信方式:
- 单工通信
配置frp内网穿透
1. 下载对应包
在git上找到对应自己系统版本的链接, 并下载到服务器
例:
wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_386.tar.gz
2. 解压缩
tar -zvxf frp_0.37.0_linux_386.tar.gz
3. 修改服务器配置
后台运行:
nohup ./frps -c frps.ini >/dev/null 2>&1 &bind_port FRP使用端口
v_host_http_port 外部访问端口(可配置nginx proxy_pass转发)
vi frps.ini
1 | [common] |
- 启动:
./frps -c frps.ini
4. 修改客户端配置
客户端下载同服务端
vi frpc.ini
1 | [common] |
- 启动:
./frpc -c frpc.ini
mac + python + oracle.md
Oracle 字符串只能用单引号
mac安装通过docker安装使用oracle
1 | # 拉取镜像 |
基操
- 查看数据库版本:
select * from v$version;
用户
- 创建用户:
create user 用户名 identified by 密码- 例:
create user test identified by test
- 例:
第一次创建
create user 'root' identified by '123456'提示 missing user or role name 是因为此处用户名不需要引号
修改后提示无效密码, 同样密码也不需要引号
- 修改密码:
alter user 用户名 identified by 新密码
角色
oracle为兼容以前版本,提供三种标准角色(role):connect, resource和dba.
- connect role(连接角色)
–临时用户,特指不需要建表的用户,通常只赋予他们connect role.
–connect是使用oracle简单权限,这种权限只对其他用户的表有访问权限,包括select/insert/update和delete等。
–拥有connect role 的用户还能够创建表、视图、序列(sequence)、簇(cluster)、同义词(synonym)、回话(session)和其他 数据的链(link)
- resource role(资源角色)
–更可靠和正式的数据库用户可以授予resource role。
–resource提供给用户另外的权限以创建他们自己的表、序列、过程(procedure)、触发器(trigger)、索引(index)和簇(cluster)。
- dba role(数据库管理员角色)
–dba role拥有所有的系统权限
–包括无限制的空间限额和给其他用户授予各种权限的能力。system由dba用户拥有
除了前面三种系统角色—-connect、resource和dba,用户还可以在oracle创建自己的role。
用户创建的role可以由表或系统权限或两者的组合构成。
为了创建role,用户必须具有create role系统权限。
创建角色:
create role 角色名;授权角色:
grant select on 表名 to 角色名;删除角色:
drop role 角色名;
权限
- 授权:
grant connect, resource to 用户名; - 撤消:
revoke connect, resource from 用户名;
库表
创建表时提示:
no privileges on tablespace USERS执行:
alter user 库名 quota unlimited on users;
- 创建数据库:
create tablespace 表间名 datafile '数据文件名' size 表空间大小;- 例:
create tablespace TEST datafile 'test' size 20M;
- 例:
- 查看建表语句:
select dbms_metadata.get_ddl('TABLE','USERINFO') from dual;
错误汇总
- 找不到
libocci.dylib
参考: https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html 根据提示要安装 Oracle Instant Client
下载 http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html 的Basic Package
下载解压后在环境变量中添加 export DYLD_LIBRARY_PATH=解压文件目录
- ORA-12541
服务未启动
- ORA-12505
报错时的配置: oracle+cx_oracle://test:123456@localhost:1521/TEST
连接配置不是具体到库, 而是到服务名, 修改为: oracle+cx_oracle://test:123456@localhost:1521/xe
服务名查看命令:
select INSTANCE_NAME from v$instance;
cookiecutter-flask-restful使用笔记
[TOC]
flask-cookiecutter-restful 使用
一. 本地开发准备
1. 源码安装python-3.7.10
1 | wget -c https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tar.xz |
搜索:
1 | :/ssl |
将以下内容取消注释:
1 | # Socket module helper for socket(2) |
取消注释如下:
1 | # Socket module helper for socket(2) |
返回Python源码根目录编译安装:
1 | cd ../ |
将 /usr/local/python3.6/bin 加入 PATH, 在/etc/profile文件后追加:
1 | vim /etc/profile |
追回内容如下:
1 | export PATH=/usr/local/python3.7/bin:$PATH |
设置python, pip别名:
1 | vim ~/.bashrc |
内容如下:
1 | alias python3.7=/usr/local/python3.7.10/bin/python3 |
2. 使用cookiecutter创建项目
1 | pip install cookiecutter |
3. pipenv 创建虚拟环境
1 | # 安装 |
4. 数据库
1 | # 本地创建相关库 |
5. 接口测试
注册
1
2
3
4
5
6curl --location --request POST 'http://127.0.0.1:5002/auth/register' \
--header 'Content-Type: application/json' \
--data-raw '{
"username": "admin",
"password": "admin"
}'登录
1
2
3
4
5
6curl --location --request POST 'http://127.0.0.1:5002/auth/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"username": "admin",
"password": "admin"
}'
6. git
1 | # git初始化 |
二. 部署
1. gunicorn
1 | pipenv install gunicorn |
2. docker
- 安docker
1 | brew install docker |
- 安docker-compose
1 | python3 -m pip install docker-compose |
登录docker
1
docker login
拉取基础Image
1
docker pull python:3.7.10-alpine
创建容器并进入
1
docker run -it --name=container_name python:3.7.10-alpine /bin/sh
配置dockerfile
1
从dockerfile启动项目
1
docker build -t container_name ./Dockerfile
Flask-Migrate报错
Flask-Migrate + pgsql 执行报错psycopg2.errors.DuplicateTable: relation “user” already exists
问题出现: 全新项目, 本来是打算用mysql, 后来换pgsql, 一开始用mysql时执行过 flask db migrate / flask db upgrade, 测试ORM,, 换成pgsql后再执行flask db upgrade出现如上报错, 看字面意思是表已存在, 可pgsql中并没有此表!
原因: 一开始执行 flask db migrate 时 alembic 已经创建了记录(versions目录下的.py文件), 也就是说对 alembic 来说是已经创建过数据表了, 在sql语句执行前就被报错拦截住了, 所以即使数据库没有user表, 报错也提示表已存在!
解决: 直接把 versions 目录下记录全部删除, 重新执行 flask db upgrade