为建模做准备的人脑结构连接矩阵

人脑代表了一个复杂的计算系统,它的功能和结构可以通过各种聚焦于脑组织和活动的独立属性的神经成像技术来测量。我们捕获组织的白质纤维扩散加权成像获得使用概率扩散束造影术。通过将纤维束造影的结果分割成更大的解剖单元,就有可能推断出系统这些部分之间的结构关系。该管道产生了一个结构连接矩阵,其中包含了所有区域之间连接强度的估计。然而,原始数据处理是复杂的,计算密集,并需要专家的质量控制,这可能会让在该领域经验较少的研究人员感到沮丧。因此,我们以一种便于建模和分析的形式提供了大脑结构连接矩阵,从而被广泛的科学家社区使用。该数据集包含大脑结构连接矩阵,以及潜在的原始扩散和结构数据,以及88名健康受试者的基本人口学数据。

1. 背景

磁共振成像技术(MRI)对人脑的研究已成为当代神经科学的重要研究方向之一。研究的关键问题之一是大脑不同区域间信息的整合。为了估计任意两个大脑区域之间的相互作用,MRI提供了几种不同的通用工具。从测量的大脑活动的时间序列,例如,使用功能磁共振成像,研究人员可以估计功能连接,即偏远区域活动的(无定向)统计依赖性,甚至试图估计有效连接,即一个大脑区域对另一个大脑区域的直接影响。然而,结构连接提供了另一块更基本的拼图,表示被考虑的神经群体之间携带物理信息的连接;典型的白质束包含轴突连接预先设定的灰质区域。

结构连通性通常是通过处理MRI弥散加权数据(DW-MRI,或DWI)来获得的。其关键原理是每个体素的图像是多次获取的,每个图像都对沿特定空间轴的扩散敏感。从这样一组图像中,可以估计出扩散首选方向的空间轮廓。这种估计可以推断给定体素中可能存在的白质纤维和方向,并将信息在空间上连接起来,生成连接大脑不同部位的初步白质束的模拟。由此产生的神经束图可以提供大脑内部结构连接的详细可视化,以及结构连接矩阵中任何预先设定的(灰质)大脑区域之间结构连接的存在和数量的定量信息。

结构连接矩阵表示大脑中信息传输的高速公路网络,因此已经得到了广泛的研究。一个核心问题是,结构连接在塑造大脑活动的动态方面所起的作用,特别是它与大脑区域活动之间的统计依赖模式的关系——功能连接矩阵。在早期有关大脑结构和功能连接的研究之后,研究结果的可变性以及理论建模和模拟都强调了其他因素在结构-功能关系中的作用。这一研究领域的重要性和丰丰性很快得到了认识,并激发了一系列进一步的努力,静态功能连接的建模进一步扩展到可靠地解释大脑活动动力学的三个方面:空间属性、时间动态和谱特征。然而,对健康大脑的功能连接进行建模并不是对大脑结构连接数据的唯一使用,它也越来越多地被用于对包括癫痫在内的大脑疾病动力学进行建模,以及对结构连接本身的更深层特征进行研究。因此,这是一个有前途和不断增长的研究领域,它要求在数据科学家和一般跨学科的研究人员可访问的水平上利用公开共享的数据。

然而,尽管最近有开放共享神经成像数据的运动,包括人类连接组项目(Human Connectome Project)这样的大型数据库,但现有的原始大型数据集数量有限,特别是在现成的预处理连接矩阵方面。事实上,在许多情况下,只有原始数据是共享的,并且从原始DWI数据生成结构连接矩阵是一个漫长的过程,需要专家知识和做出特定的选择。由于提供多个数据集以增加结果的可重复性和普遍性是很重要的,我们在这里提供了一个现成的数据集,不仅包括88个健康个体的原始扩散和结构数据,还包括派生的大脑结构连接矩阵。矩阵代表了广泛使用的自动解剖标记(AAL) atlas中定义的90个皮层感兴趣区域(ROI)之间的连接,其中矩阵的每个条目代表了从一个ROI(由一行给出)进入另一个ROI(由一列给出)的束线的比例。处理在图1中进行了高级描述,并在方法部分详细描述。

连接矩阵提供了作为一个单一的Matlab可读的文件和作为单独的制表符分隔的文本内。此外,原始的扩散和结构数据也可以与用于生成结构连通性矩阵的脚本管道一起使用。用户可以自由地生成结构连通性矩阵。最后,我们还分享了受试者的基本人口学和临床数据(性别、年龄、用手习惯、教育程度、体重、身高、BMI),以及按矩阵中使用的顺序列出的AAL roi列表。数据对应于一项关于精神分裂症早期变化的对照健康受试者队列,连接矩阵的一个子集已经被用于先前旨在建模嵌合体状态、半脑睡眠或癫痫动力学的建模研究。

2. 方法

2.1 被试

这里提供的数据是基于参与早期精神分裂症预后研究的88名健康对照者的核磁共振扫描(ESO是一项在布拉格和波西米亚中部监测区进行的前瞻性试验,调查首发精神分裂症谱系受试者)。这项研究是根据《赫尔辛基宣言》进行的。布拉格精神病学中心当地伦理委员会于2011年6月29日批准了该协议(协议代码69/11)。所有参与者都被告知研究的目的、实验程序,以及他们可以随时退出研究的事实,并在参与之前提供书面知情同意。实验对象通过当地广告招募,如果符合以下任何一个标准则被排除在外:根据迷你国际神经精神病学访谈(M.I.N.I.)建立的个人一生任何精神障碍或药物滥用史,任何一级或二级亲属的精神障碍,目前的神经障碍,一生癫痫发作史或伴有意识改变的头部损伤,颅内出血或神经后遗症,智力迟钝史,药物依赖史,以及任何核磁共振扫描禁忌。

共有88名受试者,其中女性48名,男性40名,平均年龄27.7岁(范围18-48岁),以右撇子为主(80名右撇子,6名左撇子,2N/A),最高学历:小学(n=1),高中(n=51),本科及以上学历(n=34),无资料(n=2)。具体受试者的临床资料见补充表1。

2.2 结构连接矩阵构建策略

结构连接矩阵的构建是基于扩散MRI数据的概率纤维束追踪生成的连接组。我们使用了广泛使用的AAL atlas (Automated anatomy Labeling atlas),版本ROI_MNI_v4中的ROI来定义连接矩阵:两个ROI之间的连接是基于束图中从一个ROI开始并在另一个ROI结束的流线的数量。要将AAL图谱roi精确映射到每个受试者的扩散数据空间,需要对构建神经束图的扩散空间和定义AAL roi的MNI空间(蒙特利尔神经学研究所空间)进行足够准确的映射。然而,由于T1结构图像比DWI数据更详细地反映解剖学,因此它们比DWI数据本身更适合于估计到MNI空间的映射。因此,映射的估计被实现为两个阶段的过程:结构T1图像到MNI空间的仿射映射和T1结构数据和DWI数据之间的刚体映射都是针对每个受试者的。此外,由于脑纤维束追踪是按照白质束设计的,不会在灰质中产生有意义的流线,因此必须对白质遮罩进行估计。在这里,我们利用了这样一个事实:尽管AAL是一个灰质图谱,但它的roi也可以延伸到白质,而发生这种情况的体素可以用于纤维束追踪。整个数据处理的示意图如图4所示。

图4 数据处理管道

2.3 数据采集

我们在布拉格临床和实验医学研究所使用3T Trio Siemens扫描仪(Erlangen, Germany)进行了核磁共振扫描。使用12通道头线圈,软件版本syngo MR B17。

DWI数据采用TR/TE = 8300/84 ms,矩阵112x128,体素大小2x2 x2mm³, b值0和900 s/mm²在30个扩散梯度方向,2个平均值,带宽1502 Hz/pixel, GRAPPA加速因子2在相位编码方向,参考线24,预扫描归一化,椭圆滤波,原始滤波强度为弱,采集时间为9:01。

采用磁化制备的快速采集梯度回波(MPRAGE)序列获取T1三维结构图像,(TI反演时间)TI/TR/TE=900/2300/4.63ms, 翻转角10,平均1,矩阵256x256x224,体素大小1x1x1mm³,带宽130 Hz/pixel, GRAPPA相位编码方向加速度因子2,参考线32,预扫描归一化on,椭圆滤波on,原始滤波off,采集时间5:30。

2.4 数据处理

  1. l 对DWI数据进行目视检查,以检查其质量。排除图像伪影过多的受试者。
  2. l 检查每个受试者的单个DWI卷。包含伪影(k空间尖峰、移动造成的信号空洞等)的卷被排除在进一步处理之外。
  3. l DWI数据采用FSL tools version 5.0.7进行预处理。利用FLIRT对运动和涡流畸变进行微调校正。为此使用了一个专用的dti_preprocess脚本,版本为1.8。
  4. l DWI图像采用FSL BET进行颅骨剥离。
  5. l 利用BEDPOSTX工具通过贝叶斯估计得到扩散参数。
  6. 2.5 将DWI空间注册为MNI模板空间

在使用SPM软件的社区中,术语空间标准化(或者标准化)通常用于指映射的估计和/或应用该映射的过程。在使用其他神经成像软件的社区中,注册这个术语更常用。

  • l T1图像采用FSL BET进行颅骨剥离。
  • l 使用FSL FLIRT工具将每个受试者的颅骨剥离结构T1图像注册到MNI空间。采用分辨率为2mm的 FSL T1 MNI模板对12自由度的仿射注册。
  • l 使用刚体变换(6自由度)对每位受试者的颅骨剥离T1和DWI图像进行注册。这就足够了,因为我们登记了同一对象的两个图像。注册由FSL epi_reg脚本执行,该脚本使用BBR (Boundary-Based registration)代价函数,结果表明该方法比单阶段方法更准确。
  • l 结合上述两步的变换矩阵,将AAL ROI掩模从标准MNI空间转换为每个被试的DWI空间。
  • l 转化的AAL掩模进一步受到白质掩模的限制。分别对受试者颅骨剥离T1图像进行FSL FAST分割得到,并进一步通过脑面罩对受试者DWI数据进行限制。这是因为T1图像的颅骨剥离必须是保守的,以防止排除真实的大脑部分,因此也包含一些非脑结构,可以通过DWI衍生的脑面罩去除。
  • 2.6 概率示踪和结构矩阵
  • l 使用PROBTRACKX估计的体素扩散参数进行概率束追踪。采用白质掩模对流线进行空间限制。特别是,对于每个AAL图谱ROI,使用带有默认参数的FSL命令probtrackx2生成5000条流线,从每个体素扩散到大脑的其他部分。
  • l 两个ROI之间的连接是通过在一个ROI(在其任何体素中)中植入进入另一个ROI的流线的数量来估计的。(“流线型”被计算在它访问的所有roi中。)位于小脑的AAL ROI未被使用,因此矩阵有90x90个元素。
  • l 通过种子ROI中的体素数量和每个体素的流线数量(5000)对连接矩阵进行归一化。这产生了一个连接概率矩阵其中每个元素都是通过从种子ROI中随机选择的流线到达目标ROI的概率估计(图1)。

图1 预处理管道和可视化

3. 数据记录

这些结构连接矩阵,以及以有序脚本形式复制它们所需的所有源数据和处理管道,都可以在开放科学框架(OSF)上公开获得:(https://doi.org/10.17605/OSF.IO/YW5VF)27,根据知识共享署名4.0国际许可协议。代码可用性部分提供了关于这些脚本的详细信息。SC矩阵如图2.

图2 平均结构连接

4. 技术验证

扩散数据的质量控制还没有标准化,在很大程度上依赖于按照预处理流水线的各个步骤进行目视检查。如上所述,我们确保了包含过多图像伪影的卷被丢弃,总体上,我们检查了处理的所有步骤,并采取了预防措施,以防止任何严重或系统性错误。在这里,我们提出了两种分析,以增加正确处理数据的可信度。为了进一步筛选某些被试处理过程中出现技术故障的可能性,我们将所有被试的SC矩阵进行关联,并生成了SC矩阵的相似性矩阵(图3A),在所有情况下,该相似性矩阵都实现了显著的相关性

相互相关性为我们的数据提供了内部一致性的证据;我们进一步提供与外部引用的比较。特别地,我们将我们的数据与从公开的示踪构建的结构连通性矩阵进行了比较。在这种情况下,采集设备、协议和示踪构建方法不同。然而,尽管存在这些技术差异,我们的数据与这个外部数据集的相关性平均为0.76(图3B)。

图3 结果验证

在技术验证的最后一部分,我们评估了所示SC矩阵的不对称性。由于我们对SC矩阵的构造没有以任何直接人为的方式强制它们的对称性,所以矩阵不是完全对称的。在建模应用中,通常只需计算Asym =(A+A’)/2(见例30)即可使SC矩阵对称,其中’表示矩阵的转置。可以认为,不对称包含一些可能有用的信息,但必须强调的是,它不携带任何关于白质纤维方向的信息因为矩阵主要来自非定向扩散张量数据。例如,当一个ROI x很大,并且与多个其他ROI相连,而另一个ROI y很小,并且几乎只与x相连时,不对称就会带来潜在的相关信息。在这种情况下,元素Ax,y将很小(流线分布到多个其他roi),元素Ay,x将接近1(大多数流线走向x)。

为了量化不对称程度,对于每个矩阵A,我们计算了asym(A)=||A-A’||/||A+A’||;其中||X||表示矩阵X的Frobenius范数。在这种情况下,对称矩阵将有asym(a)等于0。数据集中不对称测量的平均值为0.103(标准:0.007),数据的分布如图3所示。虽然矩阵不是完全对称的,但数据中对不对称的度量明显小于具有相同值分布的相同数量的随机矩阵

5. 使用说明

正如引言中提到的,结构连通性数据有广泛的研究用途。虽然,对于其中一些,专门的软件可能是有用的,我们确保有一个较低的门槛,因为结构连接矩阵可以直接使用,而不需要任何进一步的需求。因此,这些数据已经被完全预处理,并以可通过任意软件或脚本/编程语言加载的标签划定文本内件的形式保存。为了方便广大神经影像界人士使用Matlab,数据也可以方便地用Matlab加载,一举多得。数据使用的具体例子包括分析大脑结构网络的图论属性;为此,在其他工具中,Brain Connectivity Toolbox或BioImage Suite(用于创建图2)可能是一个有用的入口工具。另一个重要的例子是使用结构连接来模拟大脑活动的动力学和功能连接,要么通过主要集中于再现BOLD信号特征的质量模型,要么通过更详细的大规模模型。由于格式的简单和所呈现矩阵的相对直接的解释,创建的底层连接组无论对于过多的现有工具包或自定义编写的代码都不应该对建模人员构成挑战。除了进行新颖的分析外,我们鼓励研究人员尝试复制和扩展通过使用当前数据的(子集)或文献中的其他结果来报告的任何结果,这些结果使用相同的或其他方法派生的结构连通性数据来测试先前报告的分析和模拟结果的稳健性。对于结构脑连接矩阵的分析及其对大脑活动建模的使用,重要的是要记住使用弥散加权成像估计脑连接结构过程中一些固有的方法局限性和挑战。我们建议读者对这项进行详细的回顾,然而,在这里至少指出那些最相关的解释这样的事业的结果。第一点是,尽管标准方法获得的结构连接是有方向性的(即不对称的),但对这些连接方向的解释不是直接的,因此矩阵在使用前通常是对称的。我们在技术验证部分对这一点做了更多的评论。其次,由于白质束与其他束相互缠绕,追踪白质束路径的固有困难,在SC矩阵中,对侧半球之间的半球间连通性通常被低估。相反,基于束状图的估计结构连通性的方法往往会出现假阳性,因此可能需要对矩阵进行一些阈值化。

本文转载于网络 如有侵权请联系删除

相关文章

  • MATLAB-循环类型相关(for while break continue)

    MATLAB循环语句允许我们多次执行一个语句或语句组。在一般的情况下,程序中的语句都是按照顺序执行的,先从函数中的第一条语句开始执行,然后执行第二条并且依次类推。但是也会存在一种情况:需要多次执行代码块,怎么办?其实编程语言都提供了各种控制结构,允许更复杂的执行路径。下图是在大多数编程语言中的循环语句的一般形式:MATLAB提供以下类型的循环处理循环的要求。点击链接,查看个循环类型的细节:循环类型描述while循环一个给定的条件为真时重复语句或语句组。测试条件才执行循环体。for循环执行的语句序列多次缩写管理循环变量的代码。嵌套循环可以使用一个或多个环路内任何另一个循环。 MATLAB循环控制语句循环控制语句可以更改正常的执行顺序,当执行留下了范围,在该范围内所有自动创建的对象被销毁。MATLAB支持以下控制语句。点击相应链接,可以查看各语句应用。控制语句描述break语句终止循环语句,将执行的语句紧随循环。continue语句导致循环,跳过它的身体的其余部分,并立即重新再次测试前的状况。MATLABwhile循环MATLAB的while循环会重复执行while与end语句间的运算式,

  • EasyCVR接入设备开启音频后,视频无法正常播放是什么原因?

    EasyCVR是我们接入协议最广泛的视频管理平台,除了标准协议GB28181、RTSP/Onvif、RTMP等,还支持厂家的私有协议与SDK,如海康Ehome、海康SDK、大华SDK等。平台支持海量视频汇聚与管理,基于云边端一体化架构,具有强大的数据接入、处理及分发能力,在功能上,可提供视频直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、智能分析等。我们在测试时发现,EasyCVR的接入设备开启音频后,出现了无法播放的情况,于是对此进行了排查。排查中分析原因,是由于程序没有解析设备传过来的音频数据。添加如下参考代码,设置通道音频参数,传递给设备播放,之后在设备发过来的回调数据中,解析出具体的音视频数据,再进行转码播放即可。multi:=utils.Conf().Section("ehome").Key("enable_realplay_multi_port").MustInt(0) ifmulti==0{ enableEHomeChannel(channel,devID,1,false) returnenableEHo

  • 亿点点调用 = 一点点费用

    什么服务,能够在短时间内支持亿级调用,但只需要一点费用?2021年春节期间频频冲上热搜的自定义「红包封面」可谓令人印象深刻,许多商家和用户爆发创意,让红包封面充满新意与心意。看看这直冲云霄的热度,图源:微信指数、微博从冲上云霄的微信指数和热门话题可以感受到,大家都在积极地创作或领取红包封面。特别是「制作我的红包封面」限时活动,将活动推向了巨大的参与和调用高峰。 看到这里,开发同学可能会心头一紧:亿级流量同时涌入一个系统,对系统的稳定性、可用性和安全性都将是极大的挑战!这是其中一个云函数的调用情况那么,技术团队是如何hold住的呢?答案是:除了稳固的架构设计,微信红包封面团队还与云开发团队合作,为创作者流畅地制作红包封面保驾护航。简单来说,选用云开发作为活动保障,出于三个原因:一、无需部署即开即用:省事在云开发模式下,不需要为了应对高并发而提前部署大量资源,极简架构,即开即用。全程可以享受微信私有链路免鉴权云调用微信开放接口的能力。二、弹性扩缩按量付费:省钱利用云开发自带的弹性扩缩容特性,避免了传统模式下扩容所产生的资源和人力成本。同时,业务服务可以按照自身资源使用情况进行付费,用多少付

  • 敏捷史话(十):我牺牲了滑雪时间,参加了一场软件革命——Jon Kern

    “在镜头定格的一刹那,所有美好都和你不期而遇”,这是JonKern对生活的表达。为了更好地记录生活,他在一家名为flickr的网站上创建了一个属于自己的照片博客,在这个博客里,Jon上传了各种随手拍下的照片,拍摄的对象可能是一艘满载的渡轮,可能是一对长得像警卫的消防栓,也可能是倒映在水面的一只蜥蜴……Jon不仅在生活中习惯于观察、欣赏身边的小细节,同样在工作中也习惯于从细节入手,推动业务成功。忽略他身上的耀眼光环,你会重新认识JonKern。一、“初识软件开发”20世纪60年代末,“软件危机”出现之后,人们开始思考:如何满足不断增长的需求,以及如何维护数量不断膨胀的软件产品。这之后的几十年间,快速原型、增量等模型不断涌现,推动软件行业不断向前发展。也正是在这一激烈动荡的时期中,JonKern发现了一个未知的世界,带着对这个世界的好奇,他开始踏足软件开发领域。1981年,Jon顺利地从俄亥俄州立大学毕业,获得了航空工程学士学位。带着初入社会的兴奋与激情,他以一名项目工程师的身份进入海军航空推进中心工作,在推进中心,Jon的工作内容主要是巡航导弹喷气发动机的高级研发测试。这段时间里,Jon

  • C++核心准则​NL.15:谨慎使用空格

    NL.15:UsespacessparinglyNL.15:谨慎使用空格Reason(原因)Toomuchspacemakesthetextlargeranddistracts.太多的空格会使文本变长并分散注意力。Example,bad(反面示例)#include<map> intmain(intargc,char*argv[]) { //... } 复制Example(示例) #include<map> intmain(intargc,char*argv[]) { //... } 复制Note(注意) SomeIDEshavetheirownopinionsandadddistractingspace.一些IDE有自己的见解,并会增加分散注意力的空格。Thisisarecommendationforwhenyouhavenoconstraintsorbetterideas.Thisrulewasaddedaftermanyrequestsforguidance.当您没有约束或更好的做法时,考虑这个建议。此规则可以作为许多准则之外的附加要求。Note(注意)

  • RoIPooling与RoIAlign的区别

    一、RoIPooling与RoIAlign1.1、RoIPoolingRolPooling可以使生成的候选框regionproposal映射产生固定大小的featuremap,先贴出一张图,接着通过这图解释RoiPooling的工作原理。Convlayers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800*800,最后一层特征图featuremap大小:25*25   假定原图中有一regionproposal,大小为665*665,这样,映射到特征图中的大小:665/32=20.78,即20.78*20.78,如果你看过Caffe的RoiPooling的C++源码,在计算的时候会进行取整操作,于是,进行所谓的第一次量化,即映射的特征图大小为20*20   假定pooled_w=7,pooled_h=7,即pooling后固定成7*7大小的特征图,所以,将上面在featuremap上映射的20*20的regionproposal划分成49个同等大小的小区域,每个小区域的大小20/7=2.86,即2.86*2.86,此时,进行第

  • Snort安装与使用 as3+apach

    系统环境:rhas3+apache+php+snort+base 所需snort相关软件包: adodb462.tgz base-1.2.6.tar.gz Image_Canvas-0.3.0.tar.gz //Image_Color-1.0.2.tar.gz Image_Graph-0.7.2.tar.gz libpcap-0.9.5.tar.gz pcre-6.7.tar.gz snort-2.6.0.tar.gz snortrules-pr-2.4.tar.gz下载软件: wgethttp://download.sso.cn/security/ids/snort_base/adodb462.tgz wgethttp://download.sso.cn/security/ids/snort_base/base-1.2.6.tar.gz wgethttp://download.sso.cn/security/ids/snort_base/Image_Canvas-0.3.0.tar.gz wgethttp://download.sso.cn/security/ids/snort_ba

  • Linux profile1,bashrc,.bash_profile,.bash_login,.profile,.bashrc,.bash_logout浅析 Part1

    profile,bashrc,.bash_profile,.bash_login,.profile,.bashrc,.bash_logout浅析Part1by:授客(CentOS-6.0-x86_64-bin-DVD1.iso为例)1、普通用户[root@localhosthome]#useraddtest[root@localhosthome]#passwdtest...passwd:allauthenticationtokensupdatedsuccessfully.[test@localhost~]$cd/home/test[test@localhost~]$ll-atotal28...-rw-r--r--.1testtest18May302011.bash_logout-rw-r--r--.1testtest176May302011.bash_profile-rw-r--r--.1testtest124May302011.bashrc...可见用户主目录/home/username/目录下包含了以上3个文件(及其它本文不关注的文件)#查看.bash_profile文件[root

  • 认证鉴权与API权限控制在微服务架构中的设计与实现:授权码模式

    引言:之前系列文章《认证鉴权与API权限控制在微服务架构中的设计与实现》,前面文章已经将认证鉴权与API权限控制的流程和主要细节讲解完。由于有些同学想了解下授权码模式,本文特地补充讲解。授权码类型介绍授权码类型(authorizationcode)通过重定向的方式让资源所有者直接与授权服务器进行交互来进行授权,避免了资源所有者信息泄漏给客户端,是功能最完整、流程最严密的授权类型,但是需要客户端必须能与资源所有者的代理(通常是Web浏览器)进行交互,和可从授权服务器中接受请求(重定向给予授权码),授权流程如下:+----------+ |Resource| |Owner| || +----------+ ^ | (B) +----|-----+ClientIdentifier+---------------+ |-+----(A)--&RedirectionURI---->|| |User-||Authorization| |Agent-+----(B)--Userauthenticates--->|Server| |||| |-+----(C)--Authoriza

  • 网络协议 21 - RPC 协议(中)- 基于 JSON 的 RESTful 接口协议

        上一节我们了解了基于XML的SOAP协议,SOAP的S是啥意思来着?是Simple,但是好像一点儿都不简单啊!传输协议问题    对于SOAP来讲,比如我创建一个订单,用POST,在XML里面写明动作是CreateOrder;删除一个订单,还是用POST,在XML里面写明了动作是DeleteOrder。其实创建订单完全可以使用POST动作,然后在XML里面放一个订单的信息就可以了,而删除用DELETE动作,然后在XML里面放一个订单的ID就可以了。    于是上面的那个SOAP就变成下面这个简单的模样。POST/purchaseOrderHTTP/1.1 Host:www.cnblog.com Content-Type:application/xml;charset=utf-8 Content-Length:nnn <?xmlversion="1.0"?> <order> <date>2018-07-01</date> <className>板栗焖鸡</className> <p

  • TCP IP基础知识

    TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层。如下图所示两台计算机通过TCP/IP协议通讯的过程如下所示传输层及其以下的机制由内核提供,应用层由用户进程提供,应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示:不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。上图对应两台计算机在同一网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器,如下图所示:其实在链路层之下还有物理层,指的是电信号的传递方式,比如现在以太网通用的网线(双绞线)、早期以太网采用的的同

  • Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广。因其效率高开发迅速的优势,快速进入编程语言排行榜前几名。本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结。希望大家能够快速入门并学习Python这门语言。 本文是在前一部分Python基础之上Python实战:Python爬虫学习教程,获取电影排行榜,再次升级的Python网页爬虫实战课程。1.项目概述。利用XPath和requests模块进行网页抓取与分析,达到网页图片下载的效果。抓爬图片地址:http://www.2cto.com/meinv/开发环境:python2.7、PyCharm5Community所需知识:神器XPath、Requests模块、Python基本语法。2.所需模块介绍及安装Xpath介绍:XPath其实是一门可以在XML中通过元素的属性进行查找提取信息的一门语言。它支持HTML。与正则表达式相比,更简单。更强大安装:下载lxml库进行安装操作。下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml。下载对应版本的lxml打开库目录运行命令进行

  • 工作经历教给我的一些东西

    扯了一大堆差一点以为找不回了。。。草稿的位置真的不太合理。希望能够做一些调整。VIM必须把这个放在最前面,我曾经以为我永远无法掌握这个上古神器,但现在我做到了!在LearnVimProgressively中提出了Vim学习中可以参考的四个阶段:生存适应成长超神(渣翻译求原谅。。。)目前我应该在第3阶段,而之前是一直在1和2之间挣扎。怎么敢说适应Vim了呢?非常简单。还记得前些天,刚离职后回到家里打开xcode,我打出的第一段代码大概是这样的:/gaga<Enter>cwgugu<Esc>ogejigejigejigejigeji......(尽管当时最困惑的是hjkl的表现(笑...),但这里没有用它举例。因为如果你回到别的编辑器第一次打出来的是jjjjjllllllllligaga这种东西的话,那很可能还没有适应Vim,因为通常情况来说hjkl移动的效率都不怎么高)然后打到一半发现不对,楞了一下之后,我就知道我可以跟别人说我会用Vim了。。。学校里没有公司这种环境强迫我去使用Vim,之前自以为的高强度也不过是小打小闹,所谓的长时间不过是最长一星期每天摸上两三个

  • python 导出到excel ,打开excel有错误

    python导出到excel,打开excel有错误,错误的提示为:发现“***”中的部分内容问题,是否让我们尽量尝试修复?如果您信任此工作簿的源,请单击“是”。 解决办法为:#writer.save()writer.close() 注释掉第一行的语句,发现成功解决掉问题了!参考文章:https://blog.csdn.net/MarrtenBird/article/details/118157708 风雨兼程,前程可待!

  • 叠纸游戏——游戏服务器开发一、二——已OC

    笔试 细节记不清了,好像有道二叉树中序前序输出后序的题目。 一面(两项目组的面试官一起面35min) 第一个面试官的问题: 你的STL项目大致说说 你做这个STL是为什么 有参加过ACM竞赛吗 有看过侯捷其他一些书吗 你还看过哪些书 《UNIX网络编程》和《UNIX环境高级编程》看过吗? 说下你的WebServer项目 关于你的GET和POST是调用第三方库来处理吗 为什么不用CGI 同步异步日志系统是怎么实现的 Linux和MySQL都了解吗 第二个面试官问的问题: 为什么STL用C++98写的 如何用模板在编译期就求出斐波那契第10项的值? 好难。乱说给说对了。特化取值为0和1的模板,之后不断递归调用模板的成员这样子。 萃取器是怎么实现的 vector获取了begin迭代器,插入元素后迭代器会失效吗?map,list,unordered_map呢 二维连连看,0代表可通行,给你查询,问你能不能通过最多两次拐弯,这两个数是可达的 两个项目组介绍: 一个是有大IP的开放世界项目组,具体的玩法还是需要保密;另

  • splay

    #include<bits/stdc++.h> usingnamespacestd; constintmaxn=1000010; inlineintqread(){ registerintx=0,ch=getchar(),flag=0; while(!isdigit(ch))flag=ch=='-',ch=getchar(); while(isdigit(ch))x=(x<<3)+(x<<1)+ch-48,ch=getchar(); returnflag?-x:x; } intn,m; intf[maxn],ch[maxn][2],size[maxn],rev[maxn],rt; inlinevoidpushup(intx){ size[x]=size[ch[x][0]]+size[ch[x][1]]+1; } voidpushdown(intx){ if(rev[x]){ swap(ch[x][0],ch[x][1]); rev[ch[x][0]]^=1; rev[ch[x][1]]^=1; rev[x]=0; } } voidrotate(int

  • redis

    以前工作中使用过redis,但是一般是存key,value,而value里我们通常存一个Json,取出后再解析Json获得相应的信息,还有一些在服务器上的redis查询操作,用来检查一些数据是否异常,当然也可以做成webservice,在本地调。redis是一种nosql类型的内存存储方式,工作时用的存String,取出后再解析回JsonObject。需要注意的是redis存储的内容不要无限增大,或者预估好使用空间,注意编写对应的删除方式,清理掉不需要的。一般作为消息队列(MQ)中间层的存储方式,或者存储一些高频使用,读取速度要求很快的(实时方法里redis内容作为重要参数时),使用redis。 下面是一些资料的整理,直接上链接了。 redis文档(中文) http://redisdoc.com/ redis单机安装 http://my.oschina.net/jackieyeah/blog/524583 redis目前提供四种数据类型:string,list,set及zset(sortedset)和Hash。 string是最简单的类型,你可以理解成与Memcached一模一个的类

  • libpng+VS2012(VS2015)的使用

     OpenCV保存PNG图像底层调用的就是libpng库,简要说一下libPNG库的单独使用。 1.首先需要下载两个库,一个是libpng,一个是zlib libpng库下载地址:http://www.libpng.org/pub/png/libpng.html zlib库下载地址:http://www.zlib.net/ 2.将两个库下载后解压到同一个文件目录下,如图: 3.打开libpng库文件目录:\lpng1632\projects\vstudio中,用记事本打开zlib.props配置文件,对应修改zlib库的版本并保存,如下图,我用的是zlib-1.2.11 4.打开同目录下的vstudio解决方案,然后直接在debug或者release模式编译,win32或者x64均可。我用VS2012编译没有任何异常,全部成功,VS2015出现一些错误提示,但是不影响lib库的生成.   5.编译后得到的lib库和dll文件分别在同目录的Debug和Release文件中,x64下编译会在x64文件中。我们需要的是其中的libpng16.lib,libpng16.

  • 【大数据开发工程师】面试——Sqoop、Canal、Maxwell

    sqoop主要用来做离线任务,每天定时执行脚本。 canal和maxwell主要用来做实时任务或拉链表,实时监控表的变化。 Sqoop 项目经验 Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。在导出数据时采用--input-null-string和--input-null-non-string两个参数。导入数据时采用--null-string和--null-non-string。 canal 原理:伪装成mysqlmaster的从机。拷贝binlog的内容到本机。 MySQL主从复制过程 Master主库将改变记录,写到二进制日志(binarylog)中  Slave从库向mysqlmaster发送dump协议,将master主库的binarylogevents拷贝到它的中继日志(relaylog); Slave从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。 maxwell 抓取msql变化的原理也是基于binlog,但是它只有一个server把数据发送到消息队列或redis。 &n

  • SSO单点登录

    1、五一完成

  • python在图像上画线

    python代码 importmath importos importsympyassy importnumpyasnp importcv2 fromosgeoimportgdal defPolar2Cartesian(theata): """ 极坐标转直角坐标系 :return:斜率 """ pi=3.14 radian=pi*theata/180 returnmath.tan(radian) defPainter(ori,theta): """ painterapicture :paramori:originimage :paramtheta:θ :return:img """ width,height=ori.shape[0],ori.shape[1] img=np.zeros((height,width)) slope=Polar2Cartesian(theta) iftheta<90: min_offset=int(0-slope*width) max_offset=height-1 else: min_offset=1 max_offset=2*height-in

相关推荐

推荐阅读