python运行不报错又无任何结果输出结果缺少最后一个值,如何解决?

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

1xx:指示信息–表示请求已接收,继续处理

2xx:成功–表示请求已被成功接收、理解、接受

3xx:重定向–要完成请求必须进行更进一步的操作

4xx:客户端错误–请求有语法错误或请求无法实现

5xx:服务器端错误–服务器未能实现合法的请求

常见状态代码、状态描述、说明:

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

简单易懂,语言本身简洁,优美,功能超级强大、跨平台、非常火爆的社区、.很多有名的大公司在用,近年来的python用途越来越大,在编程语言的排名中稳步提升,我相信,python必会成为最热门的编程语言之一

2、通过什么途径学习的Python?

通过正规的培训机构学习以及自己买书自学、在网上查找资料、视频

⑴作为初学python的科班出身的小白,python非常简单,非常适合人类阅读

⑵易学。python虽然是用c语言写的,但是它摈弃了c中非常复杂的指针,简化了python的语法。

⑶Python是FLOSS(自由/开放源码软件)之一。

⑷可移植性————由于它的开源本质,Python已经被移植在许多平台上

⑸在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。

⑹Python既支持面向过程的函数编程也支持面向对象的抽象编程。

⑺ 可扩展性和可嵌入性。

 ⑼ Python确实是一种十分精彩又强大的语言。

4、简述解释型和编译型编程语言?

5、Python解释器种类以及特点?

8、请至少列举5个 PEP8 规范(越多越好)。

9、通过代码实现如下转换:

十六进制转换成十进制:v = “0x12”

十进制转换成十六进制:v = 87

10、请编写一个函数实现将IP地址转换成一个整数。

8、简述触发器、函数、视图、存储过程?

触发器:制定一个sql条件和要做的事当满足的时候自动触发并执行要做的事

函数(存储过程):Mysql储存过程简而言之就是一组已经好的命令,需要使用的时候拿出来用就可以

视图:将一个写好的查询语句封装起来 当调用的时看到的数据就是满足条件的数据 不用每次都写同样的代码

10、索引在什么情况下遵循最左前缀的规则?

11、主键和外键的区别?

1、主键,唯一标识一条记录,不能重复,不允许为空;外键,表的外键是另一表的主键,外键可以重复,可以是空值

2、主键,用来保证数据完整性;外键,用来和其他表建立联系

3、主键只能有一个;一个表可以有多个外键

13、列举 创建索引但是无法命中索引的8种情况。

14、如何开启慢日志查询?

15、数据库导入导出命令(结构+数据)?

16、数据库优化方案?

为经常查询的字段添加索引

1、char的长度是固定的,而varchar的长度是可变的

3、CHAR(10)若输入数据的字符数小于10,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。

18、简述MySQL的执行计划?

数据库的执行计划通俗点说就是,数据库服务器在执行sql语句的时候,会准备几套方案,最后选择消耗资源最小的那个方案。就是执行计划。

19、在对name做了唯一索引前提下,简述以下区别:

20、1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?

可以通过 增加order by,并且order by字段需要建立索引。

21、什么是索引合并?

1、索引合并是把几个索引的范围扫描合并成一个索引。

2、索引合并的时候,会对索引进行交集,交集或者先交集再并集操作,以便合并成一个索引

3、这些需要合并的索引只能是一个表的。不能对多表进行索引合并

22、什么是覆盖索引?

覆盖索引指,select的数据列只用从索引中就能取得,不必从数据表中读取,也就是说查询要被所使用的索引覆盖

23、简述数据库读写分离?

对于数据存储层高并发问题,最先想到的可能就是读写分离,在网站访问量大并且读写不平均的情况下,将存储分为

24、简述数据库分库分表?(水平、垂直)

常见的分库方式有水平性和垂直性。一般来说,就是按照用户属性(城市或者ID的hash)进行分库,或者按照业务功能进行分库

水平分库方式主要根据用户属性(如城市)拆分物理数据库,一种常见的方式是将全省划分为各大区

垂直分库方式:根据业务维度和数据的访问量等,进行数据的分离,剥离为多个数据库。例如,将一些

公用的配置信息存储到一个数据库中进行单独维护

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;

2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;

3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;

4、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);

5、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复.

26、redis中数据库默认是多少个db 及作用?

redis下,数据库是由一个整数索引标识,而不是由一个数据库名称。默认情况下,一个客户端连接到数据库0。redis配置文件中下面的参数来控制数据库总数:

28、如果redis中的某个列表中的数据量非常大,如何实现循环显示每一个值?

查询取出列表的值让后使用python循环

29、redis如何实现主从复制?以及数据同步机制?

在Master和Slave互通之后,首先,Slave会发送sync同步指令,当Master收到指令后,将在后台启动存盘进程,

同时收集所有来自Slave的修改数据集的指令信息,当后台进程完成之后,Master将发送对应的数据库文件到对应的Slave中,以完成一次完整的同步工作。

其次Slave在接受到数据库文件之后,将其存盘并加载到内存中。最后,Master继续收集修改命令和新增的修改指令,

并依次发送给Slave,其将在本次执行这些数据的修改命令,从而最终达到数据同步的实现。

Redis Sentinel 为Redis提供了高可用的实现。通俗来说就是你可以部署一套无需人为干预即可防灾的Redis环境。

RS同时为客户端提供了其他诸如监控,通知的功能。

31、如何实现redis集群?

32、redis中默认有多少个哈希槽?

33、简述redis的有哪几种持久化策略及比较?

rdb:快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略

aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合

34、列举redis支持的过期策略。

在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。

每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作

LRU(最近少用的淘汰)

即redis的缓存每命中一次,就给命中的缓存增加一定ttl(过期时间)(根据具体情况来设定, 比如10分钟).

一段时间后, 热数据的ttl都会较大, 不会自动失效, 而冷数据基本上过了设定的ttl就马上失效了.

36、写代码,基于redis的列表实现 先进先出、后进先出队列、优先级队列。

}
  • 参考译文: 淮海一粟, , ; 刘恒江,

本教程用于引导学生运行蛋白质的分子动力学(MD)模拟. 如果待研究蛋白不包含非标准氨基酸残基, 教程所用的流程可作为研究蛋白的一个良好起点. 完成本教程后, 学生应该能够知晓设置和运行模拟所涉及的步骤, 以及在不同模拟阶段应如何选择. 此外, 学生还应该知道如何对模拟结果进行核查以保证模拟质量, 并了解可以使用哪些分析方法, 哪些分析方法更适合自己的需要.

本教程的目的在于考察一段小肽结合到其蛋白受体时, 生物分子相互识别的两种机理–构象选择以及诱导匹配–所具有的不同贡献. 完成本教程后, 学生应该能够:

  • 使用GROMACS设置和运行蛋白的MD模拟.
  • 对模拟结果进行质量核查并分析
  • 对从多肽的不同构象开始的不同模拟, 比较结果
  • 对手头的体系能够得出一些理论上的考虑

大多数教程都是使用终端或控制台应用程序完成的, 因为我们用于准备和进行模拟的程序没有图形化界面. 为了便于了解这种新的运行环境, 我们准备了一份简单的帮助文档, 以便让你熟悉在Linux环境下”生存”所需的基本命令. 点击下载此文件.

Linux下的所有命令都需要小心输入, 因为shell(负责解析命令的程序)是区分大小写的. 另一经常发生的错误是将数字0当成了大写字母O, 小写字母l当成了数字1, 或者反过来. 你可以简单地复制粘贴这些命令: 先使用鼠标选中它们, 然后在需要输入的地方按下鼠标中键(Linux模式, Windows下未必可行). 首先来试试下面的命令:

这会列出你的当前用户名. 请确保你不是以root用户登录.

上面的命令列出当前工作目录下的所有文件和文件夹. 当遇到file not found之类的错误时, 可以使用这个命令来检查.

这个命令给出当前目录的完整路径.

此命令展示了如何更换目录.

2. 蛋白-多肽相互作用

在决定细胞命运的大量蛋白-蛋白相互作用中, 多肽起着关键作用, 并占了大约40%的比例. 从辅激活剂到抑制剂, 它们在许多信号和识别途径中都有涉及, 并且已经被证实与大量蛋白结构域存在相互作用, 例如, MHC, SH3和PDZ结构域就是由于其多肽亲和能力而知名. 由于功能的多样性以及间接参与的许多生物途径的重要性, 使得多它们与许多疾病相联系. 药物设计中的一个领域就专门研究多肽并用于治疗各种疾病. 与小分子抑制剂相比, 多肽的优点在于可以模拟蛋白结合的结构域, 并且自身足够大能竞争性地抑制蛋白蛋白相互作用. 许多药物先导分子就包含抗菌多肽.

尽管科学家们收集了蛋白多肽相互作用的大量数据, 确定它们形成的复合物的结构仍然是个挑战. 这主要源于两个障碍, 多肽柔性极高, 并且与其底物的相互作用很弱, 这突出了它们在信号传导或调节中的重要性, 因为这些功能通常依赖于瞬态过程. 这些障碍使得实验结构测定并不简单, 需要借助额外的计算方法如生物分子对接才能完成. 从建模的角度看, 常规的用于蛋白-配体或者蛋白-蛋白对接的算法也经常受到柔性问题的困扰.

解决柔性问题的一个途径是进行分子动力学模拟, 对多肽的构象空间进行采样, 收集具有代表性的构象, 并用于预测它们与蛋白受体的相互作用.

3. 生物分子的识别机理

上个世纪人们提出了一些理论来解释分子的识别过程. 在这些理论中, 构象选择诱导匹配 机理在过去的50年中得到了大致相同多的支持. 构象选择假定, 在配体不存在的情况下, 蛋白处于多种离散构象状态的平衡中, 其中包括倾向与配体结合的那个构象. 这一概念与诱导匹配理论相反, 后一理论起初引入用于描述酶的活性, 认为构象匹配是由与底物的结合导致的.

在本教程中, 我们要考察这一两难问题–诱导匹配和/或构象选择, 方法是使用不同初始构象的分子动力学模拟对多肽的构象空间进行采样. 我们将不同的轨迹与实验确定的多肽在与其蛋白受体形成的复合物中的构象(结合构象)进行比较, 并检查这一构象在MD过程中是否出现, 这样就能验证构象选择理论.

经典分子动力学模拟从定义好的构型开始, 使用牛顿运动方程来计算粒子的轨迹. 对于体系中的每一粒子, 所受的合力根据它与其他粒子的相互作用来计算, 这些相互作用以力场进行描述. 力除以粒子的质量为加速度, 再加上粒子以前的位置和速度, 就决定了一小段时间步长之后粒子的新位置. 高的时间和空间分辨率使得MD模拟在测试基于实验数据的模型, 理解功能背后的原理并形成新的假说时非常有用. 不幸的是, 模拟体系的大小以及时间尺度存在限制.

本教程使用进行MD模拟和分析, 它是一个可以免费获取程序包, 遵循GNU GPL(General Public License). GROMACS程序只有命令行界面, 这意味着每一步运行都要键入程序的名称及其选项. 注意命令是区分大小写的, 每一命令键入时都必须精确地与教程一致, 关于GROMACS的更多信息以及手册请见其官方网站. (提示: MPI并行版本的GROMACS可以在多个节点(集群中的机器)上分配任务从而提高性能, 对单机而言MPI并不能提高性能, 因为GROMACS可以自动使用单个机器的多个核心)

由于程序只有命令行界面, 因此我们必须使用终端. 尽管在Windows环境下借助DOS终端也可以运行GROMACS, 使用Linux有一些优点, 这也是本教程的选择. 对一些学生来说, 从Windows转到Linux或许会感到别扭, 因为他们已经更习惯了Windows提供的界面. 重要的一点是记住, Linux并非Windows的免费克隆品, 而是一个功能强大, 高度可定制化的操作系统, 能够使你的计算机发挥更大的威力. 从Windowa转到Linux有时会被描述成. 开始使用Linux终端时, 需要知道一些最基本的命令(ls, cd, mkdir,

默认情况下, 你的系统已经正确设置好了.

你可以使用gmx luck命令测试GROMACS是否正确安装. 幸运的话, 你会得到一句引言. 这说明你的GROMACS已经正确安装好了.

在进行其他操作之前, 必须要获得初始结构. 结合构象可以从获取, 它是一个蛋白三维结构的数据仓库, 根据每个蛋白的登记号(如1klu)搜索蛋白(提示: 你可以使用命令下载文件: wget

蛋白数据库的页面, 除了提供结构的坐标文件(pdb文件)外, 也包含了分子体系的一些有用信息, 如所有分子的一级序列, 二级结构的指认, 长度, 生物功能等. 花些时间来浏览页面, 收集待研究分子的尽可能多的信息.

为开始教程, 根据多肽的PDB号下载相应的结构, 并记下下列信息:

  • 确定结构的实验方法及其分辨率
  • 多肽的一级结构(氨基酸序列)
  • 多肽的来源: 天然蛋白还是大蛋白的一部分?

首先使用分子查看软件来看看分子的结构, 我们建议使用PyMOL. 可使用下面的PyMOL命令来载入结构

执行上面的命令后, PyMOL会启动, 在一个窗口中使用线形模式来显示分子, 并在主窗口的右面列出各个对象, 这些对象可以通过点击其名称来移除. 每个对象名称的后面是菜单, 用于更改显示模式. 试着使用卡通模式来显示结构. 对那些习惯使用键盘的人(我们强烈建议你也使用这种方式), 可以通过在窗口中键入下面的命令来达到目的

使用上一步骤中收集到的信息, 通过键入下面的命令来选择包含多肽的pdb链

然后抽取多肽链保存到另一个对象

计算并显示蛋白的溶剂可及表面

对蛋白表面和多肽使用两种可区分的颜色进行着色

选择处于多肽5埃之内的所有蛋白残基进行着色, 这构成了蛋白-多肽的界面

如果对显示结果满意, 你可以进一步使用ray命令改善显示结果, 并使用png filename命令保存图片.

使用下面的命令记下在PyMOL中显示的结合多肽的氨基酸序列

比较PyMOL显示的序列和蛋白数据库给出的序列, 二者是否相同? 为什么?

PyMOL也可以用于生成多肽的初始构象. 默认情况下, 你可以使用Build菜单, 选择构象和需要增加的残基. 此外, 我们提供了一个脚本build_seq, 可以对给定的氨基酸序列生成相应的理想构象. 这个脚本可能很有用, 因为对于一些多肽构象, 如聚脯氨酸II, PyMOL并不知道所需要的phi/psi角度组合. 你可以通过在窗口中键入下面的命令来获知如何使用这个脚本

使用这个脚本生成多肽的三个不同构象, 我们在教程中要使用它们, 所以要给它们指定不同的名字, 将下面命令中的XXXXXX替换为结合多肽的序列(PyMOL中有显示)

使用卡通模式显示新创建的多肽

使用align命令在空间中对齐并叠合不同的构象, 查看它们的差异程度有多大

对齐与叠合计算会返回原子位置的根均方偏差(RMSD), 它定量地表征了不同构象的结构异同. 请记下每个align命令给出的RMSD值.

最后, 使用save命令保存构象, 类似下面保存螺旋多肽的命令

得到的pdb文件可以用于开始准备模拟.

现在使用命令quit退出PyMOL. 正如你注意到的, 绘制结构必需的所有信息都保存在.pdb文件中. 你可以使用gedit来查看pdb文件, 并试着理解这种文件格式.

pdb文件包含了很多涉及蛋白, 用于确定结构的实验方法和条件等的信息. PDB数据库网页实际就是将这些信息展示给你的. pdb文件中也包含了每一个原子的直角坐标. 注意, pdb文件中一般不包含成键连接信息, 而PyMOL像大多数分子查看软件一样绘制了原子之间的成键, 这些成键是自动根据原子间的距离来确定的.

结合态多肽的pdb文件和你自己使用build_seq生成的有什么不同(如氢原子)?

为你的结构创建一个目录. 由于最后需要将结果合并起来, 最好通过组合PDB标识(如peptide_bound, peptide_helix等)和个人标识指定明确且唯一的目录名称. 将结构文件复制到目录中并切换目录. 举例来说,

请仔细阅读教程, 并检查在每一步是否成功完成. 请细心阅读程序输出!!! 如果程序给出错误信息, 这些信息通常是自明, 容易理解. 检查文件类型和程序输出以理解每一步的过程. 大多数文件是可读的, 除了扩展名为.tpr, .xtc, .trr.edr的文件

分子动力学(MD)模拟包含三个步骤: 首先, 必须准备好输入数据(模拟体系); 其次, 必须对准备好的体系运行成品模拟; 最后, 必须分析模拟结果并将其置于相关背景中. 尽管第二步是计算中最耗时的部分, 一些模拟常需要运行几个月, 实际上最费劲的步骤在于模拟体系的准备和模拟结果的分析. 本教程的这一部分提供准备蛋白MD模拟, 运行, 分析结果的一个示例.

本教程使用 5.1.4版本, 大多数命令来自这一程序. 所采用的更通用, 也可以用于其他MD程序. 每一步骤会使用一个有输入和输出的节点示意地表示出来. 一个步骤可以是执行单个程序, 也可以是几个程序的组合, 其中一个的输出作为另一个的输入. 在单个程序的情况下, 会指定输入/输出类型和控制选项. 对大多数程序/步骤, 只会列出使用的输入/输出选项. 大多数程序提供了更多高级控制选项, 这里不再细述. 如果你有兴趣, 可以参看每个程序的帮助页面, 里面给出了程序功能的完整列表和说明. 这些帮助页面可以使用程序的-h选项来显示. 在工作流程中, 程序以黄色背景上的名称来标识, 输入/输出数据以绿色背景上的描述性名称标识, 蓝色块表示输入数据, 基本不依赖于待研究的结构. 橙色块是包含多个步骤及相关程序的过程. 在这种表示方法中, 橙色块单独用于表示模拟步骤, 在下面会详细解释. 数据到过程的连接线, 每一程序输入或输出的命令行选项使用黑色背景上的白色标识.

准备模拟体系是MD中最重要的步骤. 执行MD模拟可以在原子尺度洞察动力学的过程, 用于理解实验观察到的现象, 验证理论假说, 或者为一个有待实验验证的新假说提供基础. 然而, 对于上述各种情形, 设计的模拟必须适合目的, 要根据实际情况对模拟过程进行设计, 这意味着设置模拟的时候必须十分小心.

缺失残基/侧链/原子, 非标准基团

本教程我们模拟的是多肽. 整个过程的首要步骤是选择初始结构, 如前面所说. 然后就要检查这个结构是否缺失残基和原子, 这些残基和原子模拟时必须考虑, 因此必须想办法补充完整. 从pdb库下载的文件中会列出缺失的残基和原子. 由于本教程不涉及蛋白建模, 因此所用的初始结构是完整的, 不存在缺失, 因此无需进一步处理.

另一个需要注意的问题是, pdb结构文件中可能包含非标准残基, 修饰过的残基, 溶剂分子或者配体. 这些基团没有力场参数可用. 如果存在这样的基团, 要么除去它们, 要么补充它们的力场参数, 这牵涉到MD的高级课题. 本教程假定结构不含这类基团, 只包含天然氨基酸.

最后, 一些晶体散射数据的分辨率足够高, 能够在密度网格中区分水分子. 通常这些水分子只以氧原子表示, 在开始准备步骤前必须去除它们, 除非出于特殊目的要保留它们. 对本教程的多肽不需要考虑这种情况.

幸运的是, 大多数的这些”问题”分子在PDB文件中都被标识为杂原子(HETATM), 这样可以使用sed命令轻松地移除它们

对结构文件进行进一步检查以了解其质量是一个好习惯. 例如, 在晶体结构解析的精修过程中, 谷氨酰胺和天冬酰胺的酰胺基团的取向可能不正确; 组氨酸残基的质子化状态和侧链取向也可能存在问题. 列出了与蛋白有机氨基酸最相关的化学性质, 可做参考. 为了进行正确的结构验证, 可以利用一些程序和服务(如WHATIF). 本教程假定所用结构对模拟目的而言足够好, 不存在问题, 可直接用于准备体系.

一个分子可由各个原子的坐标, 成键和非键相互作用的描述来定义. 由于从PDB文件获得的结构只含有原子坐标, 我们首先必须构建拓扑, 它给出了原子类型, 电荷, 成键情况等信息. 拓扑对应着某一特定的力场, 选择使用何种力场是一个值得仔细考虑的问题. 这里我们使用AMBER99sb-ILDN全原子力场, 它被广泛用于采样和折叠模拟的研究.

拓扑与结构的匹配很重要, 这意味着结构数据也需要根据所用力场进行转换. 可以使用pdb2gmx程序转换结构并建立拓扑数据. 该程序可以构建分子的拓扑, 前提是这些分子由特定的构建单元(如氨基酸)组成. pdb2gmx使用构建单元的数据库进行转换, 对于数据库中没有的分子或残基, 程序无法识别, 转换过程会失败. 使用-ter选项后GROMACS会提示分子的末端变化, 合适的选择应该能够正确地表示体系. 在本教程中, 这取决于多肽是一个更大蛋白的片段(非带电末端)还是一个完整的分子(末端带电).

注意, 你可以使用下面的命令将gro文件和pdb文件进行互换

仔细阅读屏幕输出的提示, 并检查组氨酸质子化状态所做的选择, 注意蛋白质的总电荷数. 也要浏览输入结构的文件(protein.pdb)和输出的结构文件(protein.gro, GROMACS格式). 注意两种格式的区别. 最后浏览拓扑文件及其结构.

记下转换前后原子数目的区别, 解释为什么. 选择拓扑文件中的一个氨基酸残基, 列出其中的每个原子及其类型, 电荷.

在对体系进行能量最小化前, 需要选定模拟体系的大致外形(空间排布方式). 大多数常见的模拟都是在周期性边界条件(PBC, periodic boundary conditions )下进行的, 这意味着要定义一个单位晶胞, 它可以填充堆积整个空间. 这样就可以模拟一个无限, 周期性的体系, 避免了由于模拟盒子的墙壁导致的边界效应. 只有少数几个通用形状可用于设置PBC. 我们将使用盒子, 因为它对应于球的最佳堆积, 因此对自由旋转的分子是最佳选择. 为避免周期映像之间的直接相互作用, 我们设置多肽和盒子边界之间的最小距离为1.2 nm, 这样两个相邻的堆积盒子的距离就会大于2.4 nm.

4. 结构的能量最小化(真空中)

现在, 一个适合所选力场并且格式正确的结构文件已经建好了, 同时还得到了相应的拓扑和盒子. 然而, 由于结构转换中, 牵涉到氢原子的删除和添加, 这可能会导致局部有些过大的应力, 比如因两个原子的位置太接近而引起的作用力. 因此我们必须对结构进行能量最小化, 使其松弛一点. 这其实就是一个, 包括两个过程: 第一步, 结构和拓扑同时还有一些控制参数被整合在一起, 形成描述整个体系的单个文件. 这个过程会生成一个运行输入文件, 该文件可以作为唯一的输入文件, 用于第二步动力学模拟的mdrun程序. 把这个过程分为两步的好处是, 运行输入文件可以传送到专门的(高性能)计算机网络或者超级计算机, 并在那里完成模拟计算. 然而, 一般只在成品模拟中才会这么做.

为了执行这些步骤, 需要用到一个.mdp参数文件, 将该 保存到自己的工作目录下. 该文件包含一些能量最小化的控制参数, 请查看其中的内容. 注意, 文件中以integrator开始的行指定了所用的算法. 本例中, 指定采用最速下降法进行1000步能量最小化. 现在, 用以下命令整合结构和拓扑文件以及一些控制参数:

grompp程序将会提示此体系的净电荷不为零, 还会输出一些与体系和控制参数有关的其他信息. 该程序也会产生一个额外的输出文件(mdout.mdp), 里面包含所有控制参数的设置. 下一步, 运行mdrun

由于只有3150个原子, 能量最小化很快就完成了. 使用选项-v会将每步的势能和最大受力打印出来, 以便于跟踪能量最小化过程. -deffnm选项设定了所有输出文件的默认文件名, 避免了对每个输出文件进行命名, 从而减少了需要设置的选项. 现在, 结构弛豫好了, 我们该添加溶剂了.

使用了什么方法进行能量最小化? 参数文件中指定了多少步, 实际使用了多少步进行能量最小化? 什么原因致使能量最小化在指定步之前停止? 体系最终的势能为多少? 使用PyMOL载入能量最小化之前和之后的结构, 并进行比较.

现在单位晶胞已经设定好了, 结构也优化好了, 我们可以添加溶剂了. 有好几种溶剂模型, 每种模型多少都与某一力场密切相关. Amber99SB力场通常使用TIP3P水分子模型, 这个模型你已经在前面选择过了. 添加溶剂不需要拓扑, 但可能需要更新拓扑, 在其中添加溶剂. 使用以下命令向盒子中添加TIP3P溶剂:

看看protein.top文件的结束部分, 其中有添加溶剂的内容, 检查添加的溶剂分子的数目.

向体系中添加了多少水分子, 对应的体积多大? 体系中现在有多少原子?

执行命令后, PyMOL会绘制一个线框来显示三斜晶胞盒子的边界. 可能看起来不太明显, 但这个三斜形状对应于菱形十二面体. 另一个值得注意的事情是, 并非所有的溶剂都处于盒子内, 但都以长方体块状排布. 有时, 蛋白质也会部分地伸出水外面.

蛋白伸出水面外部为什么不是问题?

6. 添加离子: 抗衡电荷和浓度

目前我们已经有了溶剂化的蛋白质, 但体系仍存在净电荷. 为了使体系呈电中性, 我们必须添加一定数目的抗衡离子. 此外, 添加一定浓度的离子, 可认为是一个好的做法. 程序genion能完成这些任务, 但它需要一个运行输入文件作为输入文件, 即一个包含了结构和拓扑的文件. 就像前面一样, 我们可以使用grompp来生成这样的文件. 下载,

并指定必须加入超量的某一特定种类的离子以使体系呈电中性(-neutral). genion程序会询问用离子取代何种分子, 选择SOL组.

注意: 为中和体系电荷而添加的离子的数量. 通过将一些水分子替换为离子, 体系的拓扑文件protein.top不再正确. 你可以修改拓扑文件, 减少溶剂分子的数目, 同时在文件的最后一部分(molecules)中SOL的后面增加一行, 指定添加的NA离子的数目, 并再增加另一行指明CL离子的数目. genion也提供了一个-p选项能够自动更新拓扑文件, 更方便.

向体系中添加了多少钠离子和氯离子?

7. 溶剂化体系的能量最小化

到此为止, 整个模拟系统已经准备好了. 在开始成品模拟前, 唯一要做的是对体系再次进行受控的弛豫. 由于添加溶剂以及替换离子, 可能会产生不利的相互作用, 例如, 原子间的重叠, 同种电荷太接近等, 因此需要对体系再次进行能量最小化, 其步骤与前面相同: 先运行grompp, 再运行mdrun:

参数文件中指定了多少步, 优化过程进行了多少步? 体系最终的势能多大?

8. 溶剂和氢原子位置的弛豫: 位置限制MD

为了耗散掉体系的最大应力, 我们使溶剂分子适应蛋白, 即, 我们允许溶剂自由移动, 而将蛋白的非氢原子或多或少地固定在参考位置. 这么做的目的是为了确保溶剂的构象”匹配”蛋白质. 这一步骤是第一个真正的MD步骤, 控制参数在中. 浏览这个文件, 注意integrator行和define行. 后者用于控制拓扑文件的内容: define = -DPOSRES将定义全局关键字POSRES. 查看拓扑文件最后的内容, 理解位置限制是如何打开的.

也要注意, 我们开始引入温度并对体系进行热浴耦合. 换句话说, 体系将在打开温度耦合的情况下运行一小段时间, 让体系弛豫到一个新的状态. 为此, 我们为粒子赋予了速度, 这是通过参数gen_vel来控制的, 并在下一行设定了速度分布(Maxwell分布)的温度和随机数生成器的种子(gen_seed). gen_seed被设为-1, 但应该更改为另外的值(提示: 可以使用命令更改, 如sed -i /^gen_seed/s/-1/设定值/ npt.mdp). MD模拟是最重要的一步, 所以每次都以相同的坐标, 速度和相同的参数开始模拟时, 就会导致模拟结果一模一样, 这不是我们所希望的.

查看上面提供的mdp文件, 你使用哪个温度模拟体系? 选择这一特定温度的原因何在?

编辑完参数文件后, 使用gromppmdrun程序来准备和运行模拟:

为什么我们建议你修改随机数种子的值而不是使用自动生成的随机种子(默认值-1)? 模拟长度是多少ps? 在拓扑文件中位置限制是如何包含进去的? 有两个分别耦合到热浴的组, 它们是哪些组, 每个组中包含哪些粒子?

看看总能量, 势能和动能的变化会很有趣. 在前一步, 粒子没有速度, 所以没有动能, 因此也没有温度. 现在, 模拟一开始, 原子就被赋予速度因此获得了动能.

模拟过程中的能量信息被保存在不可读的(二进制)文件中, 其扩展名为.edr. 该文件中的信息可用gmx energy命令提取. 绘制体系的温度, 势能, 动能和总能量随时间变化的图.

运行上面的命令后, 会提示你一系列能量项以供选择, 所选能量项的结果将会被写入指定的输出文件中. 输入与温度, 势能, 动能和总能量相对应的数字, 最后输入0(零), 回车. (提示: 你可以通过使用管道(|)自动选择某些项, 例如echo 10 11 12 14 0 | gmx energy ...,

输出文件(.xvg)可以用xmgrxmgrace程序查看, 这些程序需要预先安装好. 也可以用我们提供的Python查看, 它能在终端窗口上显示出基于字符的图形.

注意: 绿色曲线是总能量, 黑色是势能, 蓝色是温度, 红色是动能. 你也可以点击曲线并填写Legend窗口以改变图例. 别忘了点击accept以接受改变.

温度如何变化? 势能/动能/总能量如何变化, 如何解释?

9. 放开限制: 第二次预平衡

预平衡常常分为两个阶段, 第一个阶段使用NVT系综(粒子数, 体积, 温度恒定), 这一系综通常也称为等温等容系综或正则系综. 这一预平衡过程所需的时间步数取决于体系的性质, 但在NVT中, 体系的温度应该会在需要的值附近达到一个平台. 如果温度没有稳定. 就需要延长模拟时间. 作为示例, 我们在前面已经进行了这一步骤, 现在就进行下一步骤.

前面的NVT预平衡, 稳定了体系的温度. 在进行数据收集前, 我们也必须稳定体系的压力(因此也包括稳定密度). 压力平衡在NPT系综下进行, 这一系综的粒子数, 压力和温度保持不变, 也被称为等温等压系综, 最能代表实验条件. 现在开始慢慢放开限制, 让体系弛豫到新的状态. 下载参数控制, 看看其中的压力耦合参数.

查看控制参数文件, 找到控制压力耦合的参数.

运行结束后, 再次查看一下能量和温度. 使用前面的方法抽取它们. 数据提取方法同前:

温度如何变化? 势能/动能/总能量如何变化, 如何解释?

现在开始重复相同的平衡模拟, 并逐步放开限制

10. 非限制性MD模拟: 最后一步预平衡

完成两个阶段的预平衡后, 体系在需要的压力与温度下平衡好了. 我们现在可以放开位置限制运行成品模拟以收集数据了. 过程与前面的类似, 因为我们要将检查点文件(在这种情况下它包含了压力耦合的信息)用于grompp. 下载.

运行结束后, 再次查看一下能量和温度, 同时注意观察压力变化. 使用前面的方法抽取它们. 数据提取方法同前:

看看能量, 温度和压力的变化曲线.

温度如何变化? 压力如何变化?

最后一个问题与如何从有限数量的粒子系统中提取热力学性质直接有关. 粗略地说, 热力学指的是大量粒子(例如, 几十亿个而不是几千个)的行为. 对大量粒子的性质进行平均能够减少波动, 相反, 仅对少量粒子进行平均, 较大的波动无可避免.

由于我们引入了压力耦合, 体系的密度会发生变化. 从能量文件中提取密度数据, 方法如下:

体系密度随时间如何变化? 如果打开压力耦合, 体系的密度为什么会变化?

终于到了最后一步. 我们已经得到了或多或少平衡好的溶剂化体系, 其中包含我们感兴趣的蛋白质, 所以该进行成品模拟了. 记住, 成品模拟并不表示整个模拟都可以用来分析感兴趣的性质. 虽然已经消除了初始构象的一些影响, 体系还不太可能已经达到平衡状态. 在分析阶段, 我们会检查模拟的哪一部分可以认为处于平衡状态, 适合用于进一步处理分析. 但首先需要设定运行参数. 这里只需要运行另一个模拟步骤, 类似于准备体系的最后一步. 然而, 这一步也是另一处需要考虑模拟目的的地方, 所以应当选择能满足待分析性质的有关控制参数. 可考虑以下问题:

  • 研究的问题在什么时间尺度上发生? 或者, 模拟需要运行多长时间?
  • 需要多少帧轨迹? 或者时间分辨率取多少?
  • 需不需要保存粒子的速度?
  • 是否需要输出所有原子的数据, 还是只需要蛋白质的坐标数据?
  • 每隔多久记录一次能量文件和日志文件?
  • 每隔多久记录一次坐标和速度的检查点文件?

我们将运行50纳秒的模拟. 下载控制参数, 先查看其中的内容.

为了完成50纳秒的模拟, 需要多少步?

你必须编辑参数文件, 指定运行步数使得总模拟时间为50 ns. 然后使用grompp命令将最终的结构文件和准备步骤中得到的拓扑文件合并为一个运行输入文件.

虽然运行输入文件是二进制格式, 我们还是可以查看其内容. 在某些情况下, 模拟会发生一些意外, 这可能与内部控制和力场参数有关. 在这种情况下, 查看运行输入文件尤为有用. gmx dump程序可以将运行输入文件转换为可读格式. 转换后的内容可能会有很多页, 因此建议将其重定向到一个文件中, 或使用moreless命令分屏显示文件. 输入以下命令查看运行输入文件的内容(注意, 在实际操作时, 需要把文件名protein_md.tpr替换为运行grompp后所得到的文件名):

模拟结束后就可以进行数据分析了. 这是一个重要的过程, 包括三个阶段. 首先, 有必要进行一些标准的检查, 以便对模拟质量进行评估. 如果评估结果表明模拟良好, 就可以对每个模拟进行分析, 回答预设的研究问题了. 最后, 来自不同模拟的结果可以综合起来.

注: 文件名应当能反映文件的内容, 根据模拟体系的不同而不同. 这里我们假定使用默认的文件名, 这意味着会有以下文件:

  • topol.tpr: 运行输入文件, 包含模拟开始时体系的完整描述
  • confout.gro: 结构文件, 包含最后一步的坐标和速度
  • traj.trr: 全精度轨迹, 包括随时间变化的位置, 速度和力
  • ener.edr: 随时间变化的有关能量数据
  • md.log: 模拟过程的日志, 包含模拟过程中的信息

另外, 许多分析工具都能生成.xvg格式的文件. 这些文件能用xmgrxmgrace程序查看, 也可用Python在终端以字符形式显示.

在进行其他分析之前, 必须确认模拟正常结束. 有许多原因可能导致模拟中断, 特别是涉及力场或体系平衡不充分的问题, 要检查模拟是否正常结束, 可以使用gmx check程序

确认模拟运行了50纳秒.

轨迹文件中有多少帧, 时间分辨率为多少?

模拟信息的另一个重要来源是是日志文件. 在md.log的结束部分给出了模拟过程的统计数据, 包括CPU和内存资源的使用情况以及模拟时间. 查看日志文件的结束部分. 如果你使用less, 可以按住G(shift-g)来略过前面部分, 跳到文件结束. (提示:

模拟实际运行了多少时间(小时), 模拟速度为多少(ns/day)? 要模拟1 s需要多少年? 势能的哪部分贡献消耗量大部分计算时间?

现在是有趣的部分, 尽管多数分析都归结为从轨迹文件中提取图像, MD当然最重要是的体系的运动. 我们要看看轨迹.

首先使用GROMACS提供的查看器ngmx来看看. 虽然该程序的完善程度和视觉效果不及其他查看软件, 但它能够根据拓扑文件的信息绘制成键. 其他查看软件可能隐含长程键, 导致这些键被认为太长而不画出, 或者会在非常接近的原子之间画出键. 这是对模拟结果分析的一个常见错误. 使用ngmx载入拓扑和轨迹文件:

看看程序菜单, 试试不同的选项. 播放动画. 观看过程. 通过右边的选项控制. 右击或左击选择选项来改变查看.

为了可视化轨迹, 我们将从轨迹中抽取1000帧(-dt 50), 并去除水分子(当提示选择时, 选择蛋白Protein). 此外, 我们还要消除跨过盒子边界的跳跃形成连续轨迹(-pbc nojump). 要处理这些事情, 我们使用瑞士军刀般的GROMACS工具trjconv, 它有1001个可能的组合选项. 我们使用它输出一个多模型的pdb文件, 用于PyMOL可视化.

在PyMOL中载入轨迹

载入所有帧后, 播放动画

当播放动画时, 所有其他控制仍可以工作. 你可以使用鼠标旋转或缩放体系, 也可以改变分子的表示模式.

如果多肽扩散超过盒子边界, 会发生什么?

如果一切正常的话, 现在你可以看到多肽的扩散, 翻转和扭动. 但我们对内部运动更感兴趣, 而不是整体行为. 在PyMOL中, 你可以使用命令intra_fit将轨迹中的所有其他帧与第一帧对齐, 随后, 你可以使用orient命令设定聚焦点在多肽上

现在所有帧都已经叠合好了, 你可以看到多肽的一些部分比另一些部分运动得更剧烈, 这种运动的差异在后面会进行定量化分析.

当然, 使用卡通模式表示多肽显示效果会更好:

上面的命令会将碳骨架表示为粗管状, 而无法显示正确的二级结构元素, 因为.pdb文件中没有二级结构信息. PyMOL能够计算蛋白的二级结构, 但只计算一帧, 然后将结果应用到所有的帧. 例如, 下述命令可以计算第一帧的二级结构:

通过指定状态编号, 可以改变要计算的帧

最后, 让我们同时查看所有帧, 检查多肽的柔性和刚性区域

请随便摆弄PyMOL. 试着放大柔性或刚性区域, 并检查侧链的构象. 请使用raypng命令制作图像, 即使浪费点(CPU)时间也不要紧(提示: 将场景输出为POV-Ray格式, 得到的图像可能更酷). 但记住, 如果图像的场景太过复杂, 可能会导致PyMOL的内置光线追踪器崩溃, 这种情况下, 你可以直接使用png保存屏幕上的图像.

如果有足够的机时, 你可以考虑制作一段不错的动画. 你可能已经注意到了, 轨迹的噪声很大. 这基本上是热噪声, 因此只是蛋白正常行为的一部分, 但这些噪声对制作好的动画会有影响. 我们可以滤除这些高频的运动, 只保留更慢更平滑的整体运动. 为此, 可以使用filter命令:

退出PyMOL(quit), 检查目录下的文件(ls), 你会发现多了好些文件, 包括250张图片. 以每秒30帧的速度, 这些图片可以制作大约8秒的动画. 下载和参数, 用它来生成单帧图像的动画(你可能需要编辑参数文件来改变文件名):

对轨迹进行了最初的可视化检查后, 该对模拟质量进行一些更彻底的检查了. 质量保证(QA)包括对一些热力学参数收敛程度的测试, 如温度, 压力, 势能和动能等. 更常用的含义, QA试图评价模拟是否达到平衡. 通过起始结构和平均结构的均方根偏差(RSMD)也可以对结构的收敛性进行检查. 接下来必须检查相邻周期性映像之间没有相互作用, 因为这种相互作用会导致一些非物理效应. 最后一步QA测试是计算原子的均方根波动, 并与晶体学数据的b因子进行比较.

我们首先从能量文件中提取一些热力学数据, 包括温度, 压力, 势能, 动能, 晶胞体积, 密度以及盒子大小等. 这些量中的大多数已经在前面的准备步骤阶段检查过了. 能量分析使用energy命令进行, 该程序读入能量文件, 也就是模拟过程中生成的扩展名为.edr的文件. energy命令会提示需要从能量文件中抽取哪些项, 并为其生成一个图形. 使用下面的命令

执行命令后将列出一系列存储在.edr文件中的能量以及相关项. 本教程的能量文件中可能含有59项, 每一项都可以抽取并作图. 最前面的9项对应于力场中的不同能量项, 44以上的项列出对蛋白Protein和非蛋白Non-Protein组划分后的结果, 包括二者之间的相互作用. 键入要提取的性质的序号并回车就可以得到相应的.xvg数据文件. 要抽取温度, 键入temperature 012 0并回车(也可不键入0, 但需要回车两次). 使用xmgrace查看下图形, 观察温度如何围绕设定值(310 K)上下波动.

也可以从热力学性质的涨落计算体系的. 为此, 除体系温度外, 还必须从.edr能量文件中抽取焓(NPT系综)或总能量Etot(NVT系综)的值. 进一步, 我们必须使用-nmol选项明确指定体系中的分子数目(你可以查看拓扑文件的最后部分获知体系中分子的总数). 这样energy就可以自动计算热容并在输出部分的最后报告这个值. 更多细节请参考手册D.29.

体系的平均温度和热容多少?

通过名称引用能量项可实现能量文件的自动处理. 使用echo和管道(|)可以将一个程序输出重定向为另一个程序的输入, 这样energy的选择可以自动完成. 要抽取多个项, 各项之间必须以\n分割, 复制粘贴或键入以下命令行来抽取其他项.

逐个查看这些文件, 观察对应数值的收敛情况. 如果有的数值没有收敛, 这意味着模拟还没有达到热力学平衡状态, 必须延长模拟时间才能进行进一步的分析. 此外, 达到平衡前的过程是不能用于分析的. 这里, 为简单起见, 我们忽略这些考虑, 直接使用模拟的结果进行分析.

energy.xvgbox.xvg文件中给出的是什么性质? 估计压力, 体积和密度的稳定值.

一些性质收敛慢, 达到平衡所需的时间长于另一些性质. 特别的, 温度很容易收敛而体系各部分间的相互作用可能收敛较慢. 这样会导致温度已经收敛到平衡值, 而体系不同部分之间的相互作用仍需要更长时间进行平衡. 查看多肽与溶剂之间的相互作用能:

3.2 周期性映像间的最小距离

质量保证中最重要的检查事项之一就是确保周期性映像之间没有直接的相互作用. 由于周期性映像是全同的, 其间的相互作用是物理上不应该发生的自相互作用, 会导致模拟结果不合理. 设想具有偶极矩的蛋白会有直接的相互作用. 那么同一蛋白处于盒子边界的两个末端之间就会产生吸引, 这将影响蛋白质的自身的行为并导致模拟结果不合理. 我们通过计算每一时刻周期性映像之间的最小距离来证实这种情况不会发生.

周期性映像之间的最小距离多大, 何时出现? 在你的模拟过程中, 用于长程非键作用的截断距离是多少? 根据这一距离, 两个周期性映像之间允许的最近距离多大? 当最小距离小于截断距离时, 哪一非键能量项受影响最大, 为什么? 如果最小距离小于截断距离, 会发生什么情况? 你的模拟中是否出现了这种情况? 选择C-alpha组重新运行mindist, 结果有变化么? 对你的体系而言, 这意味着什么?

要注意小距离事件是不时出现还是持续出现. 如果持续出现, 很可能影响蛋白的动力学; 如果只是偶尔出现, 那基本没有影响.

不仅直接相互作用需要担心, 非直接效应, 即以水为媒介的间接相互作用也可能引起问题. 例如, 蛋白可以导致水在离其最近的四个溶剂化层中出现有序性, 这大约对应于1 nm的距离. 理想情况下, 最小距离不应该小于2 nm.

取决于某(些)原子质量与分子重心的关系, 可用于表征蛋白质结构的密实度. 作为QA的一部分, 我们将计算回旋半径, 它给出了每一时刻分子形状的信息, 可以与实测得的水动力学半径相比. 可以使用gyrate计算回旋半径, 这一程序将会给出回旋半径的各个分量, 对应于惯性矩阵的本征值. 这意味着第一个单独的分量对应于分子的最长轴, 最后一个对应于最短轴. 实际上, 三个轴的值给出了分子形状的整体描述,

查看回旋半径及其分量, 注意这些值如何达到平衡值.

回旋半径收敛了么? 如果是, 什么时候收敛, 收敛值为多少? 不同多肽模拟给出的回旋半径其涨落行为是否类似, 为什么? 你能将回旋半径的涨落与周期性映像的最小距离联系起来么?

除了能量等性质, 也能够通过结构的变化和弛豫来考察模拟趋向平衡的收敛性. 通常, 这种弛豫仅仅使用结构到参考结构(如晶体结构)的欧几里德距离来衡量. 这一距离被称为均方根偏差(RMSD). 然而, 我们也建议再考察一下到平均结构的弛豫, 即相对于平均结构的RMSD, 个中原因将在下节说明. 但是要计算相对于平均结构的RMSD, 需要首先获得平均结构. 平均结构可以在计算时顺便获得.

RMSF计算每个原子相对于其平均位置的涨落, 表征了结构的变化对时间的平均, 给出了蛋白各个区域柔性的表征, 对应于晶体学中的b因子(温度因子). 通常, 我们预期RMSF和温度因子类似, 这可以用于考察模拟结果是否与晶体结构符合. RMSF(和平均结构)使用rmsf命令计算. -oq选项可以计算b因子, 并将其添加到参考结构中. 我们最关心的是每个残基的涨落, 这可使用选项-res设定.

使用xmgrace查看RMSF的图形, 区分柔性和刚性区域.

确定最柔性区域的起始和终止残基编号, 给出其最大振幅. 比较不同多肽构象的结果. 是否有区别? 如果是, 哪个构象柔性最大, 哪个构象柔性最小?

为了对这些结果获得关联性的印象, 这里有个人类朊蛋白质1qlz的RMSF, 图中标示出了会导致CJD疾病的突变残基.

将两个pdb文件载入PyMOL, 根据b因子对结构bfactors.pdb进行着色, 并确定柔性区域. 平均结构是非物理结构. 查看下其中的一些侧链, 注意观察平均对构象的影响.

颜色分布在b因子值的范围内, 其中蓝色表示最小值(最稳定), 红色表示最高值(波动最大). 你可以通过截断最大值来调整颜色范围, 例如将其设置为350:

如果你很好奇, 可以再次计算b因子, 但这次使用每个原子的值:

在当前的PyMOL中载入新生成的bfactors-atom.pdb文件, 这样可以直接将其与残基平均的b因子相比较. 如果需要, 不要忘了重新调整颜色范围.

比较和对照两个b因子的结构.

以下图像显示的是根据模拟计算得到人类野生型UbcH8蛋白的b因子着色图. 蓝色对应低值, 红色对应高值.白色区域表示目前已知的能够反转蛋白质相互作用特征的残基. 在图像右侧, 你可以看到那些在螺旋2的前后环区有较高的b因子.第二个图像是螺旋2的前环的放大显示.

当心! 由于你的多肽可能会跳出盒子外, 我们必须处理轨迹, 将粒子重新置于中心的周期性映像中. 为此, 可使用下面的命令:

由于计算RMSF时也得到了平均结构, 我们现在可以计算. RMSD通常用于表征结构到平衡态的收敛情况. 如前面所讲, RMSD是结构变化对原子总数的平均, 基本上是一个距离表征, 低的值最有意义. RMSD可以用rms命令计算, 此命令可以实现对不同时刻不同分组的原子进行结构平均. 首先计算所有多肽原子的RMSD, 使用初始结构作为参考结构

如果观察到了, 在什么时间RMSD达到平台期, 平衡值多少?

再次计算, 但只考虑骨架原子:

这次的RMSD值更低, 这是由于计算时排除了通常更柔性的侧链原子, 在两种情形下. 两个RMSD都应该增大到一个平台值, 这意味着相对于参考结构, 多肽的结构达到了一定的距离, 然后或多或少保持在那个距离. 然而, 随着距离的增加, 可能的构象数目也在增加, 这意味着尽管RMSD达到了一个平台值, 但结构可能仍在趋近于其平衡态. 为此, 我们建议同时也检查趋向于平均结构的收敛情况.

与前面得到的图像进行比较. 注意在哪一点RMSD值开始趋平.

简要讨论下两个(相对于起始结构与相对于平均结构)图像的区别, 哪一个更能表征收敛情况?

到从为止, 我们完成了分析的第一部分, 包括可视化考察和质量确保检查. 现在该深入一点, 发掘一下蛋白质内部的情况. 分析的第二部分包括可根据多肽构象计算的结构性质, 例如氢键数量, 溶剂可及表面或特定的原子-原子间距离等.

结构分析: 构象派生的性质

  • 当提示选择时, 如果教程没有明确说明如何选择, 或者没有遵循教程自身的逻辑, 请选择蛋白Protein组.

确认模拟已经收敛到平衡态后, 就可以进行一些真正的分析了, 模拟数据的分析可以分为几种类型. 第一类包括对单个构象进行解释, 在每个时间点根据一些函数获得一个值或多个值. RMSD和回旋半径就是例子. 这样的性质, 可称为构象依赖或瞬时性质. 此外, 也可以在时域对过程进行分析, 例如, 通过对一段时间内的平均化得到(自)相关或涨落. 在本部分会进行一些常见的分析, 其中的每种分析都会得到直接由轨迹(随时间变化的坐标)导出的某个值的时间序列. 问题可以参考程序运行时的屏幕输出或图像.

氢键数目是一类信息丰富的性质, 无论是内部氢键(蛋白-蛋白)还是蛋白和周围溶剂之间的氢键. 氢键存在与否可以通过氢键施体-H-受体之间的距离和施体-H-受体之间角度来推断. hbond命令可计算模拟过程中分子间或组间的氢键数目以及氢键距离或角度的分布. 使用下面的命令, 然后查看得到的输出文件

讨论两种情形下氢键数目的关系, 每种情形下的氢键数目的波动情况.

特定的氢键可以使用包含待研究原子编号的索引文件来考察. 查看多肽前一半和后一半所涉及的氢键. 你必须看看confout.gro文件来检查残基编号并将多肽大致分为两半. 假定你的多肽含有14个残基, 其编号始于22终于35. 你想将它分为两部分, 22-28和29-35. 下面的第一个命令将在组选择菜单中创建两个新的条目, part_1part_2. 第二个命令是一个使用索引文件运行hbond的通用命令. 你可能想要看看N端和C端之间的氢键, 例如, 可以用来监测β发卡的形成.

注意, 你必须根据自己的多肽替换上面命令中的数字.

根据氢键分析, 你的多肽在模拟过程中是否形成类似β发卡的构象?

判定蛋白结构的最常用参数是指定二级结构元素, 如α螺旋, β片层. 能提供这一信息的一个程序是dssp, 但前提是你的电脑已经安装了dssp程序. 此程序并不是GROMACS发行的一部分, 但能够从获得. 下载后请解压,

GROMACS提供了一个dssp的接口, 可以计算轨迹中每帧的二级结构.

首先, 需要生成消除跳跃的轨迹

secondary-structure.xvg文件包含一个时间序列, 列出了每帧中与每一二级结构类型相关的残基数目. 更多的细节在.xpm文件中, 它使用颜色编码了每个残基在一段时间内的二级结构. .xpm文件可以使用类似Gimp的程序查看, 但可以使用GROMACS工具xpm2ps添加一些有用的元数据, 得到的结果可以使用gview查看, 或转换为pdf后使用xpdf或evine查看.

讨论二级结构的变化, 如果有的话. 比较不同蛋白二级结构的稳定性.

蛋白质骨架的phi和psi扭转角是两个洞察蛋白质结构特性的有用参数. phi对psi的绘图称为拉氏图, 该图中某些特定区域反映了蛋白二级结构元素或氨基酸的特性, 而(这些区域之外的)其他区域被认为是禁阻的(不可到达). phi/psi随时间的变化可以体现出结构的转变. 这些角度可以通过rama程序进行计算, 尽管结果有些粗略, 因为程序将所有角度都输出到单一的文件中. 若想研究单个残基, 可通过Linux程序grep将其从图中选出来.

此文件中包含了全部氨基酸的所有phi/psi角. 要抽取某个残基的角度, 例如LEU-24, 可键入

抽取每个残基(除边界外)的拉氏图, 并用xmgrace对其进行可视化, 描述它们的主要相似性与差别.

根据拉氏图, 讨论每个残基的构象稳定性.

动力学和时间平均性质的分析

每组学生模拟了一个从不同构象开始的多肽, 这样做的目的在于增加采样, 或者增加模拟能够覆盖的结构空间. 为了对轨迹和多肽构象性质有一个完整的观点, 我们必须将轨迹拼合到一起.

由于大多数操作/计算在执行时都需要一个拓扑文件, 为避免使用哪个文件, 从那个轨迹开始之类的问题, 请从下载你的多肽文件. 这一文件包含了多肽分子位于原始蛋白-多肽复合物中的直角坐标. 你也可以使用这一结构来计算相对于结合结构的结构相似性. 下载pdb文件后, 你必须将其转换为GROMACS的坐标文件(.gro), 这是教程中第一步骤的重复操作. 别忘了选择合适的力场和水模型, 尽管后一选择对分析并无影响.

这样, 使用新生成的这个文件来创建索引文件, 这样我们可以进行更多的选择. 在这一步, 与前面不同, 我们不需要指定任何特定的残基组, 因此, 我们简单地推出程序(键入q)

现在我们可以对我们新生成的轨迹进行截断, 使用trjconv去除前10 ns. -b选项设定要创建的新xtc文件的开始时间, 单位为ps, 这意味着我们需要新文件从10 ps开始. -dt选项指定我们要保留的时间精度. 当提示选择时, 选择Protein来生成xtc文件.

为什么我们只分析最后40 ns的轨迹?

下面的命令会输出一个单一的.xtc文件, 其中包含以下列顺序排列的四个轨迹, bound-helix-polypro-extended. 这一顺序很重要因为后面要进行比较, 因此需要特别注意. -settime选项指定在拼合轨迹时使用连续的时间, 这意味着首帧时间为10 ns的第二个轨迹, 会恰好放在第一个轨迹的后面50 ns处. 如果你忘记了这个选项, 所拼合的轨迹具有重复的时间戳(即每一轨迹的原点都是10 ns). 我们要选择选项congtinuec, 指示trjcat从前一轨迹的最后时间戳处开始新的轨迹.

我们在前面已经计算过RMSD, 并用其来检查模拟的收敛性, 但它也可以用于更进一步的分析. RMSD是两个结构之间的表征. 如果我们对轨迹文件中每一对结构的组合计算RMSD, 就可以看到是否有属于同一类型或具有相同特征的结构组. 属于同一组的结构其RMSD值较低, 而与其他组结构的RMSD值更高. 利用矩阵来表示RMSD值, 可以用于识别转变状态.

要建立RMSD矩阵, 可使用rms处理两条轨迹. 如果你要单独考虑组(簇)及其在不同轨迹之间的转变, 可以将所有的四条轨迹合并为一条, 再使用rms生成交叉RMSD矩阵. 所有的RMSD计算时, 选择主链组Mainchain.

得到的矩阵是灰阶图. 为了显示更清楚, 可以使用彩虹梯度图.

分析时为什么选择主链组? 你看到多少簇? 在不同的轨迹中, 你是否对相同构象进行了采样? 你是如何发现的? 什么是轨迹的重叠, 即对相同构象空间进行采样? 你能发现多少转变? 从这个分析你能得到什么结论? 这是你预期的结果么? 请证实你的观点.

基于结构间的距离RMSD, 可以将结构归并为反映构象可及性范围及其相对权重的一组组团簇. 这可以通过聚类算法来完成, cluster命令实现了一些聚类算法. 这一程序会生成好几个输出文件. 检查该程序的帮助文档, 了解每一个它们的含义, 然后运行程序. 注意, 我们已经计算了RMSD矩阵, 可以将它作为cluster的输入.

聚类算法使用的RMSD截断值为多大? 这一值代表什么, 如何影响得到的团簇数目? 共有多少团簇? 最大的两个其尺寸多大?

前两个团簇之间是否存在可觉察的差别?

采用RMSD比较结构的一个不足之处在于, 它包含了最小二乘叠合, 这会影响结果. 但是, 一个蛋白的结构也可以使用一系列的原子间距来表示. 这可以用于获得一个比较的表征量, 并且不依赖于叠合, 这就是距离RMSD(dRMSD). 可以利用rmsdist命令来计算dRMSD.

dRMSD何时收敛? 收敛值多大? 所得图像与标准RMSD相比有何区别? 查阅GROMACS手册, 看二者是如何计算的. 试着根据二者的计算方法解释你观察到的区别.

我们现在要回答构象采样的问题, 在我们的轨迹中, 我们是否对多肽的结合构象进行了采样? 为此, 我们要对多肽的结合构象再次运行rms. 我们可以使用合并的轨迹来进行这一分析, 而不是计算并生成四个不同的RMSD图形. 记住你生成的合并轨迹中构象的顺序, 这很重要. 当叠合计算RMSD值时, 选择主链Mainchain组.

如果在计算时我们包含整个蛋白(即所有原子), 而不是只选择主链Mainchain原子, 结果会有什么变化? RMSD和距离RMSD图形有区别么? 在不同轨迹中, 你是否对多肽的结合构象进行了采样? 对你研究的情况, 关于对蛋白多肽识别的构型采样假说你能得出什么结论?

本分析的最后一步是计算自由能形貌(FEL, free energy landscape), 它由不同多肽构象开始的轨迹采样所得. 除了看起来很酷以外, 它能显示出 在整个模拟过程中多肽所经历的自由能的谷和丘. 此外, 在对接计算中需要选择有代表性的结构时, FEL会变得更有意义.

FEL表示一个映射, 分子在模拟过程中所经历的所有可能构象到相应能量的映射. 典型的能量是Gibbs自由能. 正如你所想象的, 使用直角坐标来代表不同的构象是不合适的(你能想象4维形貌么?). 因此, FEL通常使用两个变量来表示, 它们反映了体系的特定性质, 并表征了构象变化. 例如你可以使用绕一根特定键的扭转角, 或分子的回旋半径, 或相对于天然状态的RMSD来作为这两个变量. 第三个变量是自由能, 可以从体系相对前面所选变量的分布(概率分布)来估计. 当使用三维表示时, 形貌图中的谷表示低自由能区域, 代表体系的亚稳定构象, 丘表示连接这些亚稳定状态的能量势垒.

FEL的计算可以使用GROMACS命令sham, 为了体验更好, 我们提供了一些额外的脚本将FEL载入Mathmatica(建议使用版本9), 并漂亮地显示出来. 此外, Mathmatica还可以用于识别形貌中的谷, 并确定哪些坐标匹配这些特定的状态. 利用这些信息可以追溯sham的输入, 用于提取轨迹中的时间帧, 进而得到代表性的结构.

我们将计算两个变量用于表示自由能. 为表示多肽的构象变化, 我们计算其回旋半径, 以及相对于平均结构的RMSD. 我们不使用天然状态, 因为那会破坏后面的对接模拟. 并且, 我们可以基于合并的轨迹计算这些变量. 计算FEL的一个前提是充分采样, 或者使用不同的初始速度重复进行长时间的模拟, 或者如在我们所做的, 从不同的构象开始进行模拟.

我们如何从MD轨迹中抽取代表性结构用于对接模拟? 给一个前面用来分析多肽构象变化的方法, 并说明这种方法可用于此目的.

因为FEL分析依赖于在多肽构象空间的充分采样, 并基于构象的分布进行Gibbs自由能估计, 我们需要准备新的轨迹文件(.xtc), 其中的帧数是我们到目前为止所用的十倍. 注意我们没有使用-dt选项. 对所有四条原始轨迹重复下面的步骤, 注意要更改名字.

使用和前面完全一样的做法合并高分辨率轨迹(当提示时间戳时选择ccontinue)

现在我们需要生成FEL计算所需的数据. 先计算合并轨迹的回旋半径Rg, 方法如前:

为计算相对于平均结构的RMSD, 首先必须重新计算整条轨迹的平均结构. 再次使用rmsf命令生成平均结构(-ox选项), 然后使用平均结构做参考, 利用rms计算RMSD, 方法如前. 当提示时, 对叠合和计算都选择蛋白Protein组.

sham命令需要一个文件, 其中包含多个列, 每一列代表不同的坐标. 为生成一个正确的输入文件, 我们使用Perl脚本sham.pl, 并将我们刚生成的两个xvg文件作为它的输入. Perl是一种很类似Python的编程语言. 这个脚本将两个文件作为输入, 并假定数据处于文件的列中. xvg文件的第一列通常是时间, 第二列是感兴趣的坐标. 与Python一样, Perl的计数也是从零开始, 因此选择列数时小心. 下载并执行下面的命令. 输出文件只是两个xvg文件的简单合并, 第一列代表时间, 第二列和第三列是特定时刻的Rg值和相对于平均结构的RMSD.

现在我们有了正确的sham输入文件, 可用于生成FEL. 如果你还记得, Gibbs自由能可以根据分布概率计算出来, 并且依赖于指定的温度. 使用sham的选项-tsham来指定正确的体系温度(如果你不记得这个值, 可检查成品模拟所用mdp文件中的值).

如果使用sham计算FEL时, 指定非常高的温度, 会出现什么情况?

sham的输出可以使用xpm2ps输出到ps文件, 再用pdf阅读器查看. 但是, 当选择代表性结构时这种二维等值线图帮助不大, 需要查看数据时也很麻烦. 为此, 我们准备了一个Mathmatica文件, 可用于FEL的2D或3D可视化和检查. 由于Mathmatica不支持xpm文件, 我们准备了一个Python脚本用于将任意的xpm文件转换为3列数据的文本文件, 这样更易操控. 你可以下载, 用它转换xpm文件

下载Mahmatica, 然后打开, 遵照其中说明, 更改开头的文件路径. 如果一切正常, 你可以看到类似下面的图像

查看FEL并找到其最小点(谷)的位置. 选择你认为具有代表性的一些最小点(5). 你可以通过在2D等值线图上右键点击, 选择Get Coordinates选项来获知对应的坐标. 之后, 当你在图像上移动鼠标时, 会显示每个特定点的坐标. 记录这些坐标, 然后返回原始的sham.pl脚本输出文件查找相应的时间戳. 使用sham生成FEL的过程涉及坐标的分格, 因此对原始值有所近似, 不要期待你能找到精确的对应值.

从FEL中选择你认为能代表多肽状态的五个点, 记下它们的坐标.

为了在150000行中查找特定的内容(尽管使用gedit的搜索选项很方便), 我们提供了一个搜索时间戳的. 可以使用它来得到5个时间戳. 你需要提供sham.pl的输出, 并给出两个坐标(顺序要正确). 下面是一个示例

如果你总是得到No timestamp found...这样的错误信息, 试着使用附近稍有区别的点, 或打开脚本增加变量nval的值到100或更大.

将代表性结构的时间帧与以前根据RMSD矩阵获得的相比, 这些代表性结构是否与结构簇相符?

一旦你有了5个点的时间戳, 你可以使用它们从合并的轨迹中抽取代表性结构. 下面的例子抽取45 ns时刻的结构:

在PyMOL中打开代表性结构以及结合结构, 并比较二者.

以下分析整理自泛素耦合酶教程, 用于说明操作过程, 但具体问题未必适用于前面的多肽-蛋白教程.

特定氢键可以用包含相应原子数量的索引文件来得出. 从分析1得出的RMSF及b-factors显示loops 2 和 3 (helix 2附近)值比较高. 实验数据也显示, loop 1可能在UbcH6 and UbcH8的多个行为中起了一定作用. 看看这些loop所包含的氢键连接. 第一个命令会在菜单中弹出3个新的条目去选择基团, 每个loop一个. 第二个命令是一个通用命令g_hbond, 需要一个索引文件. 你可能想看看每个loop里的氢键、loop1和loop2之间的氢键;例如, 某个特定的loop和蛋白质其他部分的氢键(为此可能需要修改索引文件)或者和水形成的氢键, 等…

除了氢键之外, 蛋白质不同的带电残基之间也常形成盐桥. 它对蛋白质的结构起着重要的稳定作用, 尤其是当它们处于憎水环境中时, 例如蛋白质核心. 但是盐桥也能在蛋白质暴露的表面形成, 这对于介导蛋白质的识别过程往往很重要. 残基间的盐桥分析可以用saltbr命令进行. 程序会输出一系列xvg文件, 给出-/-, +/-(最关注的)和+/+残基间的距离. 当需要时, 通过设置-sep选项, 这个程序可以为每对相反的带电残基产生一个输出文件, 这些残基位于轨迹中的某点, 彼此处于一定的截断距离范围内(这里是0.5 nm, 通过-t选项设置). 这将产生许多文件, 所以分析时最好建立一个单独的目录. 执行以下命令:

为了更清晰, 删除与钠离子和氯离子有关的文件:

看看以下残基之间的相互作用:

对于这些相互作用你有什么想法? 残基K60和D88高度保守, 仅仅将UbcH8中的残基D56突变为E56都会改变蛋白的相互作用方式. 其可能原因何在?

溶剂可及表面积(SAS)

这四个参数都可用sasa命令计算, 它还可以计算每个残基或原子一段时间内的平均SAS. 输键入下面的命令, 要计算SAS的组和输出组都选择蛋白Protein, 然后查看输出文件.

哪个残基是最容易被溶剂触及的?

原子间距离的分析和NOE

前面用到的rmsdist命令也可用于进一步的距离分析. 特别地, 为了解结构及其稳定性, 查看原子间的平均距离及其波动可能会有用处. 使用下面的命令对蛋白质中每对原子间的平均距离及其波动进行计算获得矩阵, 然后用上面的步骤重新着色, 并显示.png文件的结果(rmsmean.pngrmsdist.png).

简单地解释两个图像: rmsmean表示结构, rmsdist表示柔性/稳定性. 回想前面分析得到的信息并查看结构.

从实验角度看这些距离同样重要. 原子间距离的边界值可以由NMR实验推断——利用核的Overhauser效应(NOE)——这也是NMR结构计算间的主要推动力. 如果蛋白质模型正确, 这个预期得可以到的NOE信号可通过MD模拟来计算. 这些信号与距离密切相关, 特别是r-3和r-6权重的距离. 这些信号也可以用rmsdist计算.

模拟战, 最小的1/r3和1/r6平均距离为多少?

计算向量的弛豫计算及其自相关. 对蛋白质, 通常包括碳骨架N-H或侧链C-H向量. 这种自相关给出了向量能保持其方向多长时间的量度, 因而为表征可变性和稳定性提供了指示. 序参量是自相关的长程限制. 如果一个分子能够自由旋转, 序参量将不可避免地减小到零; 但在分子框架内(内部参考框架), 序参量常有一个明确的值, 这个值表明总体稳定性. 通过叠合蛋白质, 这个参考框架可以固定下来,

N-H序参量可以用chi命令计算. 这个程序可以写出一个.pdb文件, 把序参量加入了b因子列, 更容易查看. 该程序也计算J耦合参数, 并可以和NMR结果相比较, 或用于指导NMR实验.

看看.xvg文件中的序参量, 并用PyMOL查看.pdb文件, 根据b因子的值给残基着色.

记下起始与终止的残基, 具有最高序参量值的两个区域的平均值. 序参量与波动(RMSF)相比如何?

一个常用的, 但常常理解不深的分析方法是对轨迹进行主成分分析(PCA, PrincipalComponents Analysis). 这种方法有时候也称为本征动力学(ED, essential dynamics), 目的在于识别原子的大尺度集约运动, 从而揭示隐藏在原子波动后面的结构信息, 帮助确定哪些运动方式对蛋白质的整体动力学贡献最大.

在含有N个原子的体系中, 存在3N-6个可能的内部运动方式(另外6个自由度用来描述体系的外部整体的平动和转动). 在MD模拟中, 粒子的波动是互相关联的, 因为粒子彼此之间存在相互作用. 关联的程度有大有小, 但那些通过键直接相连或者彼此位置接近的粒子会产生显著的运动一致性. 粒子运动之间的相关性导致了体系总体波动的结构性, 对大分子而言, 这种结构常常与其功能或(生物)物理特性直接有关. 因此, 研究原子波动的结构性可以为了解这些大分子的行为提供有价值的洞见. 然而, 确实需要一定程度的线性代数方法和多元统计方面的知识才能来解释结果并认识到该方法的缺陷. 特别的, PCA的目标是用新的变量来描述原始数据, 这些新变量是原始变量的线性组合. 这也是PCA存在的最主要问题: 它仅仅使用原子运动间的线性关系来解释问题.

PCA的第一步是构建协方差矩阵, 它表征了每对原子之间原子运动的共线性程度. 协方差矩阵从定义上说是一个对称矩阵. 接着将这个矩阵对角化, 得到一个特征向量矩阵和特征值的对角矩阵. 每个特征向量描述了粒子的集约运动, 其中的向量值表示相应原子参与运动的程度. 通常, 体系中的大多数(>90%)运动是由10个以下的特征向量或主成分来描述的. 与特征向量相应的特征值等于以集约运动中的每个原子描述的波动的总和, 因此是与特征向量相关的总运动的一个度量, 可用于比较不同情况下蛋白质的可变性, 但对不同大小的蛋白质进行比较时, 就难以得到有意义的解释. 更多信息请参考Leach的9.14.

协方差分析会生成很多文件, 因此最好在一个新的目录中运行:

协方差矩阵的构建和对角化可使用covar命令. 键入下述命令进行分析:

对PCA, 我们主要关心蛋白质骨架上的原子, 因此提示时选择backbone组. 构建和对角化协方差矩阵可能需要一些时间.

协方差矩阵的维数多少? 特征值的总和多少?

现在, 看看covar.xpm文件中的协方差矩阵.

矩阵显示了原子间的协方差. 红色表示两个原子运动一致, 而蓝色表示它们彼此向相反的方向运动. 红色的深度表示波动振幅的大小. 对角线上的值对应于前面得到的RMSF图.

查看除端基外运动最剧烈的两个部分, 它们之间如何相对运动, 它们各自相对于蛋白的其他部分如何运动?

从协方差矩阵能得到一组组相关或反相关运动的原子, 从而可以将其集约运动重新写入总运动. 我们前面提到过, 特征值保存在eigenvalues.xvg文件中, 通过相应特征值表示出总波动.

使用文本编辑器查看eigenvalues.xvg文件, 计算头五个特征向量对总运动的百分比以及累积百分比.

典型地, 最初五个特征值将捕获主要运动, 这相当于>80%的总运动. 如果解释的总波动较低, 就说明没有明确的集约运动.

为了解特征值的实际意义, 可用anaeig命令作进一步的分析. 为了更近地看看前两个特征值, 键入以下命令

特征值对应于运动方向. 选项-extr沿着选定的特征值从轨迹中提取极端结构. 把这些结构导入PyMOL查看:

把 pdf 文件中的模型分开, 删除原始结构.

给模型着色. 特征值1中的极端结构显示为蓝-绿色而特征值2为黄-红色.

用PyMOL的align命令, 能画出表示两种构象差异的小条.

对特征值1而言, 极端结构之间的最大区别是什么? 对特征值2呢?

为了理解特征值的意义, 想象一下旅行推销员在欧洲城市间的移动. 这种移动可用地球坐标系统来说明, 对每个位置需要采用三个坐标. 虽然这样做没有问题, 但如果你只想解释推销员的移动, 这种方法不是最佳的. 因为理论上, 任何坐标系统都一样好, 我们可以定义一个新的坐标系统来解释推销员的移动. 实际上, 因为地球表面可以用二维空间代表, 我们只需要两个坐标而无须三个. 直观看来, 有人会以南北极(经度)和东西轴(维度)说明, 但也可以从移动中推断出轴. 比方说推销员在伦敦-雅典轴上走的最多, 这个轴可以作为第一个特征值; 第二个特征值与第一个正交. 用这种方式, 推销员在欧洲的每个位置就可以用在这两个特征值上的投影唯一地确定下来. 对它们的投影作图, 就可以显示出旅行路线. 沿着第一个坐标的极端投影对应于雷克雅未克(Reykjavik, 冰岛首都)和莫斯科, 即使它们实际上不在这个轴上.

蛋白质构象也和上面所述的一样. 你看到的极端投影并不一定对应于物理结构, 但是它们可以表征沿轴的运动和总的运动程度. 为了解蛋白质沿构象空间的移动, 我们可以画出特征值2对特征值1的投影图. 为此, 从两个.xvg文件中提取投影数据并且合并到文件ev1-vs-ev2.dat中. 注意’>’表示输出由屏幕重定向到一个文件中, 所以你看不到任何屏幕输出.

投影的形状如何? 它们相互依赖么(分布有所重叠)? 如果只对最后7.5 ns进行分析, 是否得到相同的特征向量(轴)? 使用最后5.0 ns呢?

}
  • Doctype作用?标准模式与兼容模式各有什么区别?
1、<!DOCTYPE>声明位于HTML文档中的第一行,处于<html>标签之前,告知浏览器的解析器用什么文档标准解析。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。
2、标准模式的排版和JS运行模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。
HTML5不基于SGML(标准通用标记语言),因此不需要对DTD(文档类型定义)进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运行)
区分HTML5,:DOCTYPE声明,新增的结构元素,功能元素等
  • 简述一下你对HTML语义化的理解?
语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析
没有CSS样式也能正常阅读文档
搜索引擎的爬虫依赖HTML标记来确定上下文和各个关键字的权重,有利于SEO
  • HTML5的离线存储怎么使用,工作原理解释一下?
在用户没有联网时,可以正常访问站点或应用;在联网的情况下,更新用户机器上的缓存文件。
原理:HTML5的离线存储是基于一个新建的.appchache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储下来。之后当网络处于离线状态时,浏览器会通过被离线存储的数据进行页面展示。
  • 浏览器是如何对HTML5的离线存储资源进行管理和加载的?
在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,浏览器会根据manifest文件的内容下载相应的资源并且进行离线存储。
如果已经访问过app,并且资源已经离线存储,浏览器会使用离线的资源加载页面,然后浏览器会对比新的manifest文件,如果文件没有发生改变,就不做任何操作,否则就会重新下载文件中的资源并进行离线存储。
离线的情况下,浏览器直接使用离线存储的资源。
cookie是网站为了标识用户身份而存储在用户本地终端上的数据(通常经过加密)
cookie数据始终在同源的http请求中携带(即使不需要),就会在浏览器和服务器间来回传递

localStorage存储持久数据,浏览器关闭后数据不丢失,除非主动删除数据
sessionStorage数据在当前浏览器窗口关闭后自动删除
cookie设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

搜索引擎的检索程序无法解读这种页面,不利于SEO
iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载
使用iframe之前需要考虑两个缺点。如果需要使用iframe,最好是通过JS
动态给iframe添加src属性值,可以绕开以上两个问题。
  • label的作用是什么?怎么用?
label标签定义表单控件间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上。
  • HTML5的form如何关闭自动完成功能?
  • 如何实现浏览器内多个标签页之间的通信?(阿里)
localStorage另一个浏览上下文中被添加、修改或删除时,它都会触发一个事件,通过监听事件,控制它的值来进行页面信息通信
  • WebSocket如何兼容低浏览器?(阿里)
  • 页面可见性可以有哪些用途?
通过visibilityState的值检测页面当前是否可见,以及打开页面的时间等
在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放
  • 如何在页面上实现一个圆形的可点击区域?
3、纯JS实现,需要求一个点在不在圆上简单算法、获取鼠标坐标等
  • 实现不使用border画出1px高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果。
  • 介绍一下标准CSS的盒子模型?低版本IE的盒子模型有什么不同?
  • CSS选择符有哪些?哪些属性可以继承?
  • CSS优先级如何计算?
优先级就近原则,同权重情况下样式定义最近者为准
载入样式以最后载入的定位为准
  • CSS3新增伪类有哪些?
  • 水平居中:给div设置一个宽度,然后添加margin: 0 auto属性
  • 让绝对定位的div居中
未知容器的宽高,利用transform属性
实际使用时应考虑兼容性
  • display有哪些值?说明它们的作用?
block块类型。默认宽度为父元素宽度,可设置宽高,换行显示。
none缺省值。像行内元素类型一样显示。
inline行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。
inline-block默认宽高为内容宽度,可以设置宽高,同行显示。
list-item像块类型元素一样显示,并添加样式列表标记。
table此元素会作为块级表格显示。
inherit规定应该从父元素继承display属性的值。
absolute生成绝对定位的元素,相对于值不为static的第一个父元素进行定位
fixed(老IE不支持)生成绝对定位的元素,相对于浏览器窗口进行定位
relative生成相对定位的元素,相对于其正常位置进行定位
static默认值。没有定位,元素出现在正常的流中(忽略toprightbottomleft声明)
  • CSS3有哪些新特性?
  • 请解释一下CSS3的flexbox(弹性盒布局模型),以及适用场景?
一个用于页面布局的全新CSS3功能,flexbox可以把列表放在同一个方向(从上到下,从左到右),并让列表能延伸到占用可用的空间。
较为复杂的布局还可以通过嵌套一个伸缩容器(flex container)来实现。
它的所有子元素自动称为容器成员,称为flex项目(flex item),简称项目
常规布局是基于块和内联流方向,而flex布局是基于flex-flow流,可以很方便地用来做居中,能对不同屏幕大小自适应。
  • 用纯CSS创建一个三角形的原理是什么?
把上、左、右三条边隐藏掉(颜色设为transparent
  • 如何设计一个满屏字布局?
下面的两个div分别宽50%
然后用float或者inline使其不换行即可
  • 如何实现CSS多列等高?
设置父容器超出隐藏overflow:hidden;,这样子父容器的高度还是它里面的列没有设定padding-bottom时的高度;
当它里面的任何一列高度增加,则父容器的高度被撑开到里面最高那一列的高度
其他比这列低的会用它们的padding-bottom补偿这部分的高度差
  • 经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么?常用hack技巧?
png24位的图片在IE6浏览器上出现背景,解决方案是做成png8
IE6双边距bug块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大
浮动IE产生的双倍距离
这种情况下IE会产生20px的距离,解决方案是在float的标签样式控制中加入_display:inline;将其转化为行内属性。(_这个符号只有IE6会识别)
渐进识别的方式,从总体中逐渐排除局部。
首先,巧妙地使用\9这一标记,将IE浏览器从所有情况中分离出来。
接着,再次使用+将IE8和IE7、IE6分离开来,这样IE8已经独立识别。
IE下可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;
解决方法:统一通过getAttribute()获取自定义属性

解决方法:(条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数

超链接访问过后hover样式不出现,被点击访问过的超链接样式不再具有hoveravtive
解决方法:改变CSS属性的排列顺序。

  • lili之间有看不见的空白间隔是什么原因引起的?有什么解决办法?
行框的排列会受到中间空白(回车/空格)等的影响,因为空格也属于字符,这些空白也会被应用样式,占据空间,所以会有间隔,把字符大小设为0,就没有空格。
  • 为什吗要初始化CSS样式?
浏览器有兼容问题,不同浏览器对有些标签的默认值不同,没有CSS初始化会出现浏览器之间的页面显示差异。

初始化样式会对SEO有一定的影响,尽量在影响最小的情况下进行初始化。

  • CSS里的visibility属性有个collapse属性值得作用?在不同浏览器下有什么区别?
对于普通元素visibility:collapse;会将元素完全隐藏,不占据页面布局空间,与display:none;表现相同。如果目标元素为tablevisibility:collapse;table隐藏,但是会占据页面布局空间。仅在Firefox下起作用,IE会显示元素,Chrome会将元素隐藏,但是占据空间。
如果元素float属性不是none,元素会脱离文档流,根据float属性值来显示。有浮动、绝对定位,inline-block属性的元素,margin不会和垂直方向上的其他元素margin折叠。
  • 对BFC规范(块级格式化上下文)的理解?
它是一个独立容器,决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。
一个页面是由多个Box组成,元素的类型和display属性,决定了这个Box的类型
不同类型的Box会参与不同的Formatting Context(决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染,也就是说BFC内部的元素和外部的元素不会相互影响。
权重的规则:标签的权重为1class的权重为10id的权重为100
  • 请解释一下为什么需要清除浮动?清除浮动的方法?
清除浮动是为了清除使用浮动元素产生的影响。
浮动的元素,高度会塌陷,而高度的塌陷使我们页面后面的布局不能正常显示。

2、父级div也一起浮动;
3、常规的使用一个class

SASS编译的时候,浮动元素的父级div定义伪类:after
1、displa:block;使生成的元素以块级元素显示,占满剩余空间;
2、height:0避免生成内容破坏原有布局的高度;
3、visibility:hidden;使生成的内容不可见,并允许可能被生成内容盖住的内容可以进行点击和交互;
4、通过content:"."生成内容作为最后一个元素,

通过分析发现,除了clear:both用来闭合浮动,其他代码都是为了隐藏content生成的内容,这也是其他版本的闭合浮动为什么有font-size:0line-height:0

外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。
合并后的外边距的高度等于两个发生合并的外边距的高度重的较大者
  • zoom:1的清除浮动原理?
zoom属性时IE浏览器的专有属性,它可以设置或检索对象的缩放比例。解决IE存在的bug
比如外边距的重叠,浮动清除,触发IE的hasLayout属性等

当设置了zoom的值后,所设置的元素就会扩大或缩小,高度宽度就会重新计算,一旦改变zoom值时也会发生重新渲染,运用这个原理解决IE中子元素浮动时父元素不随着自动扩大的问题。

目前非IE浏览器不支持这个属性,可以通过CSS3中的动画属性scale进行缩放。

  • 浏览器如何解析CSS选择器?
从关键选择器开始匹配,然后左移查找规则选择器祖先元素。
只要选择器的子树一直在工作,样式系统就会持续左移,直到和规则匹配,或因为不匹配而放弃规则。
margin用来隔开元素与元素的间距;
padding用来隔开元素与内容的间隔;
margin用于布局分开元素使元素与元素互不相干;
padding用于元素与内容之间的间隔,让内容与元素之间有一段距离
  • ::before:after中双冒号和单冒号有什么区别?解释一下这两个伪类的作用?
单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素。(伪元素由双冒号和伪元素组成)
双冒号是在当前规范中引入的,用于区分伪类和伪元素。
  • 如何修改Chrome记住密码后自动填充表单的黄色背景?

  • 设置元素浮动后,该元素的display值是多少?
  • 如何让Chrome支持小于12px的文字?
1、使用图片:如果是内容固定不变的情况下,使用将小于12px文字内容切出做图片,这样既兼容又美观。
2、使用12px字体大小样式设置,如果不考虑Chrome可以不用考虑兼容同时在设置小于12px对象设置-webkit-text-adjust:none,做到最大兼容考虑。
4、使用12px以上字体,重新考虑权重下兼容性。
  • 如何用CSS让页面的字体变得清晰,变细?
fixed的元素是相对整个页面固定位置,在屏幕上滑动只是在移动这个所谓的viewport
并不是IOS不支持fixed,只是fixed的元素不是相对手机屏幕固定的。
  • 手动写动画,最小时间间隔是多少?
多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔为1/60*1000ms=16.7ms
  • 什么是cookie隔离?(请求资源的时候不要让它携带cookie)
如果静态文件都放在主域名下,静态文件请求的时都带有cookie的数据提交给server,非常浪费流量。

因为cookie有域的限制,因此不能跨域提交请求,所以使用非主要域名的时候,请求头中就不会带有cookie数据。
这样可以降低请求头的大小,降低请求时间,从而达到降低整体请求延时的目的。

  • 介绍JS的基本数据类型
  • 介绍JS有哪些内置对象?
1、不在同一行声明多个变量
7、for循环必须使用大括号
8、if语句必须使用大括号
9、for-in循环中的变量,应该使用var关键字明确限定作用域,从而避免作用域污染
  • JS原型,原型链?有什么特点?
每个对象都会在其内部初始化一个属性,就是prototype(原型),当访问一个对象的属性时,如果这个对象内部不存在这个属性,就会去prototype里找这个属性,这个prototype又会有自己的prototype,如此反复,就是原型链的概念。

JS对象通过引用来传递,创建的每个新对象实体中并没有一份属于自己的原型副本。当修改原型时,与之相关的对象也会继承这一改变。

当需要一个属性时,JS引擎会先看当前对象中是否有这个属性,如果没有,就会查找它的prototype对象是否有这个属性,如此递推,一直检索到Object内建对象。

  • JS有几种类型的值?画一下内存图?

两种类型的区别:存储位置不同
原始数据类型直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
引用数据类型存储在堆中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;
引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解析器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

  • 如何将字符串转化为数字,例如12.3b
  • 如何将浮点数点左边的数每三位添加一个逗号,如转化为12,000,000.11
  • 如何实现数组的随机排序?

原型prototype机制或applycall方法去实现比较简单,建议使用构造函数与原型混合方式。

3、用function模拟参数构造函数来实现(用this关键字定义构造的上下文属性)
4、用工厂方式来创建(内置对象)
全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。
当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,直至全局函数,这种组织形式就是作用域链。
  • 谈谈对this对象的理解?
this总是指向函数的直接调用者;
如果有new关键字,this指向new出来的对象;
在事件中,this指向触发这个事件的对象,特殊的是IE中的attachEvent中的this总是指向全局对象window
它的功能是把对应的字符串解析成JS代码并运行;
应该避免使用eval,不安全,非常耗性能(2次,一次解析成JS语句,一次执行)
window对象是指浏览器打开的窗口
document对象时Document对象(HTML文档对象)的一个只读引用,window对象的一个属性。
null表示一个对象的值为
undefined表示一个变量声明了,但是没有初始化(赋值);

JS将未赋值的变量默认设为undefined
JS从来不会将变量设为null。它是用来标明某个用var声明的变量时没有值。

undefined:是一个表示的原始值或说表示缺少值,就是此处应该有一个值,但是还没有定义。

null:是一个对象(空对象,没有任何属性和方法)
作为函数的参数,表示该函数的参数不是对象;

写一个通用的事件侦听器函数
因为二进制里面没有数字3,导致出现超范围的radix赋值和不合法的进制解析,才会返回NaN
  • 什么是事件?IE与火狐的事件机制有什么区别?如何组织冒泡?
1、在网页中的某个操作,例如点击一个按钮就会产生一个事件,可以被JS侦测到的行为。
2、事件处理机制:IE是事件冒泡、Firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件;
  • 什么是闭包(closure),为什么要使用它?
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见方式是一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量;
利用闭包可以突破作用域链,将函数内部的变量和方法传递到外部。

1、函数内再嵌套函数;
2、内部函数可以引用外层的参数和变量;
3、参数和变量不会被垃圾回收机制回收

li节点的onclick事件都能正确的弹出当前被点击的li索引

执行sayNum()后,sayNum()闭包内部变量依旧存在,而闭包内部的函数的变量不会存在;
使得JS的垃圾回收机制GC不会收回sayNum()所占用的资源,因为sayNum()的内部函数的执行需要依赖sayNum()中的变量。这是对闭包作用的非常直白的描述。
  • JS代码中的use strict;有什么作用?使用它区别是什么?
use strict是一种ES6添加的(严格)运行模式,这种模式使得JS在更严格的条件下运行;

使JS编码更佳规范化的模式,消除JS语法的一些不合理、不严谨的地方,减少一些怪异行为。
默认支持的槽糕特性都会被禁用,比如不能使用with,也不能再意外的情况下给全局变量赋值;
全局变量的显示声明,函数必须声明在顶层,不允许再非函数代码块内声明函数,arguments.callee也不允许使用;
消除代码运行的一些不安全之处,保证代码运行的安全,限制函数中的arguments修改,严格模式下的eval函数的行为和非严格模式的也不相同。

提高编译器效率,增加运行速度;

  • 如何判断一个对象是否属于某个类?
  • 解释一下new操作符?
1、创建一个空对象,并且this变量引用该对象,同时还继承了该函数的原型;
2、属性和方法被加入到this引用的对象中;
3、新创建的对象由this所引用,并且最后隐式的返回this
  • JS中的hasOwnProperty函数,执行对象查找时不会去查找原型,详细解释一下?
JS中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。
此方法无法检查该对象的原型链中是否具有该属性;
该属性必须是对象本身的一个成员。
  • 说一下你对JSON的了解?
JSON是一种轻量级的数据交换格式。
它是基于JS的一个子集。数据格式简单,易于读写,占用带宽小

JSON字符串转换成JSON对象:

JSON对象转换成JSON字符串:
  • JS有哪些延迟加载的方式?
deferasync、动态创建DOM方式(用得最多)、按需异步加载JS
  • Ajax是什么?如何创建一个Ajax
异步:向服务器发送请求时,不必等待结果,而是可以同时做其他的事情,等到有了结果会自己根据设定进行后续操作;
与此同时,页面不会发生整体刷新,提供了用户体验。

1、创建XMLHTTPRequest对象,也就是创建一个异步调用对象;
2、创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息;
3、设置响应HTTP请求状态变化的函数;
5、获取异步调用返回的数据
6、使用JS和DOM实现局部刷新

  • Ajax解决浏览器缓存问题?
1、在ajax发送请求前添加
2、在ajax发送请求前添加
同步:不同进程为协同完成某项工作,在先后次序上调整(通过阻塞唤醒等方式)。

同步:浏览器访问服务器请求,页面刷新,重新发送请求,等待请求完成,页面刷新显示新内容,如此反复。
异步:浏览器访问服务器请求,操作页面,浏览器后端进行请求。等待请求完成,页面不刷新显示新内容。

  • AMDCMD规范的却别?
AMD异步模块定义,所有的模块将被异步加载,模块加载不影响后面语句运行。
所有依赖某些模块的语句都放置在回调函数中。

1、对于依赖的模块,AMD是提前执行,CMD是延迟执行。
2、CMD推崇依赖就近,AMD推崇依赖前置

  • DOM操作——添加、移除、移动、赋值、创建和查找节点?
2、添加、移除、替换、插入
  • 针对jQuery的优化方法?
基于class的选择器的性能相对于id选择器开销很大,因为需要遍历所有DOM元素。
  • 如何判断当前脚本运行在浏览器还是Node环境中?(阿里)
  • 哪些操作会造成内存泄漏?
垃圾回收器定义扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为0(没有其他对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象的内存即可回收。

setTimeout的第一个参数使用字符串而非函数,会引发内存泄漏。
闭包、控制台日志、循环(两个对象彼此引用,且彼此保留时,就会产生一个循环)

  • 用JS实现千位分隔符?
  • 使用JS实现获取文件扩展名?
  • webpack热更新实现原理?
2、页面首次打开后,服务端与客户端通过EventSource建立通信渠道,把下一次的hash返回前端
4、修改页面代码,webpack监听到文件修改后,开始编译,编译完成后发送build消息给客户端
5、客户端获取到hash,成功后客户端构造hot-update.jsscript链接,然互殴插入主文档
==判断,会在比较时进行类型转换
===判断(严格判断),比较时不进行隐式类型转换,类型不同就会返回false
网站重构:在不改变UI的情况下对网站进行优化,在扩展的同时保持一致的UI。

对传统的网站来说,重构通常是:
2、使网站前端兼容于现代浏览器
3、对于移动平台的优化
4、针对SEO进行优化

深层次的网站重构应该考虑:
3、严格按照规范编写代码
4、设计可扩展的API
5、代替旧有的框架、语言

1、压缩JS、CSS、image等前端资源(通常是由服务器来解决)
2、程序的性能优化(数据读写)
3、采用CDN来加速资源加载
5、HTTP服务器的文件缓存

  • 列举IE与其他浏览器不同的特性?
事件:触发事件的元素被认为是目标(target)。在IE中,目标包含在event对象的SRCElement属性;

获取字符代码:如果按键代表一个字符(shiftCtrlAlt除外),IE的keyCode会返回字符代码unicode,DOM中按键的代码和字符是分离的,要获取字符代码,需要使用charCode属性;

阻止某个事件的默认行为:IE中阻止某个事件的默认行为,必须将returnValue属性设置为false,火狐浏览器中需要调用preventDefault()方法。

  • 解析一下优雅降级和渐进增强?
优雅降级:Web站点在所有新式浏览器中都能正常工作,如果用户使用的是旧式浏览器,则代码会针对旧版本的IE进行降级处理,使之在旧式浏览器上以某种形式降级体验而不至于完全不能使用。

渐进增强:从被所有浏览器支持的基本能工开始,逐步地添加那些只有新版本浏览器才支持的功能,向页面增加不影响基础浏览器的额外样式和功能。当浏览器支持时,它们会自定地呈现出来并发挥作用。
例如:默认使用flash上传,但如果浏览器支持HTML5的文件上传功能,则使用HTML5实现更好的体验。

  • Web应用从服务器主动推送Data到客户端有哪些方式?
  • 谈一下Node的优点和缺点?
因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求;
因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好很多。
此外,与Node代理服务器交互的客户端代码是由JS语言编写,因此客户端和服务器端都用同一种语言编写。

Node是一个相对新的开源项目,所以不太稳定,总是一直在变,而且缺少足够多的第三方库支持。

  • 你使用过哪些前端性能优化的方法?
1、减少HTTP请求次数:CSS SpritesJSCSS源码压缩、控制图片大小;网页Gzip,CDN托管,data缓存,图片服务器
2、前端模板:JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
4、当需要设置的样式很多时,设置className而不是直接操作style
5、少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
6、避免使用CSS表达式,又称动态属性
7、图片预加载,将样式表放在顶部,将脚本放在底部,加上时间戳
8、避免在页面的主题布局中使用tabletable要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。

对普通的网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO读写。
向前端优化指的是,在不影响功能和体验的情况下,
能在浏览器执行的不在服务器端执行,
能在缓存服务器上直接返回的不要到应用服务器执行,
程序能直接取得的结果不要到外部取得,
本机内能取得的数据不要到远程取得,
内存能取到的不要到磁盘上取,
缓存中有得不要去数据库查询。

减少数据库操作,指的是减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让程序完成(例如join查询),
减少磁盘IO指尽量不适用文件系统作为缓存、减少读写文件次数等。

  • HTTP状态码有哪些?分别代表什么?
100-continue:继续,一般在发送post请求时,已发送http header之后服务器端将返回此信息表示确认,之后发送具体参数信息。
200-OK:正常返回信息
201-created:请求成功并且服务器创建了新的资源
202-Accepted:服务器已接受请求,但尚未处理

304-Not Modified:自从上次请求后,请求的网页未修改过
400-Bad Request:服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求

1**(信息类):表示接收到请求并且继续处理
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTML协议版本

2**(响应成功):表示动作被成功接收、理解和接受
200——表明该请求被成功地完成,所请求的资源发送回客户端
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求

3**(重定向类):为了完成指定的动作,必须接受进一步处理
300——请求的资源可在多处得到
301——本网页被永久性转移到另一个URL
302——请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的request
303——建议客户访问其他URL或访问方式
304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存,还可以继续使用。
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除

4**(客户端错误类):请求包含错误语法或不能正确执行
400——客户端请求有语法错误,不能被服务器所理解

401——请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用
HTTP 401.2——未授权:服务器配置问题导致登录失败
HTTP 401.4——未授权:授权被筛选器拒绝

403——禁止访问,服务器收到请求,但是拒绝提供服务
HTTP 403.1——禁止访问:禁止可执行访问
HTTP 403.2——禁止访问:禁止读访问
HTTP 403.3——禁止访问:禁止写访问
HTTP 403.7——禁止访问:要求客户证书
HTTP 403.8——禁止访问:禁止站点访问
HTTP 403.9——禁止访问:连接的用户过多
HTTP 403.12——禁止访问:映射器拒绝访问
HTTP 403.13——禁止访问:客户证书已被吊销
HTTP 403.15——禁止访问:客户访问许可过多
HTTP 403.16——禁止访问:客户证书不可信或者无效
HTTP 403.17——禁止访问:客户证书已经到期或者尚未生效

404——一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。
406——根据用户发送的Accept头,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源,且无进一步的参考地址
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求的资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有Range指示值,请求也不包含If-Rane请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求。

5**(服务端错误类):服务器不能正确执行一个正确的请求
HTTP 500——服务器遇到错误,无法完成请求

HTTP 503——由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常

  • 一个页面从输入URL到页面加载显示完成,这个过程发生了什么?(流程越详细越好)

1、浏览器会开启一个线程来处理这个请求,对URL分析判断如果是HTTP协议就按照Web方式来处理;
2、调用浏览器内核中的对应方法,比如webview 中的loadUrl方法;
3、通过DNS解析获取网址的IP地址,设置UA等信息发出第二个GET请求;
4、记性HTTP协议会话,客户端发送报头(请求报头);
6、进入部署好的后端应用,如PHP、Java、JavaScript、python等,找到对应的请求处理;
7、处理结束反馈报头,此处如果浏览器访问过,缓存上有对应资源,会与服务器最后修改时间对比,一致则返回304
8、浏览器开始下载HTML文档(响应报头,状态码200),同时是使用缓存;
9、文档树建立,根据标记请求所需要指定MIME类型的文件(比如css、js),同时设置了cookie
10、页面开始渲染DOM,JS根据DOM API操作DOM,执行事件绑定等,页面显示完成。

浏览器把请求的URL交给DNS域名解析,找到真实IP,向服务器发起请求;
服务器交给后台处理完成后返回数据,浏览器接收文件;
浏览器对加载到的资源进行语法解析,建立相应的内部数据结构;
载入解析好的资源文件,渲染页面显示内容。

}

我要回帖

更多关于 python运行不报错又无任何结果输出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信