精华内容
下载资源
问答
  • 本文主要介绍使用ovirt必知的相关概念:Hypervisor、KVM、QEMU、libvirt、gluster、patternfly、ansible、VDSM、远程桌面协议、磁盘类型、存储结构、Cockpit、FQDN等等

    作者专注于Java、架构、Linux、小程序、爬虫、自动化等技术。 工作期间含泪整理出一些资料,微信搜索【程序员高手之路】,回复 【java】【黑客】【爬虫】【小程序】【面试】等关键字免费获取资料。技术交流、项目合作可私聊。

    目录

    前言

    一、Hypervisor、KVM、QEMU的简单介绍

    1.1 Hypervisor

    1.2 KVM

    1.3 QEMU

    1.4 QEMU-KVM

    二、Libvirt的简单介绍

    三、Gluster的简单介绍

    四、Patternfly的简单介绍

    五、Ansible的简单介绍

    六、VDSM的简单介绍

    七、远程桌面协议(VNC/SPICE/RDP)

    八、ovirt的磁盘类型

    8.1.IDE

    8.2.virtio(virtio-blk)

    8.3.virtio-scsi

    九、qemu的磁盘格式

    9.1.raw

    9.2.qcow2

    10、常见三种存储方式DAS、NAS、SAN的架构

    10.1 存储的分类

    10.2 DAS存储 

    10.3 NAS存储

    10.4 SAN存储 

    11、Cockpit的简单介绍

    12、FQDN的简单介绍


    前言

    oVirt(Open Virtualization Manager)是一款免费开源虚拟化软件,是RedHat商业版本虚拟化软件RHEV的开源版本。

    oVirt基于kvm,并整合使用了libvirt、gluster、patternfly、ansible等一系列优秀的开源软件。

    oVirt的定位是替代vmware vsphere(https://docs.vmware.com/cn/VMware-vSphere/index.html),oVirt目前已经成为了企业虚拟化环境可选的解决方案,另外相比OpenStack的庞大和复杂,oVirt在企业私有云建设中具备部署和维护使用简单的优势。利用oVirt管理KVM虚拟机和网络,企业可以快速的搭建起一个私有云环境。从这一点看来,oVirt的定位和另一个知名云计算项目OpenStack的定位是有些类似的。

    ovirt部署架构:

    ovirt组件架构:

    本文主要介绍使用ovirt必知的相关概念:Hypervisor、KVM、QEMU、libvirt、gluster、patternfly、ansible、VDSM、VNC/SPICE/RDP等等,具体细节内容,请点击最下方的参考文献链接。

    一、Hypervisor、KVM、QEMU的简单介绍

    1.1 Hypervisor

    一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统,可以协调访问服务器上的所有物理设备和虚拟机,所以又称为虚拟机监视器(Virtual Machine Monitor, VMM)。hypervisor是所有虚拟化技术的核心,非中断的支持多工作负载迁移是hypervisor的基本功能。当服务器启动并执行Hypervisor时,会给每一台虚拟机分配适量的内存,cpu,网络和磁盘资源,并且加载所有虚拟机的客户操作系统。

    Hypervisor之于操作系统类似于操作系统之于进程。它们为执行提供独立的虚拟硬件平台,而虚拟硬件平台反过来又提供对底层机器的虚拟的完整访问。但并不是所有 hypervisor 都是一样的,这是件好事,因为 Linux 就是以灵活性和选择性著称。

    虚拟化就是通过某种方式隐藏底层物理硬件的过程,从而让多个操作系统可以透明地使用和共享它。这种架构的另一个更常见的名称是平台虚拟化。在典型的分层架构中,提供平台虚拟化的层称为 hypervisor 。来宾操作系统称为虚拟机(VM),因为对这些 VM 而言,硬件是专门针对它们虚拟化的。

    常见的Hypervisor分两类:

    Type-I(裸金属型)指VMM直接运作在裸机上,使用和管理底层的硬件资源,Guest OS对真实硬件资源的访问都要通过VMM来完成,作为底层硬件的直接操作者,VMM拥有硬件的驱动程序。

    Type-II型(宿主型)指VMM之下还有一层宿主操作系统,由于Guest OS对硬件的访问必须经过宿主操作系统,因而带来了额外的性能开销,但可充分利用宿主操作系统提供的设备驱动和底层服务来进行内存管理、进程调度和资源管理等。

    1.2 KVM

    KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。

    KVM是嵌入在Linux操作系统标准内核中的一个虚拟化模块,它能够将一个Linux标准内核转换成为一个VMM,嵌有KVM模块的Linux标准内核可以支持通过kvm tools来进行加载的GuestOS。所以在这样的操作系统平台下,计算机物理硬件层上直接就是VMM虚拟化层,而没有独立出来的HostOS操作系统层。在这样的环境中HostOS就是一个VMM。

    每个由KVM创建的GuestOS都是HostOS(或VMM)上的一个单个进程。而在GuestOS上的User-space中运行的Applications可以理解为就是进程中的线程。

    KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术),是基于硬件的完全虚拟化。

    1.3 QEMU

    QEMU是一个主机上的VMM,通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。通过这种模式,guest os可以和主机上的硬盘,网卡,CPU,CD-ROM,音频设备和USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差:

    1.4 QEMU-KVM

    从前面的介绍可知,KVM负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm并不能模拟其他设备,还必须有个运行在用户空间的工具才行。KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,QEMU模拟IO设备(网卡,磁盘等),对其进行了修改,最后形成了QEMU-KVM。

    二、Libvirt的简单介绍

    虚拟云实现的三部曲:虚拟化技术实现-->虚拟机管理-->集群资源管理(云管理)。各种不同的虚拟化技术都提供了基本的管理工具。比如:启动,停用,配置,连接控制台等。这样在构建云管理的时候就存在两个问题:
    1) 如果采用混合虚拟技术,上层就需要对不同的虚拟化技术调用不同管理工具,很是麻烦。
    2) 虚拟化技术发展很迅速,系统虚拟化和容器虚拟化均在发展和演化中。可能有新的虚拟化技术更加符合现在的应用场景,需要迁移过去,这样管理平台就需要大幅改动。

    为了适应变化,我们惯用的手段是分层,使之相互透明,在虚拟机和云管理中设置一个抽象管理层。libvirt就是扮演的这个角色。有了它,上面两个问题就迎刃而解。libvirt提供各种API,供上层来管理不同的虚拟机。

    Libvirt是管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。它包括一个API库,一个守护程序(libvirtd)和一个命令行工具(virsh);libvirt本身构建于一种抽象的概念之上。它为受支持的虚拟机监控程序实现的常用功能提供通用的API。

    libvirt的主要目标是为各种虚拟化工具提供一套方便、可靠的编程接口,用一种单一的方式管理多种不同的虚拟化提供方式。

    三、Gluster的简单介绍

    计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量的方式,已经不能满足目前的需求。

    分布式文件系统可以有效解决数据的存储和管理难题,将固定于某个地点的某个文件系统,扩展到任意多个地点/多个文件系统,众多的节点组成一个文件系统网络。每个节点可以分布在不同的地点,通过网络进行节点间的通信和数据传输。人们在使用分布式文件系统时,无需关心数据是存储在哪个节点上,或者是从哪个节点从获取的,只需要像使用本地文件系统一样管理和存储文件系统中的数据。

    GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。

    GlusterFS支持运行在任何标准IP网络上标准应用程序的标准客户端,用户可以在全局统一的命令空间中使用NFS/CIFS等标准协议来访问应用程序。GlusterFS使得用户可摆脱原有的独立,高成本的封闭存储系统,能够利用普通廉价的存储设备来部署可集中管理,横向扩展,虚拟化的存储池,存储容量可扩展至TB/PB级。

    目前glusterfs已被redhat收购,它的官方网站是:http://www.gluster.org

    四、Patternfly的简单介绍

    PatternFly是Red Hat的开源CSS框架,和Bootstrap不同的是,Bootstrap是为那些想要创建漂亮网站的人而设计的,而PatternFly主要专注于企业应用程序开发人员,提供诸如条形图、图表、导航之类的组件,实际上Red Hat就是使用它创建了OpenShift。

    除了静态HTML,PatternFly还支持ReactJS框架,这是Facebook开发的流行JavaScript框架。PatternFly具有许多适用于企业级应用程序的高级组件,如条形图,图表,模式和布局。

    ovirt的整体框架就是用PatternFly整合的(官网:https://www.patternfly.org/v4/

    五、Ansible的简单介绍

    Ansible是一个部署一群远程主机的工具。远程的主机可以是远程虚拟机或物理机, 也可以是本地主机。

    Ansible与Open Source Puppet一样,不具备“裸机供应”能力,其也需要与Foreman或ansible-os-autoinstall等工具配合使用。

    Ansible最初是作为自动化工具(如PupPET和Chef)的轻量级替代而开发的;但是它是用Python编写的(而不是Ruby),并且采用了一个基于SSH的无代理的架构(即不是采用Puppet的C/S架构,在被管理节点上不需要安装任何特殊软件)。

    Ansilbe通过SSH协议实现远程节点和管理节点之间的通信,但是SSH必须配置为公钥认证登录方式,而非密码认证。理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。包括:

    • 拷贝文件
    • 安装软件包
    • 启动服务
    • ……

    总得来说,Ansible有如下特点:

    1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
    2、默认使用SSH协议对设备进行管理;
    3、有大量常规运维操作模块,可实现日常绝大部分操作。
    4、配置简单、功能强大、扩展性强;
    5、支持API及自定义模块,可通过Python轻松扩展;
    6、通过Playbooks来定制强大的配置、状态管理;
    7、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
    8、提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

    Ansible是用Python开发的,它目前已被Redhat收购,是自动化运维工具中认可度最高的。oVirt的很多自动化部署子项目都是用Ansible开发的。

    六、VDSM的简单介绍

    Vdsm,Virtual Desktop and Server Manager的简写,虚拟桌面和服务器管理器。是虚拟化管理器(如oVirt-engine或Red Hat Enterprise Virtualization Manager)需要的一个守护进程,用于管理Linux主机和它们的KVM虚拟机客户机。Vdsm管理和监视主机的存储、内存和网络以及虚拟机创建、其他主机管理任务、统计信息收集和日志收集。

    七、远程桌面协议(VNC/SPICE/RDP)

    远程桌面协议是一个多通道的协议,让使用者(所在计算机称为用户端或'本地计算机')连上提供终端机服务的计算机(称为服务端或'远程计算机')。这里简单整理了下远程桌面协议资料,目前常用的协议有VNC/SPICE/RDP三种。

      SPICE VNC RDP
    BIOS屏幕显示 不能
    全彩支持
    更改分辨率
    多显示器 多显示器支持(高达4画面) 只有一个屏幕 多显示器支持
    图像传输 图像和图形传输 图像传输 图像和图形传输
    视频播放支持 GPU加速支持 不能 GPU加速支持
    音频传输 双向语音可以控制 不能 双向语音可以控制
    鼠标控制 客户端服务器都可以控制 服务器端控制 服务器端控制
    USB传输 USB可以通过网络传输 不能 USB可以通过网络传输

    八、ovirt的磁盘类型

    8.1.IDE

    IDE硬盘是早期的硬盘,被广泛使用,因而协议的兼容性比较好,在IDE硬盘上安装windows操作系统,能够无缝操作,中间不需要换盘。相比SCSI等协议,IDE自身的性能就比较差一些,再者IDE盘又是一种全虚拟化硬盘,所以性能并不好。

    8.2.virtio(virtio-blk)

    为了改善全虚拟化的性能问题,产生了半虚拟化技术的virtio(本文中所有的virtio均是指virtio-blk)。

    8.3.virtio-scsi

    virtio技术有一定的局限,尤其是每个磁盘都要占用虚拟机的一个pci槽,导致虚拟机并不能大量挂载此类磁盘。为了解决virtio的种种问题,产生了virtio-scsi技术,用来逐渐替代virtio.


    九、qemu的磁盘格式

    使用 qemu-img info 命令可以查看qemu支持的所有磁盘格式:blkdebug blkreplay blkverify bochs cloop copy-on-read dmg file ftp ftps gluster host_cdrom host_device http https iscsi iser luks nbd null-aio null-co nvme parallels qcow qcow2 qed quorum raw rbd sheepdog ssh throttle vdi vhdx vmdk vpc vvfat

    下面介绍两种格式:raw、qcow2

    9.1.raw

    raw是原始磁盘镜像格式,这个格式的优点是简单,易于导出导入到其它模拟器(虚拟化环境)中使用。如果你的文件系统支持“空洞”(holes),例如linux上的ext2、ext3、ext4或windows上的ntfs,这种环境下对于raw磁盘来说只有已经写入的扇区才占用存储空间,可以使用“qemu-img info”命令来查看raw磁盘的真实大小,用“ls -ls”也可以看出来。

    9.2.qcow2

    qemu最通用的镜像文件格式,在不支持“空洞”的文件系统上能够占用更小的存储空间,并且具备可选的一些配置项,比如AES加密、zlib压缩、快照等。

    10、常见三种存储方式DAS、NAS、SAN的架构

    随着主机、磁盘、网络等技术的发展,对于承载大量数据存储的服务器来说,服务器内置存储空间,或者说内置磁盘往往不足以满足存储需要。因此,在内置存储之外,服务器需要采用外置存储的方式扩展存储空间。

    10.1 存储的分类

    根据服务器类型分为:

    • 封闭系统的存储(封闭系统主要指大型机)
    • 开放系统的存储(开放系统指基于Windows、UNIX、Linux等操作系统的服务器)

    开放系统的存储分为:内置存储和外挂存储;

    外挂存储根据连接的方式分为:直连式存储(Direct-Attached Storage,简称DAS)和网络化存储(Fabric-Attached Storage,简称FAS);网络化存储根据传输协议又分为:网络接入存储(Network-Attached Storage,简称NAS)和存储区域网络(Storage Area Network,简称SAN)。看下图,可以清晰的理解刚才的描述。

    10.2 DAS存储 

    DAS存储(直连式存储Direct-Attached Storage)在我们生活中是非常常见的,尤其是在中小企业应用中,DAS是最主要的应用模式,存储系统被直连到应用的服务器中,在中小企业中,许多的数据应用是必须安装在直连的DAS存储器上。

    直连式存储与服务器主机之间的连接通道通常采用SCSI连接,随着服务器CPU的处理能力越来越强,存储硬盘空间越来越大,阵列的硬盘数量越来越多,SCSI通道将会成为IO瓶颈;服务器主机SCSI ID资源有限,能够建立的SCSI通道连接有限。

    10.3 NAS存储

    NAS存储(网络接入存储Network-Attached Storage)也通常被称为附加存储,顾名思义,就是存储设备通过标准的网络拓扑结构(例如以太网)添加到一群计算机上。NAS是文件级的存储方法,它的重点在于帮助工作组和部门级机构解决迅速增加存储容量的需求。如今用户采用NAS较多的功能是用来文档共享、图片共享、电影共享等等,而且随着云计算的发展,一些NAS厂商也推出了云存储功能,大大方便了企业和个人用户的使用。

    NAS产品是真正即插即用的产品。NAS设备一般支持多计算机平台,用户通过网络支持协议可进入相同的文档,因而NAS设备无需改造即可用于混合Unix/Windows NT局域网内,同时NAS的应用非常灵活。

    但NAS又一个关键性问题,即备份过程中的带宽消耗。与将备份数据流从LAN中转移出去的存储区域网(SAN)不同,NAS仍使用网络进行备份和恢复。NAS 的一个缺点是它将存储事务由并行SCSI连接转移到了网络上。这就是说LAN除了必须处理正常的最终用户传输流外,还必须处理包括备份操作的存储磁盘请求。

    10.4 SAN存储 

    (存储区域网络Storage Area Network),从名字上我们也可以看出,这个是通过光纤通道交换机连接存储阵列和服务器主机,最后成为一个专用的存储网络。SAN经过十多年历史的发展,已经相当成熟,成为业界的事实标准(但各个厂商的光纤交换技术不完全相同,其服务器和SAN存储有兼容性的要求)。

    SAN提供了一种与现有LAN连接的简易方法,并且通过同一物理通道支持广泛使用的SCSI和IP协议。SAN不受现今主流的、基于SCSI存储结构的布局限制。特别重要的是,随着存储容量的爆炸性增长,SAN允许企业独立地增加它们的存储容量。SAN的结构允许任何服务器连接到任何存储阵列,这样不管数据置放在那里,服务器都可直接存取所需的数据。因为采用了光纤接口,SAN还具有更高的带宽。

    最后概括一下就是,DAS存储一般应用在中小企业,与计算机采用直连方式,NAS存储则通过以太网添加到计算机上,SAN存储则使用FC接口,提供性能更加的存储。

    DAS虽然比较古老了,但是还是很适用于那些数据量不大,对磁盘访问速度要求较高的中小企业;

    NAS多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成本低;

    SAN则适用于大型应用或数据库系统,缺点是成本高、较复杂。

    11、Cockpit的简单介绍

    根据官网的介绍,cockpit是一个linux系统的管理工具,提供了一个web管理页面,可以很方便的通过点击鼠标的方式完成一系列管理工作,非常适合运维等工作。

    可以通过Cockpit Web控制台执行多种管理任务,包括:

    • 管理服务
    • 管理用户帐号
    • 管理和监视系统服务
    • 配置网络接口和防火墙
    • 查看系统日志
    • 管理虚拟机
    • 创建诊断报告
    • 设置内核转储配置
    • 配置SELinux
    • 更新软件
    • 管理系统订阅

    12、FQDN的简单介绍

    FQDN是完全合格域名/全程域名缩写,Fully Qualified Domain Name,即是域名,访问时将由DNS进行解析,得到IP

    FQDN = Hostname + DomainName

    当我们申请了一个域名时,就可以使用这个域名来得到IP,但若这个域名下挂在很多主机如何?我是不是得申请很多很多域名给每个主机?不需要,域名即创建了一个域,就如命名空间,在这个命名空间下,其他主机都可以创建自己的名称。这个名称就是通过以上公式得来。

    举个例子,一个公司申请了域名aabb.com,这时候有一台主机名为web,则可以使用web.aabb.com得到这个主机IP。若还有两台提供邮件和OA服务的主机cmail,oa,则这时候可以用以下FQDN:

    cmail.aabb.com

    oa.aabb.com

     

    参考文献:

    [1].剖析 Linux hypervisor

    [2].企业级KVM虚拟化+oVirt私有云平台建设实践

    [3].hypervisor与QEMU-KVM

    [4].Libvirt学习总结

    [5].GlusterFS分布式存储系统

    [6].patternfly官方文档

    [7].oVirt持续集成方案分析

    [8].https://www.ovirt.org/develop/developer-guide/vdsm/vdsm.html

    [9].远程桌面协议浅析(VNC/SPICE/RDP)

    [10].ovirt磁盘类型辨析(IDE, virtio, virtio-scsi)

    [11].qemu磁盘格式raw和qcow2

    [12].常见三种存储方式DAS、NAS、SAN的架构及比较

    [13].如何在 CentOS 8 中安装 Cockpit Web 控制台

    [14].FQDN 是什么

    展开全文
  • 软件测试面试前必备题库(必备理论基础复习)

    万次阅读 多人点赞 2018-04-17 23:07:54
    ####软件测试的规范:这个概念很抽象,需要根据公司具体情况而定。 如果公司的时间和人力成本都比较充足的,那个测试规范就可以定义的比较高要求,测试文档的编写、测试用例的数量、测试数据的高效、手动和自动化...

    因为我已经正式转岗成功,因此趁着有空,把之前自己面试前复习的知识整理起来,既可以帮助到有需要的人,也顺便自己做个总结。

    在面试或者准备转岗前,大家都应该对最基本的理论知识能做到熟悉掌握,主要有以下一些:

    ###软件测试基础
    ####软件测试的定义
    使用人工或者自动的手段来运行或者测量软件系统的过程,以检验软件系统是否满足规定的需求,并找出与预期结果之间的差异。

    ####测试按阶段分类

    • 单元测试
    • 集成测试
    • 确认测试
    • 系统测试
    • 验收测试

    ####按是否需要执行被测试软件分类:
    **静态测试:**是指不运行程序本身而寻找程序代码中可能存在的错误或评估程序代码的过程。另外,也称为静态分析,是不实际运行被测软件,而是直接分析软件的形式和结构,查找缺陷。主要包括对源代码、程序界面和各类文档及中间产品(如产品规格说明书、技术设计文档等)所做的测试。

    **动态测试:**又称为动态分析,是指需要实际运行被测软件,通过观察程序运行时所表现出来的状态、行为等发现软件缺陷,包括在程序运行时,通过有效的测试用例(对应的输入、输出关系)来分析被测程序的运行情况或进行跟踪对比,发现程序所表现的行为与设计规格或客户需求不一致的地方。

    ####按是否需要查看代码分类:

    • 黑盒测试
    • 白盒测试

    **黑盒测试:**是将被测试软件看做一个黑盒子,只考虑系统的输入和输出,完全不考虑程序内部逻辑结构和处理过程。黑盒测试的依据是各阶段的需求规格说明(如需求分析阶段是产品的需求规格说明书,单元测试阶段是函数的详细设计说明书)。

    **白盒测试:**是将黑盒子打开,研究源代码和程序内部的逻辑结构。白盒测试的依据是程序代码。
    利用白盒测试的覆盖指标所设计的测试用例与采用黑盒方法所得到的测试用例常常存在重复。因此,白盒测试一般充当黑盒测试的补充。

    ####按测试执行时是否需要人工干预分类:

    • 手工测试
    • 自动测试

    **手工测试:**是完全由人工完成测试工作,包括测试计划的制定,测试用例的设计和执行,以及测试结果的检查和分析等,传统的测试工作都是由人工完成的。

    **自动测试:**是各种测试活动的管理与实施,是使用自动化测试工具或自动化测试脚本来进行的测试,包括测试脚本的开发与执行等,以某种自动测试工具来验证测试需求。这类测试在执行过程中一般不需要人工干预。通常在功能测试、回归测试和性能测试中使用较为广泛。

    其他测试类型:(知道就行,能说出来一两个就行)
    **冒烟测试:**对象是每一个新编译的需要正式测试的软件版本,目的是确认软件基本功能正常,可以进行后续正常的测试。
    **随机测试:**根据测试者的经验对软件进行功能和性能检查,是保证测试覆盖完整性的有效方式和过程。
    **性能测试:**验证软件在正常环境和系统条件下重复使用是否还能满足性能指标。
    ①压力测试
    ②负载测试

    实际工作中,软件测试过程并没有这么复杂,很多情况为了节约成本都是:
    1.根据需求制定测试计划
    2.根据测试计划和产品需求编写测试用例
    3.执行测试用例
    4.回归测试
    5.验收测试

    ####软件测试的规范:这个概念很抽象,需要根据公司具体情况而定。
    如果公司的时间和人力成本都比较充足的,那个测试规范就可以定义的比较高要求,测试文档的编写、测试用例的数量、测试数据的高效、手动和自动化测试的分配、测试任务的分配等等的都会比较的完善。

    但是如果公司的时间和人力成本有限,这个规范就要适当的降低,编写关键的测试文档,测试数据需要少量的、高效的。测试用例要快速执行,快速反馈。

    在面试前,除了做好日常的心理准备和规则的自我介绍以外,就要针对企业岗位要求去完善简历。下面是经过成熟互联网大公司的面试总结:进去公司,人事首先就是给一份试卷我填,时间一小时。这个在我看来,就是考验面试者的水平和态度。那么针对面试,我主要结合我的考题和面试总结以下觉得是必要的知识点:

    ####针对面试时的问答(面试/笔试)
    1、什么是软件质量?
    软件质量:软件产品的特性可以满足用户功能、性能需求的能力。

    2、软件产品质量的六大特性:
    功能性、可靠性、可使用性、效率、可维护性、可移植性

    3、软件测试规范文档包括
    **1)测试规范:**是根据开发规范而制定的测试标准,测试规范也是后期测试用例编写的重要依据。因为开发规范因公司而异,因产品而异,所以测试规范的标准程度每一个公司都不一样。
    从理论到方法到各类报告模板,都属于规范的范畴,当一整套规范形成之后,可使得测试工作进度进行更加稳健,所有问题有据可查。

    **2)测试计划包括内容:**a.概述 b.测试目标 c.测试目标和发布标准d. 计划将测试的领域; e.测试方法描述 f.测试进度表 g.测试资源 h.配置范围和测试工具

    **3)测试用例:**这个靠自自己去了解,编写规范。后期有时间我会整理出来。

    **4)Bug报告(缺陷记录):**编号、bug所属模块、bug描述、bug级别、发现日期、发现人、修改日期、修改人、修改方法、回归结果等等。

    4、测试生命周期
    ①对测试人员进行进行业务培训
    ②测试需求分析
    ③编写测试计划
    ④编写测试案例
    ⑤测试执行(包括bug跟踪)
    ⑥编写测试报告
    备注:需要重视各步骤结束前的评审工作。

    5、Bug生命周期
    New–Open–fixed–close(Testdirector)
    缺陷的状态一般分为:新建、打开、已分配、已修复、关闭、重新打开。中间会有:延期、重复、拒绝等状态。
    ①发现缺陷(记录缺陷报告、提交给程序员)
    ②打开(程序员修改)
    ③解决(测试员确认、缺陷已修复/关闭报告)
    ④关闭

    6、软件测试工作流程
    产品立项----制定计划----准备测试-----测试执行-----测试评估----数据收集----完成标准-----总结报告

    7、补充测试方法
    Alphaα测试(内测)
    公司内部的用户在模拟实际操作环境下进行的受控测试
    Beitaβ测试(用户验收测试)
    用户在实际使用环境下进行测试,开发者一般不在测试现场。
    Αβ测试测试都不能由

    系统测试类型
    ①兼容性测试:测试软件是否可以成功移植到指定的硬件或软件环境中,例如B/S项目中各个不同浏览器之间的测试。
    ②用户界面测试(UI测试):指软件中的可见外观及其底层与用户交互的部分(菜单、对话框、窗口和其他控件)
    用户界面风格是否满足客户需求,文字是否正确、页面是否美观、文字、图片组合是否完美,操作是否友好。
    确保用户界面是否符合用户期望或需求、是否符合公司/行业的标准,包括用户友好性,人性化,易操作性测试。
    ③性能测试(疲劳测试/压力测试/响应时间/接口间测试)
    ④恢复测试
    ⑤完整/安全性测试
    ⑥结构测试
    ⑦容量测试
    ⑧功能性测试(容错性【健壮性】测试)

    8、软件的缺陷等级应如何划分?
    软件缺陷的等级可以用严重性和优先级来描述;
    严重性:衡量缺陷对客户满意度影响的满意程度,分为
    1,致命错误,可能导致本模块以及其他相关的模块异常,死机等问题;
    2.严重错误,问题局限在本模块,导致模块功能失常或异常退出;
    3.一般错误,模块功能部分失效;
    4.建议模块,有问题提出人对测试模块的改进建议;
    优先级:缺陷被修复的紧急程度;
    1.立即解决(P1级):缺陷导致系统功能几乎不能使用或者测试不能继续,需立即修复;
    2.高优先级(P2级):缺陷严重,影响测试,需优先考虑;
    3.正常排队(P3级):缺陷需要正常排队等待修复;
    4.低优先级(P4级):缺陷可以在有时间的时候被纠正;

    9、软件测试中的“5W”规则,你能说出其中明确内容和过程吗?
    “5W”规则指的是“What (做什么)”、“Why (为什么做)”、“When (何时做)”、“Where(在哪里)”、“How (如何做)”。利用“5W”规则创建软件测试计划,可以帮助测试团队理解测试的目的(Why ),明确测试的范围和内容(What ),确定测试的开始和结束日期(When ),指出测试的方法和工具(How ),给出测试文档和软件的存放位置(Where )。

    10、您认为做好测试用例设计工作的关键是什么?
    白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果
    黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题.

    11、二进制转十进制(去了解这个基本的运算方法)
    11111000111 497

    12、测试生命周期:
    计划、设计、实施、执行、总结、评估

    13、测试流程:
    1)根据需求制定测试计划
    2)测试设计
    3)编写测试用例
    4)执行测试用例
    5)回归测试
    6)验收测试

    14、按测试阶段,测试分为:

    • 单元测试
    • 集成测试
    • 确认测试
    • 系统测试
    • 验收测试

    15、单元测试、集成测试、系统测试的侧重点是什么?
    答:单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试,测试重点是系统的模块,包括子程序的正确性验证等。
    集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求,组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。测试重点是模块间的衔接以及参数的传递等。
    系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。测试重点是整个系统的运行以及与其他软件的兼容性。

    16、开发生命周期
    ① 计划
    ② 需求分析
    ③ 设计
    ④ 编码
    ⑤ 测试
    ⑥ 运行与维护

    17、测试结束的标准

    • 用例全部测试
    • 覆盖率达到达到标准
    • 缺陷率达到标准
    • 其他指标达到标准

    18、针对缺陷采取怎样的管理措施?
    答: 1. 要更好的管理缺陷,必须引入缺陷管理工具,商用的或者开源的都可。
    2.根据缺陷的生命周期,考虑缺陷提交的管理、缺陷状态的管理和缺陷分析的管理。
    3.所有发现的缺陷(不管是测试发现的还是走读代码发现的)都必须全部即时的、准确的提交到缺陷管理工具中,这是缺陷提交的管理。
    4.缺陷提交后,需要即时的指派给相应的开发人员,提交缺陷的人需要密切注意缺陷的状态, 帮助缺陷的尽快解决。缺陷解决后需要即时对缺陷的修复进行验证。这样的目的有两个:一个是让缺陷尽快解决;二是方便后面缺陷的分析(保证缺陷相关的信息准确,如龄期等),这是缺陷状态的管理。
    5.为了更好的改进开发过程和测试过程,需要对缺陷进行分析,总结如缺陷的类别、缺陷的龄期分布等信息,这是缺陷分析的管理。

    19、软件测试应该划分几个阶段?简述各个阶段应重点测试的点?各个阶段的含义?
    答:大体上来说可分为单元测试,集成测试,系统测试,验收测试,
    每个阶段又分为以下五个步骤: 测试计划,测试设计,用例设计,执行结果,测试报告
    初始测试集中在每个模块上,保证源代码的正确性,该阶段成为单元测试,主要用白盒测试方法。 接下来是模块集成和集成以便组成完整的软件包。集成测试集中在证实和程序构成问题上。主要采用黑盒测试方法,辅之以白盒测试方法。
    软件集成后,需要完成确认和系统测试。确认测试提供软件满足所有功能、性能需求的最后保证。确认测试仅仅应用黑盒测试方法。

    20、什么是设计文档测试?
    答:测试设计是否符合全部需求以及设计是否合理。

    21、什么是需求文档测试:
    答:主要测试需求中是否存在逻辑矛盾以及需求在技术上是否可以实现;

    #####第一次面试互联网大公司的题目(笔试+面试)大致包括以下内容,后期你们可以针对拓展。
    1、数据库筛选成绩前5名
    2、登陆页面,测试考虑的大小方面有哪些
    界面 | 性能 | 功能
    3、白盒测试、黑盒测试
    4、缺陷管理工具
    5、selenium自动化测试了解程度
    6、测试用例,边界值测试用例
    7、给你一个垃圾桶,应该怎么测试?

    #####其他:
    1、设计用例的方法、依据有那些?
    答:白盒测试用例设计有如下方法:基本路径测试\边界值分析\覆盖测试\循环测试\数据流测试\程序插桩测试\变异测试.这时候依据就是详细设计说明书及其代码结构
    黑盒测试用例设计方法:基于用户需求的测试\功能图分析方法\等价类划分方法\边界值分析方法\错误推测方法\因果图方法\判定表驱动分析方法\正交实验设计方法.依据是用户需求规格说明书,详细设计说明书。

    2、什么是桩模块?
    答:比如对函数A做单元测试时,被测的函数单元下还包括了一个函数B,为了更好的错误,定位错误,就要为函数B写桩,来模拟函数B的功能,保证其正确。

    3、什么是驱动模块?
    答:驱动模块在大多数场合称为"主程序",它接收测试数据并将这些数据传递到被测试模块.单元测试一个函数单元时,被测单元本身是不能独立运行的,需要为其传送数据,为此写驱动
    驱动模块主要完成以下事情:
    1)接受测试输入;
    2)对输入进行判断;
    3)将输入传给被测单元,驱动被测单元执行;
    4)接受被测单元执行结果,并对结果进行判断;
    5)将判断结果作为用例执行结果输出测试报告。

    4、描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程
    答:1) 测试人员或开发人员发现bug后,判断属于哪个模块的问题,填写bug报告后,系统会自动通过Email通知项目组长或直接通知开发者。
    2) 经验证无误后,修改状态为VERIFIED.待整个产品发布后,修改为CLOSED.
    3) 还有问题,REOPENED,状态重新变为“New",并发邮件通知。
    4) 项目组长根据具体情况,重新reassigned分配给bug所属的开发者。
    5) 若是,进行处理,resolved并给出解决方法。(可创建补丁附件及补充说明)
    6) 开发者收到Email信息后,判断是否为自己的修改范围。
    7) 若不是,重新reassigned分配给项目组长或应该分配的开发者。
    8) 测试人员查询开发者已修改的bug,进行重新测试。

    5、如果能够执行完美的黑盒测试,还需要进行白盒测试吗?(白盒与黑盒的区别)
    答:任何工程产品(注意是任何工程产品)都可以使用以下两种方法之一进行测试。
    黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。
    软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误:
    1、是否有不正确或遗漏的功能?
    2、在接口上,输入是否能正确的接受?能否输出正确的结果?
    3、是否有数据结构错误或外部信息(例如数据文件)访问错误?
    4、性能上是否能够满足要求?
    5、是否有初始化或终止性错误?
    软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是相对程序模块进行如下检查:
    1、对程序模块的所有独立的执行路径至少测试一遍。
    2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。
    3、在循环的边界和运行的界限内执行循环体。
    4、测试内部数据结构的有效性,等等。
    以上事实说明,软件测试有一个致命的缺陷,即测试的不完全、不彻底性。由于任何程序只能进行少量(相对于穷举的巨大数量而言)的有限的测试,在未发现错误时,不能说明程序中没有错误。

    最后要说的就是,其实看个人面试的岗位要求和自己对薪资的期待,企业职业要求的技术和理论知识都是根据你的经验和技术能力来定义你是否满足需求。而我是一个没项目经验的转岗者,所以我能做的就是强化自己的理论知识和不断拓展自己的加分项,比如学一门语言,我选Java;学数据库我掌握基本SQL的增删改查;还有就是学会selenium的自动化录制,这些都是我能做到的。而后就是面试前,重新复习一遍以上知识点,面试时回答顺畅,逻辑清晰,基本没有什么问题。
    把主动权掌握在自己手上,我们才有选择的权利。

    展开全文
  • 必备 | AI & DS七大 Python

    千次阅读 2019-01-23 13:55:44
    本文作者Favio Vázquez从2018年开始发布《数据...一年结束,作者列出了2018年的7大最好的Python,这些确实地改进了研究人员的工作方式。 7. AdaNet ———快速灵活的AutoML框架 https://gith...

    本文作者Favio Vázquez从2018年开始发布《数据科学和人工智能每周文摘:Python & R》系列文章,为数据科学家介绍最好的库、repos、packages以及工具。一年结束,作者列出了2018年的7大最好的Python库,这些库确实地改进了研究人员的工作方式。

     

     

    7. AdaNet ———快速灵活的AutoML框架

     

     

    https://github.com/tensorflow/adanet

    AdaNet是一个轻量级的、可扩展的TensorFlow AutoML框架,用于使用AdaNet算法训练和部署自适应神经网络[Cortes et al. ICML 2017]。AdaNet结合了多个学习子网络,以减轻设计有效的神经网络所固有的复杂性。

    这个软件包将帮助你选择最优的神经网络架构,实现一种自适应算法,用于学习作为子网络集合的神经架构。

    你需要了解TensorFlow才能使用这个包,因为它实现了TensorFlow Estimator,但这将通过封装训练、评估、预测和导出服务来帮助你简化机器学习编程。

    你可以构建一个神经网络的集合,这个库将帮助你优化一个目标,以平衡集合在训练集上的性能和将其泛化到未见过数据的能力之间的权衡。

    更多Python视频、源码、资料加群683380553免费获取

    安装

    安装adanet之前需将TensorFlow升级到1.7或以上:

    $ pip install "tensorflow>=1.7.0"

    从源代码安装

    要从源代码进行安装,首先需要安装bazel。

    下一步,复制adanet和cd到它的根目录:

    $ git clone https://github.com/tensorflow/adanet && cd adanet

    从adanet根目录运行测试:

    $ cd adanet
    $ bazel test -c opt //...

    确认一切正常后,将adanet安装为pip包。

    现在,可以对adanet进行试验了。

    import adanet

    用法

     

     

    有关AdaNet的详细用法,请阅读官方教程:

    https://github.com/tensorflow/adanet/tree/master/adanet/examples/tutorials

    https://ai.googleblog.com/2018/10/introducing-adanet-fast-and-flexible.html?m=1

    6. TPOT——一个自动化的Python机器学习工具

     

     

     

    https://github.com/EpistasisLab/tpot

    之前我介绍过Auto-Keras,这是一个很棒的AutoML库。现在我们有另一个非常有趣的工具——TPOT。

    TPOT全称是基于树的pipeline优化工具(Tree-based Pipeline Optimization Tool),这是一个非常棒Python自动机器学习工具,使用遗传编程优化机器学习pipeline。

     

     

    TPOT可以自动化许多东西,包括生命特性选择、模型选择、特性构建等等。如果你是Python机器学习者,很幸运,TPOT是构建在Scikit-learn之上的,所以它生成的所有代码看起来应该很熟悉。

    它的作用是通过智能地探索数千种可能的pipeline来自动化机器学习中最繁琐的部分,找到最适合你的数据的pipeline,然后为你提供最佳的 Python 代码。

    它的工作原理如下:

     

     

    安装

    安装TPOT之前,请先阅读教程:

    http://epistasislab.github.io/tpot/installing/

    然后,运行以下代码:

    pip install tpot

    例子:

    首先让我们从基本的Iris数据集开始:

     1from tpot import TPOTClassifier
     2from sklearn.datasets import load_iris
     3from sklearn.model_selection import train_test_split
     4
     5# Load iris dataset
     6iris = load_iris()
     7
     8# Split the data
     9
    10X_trainX_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,
    11                                                    train_size=0.75, test_size=0.25)
    12
    13# Fit the TPOT classifier 
    14
    15tpot = TPOTClassifier(verbosity=2, max_time_mins=2)
    16tpot.fit(X_train, y_train)
    17
    18# Export the pipeline
    19tpot.export('tpot_iris_pipeline.py')
    我们在这里构建了一个非常基本的TPOT pipeline,它将尝试寻找最佳ML pipeline来预测iris.target。然后保存这个pipeline。之后,我们要做的就非常简单了——加载生成的.py文件,你将看到:
    
     1import numpy as np
     2from sklearn.kernel_approximation import RBFSampler
     3from sklearn.model_selection import train_test_split
     4from sklearn.pipeline import make_pipeline
     5from sklearn.tree import DecisionTreeClassifier
     6# NOTE: Make sure that the class is labeled 'class' in the data file
     7tpot_data = np.recfromcsv('PATH/TO/DATA/FILE', delimiter='COLUMN_SEPARATOR', dtype=np.float64)
     8features = np.delete(tpot_data.view(np.float64).reshape(tpot_data.size, -1), tpot_data.dtype.names.index('class'), axis=1)
     9training_features, testing_features, training_classes, testing_classes = 
    10    train_test_split(features, tpot_data['class'], random_state=42)
    11exported_pipeline = make_pipeline(
    12    RBFSampler(gamma=0.8500000000000001),
    13    DecisionTreeClassifier(criterion="entropy", max_depth=3, min_samples_leaf=4, min_samples_split=9)
    14)
    15exported_pipeline.fit(training_features, training_classes)
    16results = exported_pipeline.predict(testing_features)
    

    就是这样。你已经以一种简单但强大的方式为Iris数据集构建一个分类器。

    现在我们来看看MNIST的数据集:

     1from tpot import TPOTClassifier
     2from sklearn.datasets import load_digits
     3from sklearn.model_selection import train_test_split
     4
     5# load and split dataset 
     6digitsdigits  ==  load_digitsload_di ()
     7X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target,
     8                                                    train_size=0.75, test_size=0.25)
     9
    10# Fit the TPOT classifier 
    11tpot = TPOTClassifier(verbosity=2, max_time_mins=5, population_size=40)
    12tpot.fit(X_train, y_train)
    13
    14# Export pipeline
    15tpot.export('tpot_mnist_pipeline.py')
    

    接下来我们再次加载生成的 .py文件,你将看到:

     1import numpy as np
     2from sklearn.model_selection import train_test_split
     3from sklearn.neighbors import KNeighborsClassifier
     4# NOTE: Make sure that the class is labeled 'class' in the data file
     5tpot_data = np.recfromcsv('PATH/TO/DATA/FILE', delimiter='COLUMN_SEPARATOR', dtype=np.float64)
     6features = np.delete(tpot_data.view(np.float64).reshape(tpot_data.size, -1), tpot_data.dtype.names.index('class'), axis=1)
     7training_features, testing_features, training_classes, testing_classes = 
     8    train_test_split(features, tpot_data['class'], random_state=42)
     9exported_pipeline = KNeighborsClassifier(n_neighbors=4, p=2, weights="distance")
    10exported_pipeline.fit(training_features, training_classes)
    11results = exported_pipeline.predict(testing_features)

     

    5. SHAP ——一个解释任何机器模型输出的统一方法

    https://github.com/slundberg/shap

     

    解释机器学习模型并不容易。然而,它对许多商业应用程序来说非常重要。幸运的是,有一些很棒的库可以帮助我们完成这项任务。在许多应用程序中,我们需要知道、理解或证明输入变量在模型中的运作方式,以及它们如何影响最终的模型预测。

    SHAP (SHapley Additive exPlanations)是一种解释任何机器学习模型输出的统一方法。SHAP将博弈论与局部解释联系起来,并结合了之前的几种方法。

    安装

    SHAP可以从PyPI安装

    pip install shap

    或conda -forge

    conda install -c conda-forge shap
    
    
    用法

    有很多不同的模型和方法可以使用这个包。在这里,我将以DeepExplainer中的一个例子为例。

    Deep SHAP是深度学习模型中SHAP值的一种高速近似算法,它基于与DeepLIFT的连接,如SHAP的NIPS论文所述(https://arxiv.org/abs/1802.03888)。

    下面这个例子可以看到SHAP如何被用来解释MNIST数据集的Keras模型结果:

    # this is the code from https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py
    from __future__ import print_function
    import keras
    from keras.datasets import mnist
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Flatten
    from keras.layers import Conv2D, MaxPooling2D
    from keras import backend as K
    batch_size = 128
    num_classes = 10
    epochs = 12
    # input image dimensions
    img_rows, img_cols = 28, 28
    # the data, split between train and test sets
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    if K.image_data_format() == 'channels_first':
        x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
        x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
        input_shape = (1, img_rows, img_cols)
    else:
        x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
        x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
        input_shape = (img_rows, img_cols, 1)
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255
    print('x_train shape:', x_train.shape)
    print(x_train.shape[0], 'train samples')
    print(x_test.shape[0], 'test samples')
    # convert class vectors to binary class matrices
    y_train = keras.utils.to_categorical(y_train, num_classes)
    y_test = keras.utils.to_categorical(y_test, num_classes)
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3),
                     activation='relu',
                     input_shape=input_shape))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(num_classes, activation='softmax'))
    model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adadelta(),
                  metrics=['accuracy'])
    model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=epochs,
              verbose=1,
              validation_data=(x_test, y_test))
    score = model.evaluate(x_test, y_test, verbose=0)
    print('Test loss:', score[0])
    print('Test accuracy:', score[1])
    

    更多示例:

    https://github.com/slundberg/shap#sample-notebooks

    4. Optimus——使用 Python 和 Spark 轻松实现敏捷数据科学工作流

     

     

    https://github.com/ironmussa/Optimus

    Optimus V2旨在让数据清理更容易。这个API的设计对新手来说超级简单,对使用pandas的人来说也非常熟悉。Optimus扩展了Spark DataFrame功能,添加了.rows和.cols属性。

    使用Optimus,你可以以分布式的方式清理数据、准备数据、分析数据、创建分析器和图表,并执行机器学习和深度学习,因为它的后端有Spark、TensorFlow和Keras。

    Optimus是数据科学敏捷方法的完美工具,因为它几乎可以帮助你完成整个过程的所有步骤,并且可以轻松地连接到其他库和工具。

    Installation (pip):

    pip install optimuspyspark

     

    用法

    在这个示例中,你可以从 URL 加载数据,对其进行转换,并应用一些预定义的清理功能:

    from optimus import Optimus
    op = Optimus()
    # This is a custom function
    def func(value, arg):
        return "this was a number"
    df =op.load.url("https://raw.githubusercontent.com/ironmussa/Optimus/master/examples/foo.csv")
    df
        .rows.sort("product","desc")
        .cols.lower(["firstName","lastName"])
        .cols.date_transform("birth", "new_date", "yyyy/MM/dd", "dd-MM-YYYY")
        .cols.years_between("birth", "years_between", "yyyy/MM/dd")
        .cols.remove_accents("lastName")
        .cols.remove_special_chars("lastName")
        .cols.replace("product","taaaccoo","taco")
        .cols.replace("product",["piza","pizzza"],"pizza")
        .rows.drop(df["id"]<7)
        .cols.drop("dummyCol")
        .cols.rename(str.lower)
        .cols.apply_by_dtypes("product",func,"string", data_type="integer")
        .cols.trim("*")
        .show()
    
    你可以将这个表格
    

     

    转换为这样:

     

     

    是不是很酷?这个库还可以做更多事情,具体请阅读:

    https://www.hioptimus.com/

    3. spacy——使用Python和Cython的工业级自然语言处理

     

     

    https://spacy.io/

    spaCy旨在帮助你完成实际的工作——构建真实的产品,或收集真实的见解。这个库尊重你的时间,尽量避免浪费。它易于安装,而且它的API简单而高效。spaCy被视为自然语言处理的Ruby on Rails。

    spaCy是为深度学习准备文本的最佳方法。它与TensorFlow、PyTorch、Scikit-learn、Gensim以及Python强大的AI生态系统的其他部分无缝交互。使用spaCy,你可以很容易地为各种NLP问题构建语言复杂的统计模型。

    安装

    pip3 install spacy
    $ python3 -m spacy download en

    这里,我们还下载了英语语言模型。你可以在这里找到德语,西班牙语,意大利语,葡萄牙语,法国语等版本的模型:

    https://spacy.io/models/

    下面是主页面的一个示例:

    # python -m spacy download en_core_web_sm
    import spacy
    # Load English tokenizer, tagger, parser, NER and word vectors
    nlp = spacy.load('en_core_web_sm')
    # Process whole documents
    text = (u"When Sebastian Thrun started working on self-driving cars at "
            u"Google in 2007, few people outside of the company took him "
            u"seriously. “I can tell you very senior CEOs of major American "
            u"car companies would shake my hand and turn away because I wasn’t "
            u"worth talking to,” said Thrun, now the co-founder and CEO of "
            u"online higher education startup Udacity, in an interview with "
            u"Recode earlier this week.")
    doc = nlp(text)
    # Find named entities, phrases and concepts
    for entity in doc.ents:
        print(entity.text, entity.label_)
    # Determine semantic similarities
    doc1 = nlp(u"my fries were super gross")
    doc2 = nlp(u"such disgusting fries")
    similarity = doc1.similarity(doc2)
    print(doc1.text, doc2.text, similarity)
    

    在这个示例中,我们首先下载English tokenizer, tagger, parser, NER和word vectors。然后创建一些文本,打印找到的实体、短语和概念,最后确定两个短语的语义相似性。运行这段代码,你会得到:

    Sebastian Thrun PERSON
    Google ORG
    2007 DATE
    American NORP
    Thrun PERSON
    Recode ORG
    earlier this week DATE
    my fries were super gross such disgusting fries 0.7139701635071919
    
    2. jupytext

     

    对我来说,jupytext是年度最佳。几乎所有人都在像Jupyter这样的笔记本上工作,但是我们也在项目的更核心部分使用像PyCharm这样的IDE。

    好消息是,你可以在自己喜欢的IDE中起草和测试普通脚本,在使用Jupytext时可以将IDE作为notebook在Jupyter中打开。在Jupyter中运行notebook以生成输出,关联.ipynb表示,并作为普通脚本或传统Jupyter notebook 进行保存和分享。

    下图展示了这个包的作用:

     

    可点击下方链接查看原文中的GIF展示:

    https://heartbeat.fritz.ai/top-7-libraries-and-packages-of-the-year-for-data-science-and-ai-python-r-6b7cca2bf000

     

    安装

    pip install jupytext --upgrade

    然后,配置Jupyter使用Jupytext:

    使用jupyter notebook --generate-config生成Jupyter配置

    编辑.jupyter/jupyter_notebook_config.py,并附加以下代码:

    c.NotebookApp.contents_manager_class = "jupytext.TextFileContentsManager"

    重启Jupyter,即运行:

    jupyter notebook

     

    你可以在这里试试:

    https://mybinder.org/v2/gh/mwouts/jupytext/master?filepath=demo

    1.Chartify ——让数据科学家很容易创建图表的Python库

     

     

    https://xkcd.com/1945/

    Chartify是Python的年度最佳库。

    在Python世界中创建一个像样的图很费时间。幸运的是,我们有像Seaborn之类的库,但问题是他们的plots不是动态的。

    然后就出现了Bokeh——这是一个超棒的库,但用它来创造互动情节仍很痛苦。

    Chartify建立在Bokeh之上,但它简单得多。

    Chartify的特性:

    • 一致的输入数据格式:转换数据所需的时间更少。所有绘图函数都使用一致、整洁的输入数据格式。
    • 智能默认样式:创建漂亮的图表,几乎不需要自定义。
    • 简单API:API尽可能直观和容易学习。
    • 灵活性:Chartify是建立在Bokeh之上的,所以如果你需要更多的控制,你可以使用Bokeh的API。

     

    安装

    Chartify可以通过pip安装:

    pip3 install chartify

     

    用法

    假设我们想要创建这个图表:

     

     

    import pandas as pd
    import chartify
    # Generate example data
    data = chartify.examples.example_data()

     

    现在,我们已经加载了一些示例数据,让我们来做一些转换:

    total_quantity_by_month_and_fruit = (data.groupby(
            [data['date'] + pd.offsets.MonthBegin(-1), 'fruit'])['quantity'].sum()
            .reset_index().rename(columns={'date': 'month'})
            .sort_values('month'))
    print(total_quantity_by_month_and_fruit.head())
    month          fruit     quantity
    0 2017-01-01   Apple         7
    1 2017-01-01  Banana         6
    2 2017-01-01   Grape         1
    3 2017-01-01  Orange         2
    4 2017-02-01   Apple         8

     

    现在我们可以把它画出来:

    # Plot the data
    ch = chartify.Chart(blank_labels=True, x_axis_type='datetime')
    ch.set_title("Stacked area")
    ch.set_subtitle("Represent changes in distribution.")
    ch.plot.area(
            data_frame=total_quantity_by_month_and_fruit,
            x_column='month',
            y_column='quantity',
            color_column='fruit',
            stacked=True)
    ch.show('png')

     

    超级容易创建一个互动的plot。

    更多示例:

     

     

     

    https://github.com/spotify/chartify

    展开全文
  • SubVersion基本概念与快速流程,做大项目必备在项目应用版本管理是一件愉快的事情,多人协作开发、版本回溯等等都是让人很激动的事情。可是为了基本的应用,我学习SVN也需要了一定的时间。网上介绍SVN的文章还是比较...

    SubVersion基本概念与快速流程,做大项目必备

    在项目应用版本管理是一件愉快的事情,多人协作开发、版本回溯等等都是让人很激动的事情。可是为了基本的应用,我学习SVN也需要了一定的时间。网上介绍SVN的文章还是比较多的,但是自己实践下来对学习影响不大,基本上都没有介绍一些基本概念与流程,本文也是为了谈谈这些。

    概述

    SVN是一种版本控制工具,可供多人协作开发,将各个人不同的修改代码集成到一起。SVN的重要功能是版本回溯,不要小看这个功能,实际用起来才可以体会到其中的妙处,可谓"谁用谁知道"。

    SVN的版本控制模型是"拷贝-修改-合并"。在建立了版本库之后,工作之前应该先下载需要工作的文件(工作拷贝)到本地电脑上,可以放在某个文件夹中。然后对工作拷贝进行修改,比如添加、修改、删除源代码等等。最后将修改之后的工作拷贝提交到版本库中,称为合并。在多人协作中也是同样的,只是最好不要两个人同时修改同一个文件,否则会产生"冲突",虽然也可以解决,只是有些麻烦。

    ·拷贝:从SVN版本库获取工作拷贝的过程。将会把所有的工作文件放入一个文件夹中。

    ·工作拷贝:名词,从SVN版本库中得到的一份工作文件集合。工作拷贝中会包含.svn文件夹,其中记录了原始文件,当修改时也会有所发觉。工作时就是对工作拷贝进行修改。

    ·合并:将已经修改过的工作拷贝提交到SVN版本库的过程。

    ·SVN版本库:用于存储工作拷贝文件集的仓库,对外提供一定的接口供SVN客户端使用。对外接口可以是文件系统、SVN服务、apache插件提供的SVN服务等等。一定要区别SVN版本库和工作拷贝。SVN版本库是一个数据库,其中的内容不推荐访问,更不要改动,在这里一般也找不到你的工作文件。

    建立版本库的过程

    在使用SVN进行源码管理之前需要先建立SVN版本库。建立SVN版本库是相对比较简单的,可以用如下命令:

    # svnadmin create foldername

    其中foldername替换成你的文件夹名字。版本库是一个数据库,可用的数据库包括FS和BDB两种,推荐使用FS,当然也是默认的,会稳定一些。

    建立版本库之后,需要确定一种版本库的访问接口。因为访问接口这个参数会直接存储到工作拷贝中,待之后提交时会使用,所以接口不要随便改变,很麻烦。可用的方式有文件系统、SVN服务和HTTP服务(apache),推荐使用SVN服务。

    如果使用了文件系统,则以后移动版本库所在路径时会直接影响所有工作拷贝,很不方便,而初学者随着SVN知识的增加,有所改动是很正常的。HTTP服务则是直接面对大型多用户服务器的,配置起来有一定的难度。SVN服务则可以看在本机运行,提供局域网或者互联网上的服务。推荐使用的方式就是在本机上建立SVN版本库,然后接口路径写上"svn://localhost/projectname"。比如笔者经常行走于公司和家之间,一些个人兴趣的小程序放在U盘上,所以就将SVN版本库放在U盘上。每次到一个地方用U盘里面的批处理文件开启SVN服务,下载工作拷贝并开始工作。修改完成后提交,随之删除本地的工作拷贝。

    SVN版本库的URL规则

    ·file:///

    以路径方式访问文件系统上的SVN。可以用相对路径和绝对路径。例如Windows上的一个例子"file:///e:/svn/db1"。

    ·http://

    通过Apache的WebDAV协议访问。略。

    ·https://

    与http://方式相似,提供SSL链路加密。

    ·svn://

    本文推荐方式,使用svnserve建立服务。例如"svn://localhost/db1"。

    ·svn+ssh://

    与svn://相似,提供SSH封装

    使用SVN服务

    可以用已经安装的svnserve提供SVN服务,如下,启动一个叫做db1的版本库

    # svnserve -d -r "e:/svnroot/db1"

    这样就可以通过"svn://localhost"来访问这个版本库了。但是一般来说,正开发的程序或者加上以往的版本库,正在使用的版本库可能不只一个,所以推荐建立一个SVN版本库的版本库。将所有版本库都放在一个文件夹中,比如我就是建立一个叫做svnroot的文件夹,其中放了很多版本库。上述的命令也可以改为:

    # svnserve -d -r "e:/svnroot"

    这样可以通过"svn://localhost/db1"来访问特定版本库。

    另外,通过网络来提供SVN服务,无论是局域网还是WWW都是需要一定的权限控制的,否则发生了混乱可不是什么好事情。关于SVN服务的权限设置可以参考我的另外一篇小文《SVN服务器的简单配置》。一般在一个局域网内都是允许匿名下载,但是需要认证上传的方式,很多开源软件也是使用同样的方式。

    一般的工作流程

    很多时候对一种不熟悉的事物,如果可以按照一般的流程走过一遍便可以有很多的了解了。下面我们谈谈一般的工作流程,初学者可以按照这个步骤下来完成一次完整的SVN试验。

    1、下载,安装SVN

    一般来说命令行版本只需要安装svn-setup即可,安装完成是自动识别语言的,即在你的中文版操作系统上可以自动显示中文。但是往往很多用户比较倾向于使用SVN的win32扩展版本,只需要右键菜单即可完成几乎所有操作。这时需要安装TortoiseSVN,并且,安装完成后再安装其中文包。笔者推荐不要安装中文包,因为很多特定的名次现在的翻译还不是很统一,还是看着英文比较通用,比如commit、update、export、import等等,这些词在SVN中有特定的意义。安装过程不需要任何设置。

    2、建立一个测试用的版本库

    推荐使用命令行版本的SVN建立,使用方法上面有,使用TortoiseSVN也可以,不过注意一定要选本地文件系统,其名字可能是如下的几个之一:

    Native filesystem

    FSFS

    不要选择BerkeleyDB(BDB),因为一些高手测试过,使用BDB不是那么稳定。而版本库是比较重要的,儿戏不得。当然,犹如"使用SVN服务"说的一样,推荐建立一个SVNROOT来存放所有的版本库,这样在将来使用多个版本库的时候不是那么狼狈。

    3、配置版本库的网络权限

    参见文章《SVN服务器的简单配置》。

    4、启动SVN服务

    如上

    5、准备一些将要进行版本控制的源代码,或其它文件

    文件类型随便,SVN都可以处理。

    6、首次导入(import)

    对需要进行版本控制的源码,需要先导入到版本库中,形成第一个修订版本。使用import命令,可以使用TortoiseSVN的IMPORT命令或者是svn import命令。首次导入之后,版本库中就已经包含了版本控制文件了,以前导入的文件也就可以删除了。但是注意,已经导入的文件是存储在版本库的数据库当中,不要试图从版本库的文件夹中找到你已经导入的代码,更不要手动修改版本库。只要记住一条即可,不要进入版本库所在的文件夹,你所作的任何修改都可能造成损坏并且你也找不到任何可读的信息。

    # svn import path svnurl

    7、首次检出(checkout)

    需要将版本库的代码检出(checkout)到一个文件夹,就得到了一份工作拷贝,可以对工作拷贝进行修改。可以使用SVN CHECKOUT命令。注意,不要检出到刚才用于导入(import)的文件夹,否则文件的覆盖会出现错误,如果确实很需要,就先删除原文件夹中的所有内容,然后检出(checkout)。检出所得的工作拷贝,每个文件夹中都包含一个.svn文件夹,其中包含了SVN的一些信息,有如版本库,不要进入这个文件夹,没什么好处。

    # svn checkout svnurl targetpath

    8、do it yourself

    现在可以修改你的代码了,随你怎么修改都可以。当然,这也是工作的一部分。我的很多同事都是在代码中删除回车,空格等等来实现一些无关紧要的修改来做测试的。

    9、提交(commit)

    修改完成之后,可以将修改提交到版本库。提交时可选的填入一条修改注释,应该重视这个注释,仔细的填写,这对以后取出某一个版本时非常有用。我每每要写好多字。注意如下的命令中并没有指定SVN url,因为已经保存在了.svn文件夹当中了。

    # svn commit --message "..."

    10、导出(export)

    如果你对某一个修订版比较满意,需要交给测试人员,或者干脆就发布了,就可以选择导出这个发行版。导出的发行版是不包含SVN控制信息的,也就是不包含.svn文件夹。对于很多时候,如果去测试一些开源软件,也推荐用这种方式来获取开发状态的代码。SVN检测文件是否修改的方式就是在.svn文件夹中包含上一版本的文件。这样,如果是checkout而不是export则会取得两份文件,其中一份是隐藏的,这对很多牛速的SVN服务器来说可不是什么好事。另外,如果你没有提交权限,保留着.svn也是没有任何用处的。

    # svn export svnurl targetpath

    11、更新(update)

    如果你遇到了一个喜欢加班的同事,在你下班提交数据之后,他还做了修改,并且他也提交过了,在第二天你再次面对工作时,版本库的修订版就已经高于你的工作拷贝了,这时可以用更新(update)操作来将当前代码更新到最新版本去。如果在更新之前你又做了修改了,那也不必担心,你的修改不会被覆盖掉。但是如果这段时间你的这个同事也对这个文件进行了修改,那么就会形成一个冲突,这是高级内容,稍候再谈。

    # svn update

    12、检查工作拷贝状态(status)

    在使用TortoiseSVN时不会碰到这个问题,所有操作的文件都会在图标上有小图标显示,比如对号就是没有修改过的,叹号是修改过的,等等。但是对于命令行版本则没有这些提示,这时可以用status操作来显示工作拷贝中各个文件已经做过的修改。

    # svn status

    工作流程模型

    导入->检出->修改->提交->导出

    import -> checkout -> 修改 -> commit -> export

    按照这个工作流程模型就可以理顺几种近义词的区别了。当然,区分版本库、工作拷贝也是一个十分艰巨的工作。

    祝大家工作愉快。

     
    展开全文
  • python之sympy--数学符号计算与绘图必备

    万次阅读 多人点赞 2020-12-12 18:47:32
    再将符号表达式转为数值即可 二、代数表达式相关运算 2.1 代数表达式 2.1.1 一元表达式 #代数表达式只由一个符号或者该符号经过有限次初等运算组成,在复习初中数学知识,主要明晰相关概念 import sympy from sympy ...
  • 国内可外用免费语料下载资源汇总   (一) 国家语委1.国家语委现代汉语语料http://www.cncorpus.org/现代汉语通用平衡语料现在重新开放网络查询了。重开后的在线检索速度更快,功能更强,同时提供检索结果下载...
  • O_DIRECT 和 RAW设备最根本的区别是O_DIRECT是基于文件系统的,也就是在应用层来看,其操作对象是文件句柄,内核和文件层来看,其操作是基于inode和数据块,这些概念都是和ext2/3的文件系统相关,写到磁盘上最终是...
  • 什么逻辑、物理? 逻辑/逻辑文件:给用户看的(即Database和Table就是我们常说的逻辑的范畴) 物理/物理文件:存储在计算机中的(即机器和Port就是我们常说的物理的范畴。) 一个服务器有多个实例(port...
  • 静态 .o文件的集合 制作 ar -cr libxxx.a xxx1.o xxx2.o xxx3.o ... ...基本概念: 静态又称为文档文件(Archive File)。它是多个.o文件的集合。Linux中静态文件的后缀为"a"。 静态的代码在
  • 全栈必备——Git

    万次阅读 2016-07-02 12:02:58
    版本控制中的基本概念 1)签入,提交,检出 2)冲突,解决,合并 3)分支,版本 4)锁定,hook 常见的版本控制工具 作为一个老码农,枚举一下曾经使用过的版本控制工具。 1. VSS: visual ...
  • 分布式系统概念

    万次阅读 多人点赞 2018-11-15 16:25:36
    移动互联网最大的特点是2(to)c的o2o产品越来越多,这跟传统2B的系统最大区别就是用户量的不同,2C系统的用户量远远要高于2b系统,这就对系统提出了各种各样的高标准,响应时间,性能,灾,吞吐量等等,各种分布式...
  • Oracle 备份恢复概念

    万次阅读 2010-08-05 20:35:00
    --======================-- Oracle 备份恢复概念--====================== 数据库维护中,备份或恢复是重中之重的问题。尽管很多时候数据库系统运行缓慢,但对数据库数据的丢失而言,显然后者损失的代价是不言而喻...
  • C/C++面试笔试详细总结—基本概念及其它问答题

    千次阅读 多人点赞 2020-09-25 18:35:20
    干货:C/C++笔试面试详细总结—基本概念及其它问答题 前言 本文覆盖了C/C++工程师面试的95%以上的常考基础概念及技术细节问答题(不含STL和socket以及嵌入式的深入问答,仅为中等层面问答),整理总结不易,不点赞...
  • (21)主一致性与主切换策略

    千次阅读 2019-05-15 11:09:58
    在状态 1 中,客户端的读写都直接访问节点 A ,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行。这样可以保持节点 B 和 A 的数据是相同的。 当需要切换的时候,就切成状态 2 。这时候客户端读写访问...
  • Maven仓库和插件

    千次阅读 2018-05-30 11:38:18
    Maven仓库的概念 在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。 Maven在某个统一的位置存储所有项目共享的构建,这个位置就称之为仓库。 任何构件都有唯一的坐标,Maven根据这个坐标定义...
  • Mysql主从复制概念

    千次阅读 2019-07-14 18:37:31
    一 基本概念(面试准备) (0)异步复制 说明:这是mysql默认的复制方式 特点:即主库执行完Commit后,在主库写入Binlog日志后即可成功返回客户端,无需等待Binlog日志传送给从,一旦主库宕机,有可能会丢失日志...
  • [数据仓库]数据仓库初探

    千次阅读 2004-07-25 21:43:00
    数据仓库的概念数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。1.面向主题:不同于操作型数据库,主题是个抽象概念,是指用户使用数据仓库进行决策时所关心的重点方面。...
  • 全栈必备 缓存cache

    千次阅读 2016-10-07 17:02:26
    缓存——cache,是一种挺复杂的技术,除了应用场景之外,更进一步,还要理解命中,Cache Miss,存储成本,索引成本,失效,替代策略的诸多概念,从而了解缓存算法,真正的掌握缓存技术。
  • 关于分布式计算的一些概念

    万次阅读 2018-06-03 14:56:53
    Carl Hewitt于1970年发明Actor模型,当时Actor模型的概念远远领先于那个时代,知道Erlang这样基于Actor模型设计的面向并发编程的新语言横空出世之后,Actor模型才真真火了起来。 1.2 Actor模型是什么? ...
  • innodb索引概念

    千次阅读 2013-04-09 19:32:10
    总结记录下innodb的索引概念,以查看   innodb索引分类: 聚簇索引(clustered index)  1) 有主键时,根据主键创建聚簇索引  2) 没有主键时,会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引 ...
  • 各mon节点的功能总体上是一样的,相互间的关系可以被简单理解为主关系。如果主mon节点损坏,其他mon存活节点超过半数时,集群还可以正常运行。当故障mon节点恢复时,会主动向其他mon节点拉取最新的cluster map。 ...
  • 全栈必备DevOps

    千次阅读 2016-08-09 12:36:55
    版本控制: 代码的创建和维护,分支管理等。Git 几乎是行业的标准,可以自建Git仓库的服务器,也可以使用github 或者bitbucket这样的第三方服务。 自动化测试: 包括客户端与服务器端的自动化测试框架,例如Appium...
  • 前置基本概念

    千次阅读 2017-11-20 10:04:09
    相关术语和缩略语说明     前置 A :指前置服务器配置中居前的前置节点(节点 ...机:如无特殊说明,指前置备机。   生数据:指未经 SCADA 处理的遥测遥信电度数据。   熟数据:指 SCADA 处理之
  • 逻辑、物理、分分表(TDDL)

    千次阅读 2019-02-01 21:28:44
    逻辑/逻辑文件:给用户看的(即Database和Table就是我们常说的逻辑的范畴) 物理/物理文件:存储在计算机中的(即机器和Port就是我们常说的物理的范畴。) 一个服务器有多个实例(port); 一个实例有多个...
  • Windows 动态链接 DLL 浅析

    万次阅读 多人点赞 2013-03-26 17:51:54
    它是microsoft在windows操作系统中实现共享函数库概念的一种实现方式。其中windows中 一些作为DLL实现的文件有: ActiveX控件(.ocx)文件:如windows上的日历控件。控制面板(.cpl)文件:控制面板中的每一项都是...
  • 20个常用Python及200个第三方

    万次阅读 2019-08-31 21:26:27
    Requests.Kenneth Reitz写的最富盛名的http。每个Python程序员都应该有它 ...Pillow 它是PIL(Python图形)的一个友好分支对于任何在图形领域工作的人是必备的 SQLAlchemy 一个数据库的。对它的评...
  • 数据流图(DFD)概念及画法

    万次阅读 多人点赞 2019-04-16 11:42:40
    (1)接受顾客的订单,检验订单,若库存有货,进行供货处理,即修改库存,给仓库开货单,并且将订单留底;若库存量不足,将缺货订单登入缺货记录。 (2)根据缺货记录进行缺货统计,将缺货通知单发给采购部门,以便...
  • 《数据挖掘概念与技术》读书笔记

    千次阅读 2017-03-12 23:39:48
    最近在学习数据挖掘和数据分析相关内容,在很多地方有很多朋友都推荐该书,遂购书一本,以作学习之用,把读书过程中一些习得记录在此,以查阅。第一章 引论1.1 为什么进行数据挖掘现在的我们生活在一个信息时代,...
  • 全栈必备 JavaScript基础

    万次阅读 多人点赞 2017-04-05 08:29:37
    意思是说JavaScript 是一个轻量级解释或即时编译的函数式语言,里面有很多的概念,轻量、解释、编译、即时编译、函数式。在老码农看来,简单起见,理解为扩展语言较为方便。 一般的编程语言都有着自己相对独立的执行...
  • 数通平台软件中的概念:组件

    千次阅读 2017-06-18 08:40:28
    操作系统中存在进程(Process)、线程(Thread)或任务(Task)的概念,譬如我们知道Linux是一种多进程、多线程的操作系统,而VxWorks为单进程、多任务的操作系统。 组件是一个什么样的概念呢?组件是如何产生的呢...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,728
精华内容 23,491
关键字:

备库的概念