Debian 软件包管理

Debian 软件包管理

  • Debian 软件包管理
    • 基础软件包管理知识
      • sources.list 文件格式
      • 新手建议
      • 档案库临时小故障
      • 软件包依赖关系
    • APT 进行软件包管理
      • 基本操作
      • 软件包管理操作

基础软件包管理知识

Debian 档案库

  • Debian 官方建立一致的软件包并从档案库中分发它们
  • 提供 HTTP 和 FTP 的方式来访问 Debian 档案库
  • 全世界都有 Debian 档案库的 镜像站,可以理解为 Debian 档案库的备份

软件包管理工具

  • 可以让用户从档案库安装 统一设置 的二进制软件包到系统中

  • 目前 Debian 的软件包管理系统是 高级软件包工具 APT

    • apt: 用于所有的 交互式命令行 操作
    • apt-get: 主要用于 脚本调用,在 apt 不可用时可作为备用选项
    • aptitude: 交互式的文本界面 来管理已安装的软件包和搜索可用的软件包
  • APT 前端用户程序和后端的不同访问方式

    • dpkg: 底层 软件包管理系统
    • apt: 命令行 管理软件包的 APT 前端 apt, apt-get, apt-cache
    • aptitude: 全屏控制台 交互式管理 软件包的 APT 前端,可以管理软件包的多个版本
    • gnome-software: GNOME 图形化的 APT 前端
    • synaptic: GTK 图形化的 APT 前端
  • APT 辅助工具

    • apt-utils: APT 实用程序 apt-extracttemplates, apt-ftparchive, apt-sortpkgs
    • apt-file: 软件包搜索工具
    • apt-cache: 提供了标准的正则表达式来搜索软件包名称和描述
    • apt-rdepends: 查询软件包依赖
    • apt-listchanges: 软件包历史更改提醒工具
    • apt-listbugs: 在 APT 安装前列出严重的 bug
    • unattended-upgrades: 用于 APT 的增强软件包,会自动安装安全更新
  • apt-get 和 apt-cache 是最基础的基于 APT 的软件包管理工具,意味快但功能不丰富

  • apt-get 和 apt-cache 可以使用 /etc/apt/preferences 来管理软件包的多个版本,但这非常繁琐

  • 在成功安装下载的软件包后,apt 将默认删除缓存的 .deb 软件包

sources.list 文件格式

对于典型的 HTTP 访问,档案库在 /etc/apt/sources.list 文件

# 源的信息组成 deb/deb-src URL 	stable/testing/unstable [area ...]
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
  • 一行一条

  • 第一个参数

    • deb 表示二进制软件包
    • deb-src 表示源代码软件包,非必要,不使用可以加速档案库元数据的更新
  • 第二个参数 Debian 档案库 的根 URL

    • URL 可以是 "http://", "ftp://", "file://", ...
  • 第三个参数是发行版名称,这个一般需要查看一下

    • stable: 稳定版,不用说一般都是使用这个,用于你的生产服务器
    • testing: 测试版,它是自动滚动发布的,由 Debian 档案库的 QA 质量架构来管理,更新得足够频繁来提供全部最新的特性
    • unstable: 不稳定版,不推荐的使用,仅对开发者调试软件包合适
  • 后面全部参数是 Debian 档案库的有效档案库范围名称

    • main: 遵从 Debian 自由软件指导方针(DFSG),并且不依赖于 non-free
    • contrib: 遵从 Debian 自由软件指导方针(DFSG),但依赖于 non-free
    • non-free: 不遵从 Debian 自由软件指导方针(DFSG)

    自由软件

    • Debian 默认只安装自由软件
    • Debian 建议只运行来自 main 的自由软件

下面是一个小脚本可以帮助你添加 第三方档案库,前提是你的默认 /etc/apt/sources.list 没有被破坏并且会 Linux 的 CLI 界面的基本操作,此脚本是根据默认的 sources.list 创建,当然你可以不用脚本用手动编辑 φ(゜▽゜*)♪

  • 第一步,在命令行执行以下内容

    # 创建一个文件夹 test 名称随意
    mkdir test
    
    # 创建脚本,可以使用 vi, vim, ... 编辑,建议不会对应编辑器可以查询一下用法
    vi apt-sources.sh
    
  • 第二步,编辑 apt-sources.sh 脚本,注意:在进入 vi 编辑模式后 小心 每个操作,如果 不确定有问题,可以按 ESC 进入命令模式再按 u 撤销

    • 按照 i 输入下面内容,只要按 i 就可以进入编辑模式

      #!/bin/bash
      
      if [ -r $1 ]; then
          while read -r url; do
              filename=${url#*.}
              grep "^deb.*" /etc/apt/sources.list |  sed -E "s~http.*\.[[:lower:]]{2,5}~$url~" > /etc/apt/sources.list.d/${filename%%.*}.list
          done < "$1"
          apt update
      else
          echo "文件不存在或无法权限读取"
      fi
      
    • 输入完上面内容,按 Esc 进入命令模式,按 :wq 保存退出 vi 编辑器,如果有问题按照上面警告可以撤销操作按 :q! 退出 vi

    • 注:读不懂脚本,可以在 此处 了解 shell 脚本的基本知识

  • 第三步,编辑第三方档案库信息,vi sources.txt 像第二步一样输入下面内容,当然你可以添加其他你知道的 第三方档案库信息,注意一条地址一行

    http://mirrors.ustc.edu.cn
    http://mirrors.aliyun.com
    
  • 第四步,执行脚本

    # 赋予脚本执行权
    chmod +x apt-sources.sh
    
    # 执行脚本
    sudo ./apt-sources.sh sources.txt
    
    # 查看添加是否成功
    cd /etc/apt/sources.list.d/ && ls -lh
    
    • 使用时部分命令可能执行不了,建议查看权限,可以使用 sudo 进行临时提权,关于 sudo 信息

说明:

  • 如果需要对 档案库的有效档案库范围 变更可以在 /etc/apt/sources.list.d/ 目录中找到不同第三方档案库进行调整
  • /etc/apt/sources.list.d/ 目录中最好一个档案库一个文件
  • 注意 /etc/apt/sources.list.d/ 是官方为我们准备的不是脚本创建的
  • 此脚本的作用:根据默认的 /etc/apt/sources.list 为模板,将每条 sources.txt 中的档案库地址于默认的进行替换,并一个档案库创建一个 .list 文件存放在 /etc/apt/sources.list.d/ 目录中

网上直接复制的源一般存在以下问题

  • 协议问题,一般是 HTTP 协议,部分对 HTTPS 协议不友好需要安装 apt-transport-httpca-certificates 的支持

  • 发行版号不匹配,这个建议查看自己当前系统 uname -a 然后在官网查看,或看看 /etc/apt/sources.list 默认的内容,所以一般别改 /etc/apt/sources.list

  • deb-src 一般含义此行需要下载大量源码信息,一些不必的可以注释掉,不一定每个仓库需要拉取

  • GPG error 问题,这个一般是版本问题或安装时是离线安装,导致发行版的元数据文件 Release 不同步出现 GPG 验证错误,或者离线安装没有网络在安装时 apt 自动配置根据 CD/DVD 的数据配置等可能,建议了解 GPG

    解决方法是添加上对应的签名即可,两种方法,都需要 wget 这个一般有自带,解决时的两种关于签名的文件 .asc.gpg

    • 直接使用 gpg 程序

      • 确认 gpg 是否安装,没有就安装一下

        sudo apt-get install gpg
        
      • 得到 .gpg 文件,具体名字随便,建议有辨识度,比如阿里云记为 aliyun.gpg

        # 根据对应档案库的 Release.gpg 文件下载
        wget -qO- http://mirrors.aliyun.com/debian/dists/buster/Release.gpg?spm=a2c6h.25603864.0.0.25864a07v5Lsgz > aliyun.gpg
        
        # 如果是 .asc 文件,使用 gpg --dearmor 转化
        wget -qO- http://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
        
      • 添加 .gpg 文件,两种方法

        # 方法一:安装 /etc/apt/keyrings/ 目录
        sudo install -D -o root -g root -m 644 aliyun.gpg /etc/apt/keyrings/aliyun.gpg
        
        # 方法二:安装 /etc/apt/trusted.gpg.d/ 目录
        sudo install -D -o root -g root -m 644 aliyun.gpg /etc/apt/trusted.gpg.d/aliyun.gpg
        

        方法一需要改变 list 文件,在 deb/deb-srcurl 之间添加一条信息 [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/aliyun.gpg]

        # 这是 /etc/apt/sources.list.d/aliyun.list 文件,其中 ... 是简化的需要根据情况填写,参考默认的 /etc/apt/sources.list
        deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/aliyun.gpg] http://mirrors.aliyun.com/debian ...
        
    • 使用 apt 默认的 apt-key

      使用非常方便,首先下载 .asc 或 .gpg 文件,然后使用 apt-key 安装

      # 下载
      wget http://archive.kali.org/archive-key.asc
      wget -qO- http://mirrors.aliyun.com/debian/dists/buster/Release.gpg?spm=a2c6h.25603864.0.0.25864a07v5Lsgz > aliyun.gpg
      
      # 安装
      sudo apt-key archive-key.asc
      sudo apt-key aliyun.gpg
      

    Release.gpg 文件在每个档案库都有的,比如阿里的访问 http://mirrors.aliyun.com/debian/dists/buster 就可以看到,.asc 文件也差不多在档案库中但位置不定,不同档案库可能不同需要自己查,Debian 官方档案库 的 keys 仓库 地址

新手建议

  • /etc/apt/sources.list 不要包含 testing 或 unstable

  • /etc/apt/sources.list 不要在标准的 Debian 中混合使用其它非 Debian 的档案库

  • 第三方档案库放在 /etc/apt/sources.list.d 分类以 .list 后缀结尾的文件中

  • 不要建立 /etc/apt/preferences

  • 不了解会造成的全部影响,就不要通过配置文件改变软件包管理工具的默认行为

  • 不要使用 dpkg -i random_packagedpkg --force-all -i random_package 安装任何软件包

  • 不要删除或修改 /var/lib/dpkg/ 中的文件

  • 不要让从源码直接安装的程序覆盖系统文件

  • 没有在安全的条件下使用你特定的配置进行彻底地测试,就不要从 Debian 安装任何软件包

  • 使用 non-free 和 contrib 中的软件包所需要冒的风险

    • 使用类似的软件包会失去自由
    • 失去 Debian 对软件包的支持,这些软件包无法访问源代码,Debian 不能进行完全的支持
    • 可能存在商业付费

档案库临时小故障

  • 损坏的软件包被上传到档案库,多见于 unstable
  • 延迟接受新的软件包到档案库,多见于 unstable
  • 档案库时间同步问题,在 testing 和 unstable
  • 手动干预档案库,多见于 testing

软件包依赖关系

Debian 系统通过其控制文件字段中的版本化二进制依赖声明机制

  • Depends: 绝对的依赖,所有在这里列出的软件包都必须同时或提前安装
  • Pre-Depends: 类似于 Depends,但列出的软件包必须提前完成安装
  • Recommends: 这里表示一个强,但不是绝对的依赖关系,大多数用户不会想要这个包除非在这里列出的所有包都已经安装
  • Suggests: 较弱的依赖,这个软件包的大多数用户可能会从安装所列的软件包中受益,但没有它们也可以有适当的功能
  • Enhances: 这里表明一个像建议的弱依赖关系,不装也没关系
  • Breaks: 表明一个软件包不兼容一些版本规范,一般的解决方法就是升级列出的所有软件包
  • Conflicts: 这表明了绝对的不兼容,为了安装这个软件包必须移除所有列出的软件包
  • Replaces: 这表明这个文件安装的文件会替代所列的软件包的文件
  • Provides: 表明这个软件包会提供所列的软件包所有的文件和功能

Conflicts, Replaces, Provides 定义到一个虚拟的软件包,确保了在任何一个时间只能安装一个提供该虚拟包的真正软件包


APT 进行软件包管理

基本操作

更新元数据: apt update, apt-get update, aptitude update

  • 从远程档案库获取档案库元数据
  • 重建并更新 APT 使用的本地元数据

安装软件: apt install ..., apt-get install ..., aptitude install ...

  • 选择命令行中列出的包
  • 解决软件包依赖关系
  • 从远程服务器获取已选二进制包
  • 解包所获取的二进制软件包
  • 运行 preinst 脚本
  • 安装二进制文件
  • 运行 postinst 脚本

升级软件: apt upgrade/full-upgrade, pt-get upgrade/dist-upgrade, aptitude safe-upgrade/full-upgrade

  • 选择候选版本,默认最新的可用版本,除非手动指定版本
  • 解决软件包依赖关系
  • 如果候选版本与已安装的版本不同,会从远程档案库获取所选择的二进制软件包
  • 解包所获取的二进制软件包
  • 运行 preinst 脚本
  • 安装二进制文件
  • 运行 postinst 脚本

移除软件: apt remove ..., apt-get remove ..., aptitude remove ...

  • 选择命令行中列出的包
  • 解决软件包依赖关系
  • 运行 prerm 脚本
  • 移除已安装的文件,除了 配置文件
  • 运行 postrm 脚本

清除软件: apt purge ..., apt-get purge ..., aptitude purge ...

  • 选择命令行中列出的包
  • 解决软件包依赖关系
  • 运行 prerm 脚本
  • 移除已安装的文件,包含 配置文件
  • 运行 postrm 脚本

软件包管理操作

  • apt 用于交互式命令行
  • aptitude 全屏的交互式文本用户界面
  • apt-get/apt-cache 基本工具,主要用于脚本
apt aptitude apt-get/apt-cache 描述
apt update aptitude update apt-get update 更新软件包档案库元数据
apt install foo aptitude install foo apt-get install foo 安装 foo 软件包的候选版本以及它的依赖
apt upgrade aptitude safe-upgrade apt-get upgrade 安装已安装的软件包的候选版本并且不移除任何其它的软件包
apt full-upgrade aptitude full-upgrade apt-get dist-upgrade 安装已安装的软件包的候选版本,并且需要的话会移除其它的软件包
apt remove foo aptitude remove foo apt-get remove foo 移除 foo 软件包,但留下配置文件
apt autoremove N/A apt-get autoremove 移除不再需要的自动安装的软件包
apt purge foo aptitude purge foo apt-get purge foo 清除 foo 软件包的配置文件
apt clean aptitude clean apt-get clean 完全清除本地仓库的软件包检索文件
apt autoclean aptitude autoclean apt-get autoclean 清除本地仓库中过时软件包的软件包检索文件
apt show foo aptitude show foo apt-cache show foo 显示 foo 软件包的详细信息
apt search regex aptitude search regex apt-cache search regex 搜索匹配 regex 的软件包
N/A aptitude why regex N/A 解释匹配 regex 的软件包必须被安装的原因
N/A aptitude why-not regex N/A 解释匹配 regex 的软件包不必安装的原因
N/A aptitude search '~i!~M' apt-mark showmanual 列出手动安装的软件包
  • 对于使用体验和功能性: aptitude > apt > apt-get/apt-cache
  • 对于自动化脚本: apt-get/apt-cache > apt > aptitude
  • apt 算得上是 apt-get, apt-cache, ... 类似命令的封装,针对终端用户交互的界面

注意:

  • 不建议在新版本发布后在 stable 的 Debian 系统上使用 aptitude 命令来进行跨版本的系统升级
  • aptitude 命令有时候会为了 testing 或 unstable 的 Debian 系统升级清除大量软件包
  • 建议用户使用 apt 命令用于 交互式 的使用场景,而在 shell 脚本 中使用 apt-get/apt-cache 命令
  • 对于它们更精细化或特殊选项的使用建议 man 查看

关于 GNU/Linux 的内容

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

相关文章

  • 百度前端高频面试题(附答案)

    TCP粘包是怎么回事,如何处理?默认情况下,TCP连接会启⽤延迟传送算法(Nagle算法),在数据发送之前缓存他们.如果短时间有多个数据发送,会缓冲到⼀起作⼀次发送(缓冲⼤⼩⻅socket.bufferSize),这样可以减少IO消耗提⾼性能.如果是传输⽂件的话,那么根本不⽤处理粘包的问题,来⼀个包拼⼀个包就好了。但是如果是多条消息,或者是别的⽤途的数据那么就需要处理粘包.下面看⼀个例⼦,连续调⽤两次send分别发送两段数据data1和data2,在接收端有以下⼏种常⻅的情况:A.先接收到data1,然后接收到data2.B.先接收到data1的部分数据,然后接收到data1余下的部分以及data2的全部.C.先接收到了data1的全部数据和data2的部分数据,然后接收到了data2的余下的数据.D.⼀次性接收到了data1和data2的全部数据.其中的BCD就是我们常⻅的粘包的情况.⽽对于处理粘包的问题,常⻅的解决⽅案有:多次发送之前间隔⼀个等待时间:只需要等上⼀段时间再进⾏下⼀次send就好,适⽤于交互频率特别低的场景.缺点也很明显,对于⽐较频繁的场景⽽⾔传输效率实在太低,不过⼏

  • 漫谈数据仓库的分层架构与演进

    作者:暮角编辑:数据社全文共2845个字,建议5分钟阅读大家好,我是一哥,今天跟大家分享一下怎么理解建模方法和分层架构?分层架构很容易在各种书籍和文档中去理解,但是把建模方法和分层架构放在一起就会出现很多困惑了。接下来,我会从数据研发与建模的角度,演进一下分层架构的设计原因与层次的意义。01分层的演进之所以会有分层架构,最主要的原因还是要把复杂冗长的数据流程分拆成一些有明确目的意义的层次,这样复杂就被拆解为一些相对简单小的模块。那么分层架构中各层都是怎么产生的呢,我们可以简化看一下。第一个数据加工任务:我要进行第一个数据加工任务,一切平台层次都没有,我只有一个MaxCompute。我该怎么做呢?第一步,我需要自己做一下数据集成,把源系统的数据集成到MaxCompute。第二步,我需要把增量合并全量生成ODS层,这样我就得到了与业务系统一样的表结构和全量的数据。第三步,因为我对业务系统的数据表关联关系有了解,所以,我可以根据业务需求使用ODS的全量表做表关联,加工出我想要的数据结果。第一个数据应用: 如果我不只是做一个业务需求,我是有很多业务需求,这样我就形成了我的第一个数据应用。所以,

  • 何恺明上榜CVPR 2021获奖名单,4篇「最佳」是华人一作

    晓查发自凹非寺 量子位报道|公众号QbitAICVPR2021本周正式召开啦,作为计算机视觉领域最重要的学术会议,大会的最佳论文自然是领域学者们关注的重要风向标。就在上周,CVPR官方公布了入围的32篇最佳论文候选名单,其中华人一作占据了16篇,国内北大、腾讯、商汤等学校机构上榜。那么最终哪些论文摘得荣誉呢?今天凌晨,也就是大会首日,官方公布了结果:其中最佳论文奖和最佳学生论文奖1篇,最佳学生论文提名3篇,最佳论文提名2篇。在这7篇文章里,有4篇是华人一作,我们还看到了熟悉的大神何恺明的名字。7篇获奖论文最佳论文奖GIRAFFE:RepresentingScenesasCompositionalGenerativeNeuralFeatureFields这篇论文来自德国蒂宾根大学的两位学者。摘要:这篇文章提出,将复合三维场景表示纳入生成模型,会导致更可控的图像合成。将场景表示为复合生成神经特征场,能使我们能够从背景中解开一个或多个对象以及单个对象的形状和外观,同时从非结构化和非定位的图像集合中学习,而无需任何额外的监督。本文将这种场景表示与神经渲染pipeline相结合,可以生成快速逼真

  • 高性能 MySQL 主从架构的复制原理及配置详解

    选择“星标”,重磅干货,第一时间送达!复制复制概述Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。mysql支持的复制类型:基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。基于行的复制:把改变的内容复制过去,而不是把命

  • 从SEO的角度,如何打造非专业领域内容?

    在做SEO的过程中,你一定会遇到这样的问题,我们会在不同行业中,扮演相同的角色:搜索引擎优化师,但如果对方并没有提供内容团队的话。我们偶尔需要自己去撰写大量的相关性内容,可是我们并不是万能机器,对于一些非专业领域的内容撰写,我们并不擅长。那么,从SEO的角度,如何打造非专业领域内容?根据以往SEO写作的经验,我们将通过如下内容阐述:1、问卷调查让我们从简单开始:对您的客户行业一无所知?在与他们开始电话会议之前,请先设置一份内容调查表,这将帮助您了解有关他们的业务以及他们希望您关注什么的基础知识,提出类似的问题:①您的业务陈述是什么?②客户面临的主要痛点是什么?③用五句话或更少的句子描述您公司的卖点。让我们面对现实吧:内容调查表很简单。2、问问题这听起来似乎很容易,甚至可能使您想打自己的脑袋,而实操的过程中却很难,但向客户提出正确的问题将帮助您为他们创建最佳的内容。请记住,您不是专家,这很正常,但是与专家(客户)会面以获取正确的信息也是您的工作。只需向他们解释:“因为您是专家,您可以在此博客文章中插入一些专业知识吗?”他们通常会乐于承担义务。并给出积极的建议。3、百度一下因为90%的时间

  • 微信小程序使用公众号关注组件

    点击开启按钮,会提示选择需要展示的关注组件的公众号,这里以本站的官方微信为例子。在小程序中添加关注组件官方的WIKI很简单,如下所示:official-account 基础库2.3.0开始支持,低版本需做兼容处理。 用户扫码打开小程序时,开发者可在小程序内配置公众号关注组件,方便用户快捷关注公众号,可嵌套在原生组件内。复制Tips:使用组件前,需前往小程序后台,在“设置”->“接口设置”->“公众号关注组件”中设置要展示的公众号。注:设置的公众号需与小程序主体一致。 在一个小程序的生命周期内,只有从以下场景进入小程序,才具有展示引导关注公众号组件的能力: 当小程序从扫二维码场景(场景值1011)打开时 当小程序从扫小程序码场景(场景值1047)打开时 当小程序从聊天顶部场景(场景值1089)中的“最近使用”内打开时,若小程序之前未被销毁,则该组件保持上一次打开小程序时的状态 当从其他小程序返回小程序(场景值1038)时,若小程序之前未被销毁,则该组件保持上一次打开小程序时的状态 每个页面只能配置一个该组件。复制示例:<official-account><

  • 原生态纯JavaScript 100大技巧大收集---你值得拥有(1--50)

    1、原生JavaScript实现字符串长度截取functioncutstr(str,len){ vartemp; varicount=0; varpatrn=/[^\x00-\xff]/; varstrre=""; for(vari=0;i<str.length;i++){ if(icount<len-1){ temp=str.substr(i,1); if(patrn.exec(temp)==null){ icount=icount+1 }else{ icount=icount+2 } strre+=temp }else{ break } } returnstrre+"..." }复制 2、原生JavaScript获取域名主机functiongetHost(url){ varhost="null"; if(typeofurl=="undefined"||null==url){ url=window.location.href; } varregex=/^\w+\:\/\/([^\/]*).*/

  • 网易MySQL微专业学习笔记(十一)-MySQL业务优化与设计

    前言这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL业务优化与设计”中的MySQL数据类型相关笔记。所有笔记可能不定期更新,发布时不一定为最终版。正文索引查询优化什么是索引索引的意义-快速定位要查找的数据二分查找法B+tree创建及索引单列索引createindexidx_test1ontb_student(name);联合索引createindexidx_test2ontb_student(name,age);索引中现根据name排序,name相同的情况下,根据age排序索引维护索引维护有数据库自动完成插入/修改/删除每一个索引行都编程一个内部封装的事务索引越多,事务越长,代价越高索引越多对标的插入和索引字段修改就越慢。控制表上的索引数量!切忌胡乱添加无用索引如何使用索引依据where查询条件创建索引selecta,bfromtab_awherec-?idx_c(c)selecta,bfromtab_awherec=?andd=?idx_cd(c,d)排序ORDERBY,GROUPBY,DISTINCT字段添加索引select*f

  • Python神经网络| 一篇很棒的实战笔记,附源码

    建议阅读时间:5~10分钟 0前言感谢粉丝:疯琴,以下分享是疯琴在学习《Python神经网络》时的笔记,总结得很棒,感谢疯琴的乐于分享精神,相信这篇笔记一定会帮助到大家。1基本概念神经网络也是机器学习的一种实现,可以应用在有监督学习和无监督学习,因为中间可以有较多层,所以属于深度学习方法。神经网络的名字很唬人,其实概念挺朴素的,是由含一个输入层,一个输出层和若干隐藏层构成的有向无环图(这名字也唬人),看图像一目了然。为啥叫隐藏层呢,就是因为和输入输出没关系,看不见,有点儿神秘。每层的每个结点借助生物的概念称为神经元,各层之间神经元相互链接。2神经网络训练过程算法训练包含两个阶段:输入向输出传送叫前向馈送信号;输出向输入传送叫反向误差传播。把输入前馈计算得到输出,把输出与目标值比对,计算误差,把误差反向传播修正链接权重。具体过程:输入层与隐藏层之间的链接权重”与“输入信号”加权求和,“和值”通过神经元函数(比如,阶跃函数,Relu函数,Sigmoid函数等)运算得到隐藏层的结果。用与第一步相同的过程计算出输出层的结果。目标值-输出值=误差。将误差按权重反向传播给隐藏层。用梯度下降法最小化

  • Python3 里不存在编码问题?

    编码问题在Python中一直是个巨坑。关于Python2的编码问题,之前写过一篇文章:浅谈Python2中的编码问题在Python3中,编码问题得到了改进,str类型直接使用unicode进行存储,不带有编码。但真的就一劳永逸了吗?事实上,虽然填上了一些坑,但也会带来新的坑。尤其结合Windows使用,那酸爽……真是谁用谁知道?。Crossin编程教室的WooDumpling同学在学习中做了一点总结,分享Python3的学习者。相关概念 bytesunicodestr encodedecodebytes相当于Python2中的str类型,从网页上抓取下来的数据流也是该类型的 在Python3中,要得到一个byte类型的变量,可以在字符串内容前面加入b得到,但前提是该字符串的内容是可以完全由ascii码表示的,否则会出现语法错误>>>s1="你好" >>>s1 '你好' >>>type(s1) <class'str'> >>>s2=b'

  • jenkins X实践系列(1) —— 背景知识

    本文介绍jenkinsX(以下简称jx)相关的背景技术。 jenkinsX简介 JenkinsX是一个高度集成化的CI/CD平台,基于Jenkins和Kubernetes实现,旨在解决微服务体系架构下的云原生应用的持续交付的问题,简化整个云原生应用的开发、运行和部署过程。 jx基于gitops,将k8s分为preview、staging、production几个环境, 详细的devops可以查看下图: jx是云原生CICD,devops的一个最佳实践之一,目前在快速的发展成熟中。最近调研了JX,准备写一个jx实践系列,这里为第一篇,介绍jx用到的一些相关组件,作为了解jx的背景知识。 jenkinspipeline jx使用JenkinsPipeline来执行CI流程,JenkinsPipeline是jenkins的一套插件,支持将连续输送Pipeline实施和整合到Jenkins。Pipeline提供了一组可扩展的工具,用于通过PipelineDSL为代码创建简单到复杂的传送Pipeline。 Jenkinsfilepipeline使用Groovy脚本来定义CI流程,来看一个jx

  • &quot;元素隐式具有 “any” 类型,因为类型“Shared”没有索引签名&quot;问题解决思路

     最近在构建一个typescript项目时如下代码在项目框架里vscode报错元素隐式具有"any"类型,因为类型“Shared”没有索引签名;很有意思的是当我们单独的把这段代码里单独写一个a.ts,则vscode不会报错;在搜索网上资料及自己尝试后,找到了几个有意思的解决方法。 classShared{map:any;get(key:string){returnthis['map'][key];}set(key:string,value:any){this['map'][key]=value;}privateroot=__dirname;}复制方法二思考单独的.ts和typescript框架在vscode层的差异,想想只有launch.json和tsconfig.json,一个个属性过去后,发现是tsconfig.json配置项"noImplicitAny":true, 导致的.解释:noImplicitAny:true/false;为false时,如果编译器无法根据变量的使用来判断类型时,将用any类型代替。为true时,进行强类型检查,会报错,很显然

  • Storm入门

    前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 听说过大数据的同学应该都听说过Storm吧?其实我现在负责的系统用的就是Storm,在最开始接手系统的时候,我是完全不了解Storm的(现在其实也是一知半解而已) 由于最近在整理系统,所以顺便花了点时间入门了一下Storm(前几天花了点时间改了一下,上线以后一堆Bug,于是就果断回滚了。) 这篇文章来讲讲简单Storm的简单使用,没有复杂的东西。看完这篇文章,等到接手Storm的代码的时候你们**『大概』『应该』**能看懂Storm的代码。 什么是Storm 我们首先进官方看一下Storm的介绍: ApacheStormisafreeandopensourcedistributedrealtimecomputationsystem Storm是一个分布式的实时计算系统。 分布式:我在之前已经写过挺多的分布式的系统了,比如Kafka/HDFS/Elasticsearch等等。现在看到分布式这个词,三歪第一反应就是「它的存储或者

  • Socket (二) 简单的代码实现

    SocktServer.cpp #include"stdafx.h" #pragmacomment(lib,"ws2_32.lib") #include<Winsock2.h> int_tmain(intargc,_TCHAR*argv[]) { WORDwVersionRequested; WSADATAwsaData; interr; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0){ return0; } if(LOBYTE(wsaData.wVersion)!=1|| HIBYTE(wsaData.wVersion)!=1){ WSACleanup(); return0; } SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_INaddrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin

  • 常用数据结构操作与算法复杂度总结

    目录时间复杂度常用数据结构操作与算法的复杂度输入规模较小时的情况引用 博客:blog.shinelee.me|博客园|CSDN 时间复杂度 如何评估一个算法的计算时间? 一个算法的实际运行时间很难评估,当时的输入、CPU主频、内存、数据传输速度、是否有其他程序在抢占资源等等,这些因素都会影响算法的实际运行时间。为了公平地对比不同算法的效率,需要脱离开这些物理条件,抽象出一个数学描述。在所有这些因素中,问题的规模往往是决定算法时间的最主要因素。因此,定义算法的时间复杂度\(T(n)\),用来描述算法的执行时间随着输入规模的增长将如何变化,增长速度是怎样的。 在输入规模较小时,运行时间本来就少,不同算法的差异不大。所以,时间复杂度通常关注的是输入规模\(n\)较大时运行时间的变化趋势,称之为渐进复杂度,采用大O记号,表示渐进上界,对于任意的\(n>>2\),若有常数\(c\)和函数\(f(n)\)满足 \[T(n)\leqc\cdotf(n) \]则记作 \[T(n)=O(f(n)) \]可以简单地认为,\(O(f(n))\)表示运行时间与\(f(n)\)成正比,比如\(O(n

  • FastReport MasterData明细数据 Memo 设置0值打印时为空白,不显示

      在FastReport中设置要显示为指定值的列,在这列有个HideZeros设置为true,当此列值为0时,打印出来后为空白,避免因大量的0看起来晕                  

  • angular + spring boot + mysql

      花了两周的时间,我终于做完实训了。   这次用的全是新学的技术,前端框架是angular,组件库是ngzorro的,后端是springboot,数据库是mysql。这次被逼着学习新东西,总算是凑凑合合把这些技术学会了。   先说前端的angular框架,现在我学会了基本的建component,设置路由和其他一些框架的特效,如果以后要用却忘记了,可以去angular官网看英雄教程。   再看后端,spring的框架在今年暑假的时候我就被要求学,可是我初看一头雾水,又没有实际使用的需求,我就一直拖着没学。这次总算学习了一波。   为了让后端能够与数据库连接,先配置resources文件夹中的application.properties文件,如下: server.port=8080 #Hibernate相关配置 ##方言 #hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect ##显示S

  • 课后作业-阅读任务-阅读提问-4

    同类型的软件之间是如何竞争的? 项目开发有什么经验和教训? 团队精神和集体主义的区别? 好的用户体验当然是所有人都想要的,如果它和产品的质量有冲突,怎么办?  牺牲质量去追求用户体验吗?用户能接受吗?

  • 多态

    一、什么是多态 “多态”是JAVA的一种重要特性,可以理解为事物存在的多种形态。 不过,这只是字面上来理解,等于废话。那么究竟何为多种形态呢,接下来,举一个现实生活中的例子。 比如,动物里有猫和狗。猫摆在面前,你可说它是猫,也可以说它是动物。 说它是猫时,用JAVA语句表示即 猫x=new猫; 说它是动物时,用JAVA语句表示即 动物x=new猫; 这样,实体x即具备猫的类型,也具备动物类型。但必须一个前提,即“猫”必须是“动物”中的一种,如果“狗x=new猫”就不对了。 通过以上的例子,我们可以看出,实体除了具备本类类型,还可以具备其它类型。这种是“多态”。   先看以下代码,这是使用非多态方式编写的 代码如下: packagecom.duotai; publicclassDuoTaiDemo{ publicstaticvoidmain(String[]args){ myFun(newCat()); myFun(newDog()); myFun(newPig()); } //动物“吃”的功能提取出来封装成函数 publicstaticvoidm

  • 艺术活动——《喜羊羊和灰太狼》(音游)

    一、活动内容:艺术活动——《喜羊羊和灰太狼》(音游) 二、活动目标: 1.能听辨音乐中的长音和停顿,控制好手部动作,跟随音乐玩游戏。 2.能遵守游戏规则,体验游戏的紧张感,享受与同伴两两合作游戏的快乐。 三、活动准备: 1.物质准备:音乐《喜羊羊和灰太狼》 2.资源利用:事先教会一名幼儿与教师协同玩游戏。 四、活动过程: (一)以故事导入活动,引发幼儿的兴趣。 引导语:有一天,喜羊羊出去玩,走着走着,突然看到灰太狼迎面跑来。喜羊羊吓坏了,不由自主地大叫一声“咩——”。灰太狼被吓了一跳,仔细一看,说:“哦,是喜羊羊啊,我的美味午餐!”说完,灰太狼扑向喜羊羊,喜羊羊转身就跑。一个在前面跑,一个在后面追。喜羊羊到底有没有被灰太狼追上?我们一起来听听音乐。 (二)组织幼儿安静倾听音乐《喜羊羊和灰太狼》。 教师在音乐中长音的地方用手指点数,引导幼儿发现并记忆音乐中灰太狼共追了喜羊羊基础,前三次和第四次的音乐有什么不同。 (三)听音乐扮演喜羊羊和灰太狼。  1.情节一:喜羊羊和灰太狼出门。启发幼儿自编能表现喜羊羊和灰太狼走路的动作,跟随音乐节奏原地做走路动作。 2.情节二:喜羊羊和灰太狼

  • Vue-learn-002

    App.vue {{url}} SoSo {{url}} CustomInput.vue {{url}} {{url}} 学之如大海汪洋,薄积厚发,后发制人,大学之道也。

相关推荐

推荐阅读