Home
avatar
Kori Lin
一个热爱开源的开发者
korilin.dev@gmail.com
记录
计算机网络

TLS(Transport Layer Security)是传输层安全协议,HTTPS 是在 HTTP 的基础上使用 TLS 来保证数据传输的安全。

HTTPS 的传输过程需要一下三个算法(协议):

  1. 数字证书认证机构(Certificate Authority,CA)签发的服务器公开证书,用于传输非对称加密算法的公钥
  2. 非对称加密算法,用于传输对称加密算法的密钥
  3. 对称加密算法,用于加密传输的数据
记录
操作系统

处理器寻址方式分为指令寻址和操作数寻址。

指令寻址分为:顺序寻址方式和跳跃寻址方式。

操作数的寻址方式分别有:立即寻址、直接寻址、寄存器寻址、间接寻址、寄存器间接寻址、相对寻址、基址寻址、变址寻址、基变寻址、相对基变寻、块寻址

记录
计算机网络

TCP(Transmission Control Protocol) 是一个提供可靠连接服务的传输控制协议。采用三次握手确认一个连接和四次挥手关闭连接。

三次握手(Three-way Handshake) 指的是建立一个 TCP 连接时,客户端和服务端总共需要发送 3 个包。当客户端执行connect()时触发三次握手建立 TCP 连接。

四次挥手(Four-way Handshake) 指的是断开一个 TCP 连接需要发送 4 个包,客户端和服务器都可以执行close()来发起四次挥手操作。

记录
Vue.js

当计算机拥有代理服务时,通常命令行并不会走这个代理,如果我们希望命令行也走代理服务的话,需要在环境变量配置HTTP_PROXYHTTPS_PROXY,将其指向对应的代理端口,这样就可以实现命令行也走网络代理了。

然而在实际的使用,并不是所有命令行的网络命令都需要使用代理,有一些在代理模式下某些模块也可能会出现错误,例如@vue/cli

记录
Java Json

目前 Java 有很多 JSON 解析库,本文记录的是阿里巴巴的开源 JSON 解析库 fastjson 以及 Google 的 Gson, 来解析请求中的 JSON 字符串。

fastjson 这段时间被爆出很多漏洞呀,没想到我选了一个代码质量最差的和一个运行速度最慢的

算法
Java Go Python

# 题目地址

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/string-to-integer-atoi

# 题目描述

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

  • 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
  • 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
  • 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
  • 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0 。

提示:

  • 本题中的空白字符只包括空格字符 ' ' 。
  • 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

# 个人解题思路

字符串转数字可以使用语言中自带的库来转换,但是题目给的字符串加入了其它东西,所以直接使用自带库的转换函数会报错或者得到错误的结果,不过只需要对字符串进行清理,变成符合要求的并且可以转换的字符串就可以了。

清理的方法:

  1. 将字符串前面的空格都去除,并且只能清除前面的空格,夹在其它字符中间的空格不能清除
  2. 对清除空格后的字符串的第一个字符进行判断
  • 字符不是正负号和数字,直接返回 0
  • 字符是正负号,将正负存为 +1 和 -1 后截取掉,或者直接保留正负号进行转换
  • 字符是数字,进行下一步
  1. 可以分 3 种办法得到可转换的数字字符串
  • 将遍历到的数字字符依次存到新的数字字符串,直到遇到非数字符号
  • 不断遍历字符,遇到非数字符号后,将后面的字符都截掉得到新的数字字符串
  • 直接将数字加到总和,每次操作前需要对总和进行乘以 10 的操作,保证新加的数字在最后一位
  1. 用内置函数将数字字符串转为数字,判断数字是否超出范围
算法
Java Go Python

# 题目地址

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-palindromic-substring/

# 题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

# 个人解题思路

暴力解法比较简单,直接两层循环遍历所有可能,判断是否为回文,取最大那一个就好了。

个人在此基础上的优化:每个回文都有一个中心,这个中心可能是一个字符,也可能是两个字符,只要求各个中心的最长回文就可以了。由于回文串中间的子串也是回文子串,一旦子串不是回文,那么该中心更长的子串也不是回文。

记录
OAuth 2.0 PKCE

OAuth 2.0 是用于授权的行业开放标准协议,在这个标准中,用户可以在第三方应用访问该用户在某一平台上存储的资源,也就是我们经常看到的某些平台可以使用第三方账号登陆。

对于无后端应用来说,OAuth 提供的授权码模式就无法实现,对于希望依靠前端的应用来说,AppId 和 AppSecret 的存储显得不是很安全,并且对于 Access Token 传输也是一个需要重点考虑的问题。

在 OAuth 2 中有一个隐式授权(Implicit Flow),它在 RFC 6749 中有说明,但安全性太低,目前已经弃用了。

那么在 okta 中有推行另一种授权码流 PKCE(Proof Key for Code Exchange by OAuth Public Clients,发音为 pixie)来缓解截获授权代码的威胁,详细规格可在 RFC 7636 查看

算法
Java

问题描述:给定 n 个十六进制正整数,输出它们对应的八进制数。

输入格式

  • 输入的第一行为一个正整数 n (1<=n<=10)。
  • 接下来 n 行,每行一个由 0~9、大写字母 A~F 组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过 100000。

输出格式:输出 n 行,每行为输入对应的八进制正整数。

【注意】

  1. 输入的十六进制数不会有前导 0,比如 012A。
  2. 输出的八进制数也不能有前导 0。

题思路,我们可以先将十六进制数转换成某进制数,再由某进制数转换成八进制。

这里我们采用把十六进制字符串转换为二进制字符串,然后再从二进制转换为八进制字符串的方式。

为什么不转换为十进制数?

因为蓝桥杯的测试数据非常大,转换后的十进制数连 long 类型都装不下,因此调用 Java 提供的转换函数会报错。

记录
Vue Axios

在前端和后端分离的情况下,我们可以使用 Axios 的方式来发送请求获取数据,通过 Vue 来修改页面的内容

同时我们也可以提交表单上传文件到服务器进行存储

开始前要先引入 Vue.js 和 Axios, 这里使用 CDN 引入

<body>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</body>
记录
Java

这是目前我尝试过的 Java 文件打包 Zip 最快的方法,使用 Channel 来将文件打包到 Zip 包

打包方法是建立一个 Zip 文件对象,然后用 Zip 输出流对象来输出 Zip 包,用输入流对象来写入 Zip 包,通过使用 Channel 建立两个流的通道,利用通道进行数据传输。

记录
Nginx

在使用 Vue + Nginx + Tomcat + SpringBoot 开发一个文件上传的网站时,发现一上传大文件,总是上传到 50M 的时候就失败,并提示网络连接失败

如果是网络原因应该不会这么巧每次都在这个位置失败,所以把问题的关键点放在了上传限制上面,在这个数据的传输过程中,能够限制请求发送的数据大小的,有 Nginx,Tomcat,SpringBoot 这三个地方

从服务器 SpringBoot 的日志文件里看,没有找到什么错误信息,所以说这个请求还没有被 SpringBoot 处理到就被断开了

思考了一下,我是采用 Nginx 反向代理,根据 Nginx 的缓存机制,会先将请求完整接收完,再发送给 Tomcat 服务器,那么请求文件的大小是被 Nginx 限制的可能性就比较高了

记录
Spring Boot Java

项目开发需求,要在用户发送请求后把对应的数据打包成压缩包,再放回给浏览器,这种情况下无法使用<a>标签来进行跳转下载,所以我们可以通过返回文件的方式来,在压缩包打包后让浏览器下载

使用 ResponseEntity 配置 Http 的响应,在使用文件系统资源类 FileSystemResource 来把文件放入响应的数据中

算法
Java

第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组

试题 B: 年号字串 【问题描述】

小明用字母 A 对应数字 1, B 对应 2, 以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或者更长的字符串来对应,例如 AA 对应 27, AB 对应 28, AZ 对应 52, LQ 对应 329。

请问 2019 对应的字符串是什么?

这一道题可以看按进制的方式来处理,但是有几个注意点:

  1. 没有 0 这一数位,每个字符只能代表 1~26, 所以在取值和进位的时候多了一些限制
  2. 一些代码在用 2019 进行测试的时候,是可以得到正确结果的,但是如果传入的数对应的字符串存在 Z 或者邻近 Z 的情况,会发现很容易出错,因为这个原因我也改了挺久的代码
  3. 在计算该位最大取值的时候要算好后面位数可以取的最小值,否则会出现当前位的字符的数值取完,剩下的数比后面位数全取 A 时还小,这样算法可能不会报错,但是得出来的结果会比预想的大。
记录
Python MySQL

# 简介

Web-MySQL 是一个是基于 PyMySQL 构建出来的一个简单的 SQL 命令执行工具包,用于后端使用 Python 连接数据库的包。

目前为个人为方便进行数据库 CRUD 操作在 PyMySQL 的基础上进行封装,已发布到 PyPi,可以使用 pip 命令进行安装。

主要使用 Connector 类的 executor、fetchone 和 fetchall 这 3 个功能,调用了 PyMySQL 的功能进行自动连接数据库和断开连接。

使用 Web-MySQL 的时候,需要导入 Web-MySQL 的 Connector 类,创建一个对象并初始化数据库配置,就可以调用函数对相应的 MySQL 数据库执行 SQL 命令。

GitHub仓库地址:https://github.com/korilin/Web-MySQL

记录
Python

# 简介

Nested-List 是一个使用 operator 库构建的一个嵌套列表操作库,主要用于对元素不是基本数据类型的列表进行排序、删除等操作,里面的大多函数使用了 operator 库,可以简化项目代码编写量。

Nested-List 可以使用 pip 进行安装:pip install Nested-List

Nested-List-1.0.x 有 4 个可用函数,分别是排序、删除元素、最大值和最小值,Nested-List 会自动判断传入的列表的元素是什么类型,并调用相应的处理函数,无论进行哪些操作,都要保证列表里的元素是同一类型,这是这个库的工作基础。

def sort(nl, *key, order=False):
    ...

def delete_items(dl, keys, values, compare=None):
    ...

def max(nl, *keys):
    ...

def min(nl, *keys):
    ...

每个函数使用时都需要传入需要操作的列表。

记录
Python

本文章是在发布 web-mysql 和 nested-list 时根据官方教程在实践后后写下的,可以边参考官方教程边阅读本文章,这样可能有助于您理解如何去把项目打包成一个 pip 软件包

本人使用的是 Python3, 操作可能会和 Python2 有点不同,同时使用的命令是参考了其他的教程,和官方命令也不太一样,免去了许多参数的选择,更加简单。

如果希望更加全面地理解和打包 pip 软件包请参考

官方教程:https://packaging.python.org/tutorials/packaging-projects/

# 需要使用到的东西

两个 Python 包:setuptools、twine

一个 PyPI 账号:https://pypi.org/

打一个 pip 软件包一定要有这两个工具,setuptools 用于创建构建脚本,twine 用于上传项目,上传的 pip 包都会放在这里 PyPI

算法
Python

Python 这语言本身执行效率实在堪忧···以前做题目的时候,发现同样是 2 千万次循环,同样的算法,Java 几百毫秒就解决了,Python 用了 7 秒,偶然在一篇文章看到了一个快排代码,据说是《算法导论》中的 Python 快排,当时觉得,哇塞,代码居然这么精简(虽然后来看到了更加精简的代码,我还是太菜了,还够不到大佬的后脚跟~)。

# 据说是《算法导论》中的快速排序

def quick_sort(array, l, r):
    if l < r:
        q = partition(array, l, r)
        quick_sort(array, l, q - 1)
        quick_sort(array, q + 1, r)

def partition(array, l, r):
    x = array[r]
    i = l - 1
    for j in range(l, r):
        if array[j] <= x:
            i += 1
            array[i], array[j] = array[j], array[i]
    array[i + 1], array[r] = array[r], array[i + 1]
    return i + 1
算法
Python

任何一个大于 1 的自然数 n, 都可以拆分成若干个小于 n 的自然数相加,现在输入一个数 n, 列出该数的所有拆分可能

像这种获取所有可能性的问题,可以使用树遍历来解决

这次其实我第一次想到的不是树结构,而是 for 循环,其实就是被那么规律的排列给误导了~

但是最后还是靠树来实现了。

算法的思路是定义了 Node 类传入列表进行计算存储,从 1 到 n-1 开始遍历,将遍历到的数存到列表里面,每次存完 1 个数将列表传入下一个节点,再从 1 开始存,直到列表的和等于 n 的值,把这个列表进行排序然后存入全局列表 result 里面,最后再打印出来。

算法
Python

假如有一串字符串,要对字符串里所有字符进行排列,列出所有排列组合的可能

对于这种获取所有可能性的问题我第一想到的就是用树结构进行深度遍历来实现

对于这种问题,我们知道遍历到最后的树叶就是其中的一种结果,所以我们定义一个全局列表来储存全部树叶的结果。

所以我们定义一个 Tree 类来对第一次传入节点进行操作;

定义一个节点类来作为树节点,并直接把向下添加的节点写在构造函数里面,只要符合要求就一直向下传入节点,直到全部字符都遍历完,到达树叶的时候将该结果存储起来。

记录
Python

在编译的时候,变量的类型就可以被编译器确定,并且运行时该变量不经过强制转换将类型无法发生改变,这种禁止错误类型的参数继续运算的语言我们称为强类型语言

弱类型语言的变量在定义后,可以根据环境变化不需要通过显式的强制转换,可以进行隐式的转换类型,这一种变量类型为弱类型。

本次主要对Python进行探讨,不对强弱类型、动态类型、安全类型这些进行讲解,关于类型系统的相关内容参考wiki类型系统强类型和弱类型

记录
Python

本教程是使用 Pyinstaller 来将 Python 程序打包成 exe 可执行文件

# 实现步骤

首先要安装 Pyinstaller 包,在命令行窗口使用 pip 指令就可以完成:

pip install pyinstaller

安装成功后就可以进行打包了

在命令行进入要打包的 python 程序的目录下面

接着使用pyinstaller file.py就进行打包了 (file.py 是指你要打包的 python 文件)

Post Order
By Time : DESC
Article Statistics
Article: 34
Categories: 3
Tags: 19