MENU

笔记

linux内核tcp配置导致的web服务偶发无法访问

问题描述

一个web项目时有用户无法访问的情况,过一会又可以访问,这个问题困扰了很长一段时间,一直以为是DNS的问题。后来在看了一篇文章 “三次握手,四次挥手”https://www.cnblogs.com/qcrao-2018/p/10182185.html你真的懂吗? 看到关于 tcp的连接队列的时候,猛然意识到问题出在了哪, 遂连上服务器查看,果然linux的tcp配置有问题

Read More

MySQL命令小记

基本命令

# 显示授予用户的权限
SHOW GRANTS;

# 显示所有数据库
SHOW DATABASES;

# 使用指定数据库
USE `database_name`;

# 显示创建数据库的MySQL语句
SHOW CREATE DATABASE `database_name`;

# 显示所有表
SHOW TABLES;

# 显示表结构
DESC `table_name`;

查询

# 查询所有字段
SELECT * FROM `table_name`;

# 指定查询字段
SELECT `field1_name`,`field2_name` FROM `table_name`;

# 排序
SELECT * FROM `table_name` ORDER BY `field_name`;

# 限制数量
SELECT * FROM `table_name` ORDER BY `field_name` LIMIT 1;

过滤条件

SELECT * FROM `table_name` WHERE id = 25;

# OR 操作符
SELECT * FROM `table_name` WHERE id = 25 or id = 35;

# AND 操作符
SELECT * FROM `table_name` WHERE (tall = 175 or tall = 180) and age >= 25;

# IN 操作符
SELECT * FROM `table_name` WHERE id IN (25, 35);

# NOT 操作符
SELECT * FROM `table_name` WHERE id NOT IN (25, 35);

# LIKE 操作符
SELECT * FROM `table_name` WHERE name LIKE '%James%';

Python编码规范

工具

  • pep8检查工具
  • pylint
  • pre-commit

import 顺序问题

  • 标准库导入
  • 第三方相关包导入
  • 本地应用或库导入
# 标准库
from math import sqrt
from os.path import abspath

# Django导入
from django.db import models
from django.utils.translation import ugettext_lazy as _

# 第三方应用导入
from rest_framework.response import Response

# 导入自己的应用
from user.models import User
  • 尽量不要使用 id type 等Python关键字给变量命名

代码的坏味道

  • 神奇的数字 使用常量代替
# 神奇的数字
def func(state):
    if state == 2:
        return 5
    if state == 3:
        return 10
    return 13
  • 确定不会再使用的代码,别注释掉,直接删除
  • 重复的代码 DRY
  • 不必要的复杂
  • 不知所云的变量名
  • 冗长的类
  • 过长的函数

防御性编程

  • 最小权限原则
  • 所有的数据输入是否都进行了检查(检测正确的类型,长度,格式和范围)并且进行了编码,无效的参数值是否能够处理?考虑边界值
  • 在哪里使用了第三方工具,返回的异常是否被捕获?
  • 输出的值是否进行了检查并且编码?
  • 对非常规行为和边界情况是否进行了处理

编写函数的几个原则

  • 1:函数设计要尽量短小,嵌套层次不宜过深。最好能控制在 3 层以内。
  • 2:函数申明应该做到合理、简单、易于使用。参数个数不宜太多。
  • 3:函数参数设计应该考虑向下兼容。比如相同功能的函数不同版本的实现,唯一不同的是在更高级的版本中添加了参数导致程序中函数调用的接口发生了改变。这并不是最佳设计,更好的方法是通过加入默认参数来避免这种退化,做到向下兼容。
  • 4:一个函数只做一件事,尽量保证函数语句粒度的一致性。(同理类设计也一样,一个类只做一件事)
  • 5:不要在函数参数中定义可变对象作为默认值(除非你确定自己需要这么做)
  • 6:使用异常替换返回错误(依情况而定)
  • 7:保证通过单元测试

阅读清单

pylint检测代码规范

pre-commit代码提交前检查

.pre-commit-config.yaml

Read More

CPython编译安装

如果未安装git

yum install git

git clone https://github.com/python/cpython.git

cd cpython
git checkout v3.7.0

或wget获取源码

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz

xz -d Python-3.7.0.tar.xz
tar xvf Python-3.7.0.tar

编译前系统库安装

yum install gcc

zlib

yum install zlib zlib-devel

3.7版本需要一个新的包libffi-devel

yum install libffi-devel

sqlite安装

yum install sqlite-devel

解决 readline 缺失提醒及方向键行为非预期的问题

yum install readline-devel

openssl安装

yum install openssl openssl-devel

解决 import bz2 报错

yum install bzip2

uuid

yum install uuid-devel

解决 import curses 报错

yum install ncurses-devel

解决 _dbm _gdbm 缺失提醒

yum install gdbm-devel

解决 _lzma 缺失提醒

yum install xz-devel

解决 _tkinter 缺失提醒

yum install tk-devel

编译安装

查看configure可选项

./configure --help

./configure
make
make install

重新编译前

make clean

二叉树遍历

  • 前序遍历: 根节点 -> 左子树 -> 右子树
  • 中序遍历: 左子树 -> 根节点 -> 右子树
  • 后序遍历: 左子树 -> 右子树 -> 根节点
  • 层次遍历

前序遍历

class TreeNode(object):

    def __init__(self, val=None, left=None, right=None):
        self.left = left
        self.right = right
        self.val = val

class BinTree(object):

    def __init__(self, root):
        self.root = root

    def stack_print(self, root):
        """堆栈实现"""
        stack = []

        while root or stack:
            while root:
                stack.append(root)
                print(root.val)
                root = root.left

            if stack:
                root = stack.pop()
                root = root.right

    def recursive_print(self, root):
        """递归实现"""
        if not root:
            return

        print(root.val)
        self.recursive_print(root.left)
        self.recursive_print(root.right)

def main():
    left = TreeNode(2, left=TreeNode(4), right=TreeNode(5))

    right = TreeNode(3, left=TreeNode(6), right=TreeNode(7))

    root = TreeNode(1, left=left, right=right)

    tree = BinTree(root)

    print('递归 先序遍历:')
    tree.recursive_print(tree.root)
    print('堆栈 先序遍历:')
    tree.stack_print(tree.root)

中序遍历

class TreeNode(object):

    def __init__(self, val=None, left=None, right=None):
        self.left = left
        self.right = right
        self.val = val

class BinTree(object):

    def __init__(self, root):
        self.root = root

    def stack_print(self, root):
        """堆栈实现"""
        stack = []

        while root or stack:
            while root:
                stack.append(root)
                root = root.left

            if stack:
                root = stack.pop()
                print(root.val)
                root = root.right

    def recursive_print(self, root):
        """递归实现"""
        if not root:
            return

        self.recursive_print(root.left)
        print(root.val)
        self.recursive_print(root.right)

def main():
    left = TreeNode(2, left=TreeNode(4), right=TreeNode(5))

    right = TreeNode(3, left=TreeNode(6), right=TreeNode(7))

    root = TreeNode(1, left=left, right=right)

    tree = BinTree(root)

    print('递归 中序遍历:')
    tree.recursive_print(tree.root)
    print('堆栈 中序遍历:')
    tree.stack_print(tree.root)

后序遍历

class TreeNode(object):

    def __init__(self, val=None, left=None, right=None):
        self.left = left
        self.right = right
        self.val = val

class BinTree(object):

    def __init__(self, root):
        self.root = root

    def stack_print(self, root):
        """堆栈实现"""
        if not root:
            return
        stack1 = []
        stack2 = []
        node = root
        stack1.append(node)

        while stack1:
            node = stack1.pop()
            if node.left:
                stack1.append(node.left)
            if node.right:
                stack1.append(node.right)
            stack2.append(node)
        while stack2:
            print(stack2.pop().val)

    def recursive_print(self, root):
        """递归实现"""
        if not root:
            return

        self.recursive_print(root.left)
        self.recursive_print(root.right)
        print(root.val)

def main():
    left = TreeNode(2, left=TreeNode(4), right=TreeNode(5))

    right = TreeNode(3, left=TreeNode(6), right=TreeNode(7))

    root = TreeNode(1, left=left, right=right)

    tree = BinTree(root)

    print('递归 后序遍历:')
    tree.recursive_print(tree.root)
    print('堆栈 后序遍历:')
    tree.stack_print(tree.root)

层次遍历

class TreeNode(object):

    def __init__(self, val=None, left=None, right=None):
        self.left = left
        self.right = right
        self.val = val

class BinTree(object):

    def __init__(self, root):
        self.root = root

    def level_queue(self, root):
        if not root:
            return
        storage = []
        node = root
        storage.append(node)
        while storage:
            node = storage.pop(0)
            print(node.val)
            if node.left:
                storage.append(node.left)
            if node.right:
                storage.append(node.right)

def main():
    left = TreeNode(2, left=TreeNode(4), right=TreeNode(5))

    right = TreeNode(3, left=TreeNode(6), right=TreeNode(7))

    root = TreeNode(1, left=left, right=right)

    tree = BinTree(root)

    print('队列 层次遍历:')
    tree.level_queue(tree.root)