目录:

一、Linux 中软件包的分类

1.源码包


2.二进制包


3.源码包


4.软件安装的选择

二、软件安装之 RPM

1.背景知识


2.准备知识


3.安装升级与卸载


4.查询校验与提取

三、软件安装之 YUM

1.概述


2.YUM 在线安装

四、软件安装之源码包

1.源码包与 RPM 包的区别


2.源码包的安装


3. 测试 http 服务

五、脚本安装包

一、Linux 中软件包的分类:

1.源码包

1.1 源码包的简介

源码包就是各种源代码文件组合而成的压缩包,因为 Linux 是开源的,所以源码包中的源代码是可以查看甚至修改的,用户可以根据自己所需要的功能进行安装。但是源码包在安装的时候需要编译,即从源代码 abcd 编译成机器语言 0101,这个过程需要花费很长的时间。


在 Windows 中的程序都是经过编译的,并且一般认为编译是不可逆的,即反编译(0101->abcd是非常困难的),即使能勉强完成,也会丢失部分代码。也正因为这个原因,在 Windows 中需要用到某个程序,如果该程序向你收费,你也只能乖乖交钱,除非你不用。这也就是 Linux 开源的魅力所在!

1.2 源码包的优缺点

源码包有如下优点:

  1. 开源,如果有足够的能力,可以修改源码包中的源代码;
  2. 可以根据自己的需求选择安装特定功能;
  3. 软件是编译安装,所以更加适合自己的系统,更加稳定高效;
  4. 卸载方便,只需要把安装目录删除,就能不留痕迹。

源码包有如下缺点:

  1. 安装过程步骤多,尤其是安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误;
  2. 编译过程会比较长,所以安装的过程也比二进制包安装时间长;
  3. 对新手不太友好,因为是编译安装,所以一旦报错,新手很难解决。

2.二进制包

2.1 二进制包的简介

二进制包是已经编译好了的包,二进制包中的数据都计算机能直接识别的 0101 ,所以安装起来就省去了编译环节,这样可以节省很多时间。在 Linux 中,Redhat 系列的二进制包一般都是 rpm 包,而 Ubuntu 系列的二进制包一般都是 deb 包。

2.2 二进制包的优缺点

二进制包有如下优点:

  1. 包管理系统简单,只需要敲几个命令就能实现包的安装,升级,查询和卸载;
  2. 安装速度比源码包快得多;

二进制包有如下优点:

  1. 经过编译,不可以再看到源代码,不能根据自己的需求决定安装哪些功能;
  2. 功能的选择不如源码包灵活
  3. 效率不如源码包
  4. 依赖性

3.脚本安装包

3.1 脚本安装包的简介

对于一些复杂的环境搭建(如LAMP),太过于繁琐,有大神就写出了该环境的安装脚本,只需要运行该脚本,所有的东西都能装上。虽然给脚本安装包另外分了一个类,但是脚本安装包实际上还是安装源码包和二进制包。

3.2 脚本安装包的优缺点:

脚本安装包有如下优点:

  1. 安装简单,方便,只需要运行脚本,就能安装脚本包含的所有软件,也不会报错。

脚本安装包有如下缺点:

  1. 完全丧失自定义性,不能按照自己的需求安装需要的功能,安装的功能完全由脚本编写者帮你决定。

4. 软件安装的选择

如果是服务器,推荐源码包安装。因为服务器要被成千上万的人访问,源码包执行效率高。

如果是个人设备,推荐 RPM 包,当然也看个人自己的爱好了,想装什么包就装什么包,谁特么管你。


二、软件安装之 RPM :

1. 背景知识:

RPM包来源与光盘中,所以要先挂载光盘,才可以进行后面的步骤。挂载的示例如下:

  1. 创建挂载点并挂载:
	mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom/
  1. 所有的 RPM 包都在 /mnt/cdrom/Packages/ 中,可用 ls 命令查看,如下图所示:

与挂载相关的内容,可以参考我的另一篇博客:

Linux基础二(挂载、关机重启与系统等级)

2.准备知识

知道了挂载后,还不能直接安装 RPM 包,还必须具备一些关于 RPM 包的准备知识(命名规则和依懒性)

2.1 命名规则

2.1.1 名称格式

如下所示:

httpd-2.2.15-29.el6.centos.x86_64.rpm
其中:
httpd 为包名
2.2.15 为版本号;
29 为软件发布的次数
el6.centos 为其适合的Linux平台
x86_64 为其适合的硬件平台
rpm 是包的扩展名
2.1.2 包名与包全名

包全名指的是完整的包名,包名是开头的第一个单词。


在上面的例子中:


httpd为包名;


httpd-2.2.15-29.el6.centos.x86_64.rpm是包全名

  1. 包全名:在操作没有安装的包的时候(安装和升级),要使用包全名,并且要注意路径(绝对路径或相对路径)
  2. 包名:已经安装了该软件之后,后续对该包的操作(卸载和查询)使用包名就可以了。当使用包名的时候,实际上是去搜索 /var/lib/rpm/ 中的数据库__db.001到__db.004(里面是乱码)

2.2 依赖性

  1. 树形依赖:a->b->c


    解决:装c再装b再装a
  2. 环形依赖:a->b->c->a


    解决:将a、b、c三个包放在一个命令里安装
  3. 模块依赖:也叫库依赖。


    最恶心,依赖以.so.n(n为数字)结尾的库文件,该库文件是 /mnt/cdrom/Packages 目录下的某一个rpm包中的文件,要先安装该包


    解决:如何判断在哪个包中,查询 www.rpmfind.net

3.安装升级与卸载

3.1 安装

命令:

rpm -ivh 包全名
选项:
-i:安装(install)
-v:显示详细信息(verbose)
-h:显示进度(hash)
--nodeps:不检测依赖性(不要用)

用 rpm 命令来安装软件时要注意其依赖性。可以根据 2.2 节中的思路来进行安装。

示例:安装 httpd

1. 进入挂载目录:cd /mnt/cdrom/Packages/
2. 安装 httpd:rpm -ivh http-tab(2次tab)
3. 经过 2. 后会提示几个 rpm 包,其中:
1. httpd-2.2.15-29.centos.x86_64.rpm 为主包
2. httpd-devel-* 为库包
3. httpd-manual-* 为文档包
4. httpd-tools-* 为工具包
4. 一般先安装主包,再安装附加包

注意:有两个100% 才算完成,第一个100% 是准备成功,第二个100% 出现才算安装成功

3.2 升级

命令:

rpm -Uvh 包全名
选项:
-U:升级(Upgrade)
--nodeps:不检测依赖性(不要用)
升级相当于安装一个版本更新的安装包,你也可以用升级命令来安装新包。

3.3 卸载

命令:

rpm -e 包名
选项:
-e:卸载(erase)
--nodeps:不检测依赖性(不要用)

说明:

  1. 卸载时只需输入包名即可,因为该软件包在安装的时候已经写入 /var/lib/rpm/ 中的数据库中了
  2. 卸载命令依然存在依赖性,按照安装时的反序卸载即可
  3. rpm 包在安装时没有指定安装位置,安装位置是该rpm包作者定义好的默认位置(如下图所示),会分布在磁盘的各个部分,若要手工删除不方便,所以才有了卸载命令。
  4. 而源码包没有卸载命令,因为源码包在安装过程中可以指定安装位置,只要把软件包安装位置所在目录删除就会将软件彻底删除。

4.查询校验与提取

4.1 查询

命令:

rpm –q 包名			// 查询指定软件包是否安装
rpm –qa // 查询所有已安装的软件包
rpm –qi 包名 // 查询指定包名的详细信息(里面只有帮助网站有点用)
rpm –qip 包全名 // 查询指定未安装包的详细信息(注意路径)
rpm –ql 包名 // 查询指定软件包都安装在哪些位置了
rpm –qf 系统文件名 // 查询该系统文件属于哪一个软件(必须是已经安装了的软件生成的文件才能反向追查)
rpm -qR 包名 // 查看软件包的依赖关系 (–p 未安装的软件包) 选项:
-q:查询(query)
-a:所有(all)
-i:信息(information)
-p:包(package)
-l:位置(local)
-f:文件(file)

在查询的时候可以灵活应用管道符搭配 grep 命令使用

4.2 校验

命令:

rpm –V 已安装的包名		// 校验指定rpm包中的文件
选项:
-V (verify) 校验
示例:
rpm -V httpd

如果文件未被修改,则不会出现任何提示,若文件被修改,则会出现以下提示:

其中,验证内容(即文件前面的 9 个.和一个c)分别代表:

S:文件的大小是否被改变
M:文件的类型或文件的权限是否被改变
5:文件的MD5校验和是否改变(可看成是文件内容是否改变)
D:设备的主从代码是否改变
L:文件路径是否改变
U:文件的属主(所有者)是否改变
G:文件的属组是否改变
T:文件的修改时间是否改变
c:这个字符所占的位置有以下意义:
c:配置文件
d:普通文档
g:鬼文件,很少见,就是该文件不应该被这个 RPM 包所包含
L:授权文件
r:描述文件

4.3 提取

当某一个软件的某些配置文件被误删除了,导致一些功能执行不了,这时候可以通过来提取命令来将该文件从 RPM 包提取出来。

命令:

rpm2cpio 包全名 | cpio -idv.文件绝对路径
其中:
rpm2cpio 是将 rpm 包转化为 cpio 格式的命令
cpio 是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
| 是管道符

三、软件安装之 YUM :

1.概述

RPM 安装的缺点:依赖性太强,手工安装难度较大。


YUM 安装的也是 RPM 包,其好处是:所有安装包都放在官方服务器上,使用 YUM 进行在线安装时,可以自动解决依赖性问题;当然,如果网络不通,也可以进行本地 YUM 安装。但是,YUM 在线安装对于 RedHat 来说是收费服务(CentOS可以用_)。而且 YUM 也只能实现安装,升级和卸载功能,不支持其他的功能(如查询,YUM的查询只是在服务器上查询相关软件名)。

2.YUM 在线安装

2.1 YUM 源文件

因为 YUM 安装是在线的,所以需要指定安装时所需的源文件从哪里下载。YUM 源文件就是用来指定下载来源的文件,即用来指定下载来源是网络上的某个网站的还是本地哪个文件的。


YUM 源文件保存在 /etc/yum.repos.d/ 目录下,一共有 4 个文件,分别是:CentOS-Base.repo(网络YUM源)CentOS-Debuginfo.repo(调试YUM源)CentOS-Media.repo(光盘YUM源)CentOS-Vault.repo。其中,默认只有第一个是生效的。

CentOS-Base.repo 文件的内容(部分)如下:

# 注释
# 注释
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 [updates]
···
enabled=0
···
[extras]
···
[centosplus]
···
[contrib]
···

其中:


形如 [base] 的是容器名称,base 代表基本安装,update 代表更新等;


name 是容器说明,可以自己随便写;


mirrorlist 是镜像站点,指定了一个网站地址,安装时就从该网站上下载所需的文件,与 baseurl 的作用一样,可以注释掉其中一个;


baseurl 是 YUM 源服务器的地址,默认是 CentOS 官方的 YUM 源服务器,是可以使用的,该服务器在国外,嫌慢的话你也可以改成国内的地址;


enabled 此容器是否生效,生效则 =1,不生效则 =0,不写则默认生效;


gpgcheck 如果是 1 则代表 RPM 的数字证书生效,0 则不生效;


gpgkey 是数字证书公钥文件保存的位置,不用修改。

如果你能联网,直接用第一个YUM源就可以了,如果你闲它太慢可以改成国内的服务器地址。

2.2 光盘搭建 YUM 源

没有网络的情况下,可以用光盘来搭建本地 YUM 源。步骤如下:

  1. 挂载光盘

     mkdir /mnt/cdrom
    mount /dev/sr0 /mnt/cdrom/
  2. 使网络 YUM 源失效,即:使 /etc/yum.repos.d/CentOS-Base.repo 文件失效,因为系统默认选择的 YUM 源文件是网络 YUM 源


    可以通过修改该文件的后缀名使其失效:

     cd /etc/yum.repos.d/
    mv CentOS-Base.repo CentOS-Base.repo.bak
  3. 让光盘 YUM 源生效,即:使 /etc/yum.repos.d/CentOS-Base.repo 文件生效,要改动该文件内的三个地方,如下图所示:






    两张图分别为修改前后的内容。

  4. 验证本地 YUM 源是否搭建完成,可借助 yum list 命令,若在第三列看到 CentOs-Media.repo 的容器名称即 c6-media 则代表搭建成功。

  5. 这样一来,即使不能联网还能通过本地 YUM 源进行软件安装。实际上在生产中很多人也更愿意使用本地 YUM 源进行软件安装。

2.3 YUM 命令

2.3.1 查询命令
yum list 	// 用来查询所有可安装的软件包(不支持本地)
yum search keyword // 搜索和关键字相关的所有软件包

如果我们要使用某个命令提供的服务,如 nslookup 查看 DNS 相关信息,但是系统并没有安装该命令所在的软件包,怎么查询呢?

  1. yum provides */keyword:如 yum provides */nslookup,就能看到该命令属于 'bind-utils' 这个软件包
  2. 接下来用 yum 安装该软件包即可:yum -y install bind-utils
2.3.2 安装升级卸载命令
yum -y install 包名		// 安装软件包(自动解决依赖关系)
选项:
-y 自动回答 yes
例如:
yum -y install gcc // gcc 是 C 语言编译器 yum –y update 包名 // 升级软件包,不写包名会升级所有
// 必须要有更高版本的软件包,个人可以升级,服务器上不建议(除非是严重漏洞) yum –y remove 包名 // 卸载软件包

注意:服务器上应使用最小化安装,用什么装什么,尽量别用 YUM 卸载!因为会卸载掉相关的依赖包,包括系统内核所依赖的包!

Yum软件组管理命令:

yum grouplist			// 列出若有可用的软件组列表

yum groupinstall 软件组名	// 安装指定软件组,组名可以由 grouplist 查询出来

yum groupremove 软件组名		// 卸载指定软件组

说明:


对于一些复杂的软件(如中文支持),用组比较方便。


在远程工具上,yum grouplist 会用中文显示软件组名,但是安装敲命令的时候必须要用英文组名,我们可以修改系统默认语系:LANG=en_US 即可。要改回中文语系,可以用 LANG=zh_CN.utf8 命令。这是临时生效,要永久生效需要在文件 /etc/sysconfig/i18n 中修改(shell的环境变量中有详细)。

这边推荐一个用yum查询命令所属软件包的方法


四、软件安装之源码包的安装:

1.源码包与 RPM 包的区别

1.1 安装前的区别

我们在上面对软件包的分类中,有提到源码包和二进制包的优缺点,在这里就不再赘述。实际上,上面提到的优缺点是在软件安装之前体现出来的差别,但是源码包与二进制包(RPM)在安装后还有一些区别。安装前的区别主要是在概念上有所不同,可以简单地理解为编译前和编译后的不同;而安装后的区别主要是安装位置的区别,而由安装位置的区别又造成后续的管理方法的不同。

1.2 安装后的区别

1.2.1 RPM 包的安装位置

在上文中已经贴有一张图,这边再贴一次:

实际上,安装者并不能决定 RPM 包安装的位置,而 RPM 包的安装位置是由编写该安装包的作者定义的,所以我们在安装的时候并不需要指定安装位置。上图是一个常见的 RPM 包所安装的目录,不代表所有的安装包都按照这个目录进行安装。


不过 RPM 包还是支持指定安装位置的,由命令:rpm --prefix=<dir> 实现。但是我们并不建议指定 RPM 包的安装位置,原因如下:

  1. 若不指定安装位置,则会按照默认的位置安装,系统可以正常调用;
  2. 若指定安装位置,则系统会去默认的安装位置中找,反而找不到;
  3. 但是不指定安装位置,默认的安装位置会很零散,到处都是,但是我们还有卸载命令 rpm -e 包名
1.2.2 源码包的安装位置

源码包的安装位置可以随意指定,但是为了方便管理,我们通常安装在 /usr/local/软件名/ 目录下,软件安装包可以保存在 /usr/local/src/ 目录中。但是我们为什么要指定源码包的安装位置呢?因为源码包并没有卸载命令,若不指定安装位置,则会装得到处都是,当我们想要卸载该软件时删起来很麻烦;若指定了安装位置,删除安装目录即可。

1.2.3 管理(启动)方法不同

管理方法的不同实际上就是启动方法的不同:

  1. RPM 包在安装时,若不指定安装位置,则会安装在默认位置,同时将启动程序放在 /etc/rc.d/init.d/ 目录下,可以通过 service 软件名 start|stop|restart 命令管理软件。
  2. 源码包在安装时,并不会将启动程序放在该目录下,所以也不能用 service 命令其管理源码包安装的程序,所以只能用绝对路径来启动或关闭。当然啦,也可以将该软件的启动程序(以apache为例默认放在/usr/local/apache2/bin/apachectl目录下)复制到该目录下然后用 service 命令来管理。

此外,还有一些命令也只能针对 RPM 包安装的服务使用,如:查看服务自启动状态的命令 chkconfig --list 和管理服务自启动的命令 ntsysv,默认情况下均不能对源码包使用。

2.源码包的安装

2.1 安装前的准备工作

  1. 安装 C 语言编译器gcc:因为在 Linux 中,所有的源代码包都使用 C 语言编写的,所以我们需要确保在安装源码包之前已经安装了 C 语言编译器。值得注意的是,gcc 必须要用二进制包安装,因为 gcc 的源码包也是 C 语言编写的,需要进行编译才能安装。
  2. 下载源码包:安装完了 gcc 之后,我们可以去官网下载源码包,如 Apache 官网下载地址是 http://mirror.bit.edu.cn/apache/httpd。新手练习的话可以下载 2.2 版本的 Apache 源码包,因为它不会报错

2.2 注意事项

  1. 源码包的保存位置:/usr/local/src/。其中,usr是用户资源;local是本地;src指源码包
  2. 软件安装位置:/usr/local/软件名/。其中,usr是用户资源;local是本地
  3. 如何确定安装报错?
	① 安装过程停止(只有安装过程停止了才能判断)
② 看是否出现 error|warning|no 的提示(只需要看最后几行即可)

2.3 安装过程(固定不变)

  1. 下载源码包
  2. 解压下载的源码包
  3. 进入压缩目录(必须执行,因为后续操作都在该目录下进行)
  4. 执行 ./configure 软件配置与检查 命令,可看成是编译前的准备(基本上每个源码包都有这个命令或者类似的命令),执行完成会生成(写入) MakeFile 文件,后续依赖该文件进行安装


    作用如下:
	① 定义需要的功能选项:
./configure --help 命令可以看到支持的功能选项,需要的话在安装的时候加上即可
如:./configure --prefix=/usr/local/apache2
其中,--prefix 选项的作用是在安装时会自动创建 /usr/local/apache2/ 这个目录,并将安装期间产生的一系列文件都复制到该目录下
② 检测系统环境是否符合安装要求
如:检测是否安装了 gcc
③ 把定义好的功能选项和检测系统环境的信息,都写入 MakeFile 文件,用于后续的编辑
  1. 执行 make 命令进行编译。检查有无报错,若报错可使用 make clean 清除编译产生的缓存文件,恢复到 make 之前的状态,再想办法。


    截止到目前,若出现错误,无需删除 /usr/local/apache2 目录,因为还没安装
  2. 执行命令make install对软件进行安装。检查有无报错,若报错则删除安装目录;若没报错可以进入安装目录查看相关文件
  3. 启动该软件:以 httpd 为例执行 /usr/local/apache2/bin/apachectl start


    注:如何知道 Apache 的启动文件是 apachectl ?


    在解压的源码包中有一个 INSTALL 文件,里面有相关信息如下图所示:
![INSTALL文件](https://i.imgur.com/cXYSiPb.png)
  1. 去浏览器上输入 IP 地址测试服务是否开启成功啦,若访问不了可以试试关闭 Linux 上的防火墙(setup)

2.4 卸载

源码包无卸载命令,直接删除安装目录即可

3. 测试 http 服务

3.1 RPM 包的 http 服务

网页保存位置是:/var/www/html/,里面默认是空的,可以自己创建一个文件 index.html

3.2 源码包的 http 服务

网页保存文件是:/usr/local/apache2/htdocs/index.html,可以 vi 进行编辑


五、脚本安装包:

脚本安装包在本文一开始的分类中有介绍,很简单,只要执行该脚本即可,脚本安装包实际上还是安装 RPM 包或源码包。这里就不再不再赘述。


对于搭建复杂的环境 LNMP(Linux,Nginx,MySQL,PHP) 可以使用脚本安装包,这边推荐一个网站:https://lnmp.org/

Linux基础三(软件安装管理)的更多相关文章

  1. Linux 学习 (十一) 软件安装管理

    Linux软件安装管理 学习笔记 软件包简介 软件包分类: 源码包 :脚本安装包 二进制包(RPM 包.系统默认包) 源码包的优点: 开源,如果有足够的能力,可以修改源代码 可以自由选择所需的功能 软 ...

  2. Linux基础:软件安装(rpm,yum,源代码)

    Software Installation on Linux Linux安装分为rpm包(可通过yum或者是rpm命令安装)和源码包(源代码或者是编译过的二进制码)两种. Linux是开源系统,很多应 ...

  3. linux基础开发软件安装 - java相关

    1.linux在线安装mysql:转自 https://www.cnblogs.com/bigbrotherer/p/7241845.html ,写的很好,简单易用. 开启远程访问:转 https:/ ...

  4. 1、Linux基础--相关软件安装与网络配置

    1.虚拟机(VM安装) 2.网络配置 3.Linux操作系统安装 4.xshell安装

  5. Linux软件安装管理之——dpkg与apt-*详解 apt命令(dpkg和apt代替rpm)

    apt list *python* Nosee123关注赞赏支持   Linux软件安装管理之--dpkg与apt-*详解 [Linux软件安装管理系列]- - 传送门: - -<Linux软件 ...

  6. Linux软件安装管理之——dpkg与apt-*详解

    Linux软件安装管理之--dpkg与apt-*详解 [Linux软件安装管理系列]- - 传送门: - -<Linux软件安装管理之--源码安装详解> - -<Linux软件安装管 ...

  7. Linux上的软件安装有哪些方式?

    Linux上的软件安装有以下几种常见方式介绍 1.二进制发布包 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 2.RPM包 软件已经按照redhat的包管理工具规范RPM进行打包发布,需要 ...

  8. inux软件安装管理之——dpkg与apt-*详解

    inux软件安装管理之--dpkg与apt-*详解 Nosee123关注 0.5922017.09.12 17:47:44字数 3,894阅读 8,565 [Linux软件安装管理系列]- - 传送门 ...

  9. 大数据学习——Linux上常用软件安装

    4.1 Linux系统软件安装方式 Linux上的软件安装有以下几种常见方式: 1.二进制发布包 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 2.RPM发布包 软件已经按照redhat的 ...

随机推荐

  1. luogu P2365 任务安排

    嘟嘟嘟 如果常规dp,\(dp[i][j]\)表示前\(i\)个任务分\(j\)组,得到 \[dp[i][j] = min _ {k = 0} ^ {i - 1} (dp[k][j - 1] + (s ...

  2. luogu P1891 疯狂LCM

    嘟嘟嘟 这题跟上一道题有点像,但是我还是没推出来--菜啊 \[\begin{align*} ans &= \sum_{i = 1} ^ {n} \frac{i * n}{gcd(i, n)} ...

  3. java使用纯命令行打包项目

    1: javac -d 编译之后的class文件输出目录   指定源文件位置即可.例如 对于多个包下面的源码编译,貌似javac不支持迭代编译,可能需要一次传入多个源码位置进行编译.一种便捷方法就是使 ...

  4. auto关键字使用

    auto类型变量--根据初始值推断真实的数据类型. 有些时候并不能很确定一个变量应该具备的数据类型,例如:将一个复杂表达式的值赋给某个变量,此时并不能很明显的确定这个值所具备的数据类型.此时auto关 ...

  5. js基础知识整理

    一.javaScript,也称之为js,是专为网页交互设计的脚本语言.主要由以下三部分组成: 1)ECMAScript  由ECMA-262定义,提供核心语言功能. 2)DOM对象(document ...

  6. $Luogu P2029$ 跳舞 题解

    一道不是十分水的\(dp\). 首先我们考虑\(dp\)方程的构造.起初我定义的状态是\(dp_{i,j}\)表示前\(i\)个格子,总共跳了\(j\)次的最大得分.但事实上它并不可以转移,因为我们不 ...

  7. HDU3853:LOOPS

    题意:迷宫是一个R*C的布局,每个格子中给出停留在原地,往右走一个,往下走一格的概率,起点在(1,1),终点在(R,C),每走一格消耗两点能量,求出最后所需要的能量期望   #include<i ...

  8. python3 raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbid

    1.分析: 如果用 urllib.request.urlopen 方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器,操作系统,硬件平台等信 ...

  9. 模板自定义函数 template function

    sqlite3中的日期默认是UTC,当日期字段的默认值是CURRENT_TIMESTAMP时,这个日期和北京时间CST少了8小时. 网上建议说数据库里用UTC,读取数据时再转换为当地时间. web页面 ...

  10. 【H5】dropload (移动端下拉刷新,上拉加载)

    插件概要地址:http://ximan.github.io/dropload/ 一般下载其中的demo2对照修改即可使用. 小吐槽.我在项目中用的时候,有个后端说ajax麻烦但是还是要做体现他很热爱工 ...