0%

前言

日常生活中大家都离不开电脑
所以如何自动定时开关电脑大家一定用得上

自动开机

自动开机需要在 BIOS 里面设置
开机的时候按住 F2 或者 DEL 进入主板设置
然后选择电源选项
假如需要每天都定时开机,就选择Every Day,
如果想要在每天 6:45 开机,
就通过数字键输入06:15:00,
最后,一般按F10 进行保存,重启电脑后生效。
一般的老旧主板就是这种样子的

比较新的笔记本或者电脑主板就会有这样的图形化中文界面

自动开机已经设置好了

自动关机

这个可以提供计划任务来实现
控制面板上面搜索计划任务就可以看到
创建新的 触发器
根据需要 改为 设置 任务开始时间及每隔多久
如下图


再把 启动程序 选择自动执行的带参数的关机命令
如下图

这样就实现了 windows 定时自动开机关机功能

问题

在下载软件包时,linux软件包经常会有

  • linux_386.tar.gz
  • linux_amd64.tar.gz
  • linux_arm.tar.gz
  • linux_arm64.tar.gz
  • linux_mips.tar.gz
  • linux_mips64.tar.gz
  • linux_mips64le.tar.gz
  • linux_mipsle.tar.gz
  • linux_riscv64.tar.gz
    等选项,作为硬件一窍不通的人了,看了这么多选项两眼发黑,到底选哪个版本才是符合自己服务器的呢?

基础知识

在了解上面选项之前,我们需要先了解下 CISC 和 RISC ,这是所有分类的前置分类。

指令集架构

每一种处理器都有自己可以识别的一整套指令,称为 【指令集】
处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。

处理器 【指令集】 只是定义了硬件与软件(含OS)之间的接口、标准规范,而不定义处理器的实现

一台计算机上全部指令的集合,就是这台计算机的 指令系统

指令系统 也称 指令集,是这台计算机全部功能的体现。

而人们设计计算机首要考虑的是它拥有的功能,也就是首先要按功能档次设计指令集;然后,按指令集的要求在硬件上实现。
指令系统 不仅仅是指令的集合,还包括全部指令的指令格式、寻址方式和数据形式。

CISC

CISC(Complex Instruction Set Computer, 复杂指令系统计算机),除了RISC,任何全指令集计算机都使用的是复杂指令集计算(CISC)。

常见使用CISC的处理器主要有X86.

从计算机诞生以来,人们一直沿用CISC指令集方式。
早期的桌面软件是按CISC设计的,并一直沿续到现在。目前,桌面计算机流行的x86体系结构即使用CISC。
微处理器(CPU)厂商一直在走CISC的发展道路,包括Intel、AMD,还有其他一些现在已经更名的厂商,如TI(德州仪器)、IBM以及VIA(威盛)等。
在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。
顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。
CISC架构的服务器主要以IA-32架构(Intel Architecture,英特尔架构)为主,而且多数为中低档服务器所采用。

RISC

RISC(reduced instruction set computer,精简指令集计算机)是一种执行较少类型计算机指令的微处理器。

纽约约克镇IBM研究中心的John Cocke证明,计算机中约20%的指令承担了80%的工作,他于1974年提出了RISC的概念。

目前常见使用RISC的处理器包括DEC Alpha、ARC、ARM、MIPS、PowerPC、SPARC和SuperH等。

RISC是一种执行较少类型计算机指令的微处理器,起源于80年代的MIPS主机(即RISC机),RISC机中采用的微处理器统称RISC处理器。
这样一来,它能够以更快的速度执行操作(每秒执行更多百万条指令,即MIPS)。因为计算机执行每个指令类型都需要额外的晶体管和电路元件,计算机指令集越大就会使微处理器更复杂,执行操作也会更慢。

CISC 指令集有哪些?

指令集架构 发源于(时间、干系人) 具体示例 微处理器
X86 指令集(架构) 创始者: Intel公司 X86-32 / X86-64(即 AMD64 / Intel64) 1. Intel i8086 CPU处理器(首台X86 CPU)
2. VIA CPU处理器
3. Intel Core I3/I5/I7/I9 CPU处理器
4. AMD CPU处理器

RISC 指令集 有哪些?

指令集架构 发源于(时间、干系人) 具体示例 微处理器
MIPS(Million Instructions Per Second) 指令集架构 1.创立于1998年;
2.创始者: 斯坦福大学教授John LeRoy Hennessy(RISC架构的开拓者)
MIPS I/II/III/IV/V/16/32/64 龙芯芯片
ARM(Acorn/Advanced RISC Machine) 指令集架构 1. 创立于1985年;
2. 创始者:Acorn公司、加州大学伯克利分校Sophie Wilson(指令集开发)和Steve Furber(芯片设计)2位教授(2家单位合作推出ARM1芯片,以此作为其未来个人计算机的中枢)
ARMv7a架构: ARM Cortex A8/A9
ARMv7M架构:ARM Cortex A3/A4
ARMv8架构(支持32+64位架构):ARM Cortex A32/35/53/57/72/73/77/78
1. 高通骁龙Qualcomm 810处理器
2.海思麒麟950处理器
3. 三星Exynos 4412处理器
4.Apple A系列处理器、Apple A6/A6X CPU处理器(基于Apple Swift 微架构[ARM指令集扩展的微架构])
AArch64/ARM64(ARMv8A架构的2种执行状态/执行模式之一,64位指令集架构) 1. 概念于2011年在美国加州圣克拉拉的一场技术大会“ARM TechCon 2011”的ARM公司院士、首席架构师Richard Grisenthwaite发布 .. ..
AArch32 指令集(ARMv8A架构的2种执行状态/执行模式之一,64位指令集架构) 同上 同上 同上
Power PC(Performance Optimization With Enhanced RISC – Performance Computing, 简称:PPC) 指令集 1.POWER是1991年,Apple、IBM、Motorola组成的AIM联盟所发展出的微处理器架构;
2.PowerPC是整个AIM联盟平台的一部分,并且是到目前为止唯一的一部分;
3.但苹果电脑自2005年起,将旗下电脑产品转用Intel CPU;
4.该设计是从早期的RISC架构(比如IBM 801)与MIPS架构的处理器得到灵感的
(略) 任天堂Gamecube、MPC505/821/850/860/8240/8245/8260/8560
SPARC(Scalable Processor Architecture可伸缩的处理器架构) 指令集 1987年,SUN公司与TI合作的成果 (略) ERC 32(机构: 欧洲航天航空局)
RISC-V / RISC-FIVE 指令集(Reduced Instruction Set Computer-V, 第5代精简指令集计算机) 1.创始者: Keste Asanovic教授(RISC-V基金会主席)、David Pattern教授(《量化分析》作者、RISC-V概念的提出者、Turing奖获得者)、Andrew Waterman(SiFive首席工程师、Rocket处理器作者)、Yunsup Lee(SiFive的CTO、Rocket处理器作者)
2.源于2010年,当时加州大学伯克利分校(UC Berkeley)一研究团队要设计一款CPU,为该项目选架构的时候研究团队对比了当时的ARM、MIPS、SPARC和X86等,发现:不仅这些【指令集越来越复杂】,还有很多【IP法律】问题,再加上【X86授权难以获取】,【ARM授权价格昂贵】,所以该研究团队最终决定设计一套全新的指令集。
2.于是,成立了一个四人小组,仅用了3个月的时间就完成了RISC-V指令集的开发。
3.其【目标】是:新的指令集能满足从微控制器到超级计算机等各种尺寸的处理器

如何确认下载哪个版本?

了解了上文的知识,直接在linux中查看指令集架构即可

  1. arch 命令查看

  2. file /lib/systemd/systemd查看

可以看到,笔者的服务器为x86架构,那么对应到上文的选项,应该选择 linux_amd64.tar.gz 下载。

文章参考

RISC / CISC | arm | amd | X86/i386 | aarch64

背景

本文为个人阅读Spark SQL内部剖析书籍时,记录一些名词解释,方便个人阅读理解

#SQL 转换过程

  • Relation、
    数据表
  • Filter
    过滤逻辑(age>l8)
  • Project
    列剪裁逻辑 (只涉及3列中的2列)

ROW

数据处理首先需要考虑如何表示数据 。 对于关系表来讲,通常操作的数据都是以“行”为单 位的 。 在 SparkSQL 内部实现中, InternalRow就是用来表示一行行数据的类

TreeNode

无论是逻辑计划还是物理计划,都离不开中间数据结构。在 Catalyst 中,对应的是 TreeNode体系 。 TreeNode类是 SparkSQL 中所有树结构的基类,定义了一 系列通用的集合操作和树遍历操作接口 。

Expression 体系

表达式一般指的是不需要触发执行引擎而能够直接进行计算的单元,例如加减乘除四则运 算、逻辑操作、转换操作、过滤操作等。 如果说TreeNode是“框架”,那么Expression就是“灵 魂”。

4.2 SparkSqlParser之AstBuilder


其中,比较核心的是 AstBuilder,它继承了 ANTLR4 生成的默认 SqlBaseBaseVisitor,用于生成 SQL对应的抽象语法树 AST (Unresolved LogicalPlan); SparkSqlAst- Builder 继承 AstBuilder,并在其基础上定义了 一 些 DDL 语句的访问操作,主要在 SparkSqlParser 中调用 。
当面临开发新的语法支持时,首先需要改动的是 ANTLR4 文件(在 Sq1Base.g4 中添加文法), 重新生成词法分析器( SqlBaseLexer)、语法分析器( SqlBaseParser)和访问者类( SqlBaseVisitor 接口与 SqlBaseBaseVisitor类),然后在 AstBuilder等类中添加相应的访问逻辑,最后添加执行逻 辑。

Context

在 Catalyst中, SQL 语句经过解析,生成的抽象语法树节点都以 Context结尾来命名 。

5.1 Spark SQL 逻辑计划

Spark SQL 逻辑计划在实现层面被定义为 LogicalPlan 类 。 从 SQL 语句经过 SparkSqlParser 解析生成 Unresolved LogicalPlan,到最终优化成为 Optimized LogicalPlan,这个流程主要经过 3 个阶段,如图 5.1 所示 。 这 3 个阶段分别产生 Unresolved Logica!Plan, Analyzed LogicalPlan 和 Optimized LogicalPlan,其中 OptimizedLogicalPlan传递到下一个阶段用于物理执行计划的生戚。

具体来讲,这 3 个阶段所完成的工作分别如下 。
(1)由 SparkSq!Parser 中的 AstBuilder执行节点访问,将语法树的各利I Context节点转换成
对应的 LogicalPlan 节点,从而成为 一棵未解析的逻辑算子树( Unresolved LogicalPlan),此时的
逻辑算子树是最初形态,不包含数据信息与列信息等。
(2)由 Analyzer将一系列的规则作用在 Unresolved LogicalPlan 上,对树上的节点绑定各种
数据信息,生成解析后的逻辑算子树( Analyzed LogicalPlan)。
(3)由 SparkSQL中的优化器(Optimizer)将一系列优化规则作用到上一步生成的逻辑算
子树中,在确保结果正确的前提下改写其中的低效结构,生成优化后的逻辑算子树( Optimized
Logica!Plan) 。
本章首先在 5.2 节全面介绍 Logica!Plan 所涉及的方方面面的基础知识,包括 LogicalPlan 分
类和各种操作的概述;然后,在 5.3~5.5节分别讲解 3个阶段的执行过程;最后,在 5.6节对全 章内容进行总结 。

5.2.1 QueryPlan 概述


QueryPlan的主要操作分为6个模块,分别是输入输出、 字符串、 规范化、表达式 操作、基本属性和约束。

  • 输入输出: QueryPlan 的输入输出定义了 5 个方法,其中 output 是返 回值为 Seq[Attribute] 的虚函数,具体内容由不同子节点实现,而 outputSet 是将 output 的返回值进行封装,得 到 AttributeSet集合类型的结果 。 获取输入属性的方法 inputSet 的返回值也是 AttributeSet, 节点的输入属性对应所有子节点的输出; producedAttributes 表示该节点 所产生的属性; missinglnput表示该节点表达式中涉及的但是其子节点输出中并不包含的属性 。
  • 基本属性:表示 QueryPlan节点中的一些基本信息,其中 schema对应 output输出属性的 schema信息, allAttributes记录节点所涉及的所有属性( A忧ribute)列表, aliasMap 记录节 点与子节点表达式中所有的别名信息, references 表示节点表达式中所涉及的所有属性集 合, subqueries 和 innerChildren 都默认实现该 QueryPlan 节点中包含的所有子查询 。
  • 字符串:这部分方法主要用于输出打印 QueryPlan树型结构信息,其中 schema信息也会 以树状展示。 需要注意的一个方法是 statePre缸,用来表示节点对应计划状态的前缀字符
    串。 在 QueryPlan 的默认实现中,如果该计划不可用 (invalid),则前缀会用感叹号(“!”)
    标记。
  • 规范化: 类似 Expression 中的 方法定义,对 QueryPlan 节点类型也有规范化( Canonicalize) 的概念。 在 QueryPlan 的默认实现中, canonicalized直接贼值为当前的 QueryPlan类;此 外,在 sameResult 方法中会利用 canonicalized 来判断两个 QueryPlan 的输出数据是否相同 。
  • 表达式操作:在第 3 章中已经介绍过 Spark SQL 丰富的表达式体系,其典型的特点就是不 需要驱动,直接执行 。 而在 QueryPlan 各个节点中,包含了各种表达式对象,各种逻辑操 作一般也都是通过表达式来执行的。 在QueryPlan的方法定义中,表达式相关的操作占据 重要的地位,其中 expressions方法能够得到该节点中的所有表达式列表,其他方法很容易 根据命名了解对应功能,具体的实现细节可以参看代码 。
  • 约束(Constraints):本质上也属于数据过滤条件(F过ter)的一种,同样是表达式类型。 相 对于显式的过滤条件,约束信息可以“推导”出来,例如,对于“ a > S”这样的过滤条件, 显然 a 的属性不能为 null,这样就可以对应地构造 isNotNull (a)约束;又如“ a=S”和 “a=b”的谓词,能够推导得到“b=S”的约束条件。在实际情况下, SQL语句中可能会 涉及很复杂的约束条件处理,如约束合并、 等价性判断等。 在QueryPlan类中,提供了大 量方法用于辅助生成 constraints表达式集合以支持后续优化操作 。 例如, validConstraints 方法返回该 QueryPlan 所有可用的约束条件,比较常用的 constructlsNotNullConstraints 方 法,会针对特定的列构造 isNotNull 的约束条件 。

5.4.1 Catalog 体系分析

按照 SQL 标准的解释,在 SQL 环境下 Catalog 和 Schema 都属于抽象概念 。 在关系数据库 中, Catalog是一个宽泛的概念,通常可以理解为一个容器或数据库对象命名空间中的一个层次,主要用来解决命名冲突等问题 。
在 SparkSQL 系统中, Catalog主要用于各种函数资源信息和元数据信息(数据库、数据表、
数据视图、数据分区与函数等)的统一管理。 SparkSQL 的 Catalog体系涉及多个方面,不同层 次所对应的关系如图 5.11 所示 。

5.4.2 Rule 体系

在 Unresolved LogicalPlan 逻辑算子树的操作(如绑定、解析、优化 等 )中,主要方法都是 基于规则( Rule)的,通过 Scala语言模式匹配机制( Pattern-match)进行树结构的转换或节点 改写 。 Rule是一个抽象类,子类需要复写 apply(plan: TreeType)方法来制定特定的处理逻辑,基 本定义如下 。

6.1 Spark SQL 物理计划

在 SparkSQL 中,物理计划用 SparkPlan表示,从 OptimizedLogicalPlan传入到 SparkSQL物理 计划提交并执行,主要经过 3个阶段。 如图 6.1 所示,这 3个阶段分别产生 Iterator[PhysicalPlan]、 SparkPlan 和 Prepared SparkPlan,其中 Prepared SparkPlan 可以直接提交并执行(注:这里的 “PhysicalPlan”和“ SparkPlan”均表示物理计划) 。

spark sql物理执行计划操作

  • Project进行列剪裁
  • Filter 行过滤
  • Exchange 负责对数据进行重分区,
  • SampleExec 对输入 RDD 中的数据进行采样,
  • SortExec按照一 定条件对输入 RDD 中数据进行排序,
  • WholeStageCodegenExec 类型的 SparkPlan 将生成的代码 整合成单个 Java 函数 。

聚合过程 partial & final

Final模式一般和 Partial模式组合在一起使用 。 Partial模式可以看作是局部数据的聚合,在 具体实现中, Partial 模式的聚合函数在执行时会根据读入的原始数据更新对应的聚合缓冲区, 当处理完所有的输入数据后,返回的是聚合缓冲区中的中间数据 。 而 Final模式所起到的作用 是将聚合缓冲区的数据进行合并,然后返回最终的结果 。

Complete

Complete模式和上述的 Partial/Final组合方式不一样,不进行局部聚合计算,一般来讲, Complete模式应用在不支持Partial模式的聚合函数中。

聚合函数计算过程 – 包含distinct

相比 Partial、 Final和 Complete模式, PartialMerge模式的聚合函数主要是对聚合缓冲区进 行合并,但此时仍然不是最终的结果。 ParitialMerge主要应用在 distinct语句中,如图 7.10所示。 聚合语句针对同一张表进行 sum 和 count (distinct)查询,最终的执行过程包含了 4 步聚合操 作。 第 l步按照(A,C)分组,对 sum函数进行 Partial模式聚合计算;第 2步是 PartialMerge模 式,对上一步计算之后的聚合缓冲区进行合井,但此时仍然不是最终的结果;第 3步分组的列 发生变化,再一次进行 Partial模式的 count计算;第 4步完成 Final模式的最终计算 。

窗口函数

现象

最近打包了一个spring的jar包项目,但是运行时提示如下错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Caused by: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 75; cvc-elt.1: Cannot find the declaration of element 'beans'.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoa

原因

很显然,这个错误提示的意思是解析xml时,无法识别<bean>这个标签。

spring识别xml中的语法是通过头部文件中表示的xsd生命进行识别的,一个样例如下:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

那么这一次为什么报错呢?

网上的不优雅解决方案

关于这个问题,网上有两种常见的解决方法

第一种简单有效,但是工作量大,即:把所有spring配置文件中url形式的xsd路径转换成指向本地xsd文件的classpath形式的路径,例如:classpath:org/springframework/beans/factory/xml/spring-beans-2.5.xsd

再有一种方法就是在本机搭建web服务器,按URL创建相应文件夹,放入对应xsd文件,在本机hosts文件中加入”127.0.0.1 www.springframework.org".

实际上,这两种方法都属于“歪打正着”式的方法,直正弄明白这一问题还需要从spring的XSD文件加载机制谈起。

spring的XSD文件加载机制

首先:你必须知道一点:spring在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件),如果没有找到,才会转向去URL指定的路径下载。这是非常合理的做法,并不像看上去的那样,每次都是从站点下载的。事实上,假如你的所有配置是正确定的,你的工程完全可以在断网的情况下启动而不会报上面的错误。Spring加载xsd文件的类是PluggableSchemaResolver,你可以查看一下它的源码来验证上述说法。另外,你可以在log4j.xml文件中加入:

1
2
3
<logger name="org.springframework.beans.factory.xml">
<level value="all" />
</logger>

通过日志了解spring是何加载xsd文件的。

那么剩下的问题就是为什么spring在本地没有找到需要的文件,不得不转向网站下载。

spring 为什么找不到本地xsd?

在很多spring的jar包里,在META-INF目录下都有一个spring.schemas,这是一个property文件,其内容类似于下面:

1
2
3
4
http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd
....

实际上,这个文件就是spring关于xsd文件在本地存放路径的映射,spring就是通过这个文件在本地(也就是spring的jar里)查找xsd文件的。那么,查找不到的原因排除URL输入有误之外,可能就是声明的xsd文件版本在本地不存在。一般来说,新版本的spring jar包会将过去所有版本(应该是自2.0以后)的xsd打包,并在spring.schemas文件中加入了对应项,出现问题的情况往往是声明使用了一个高版本的xsd文件,如3.0,但依赖的spring的jar包却是2.5之前的版本,由于2.5版本自然不可能包含3.0的xsd文件,此时就会导致spring去站点下载目标xsd文件,如遇断网或是目标站点不可用,上述问题就发生了。

但是,在实现开发中,出现上述错误的几率并不高,最常见的导致这一问题的原因其实与使用了一个名为“assembly”的maven打包插件有关。很多项目需要将工程连同其所依赖的所有jar包打包成一个jar包,maven的assembly插件就是用来完成这个任务的。但是由于工程往往依赖很多的jar包,而被依赖的jar又会依赖其他的jar包,这样,当工程中依赖到不同的版本的spring时,在使用assembly进行打包时,只能将某一个版本jar包下的spring.schemas文件放入最终打出的jar包里,这就有可能遗漏了一些版本的xsd的本地映射,进而出现了文章开始提到的错误。如果你的项目是打成单一jar的,你可以通过检查最终生成的jar里的spring.schemas文件来确认是不是这种情况。而关于这种情况,解决的方法一般是推荐使用另外一种打包插件shade,它确实是一款比assembly更加优秀的工具,在对spring.schemas文件处理上,shade能够将所有jar里的spring.schemas文件进行合并,在最终生成的单一jar包里,spring.schemas包含了所有出现过的版本的集合!

以上就是spring加载XSD文件的机制和出现问题的原因分析。实际上,我们应该让我们工程在启动时总是加载本地的xsd文件,而不是每次去站点下载,做到这一点就需要你结合上述提及的种种情况对你的工程进行一番检查。

场景描述

python 软件包的常用命令为

1
pip install xxx

由于默认的资源站为国外站,在国内,此安装源会经常安装失败

因此需要将资源站换成靠谱的国内资源站

国内常用的pypi镜像源

阿里:https://mirrors.aliyun.com/pypi/simple
中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/
豆瓣:https://pypi.douban.com/simple
清华:https://pypi.tuna.tsinghua.edu.cn/simple/

单次安装时指定数据源

单次安装时指定数据源

1
pip install <包名> -i https://pypi.tuna.tsinghua.edu.cn/simple/

指定全局安装源

在unix和macos,配置文件为:$HOME/.pip/pip.conf
在windows上,配置文件为:%HOME%\pip\pip.ini

其中pip.conf或者pip.ini的文件内容为

1
2
3
4
5
[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn

转载

本文转自 windows 生产服务器下部署 Flask

场景描述

很多 python 工程师,都会用 flask 来开发、部署 Web 应用。但也有很多工程师就直接使用 app.run() 在生产环境上启动服务。

那可能会发现 Flask 用 app.run() 这种方式启动,有异常特别容易退出,而且性能很弱。

生产环境下,python 常见的 web 部署搭配是 nginx+gunicorn

但是这种搭配只适合在 Linux 环境下。关于这种搭配的配置方法网上有很多。反而在 windows 环境下该使用什么搭配来部署,网上说的比不多。而我们的项目由于某种特殊的原因就必须搭建在 windows 环境下,所以使用的部署方案是:Flask + Tornado+nginx

解决方案示例

flask 服务文件 flask_app.py

1
2
3
4
5
6
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "Hello World!"

安装 Tornado

1
pip install tornado

flask_app.py 目录下编写 Tornado 的 server.py 文件

1
2
3
4
5
6
7
8
from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
from flask_app import app
from tornado.ioloop import IOLoop

s = HTTPServer(WSGIContainer(app))
s.listen(8080) # 监听 8080 端口
IOLoop.current().start()

启动服务

当前目录下执行 python server.py 浏览器中访问 http://ip:8080 即可

1
python server.py

配置 nginx 反向代理

配置 nignx 反向代理,这样在浏览器中直接访问 www.test.com 即可

windows 下 nginx 的安装和使用还是很简单的,网上教程很多,这里就不多说了

1
2
3
4
5
6
7
8
9
10
11
12
13
http {   
server {
listen 80;
server_name www.test.com;
charset utf-8;

location / {
root html;
index index.html index.htm;
proxy_pass http://ip:8080;
}

}

本文用于记录一些常用命令,防止自己忘记

官方权威文档

指令

创建新博客页面,带目录

1
hexo new page --path 技术/hexo/testPage

该命令会创建source/_posts/技术/hexo/testPage.md

本次服务

1
hexo server

生成静态文件

1
hexo g 

发布生产

1
hexo g -d

1.常用转义字符

转义字符串(Escape Sequence)也称字符实体(Character Entity)。在HTML中,定义转义字符串的原因有两个:第一个原因是像“<”和“>”这类符号已经用来表示HTML标签,因此就不能直接当作文本中的符号来使用。为了在HTML文档中使用这些符号,就需要定义它的转义字符串。当解释程序遇到这类字符串时就把它解释为真实的字符。在输入转义字符串时,要严格遵守字母大小写的规则。第二个原因是,有些字符在ASCII字符集中没有定义,因此需要使用转义字符串来表示。表18-3是其中的几个转义字符串。

表18-3 特殊字符

字符 十进制 转义字符
&quot;
& & &amp;
< < &lt;
> > &gt;
& & &amp;
不断开空格(non-breaking space) &nbsp;

表18-4 其他字符

字符 十进制 转义字符 字符 十进制 转义字符 字符 十进制 转义字符
? ¡ &iexcl; Á Á &Aacute; á á &aacute;
¢ &cent; Â Â &circ; â â &acirc;
£ &pound; Ã Ã &Atilde; ã ã &atilde;
¤ ¤ &curren; Ä Ä &Auml; ä ä &auml;
¥ &yen; Å Å &ring; å å &aring;
| ¦ &brvbar; Æ Æ &AElig; æ æ &aelig;
§ § &sect; Ç Ç &Ccedil; ç ç &ccedil;
¨ ¨ &uml; È È &Egrave; è è &egrave;
© © &copy; É É&Eacute; é é &eacute;
a ª &ordf; Ê Ê &Ecirc; ê ê &ecirc;
? « &laquo; Ë Ë &Euml; ë ë &euml;
? ¬ &not; Ì Ì &Igrave; ì ì &igrave;
\x7f &shy; Í Í &Iacute; í í &iacute;
® ® &reg; Î Î &Icirc; î î &icirc;
ˉ ¯ &macr; Ï Ï &Iuml; ï ï &iuml;
° ° &deg; Ð Ð &ETH; ð ð &ieth;
± ± &plusmn; Ñ Ñ &Ntilde; ñ ñ &ntilde;
2 ² &sup2; Ò Ò &Ograve; ò ò &ograve;
3 ³ &sup3; Ó Ó &Oacute; ó ó &oacute;
´ &acute; Ô Ô &Ocirc; ô ô &ocirc;
μ µ &micro; Õ Õ &Otilde; õ õ &otilde;
? &para; Ö Ö &Ouml; ö ö &ouml;
· · &middot; &times; × &times; ÷ ÷ &divide;
? ¸ &cedil; Ø Ø &Oslash; ø ø &oslash;
1 ¹ &sup1; Ù Ù &Ugrave; ù ù &ugrave;
o º &ordm; Ú Ú &Uacute; ú ú &uacute;
? » &raquo; Û Û &Ucirc; û û &ucirc;
? ¼ &frac14; Ü Ü &Uuml; ü ü &uuml;
? ½ &frac12; Ý Ý &Yacute; ý ý &yacute;
? ¾ &frac34; Þ Þ &THORN; þ þ &thorn;
? ¿ &iquest; ß ß &szlig; ÿ ÿ &yuml;
À À &Agrave; à à &agrave;

     

2.所有转义字符

ISO Latin-1字符集:

&#09; — 制表符Horizontal tab
&#10; — 换行Line feed
&#13; — 回车Carriage Return
&#32; — Space
! &#33; — 惊叹号Exclamation mark
” &#34; " 双引号Quotation mark

&#35; — 数字标志Number sign

$ &#36; — 美元标志Dollar sign
% &#37; — 百分号Percent sign
& &#38; & Ampersand
‘ &#39; — 单引号Apostrophe
( &#40; — 小括号左边部分Left parenthesis
) &#41; — 小括号右边部分Right parenthesis

  • &#42; — 星号Asterisk
  • &#43; — 加号Plus sign
    , &#44; — 逗号Comma
  • &#45; — 连字号Hyphen
    . &#46; — 句号Period (fullstop)
    / &#47; — 斜杠Solidus (slash)
    0 &#48; — 数字0 Digit 0
    1 &#49; — 数字1 Digit 1
    2 &#50; — 数字2 Digit 2
    3 &#51; — 数字3 Digit 3
    4 &#52; — 数字4 Digit 4
    5 &#53; — 数字5 Digit 5
    6 &#54; — 数字6 Digit 6
    7 &#55; — 数字7 Digit 7
    8 &#56; — 数字8 Digit 8
    9 &#57; — 数字9 Digit 9
    : &#58; — 冒号Colon
    ; &#59; — 分号Semicolon
    < &#60; < 小于号Less than
    = &#61; — 等于符号Equals sign
    > &#62; > 大于号Greater than
    ? &#63; — 问号Question mark
    @ &#64; — Commercial at
    A &#65; — 大写A Capital A
    B &#66; — 大写B Capital B
    C &#67; — 大写C Capital C
    D &#68; — 大写D Capital D
    E &#69; — 大写E Capital E
    F &#70; — 大写F Capital F
    G &#71; — 大写G Capital G
    H &#72; — 大写H Capital H
    I &#73; — 大写J Capital I
    J &#74; — 大写K Capital J
    K &#75; — 大写L Capital K
    L &#76; — 大写K Capital L
    M &#77; — 大写M Capital M
    N &#78; — 大写N Capital N
    O &#79; — 大写O Capital O
    P &#80; — 大写P Capital P
    Q &#81; — 大写Q Capital Q
    R &#82; — 大写R Capital R
    S &#83; — 大写S Capital S
    T &#84; — 大写T Capital T
    U &#85; — 大写U Capital U
    V &#86; — 大写V Capital V
    W &#87; — 大写W Capital W
    X &#88; — 大写X Capital X
    Y &#89; — 大写Y Capital Y
    Z &#90; — 大写Z Capital Z
    [ &#91; — 中括号左边部分Left square bracket
    \ &#92; — 反斜杠Reverse solidus (backslash)
    ] &#93; — 中括号右边部分Right square bracket
    ^ &#94; — Caret
    _ &#95; — 下划线Horizontal bar (underscore)
    ` &#96; — 尖重音符Acute accent
    a &#97; — 小写a Small a
    b &#98; — 小写b Small b
    c &#99; — 小写c Small c
    d &#100; — 小写d Small d
    e &#101; — 小写e Small e
    f &#102; — 小写f Small f
    g &#103; — 小写g Small g
    h &#104; — 小写h Small h
    i &#105; — 小写i Small i
    j &#106; — 小写j Small j
    k &#107; — 小写k Small k
    l &#108; — 小写l Small l
    m &#109; — 小写m Small m
    n &#110; — 小写n Small n
    o &#111; — 小写o Small o
    p &#112; — 小写p Small p
    q &#113; — 小写q Small q
    r &#114; — 小写r Small r
    s &#115; — 小写s Small s
    t &#116; — 小写t Small t
    u &#117; — 小写u Small u
    v &#118; — 小写v Small v
    w &#119; — 小写w Small w
    x &#120; — 小写x Small x
    y &#121; — 小写y Small y
    z &#122; — 小写z Small z
    { &#123; — 大括号左边部分Left curly brace
    | &#124; — 竖线Vertical bar
    } &#125; — 大括号右边部分Right curly brace
    ~ &#126; — Tilde
    — &#127; — 未使用Unused
    &#160; &nbsp; 空格Nonbreaking space
    ? &#161; &iexcl; Inverted exclamation
    ¢ &#162; &cent; 货币分标志Cent sign
    £ &#163; &pound; 英镑标志Pound sterling
    ¤ &#164; &curren; 通用货币标志General currency sign
    ¥ &#165; &yen; 日元标志Yen sign
    | &#166; &brvbar; or &brkbar; 断竖线Broken vertical bar
    § &#167; &sect; 分节号Section sign
    ¨ &#168; &uml; or &die; 变音符号Umlaut
    ? &#169; &copy; 版权标志Copyright
    a &#170; &ordf; Feminine ordinal
    ? &#171; &laquo; Left angle quote, guillemet left
    ? &#172; &not Not sign
    ? &#173; &shy; Soft hyphen
    ? &#174; &reg; 注册商标标志Registered trademark
    ˉ &#175; &macr; or &hibar; 长音符号Macron accent
    ° &#176; &deg; 度数标志Degree sign
    ± &#177; &plusmn; 加或减Plus or minus
    2 &#178; &sup2; 上标2 Superscrīpt two
    3 &#179; &sup3; 上标3 Superscrīpt three
    ′ &#180; &acute; 尖重音符Acute accent
    μ &#181; &micro; Micro sign
    ? &#182; &para; Paragraph sign
    ? &#183; &middot; Middle dot
    ? &#184; &cedil; Cedilla
    1 &#185; &sup1; 上标1 Superscrīpt one
    o &#186; &ordm; Masculine ordinal
    ? &#187; &raquo; Right angle quote, guillemet right
    ? &#188; &frac14; 四分之一Fraction one-fourth
    ? &#189; &frac12; 二分之一Fraction one-half
    ? &#190; &frac34; 四分之三Fraction three-fourths
    ? &#191; &iquest; Inverted question mark
    à &#192; &Agrave; Capital A, grave accent
    á &#193; &Aacute; Capital A, acute accent
    ? &#194; &Acirc; Capital A, circumflex
    ? &#195; &Atilde; Capital A, tilde
    ? &#196; &Auml; Capital A, di?esis / umlaut
    ? &#197; &Aring; Capital A, ring
    ? &#198; &AElig; Capital AE ligature
    ? &#199; &Ccedil; Capital C, cedilla
    è &#200; &Egrave; Capital E, grave accent
    é &#201; &Eacute; Capital E, acute accent
    ê &#202; &Ecirc; Capital E, circumflex
    ? &#203; &Euml; Capital E, di?esis / umlaut
    ì &#204; &Igrave; Capital I, grave accent
    í &#205; &Iacute; Capital I, acute accent
    ? &#206; &Icirc; Capital I, circumflex
    ? &#207; &Iuml; Capital I, di?esis / umlaut
    D &#208; &ETH; Capital Eth, Icelandic
    ? &#209; &Ntilde; Capital N, tilde
    ò &#210; &Ograve; Capital O, grave accent
    ó &#211; &Oacute; Capital O, acute accent
    ? &#212; &Ocirc; Capital O, circumflex
    ? &#213; &Otilde; Capital O, tilde
    ? &#214; &Ouml; Capital O, di?esis / umlaut
    × &#215; &times; 乘号Multiply sign
    ? &#216; &Oslash; Capital O, slash
    ù &#217; &Ugrave; Capital U, grave accent
    ú &#218; &Uacute; Capital U, acute accent
    ? &#219; &Ucirc; Capital U, circumflex
    ü &#220; &Uuml; Capital U, di?esis / umlaut
    Y &#221; &Yacute; Capital Y, acute accent
    T &#222; &THORN; Capital Thorn, Icelandic
    ? &#223; &szlig; Small sharp s, German sz
    à &#224; &agrave; Small a, grave accent
    á &#225; &aacute; Small a, acute accent
    a &#226; &acirc; Small a, circumflex
    ? &#227; &atilde; Small a, tilde
    ? &#228; &auml; Small a, di?esis / umlaut
    ? &#229; &aring; Small a, ring
    ? &#230; &aelig; Small ae ligature
    ? &#231; &ccedil; Small c, cedilla
    è &#232; &egrave; Small e, grave accent
    é &#233; &eacute; Small e, acute accent
    ê &#234; &ecirc; Small e, circumflex
    ? &#235; &euml; Small e, di?esis / umlaut
    ì &#236; &igrave; Small i, grave accent
    í &#237; &iacute; Small i, acute accent
    ? &#238; &icirc; Small i, circumflex
    ? &#239; &iuml; Small i, di?esis / umlaut
    e &#240; &eth; Small eth, Icelandic
    ? &#241; &ntilde; Small n, tilde
    ò &#242; &ograve; Small o, grave accent
    ó &#243; &oacute; Small o, acute accent
    ? &#244; &ocirc; Small o, circumflex
    ? &#245; &otilde; Small o, tilde
    ? &#246; &ouml; Small o, di?esis / umlaut
    ÷ &#247; &divide; 除号Division sign
    ? &#248; &oslash; Small o, slash
    ù &#249; &ugrave; Small u, grave accent
    ú &#250; &uacute; Small u, acute accent
    ? &#251; &ucirc; Small u, circumflex
    ü &#252; &uuml; Small u, di?esis / umlaut
    y &#253; &yacute; Small y, acute accent
    t &#254; &thorn; Small thorn, Icelandic
    ? &#255; &yuml; Small y, umlaut
    symbols, mathematical symbols, and Greek letters
    ? &fnof;
    Α &Alpha;
    Β &Beta;
    Γ &Gamma;
    Δ &Delta;
    Ε &Epsilon;
    Ζ &Zeta;
    Η &Eta;
    Θ &Theta;
    Ι &Iota;
    Κ &Kappa;
    Λ &Lambda;
    Μ &Mu;
    Ν &Nu;
    Ξ &Xi;
    Ο &Omicron;
    Π &Pi;
    Ρ &Rho;
    Σ &Sigma;
    Τ &Tau;
    Υ &Upsilon;
    Φ &Phi;
    Χ &Chi;
    Ψ &Psi;
    Ω &Omega;
    α &alpha;
    β &beta;
    γ &gamma;
    δ &delta;
    ε &epsilon;
    ζ &zeta;
    η &eta;
    θ &theta;
    ι &iota;
    κ &kappa;
    λ &lambda;
    μ &mu;
    ν &nu;
    ξ &xi;
    ο &omicron;
    π &pi;
    ρ &rho;
    ? &sigmaf;
    σ &sigma;
    τ &tau;
    υ &upsilon;
    φ &phi;
    χ &chi;
    ψ &psi;
    ω &omega;
    ? &thetasym;
    ? &upsih;
    ? &piv;
    ? &bull;
    … &hellip;
    ′ &prime;
    ″ &Prime;
     ̄ &oline;
    ? &frasl;
    ? &weierp;
    ? &image;
    ? &real;
    ? &trade;
    ? &alefsym;
    ← &larr;
    ↑ &uarr;
    → &rarr;
    ↓ &darr;
    ? &harr;
    ? &crarr;
    ? &lArr;
    ? &uArr;
    ? &rArr;
    ? &dArr;
    ? &hArr;
    ? &forall;
    ? &part;
    ?&exist;
    ?&empty;
    ? &nabla;
    ∈ &isin;
    ? &notin;
    ? &ni;
    ∏ &prod;
    ∑ &sum;
    ? &minus;
    ?&lowast;
    √ &radic;
    ∝ &prop;
    ∞ &infin;
    ∠ &ang;
    ∧ &and;
    ∨ &or;
    ∩ &cap;
    ∪ &cup;
    ∫ &int;
    ∴ &there4;
    ~ &sim;
    ? &cong;
    ≈ &asymp;
    ≠ &ne;
    ≡ &equiv;
    ≤ &le;
    ≥ &ge;
    ? &sub;
    ? &sup;
    ? &nsub;
    ?&sube;
    ? &supe;
    ⊕ &oplus;
    ? &otimes;
    ⊥ &perp;
    ? &sdot;
    ?&lceil;
    ? &rceil;
    ? &lfloor;
    ?&rfloor;
    ? &lang;
    ? &rang;
    ? &loz;
    ? &spades;
    ? &clubs;
    ? &hearts;
    ? &diams;
    markup-significant and internationalization characters:
    “ &quot;
    & &amp;
    < &lt;
    > &gt;
    ? &OElig;
    ? &oelig;
    ? &Scaron;
    ? &scaron;
    ? &Yuml;
    ? &circ;
    ? &tilde;
    &ensp;
    &emsp;
    &thinsp;
    ? &zwnj;
    ? &zwj;
    ? &lrm;
    ?&rlm;
    – &ndash;
    — &mdash;
    ‘ &lsquo;
    ’ &rsquo;
    ? &sbquo;
    “ &ldquo;
    ” &rdquo;
    ? &bdquo;
    ?&dagger;
    ? &Dagger;
    ‰ &permil;
    ? &lsaquo;
    ? &rsaquo;
    € &euro;

转载

本文转自HTML转义字符大全

现象

在使用hexo渲染博客时,发现有个页面渲染报错,如下所示

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
INFO  Start processing
ERROR {
err: YAMLException: bad indentation of a mapping entry (1:22)

1 | title: hexo title 包含 : 冒号导致的错误
--------------------------^
2 | date: 2022-08-16 14:37:37
3 | tags:
at generateError (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:183:10)
at throwError (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:187:9)
at readBlockMapping (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1182:7)
at composeNode (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1441:12)
at readDocument (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1625:3)
at loadDocuments (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1688:5)
at Object.load (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1714:19)
at parseYAML (/Volumes/external/git/bivana_blog/node_modules/hexo-front-matter/lib/front_matter.js:69:23)
at parse (/Volumes/external/git/bivana_blog/node_modules/hexo-front-matter/lib/front_matter.js:50:12)
at /Volumes/external/git/bivana_blog/node_modules/hexo/lib/plugins/processor/post.js:93:18
at tryCatcher (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:544:35)
at Promise._settlePromise (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:729:18)
at Promise._fulfill (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:673:18)
at PromiseArray._resolve (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise_array.js:127:19)
at PromiseArray._promiseFulfilled (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise_array.js:145:14)
at PromiseArray._iterate (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise_array.js:115:31)
at PromiseArray.init [as _init] (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise_array.js:79:10)
at Promise._settlePromise (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:601:21)
at Promise._settlePromise0 (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:649:10) {
reason: 'bad indentation of a mapping entry',
mark: {
name: null,
buffer: 'title: hexo title 包含 : 冒号导致的错误\n' +
'date: 2022-08-16 14:37:37\n' +
'tags:\n' +
' - hexo\n' +
'categories:\n' +
' - 技术\n' +
'keywords:\n' +
' - 冒号\n' +
' - title\n',
position: 21,
line: 0,
column: 21,
snippet: ' 1 | title: hexo title 包含 : 冒号导致的错误\n' +
'--------------------------^\n' +
' 2 | date: 2022-08-16 14:37:37\n' +
' 3 | tags:'
}
}
} Process failed: %s _posts/技术/hexo/hexo_title_quato.md
INFO Files loaded in 3.38 s
INFO 0 files generated in 3.53 s

几个关键的错误信息为

1
2
3
4
err: YAMLException: bad indentation of a mapping entry (1:22)

snippet: ' 1 | title: hexo title 包含 : 冒号导致的错误\n' +
'--------------------------^\n' +

第一行告诉我们,这是YAML异常
第二行告诉我们,可呢个是title这里出错了

经过测试,在title里去除:冒号后正常,确认是:冒号导致的异常

原因

其实报错信息已经告诉我们了

  1. hexo的元数据title,date,tags这些,使用的是yaml语法描述
  2. yaml的kv使用的就是:冒号这个关键字,因此在value值这里,是禁用:冒号这个关键字的,想更加了解yaml,可以查看yaml官网,结构语法可以查看第 6 章结构产品,其中和本次错误相关在Indicator Characters这里.
  3. 由于在title文章标题里使用了:冒号,导致了yaml的解析异常

解决方案

知道了原因,解决方案就简单了,解决方案有2种

  1. 使用‘’单引号""双引号把title后面的值围起来即可
    1
    title: 'hexo title 包含 : 冒号导致的错误'
  2. 使用html字符替换,其中:冒号对应的html字符为&#58;,其他的html字符体可以参考html转义字符大全
    1
    title: hexo title 包含 &#58; 冒号导致的错误

本人推荐使用方案1

参考文章