[2018]Anaconda安装及配置

学习Python第一件是就是安装程序,对于初学者,有些坑总是要过的,我把自己学习过程中遇到过的问题 整理,供大家参考. 1.选择安装什么Python软件及版本 安装最新版Anaconda,里面有最新版的Python程序.好几个培训机构都使用的Anaconda.使用最受欢迎的软件准没错 最新版的Anaconda中Python应该是3.0以上的. Python3.0版向2.0版不兼容真的很好,只有这样才能最为一款最简洁的软件 2.路径配置 安装过程中有一步是否将Anaconda添加的环境变量中,建议勾选.如果不勾选,安装后需要自己添加环境变量,这又是一个坑 3.手动将Anaconda添加到环境变量 找到 控制面板→系统和安全→系统→高级系统设置→高级→环境变量→系统变量→Path 双击 将以下三个添加到Path中(win8系统) D:\Anaconda\D:\Anaconda D:\Anaconda\Scripts D:\Anaconda\Library\bin 4.修改打开jupyter notebook的浏览器 默认是IE浏览器,一般很难用,而且如果IE浏览器过低,jupyter notebook如法打开 找到jupyter_notebook_config.py文件. 一般在 c:/users/username/.jupyter目录下,用记事本打开 找到# c.NotebookApp.browser = ‘’’’ 代码 修改成如下格式: chrome浏览器 import webbrowser webbrowser.register(“chrome”,None,webbrowser.GenericBrowser(u”C:\ProgramFiles(x86)\Google\Chrome\Application\chrome.exe”)) c.NotebookApp.browser = ‘chrome’ 火狐浏览器 c.NotebookApp.browser = ‘Firefox’ import webbrowser webbrowser.register(“Firefox”, None, webbrowser.GenericBrowser(u”C:\Program Files\Mozilla Firefox\firefox.exe”)) 注意:删除前面#号,代码顶格 5.修改jupyter notebook中文件路径 原因:好找文件,文件显示简洁 同上,找到jupyter_notebook_config.py文件,用记事本打开 找到 #c.NotebookApp.notebook_dir = ‘’ 语句,删除#号 修改成 c.NotebookApp.notebook_dir =‘E:/python’ 表示文件在E盘的python文件夹下面

深度学习笔记(4):1.1-1.3 边缘检测(edge detection)

第四课开始,我们开始学习卷积神经网络。 1.1 计算机视觉(computer vision) 深度学习在计算机视觉方面的应用非常振奋人心,一方面是该应用使许多不可能变成了可能,另一方面是深度学习在计算机视觉方面的应用能够给深度学习在其他方面的应用带来一些方法的改进和思考,比如语音识别等。 计算机视觉包含哪些问题呢?如下图所示: 比如图片分类,判断一个图片是否是猫;或者目标识别,比如在无人驾驶任务中,识别路上其他的车以及距离,以便无人驾驶能够安全执行;还有就是图片风格转化,比如我们有一个美女的照片(是吴老师的妻子,哈哈)和一个毕加索的绘画,把二者融合起来,就可以得到人像的轮廓和毕加索的风格。 比如在图片分类中,我们使用的图片可能是小图片,比如像素是64*64,加上颜色的三个channel(RGB channels),该图片作为输入是一个64*64*3=12288维的向量,还好。但若是大图片呢?比如一个像素为1000*1000的图片,那该图片作为输入就是3m(3百万)维的向量,假设第一层隐藏节点有1000个,且在完全连接的情况下,第一层的权重矩阵就是1000*3m维的矩阵,相当于第一层有30亿的权重,这时很难有足够多的样本去训练这么多的权重,容易发生过拟合,同时这么多的权重还会对内存有一定要求,而且我们不想仅限于处理小图片。为了解决衍生出来的这么多问题,我们需要使用卷积运算,见下节。 1.2 边缘检测例子(edge detection example) 卷积运算是卷积神经网络最基本的组成部分。这节课我们通过边缘检测例子来学习卷积运算,如下图所示: 在神经网络模型中,前几层神经网络能检测到边界,后几层可能检测到物体小部分,再后面几层可能检测到具体的物体,在这个例子中就是人脸。接下来我们讲如何在图片中识别边界,也就是为何神经网络前几层能够检测到图片中的边界。 假设我们有上图中这样一个照片,我们可以通过垂直边缘检测器和水平边缘检测器分别检测出图片中的垂直和水平边缘,检测器检测出的结果如上图所示。但是这些检测器是如何工作的呢?我们以垂直检测器为例。在介绍垂直检测器之前,我们先介绍一种运算,卷积运算(Convolution operation),如下图所示: 假设我们的图片如上图左侧矩阵所示,这是一个6*6的矩阵,因为我们没有考虑彩色,这仅仅是一个黑白图片,所以不存在RGB通道,这里图片是6*6*1的向量,接下来我们对其作卷积运算。 首先介绍一下中间的3*3矩阵,我们称之为‘核(kernel)’或‘过滤器(filter)’,中间‘*’号表示卷积运算,这与我们在程序中使用方法不同,一般‘*’在程序中都表示乘法,或者说是element-wise的乘法。 那么卷积运算怎么做呢?我曾在深度学习书中看过这样一种比喻,我觉得比较恰当,在这里跟大家分析一下,想象你是一个探险家,在黑暗中找到一幅画卷,为了仔细看清画卷内容,于是你打开手电筒从画的左上角还是扫描直至画的右下角,过滤器做的就是类似手电筒的工作。计算也非常简单,就是element-wise,首先将filter对应于左上角九宫格,然后按上图中红色式子进行计算,就是对这两个3*3矩阵进行element-wise乘法再求和,我们得到-5,写于右侧矩阵的(1,1)位置,就这样从左到右,从上到下,最终得到一个4*4的矩阵,其中最后(4,4)位置对应的-16是由左侧紫色框内矩阵和filter做卷积计算所得。 了解了卷积运算,接下来我们介绍垂直边缘检测器,如下图所示: 同样是做卷积运算,不过我们在这里对filter做了‘手脚’,使其能够检测出图片中的垂直边界,怎么说呢? 在原图中,也就是左矩阵中,我们用0来表示灰色(或者你认为黑色都可以),10来表示白色,即数值越大颜色越亮,我们想检测出白色和灰色中间那条边界,怎么做呢?我们使用了一个3*3的filter,它的第一列都为1,第二列为0,第三列为-1,经过卷积运算我们得到了一个4*4的矩阵,中间两列值都为30,两边为0,即我们清晰地找出了边界。 首先为什么能够找出边界,背后的思想我们可以这样认为,边界两侧的数值肯定是有很大差异的,不是边界的数值差异不大,所以kernel这样取值就能使数值差异不大的地方通过卷积运算得出来的值近似为0,而当数值有很大差异时,使用该kernel就无法抵消,这样就可以找出边界,当然这里要注意我们设置kernel的维度要注意原图的维度以及边界的宽度,比如这里最后的出来的边界看起来很宽,那是因为原图太小了,仅仅是6*6,如果是1000*1000,边界效果就会很好了。 1.3 更多边缘检测内容(more edge detection) 这小节我们将学习更多边缘检测的内容,比如学会如何区分正边和反边,也就是区分由亮到暗和由暗到亮的区别,如下图所示: 还是之前那个例子,假设我们将图片左右翻转一下,现在左侧是暗的,右侧是亮的,但是我们还使用同一个filter,所以自然会得到一个相反的数值,如上图所示,表示边界的值由30变为-30,这里数值的变化就就能够告知我们一些准确的信息,比如30告诉我们这个边界是正边,即颜色是由亮到暗,而-30就告诉我们这个边界是负边,及颜色是由暗到亮,当然如果你不care正边还是负边可以直接对卷积计算结果取绝对值,即只确定边界并不考虑其颜色是如何变化的。 除了垂直边缘检测,我们还可以进行水平边缘检测,如下图所示: 思想很简单,将垂直边缘检测的kernel作转置我们就可以得到水平边缘检测的kernel了。套用在例子中如上图所示,假设我们现在有一个这样的6*6矩阵,其对应图片为左下部和右上部偏暗,显然这个图片既存在水平边缘也存在垂直边缘,现在我们使用水平边缘检测的kernel去检测水平边缘,结果如上图所示,10和-10的出现在这里是因为垂直边缘的影响,同样,因为我们这里举例子的图片太小(6*6),所以这里显得10和-10占了很大比重,如果我们是1000*1000的图片,结果就可以不考虑10和-10的影响了。 对于kernel中的数值选取,很多学者在文献中公平地讨论过该如何搭配数据才是合理的,如下图所示: 除了第一列都是1,第三列都是-1这种filter,我们还可以对数据做其他改变,比如第二行都乘上2,我们称之为sobel filter,相当于在原来基础上进行了加权,它的优点在于增加了中间一行的权重,也就是处在中间的像素,这样可以增加结果的鲁棒性(robust),还有另一种filter,将第一行和第三行都乘上3,第二行乘上10,我们称之为scharr filter,这样改变也会改进一些性能。 但实际中,我们一般将这九个值设为九个参数,然后通过神经网络的反向传播去学习,为啥呢么这样做呢?首先是之前的filter过于简单,针对的仅仅是垂直或水平边缘的情况,即90度,且数值是实验前已经设定好的,不一定适合每个问题,而实际问题要复杂得多,比如上图中所示的情况,所以我们希望filter中的数值能够作为参数从数据集中学习而得到,这样一方面是准确,一方面是我们可以应对任何复杂的情况,不论是45度、70度或是73度的边缘我们都可以检测出来。 通过反向传播去学习kernel中的参数已经成为计算机视觉中最有效的思想之一。接下来我们会学习如何使用反向出传播去学习这九个参数,但在此之前,我们会先学习一下有关卷积运算的基础知识,详见下节。 版权声明:尊重博主原创文章,转载请注明出处https://blog.csdn.net/kkkkkiko/article/details/81812841

惠普Z840工作站使用U盘安装ubuntu16.04以及grub无法引导问题总结(干货)

一、制作U盘启动盘 具体过程可参考该博客:https://blog.csdn.net/yaoyut/article/details/78003061 从Ubuntu官网http://cn.ubuntu.com/download/下载你需要安装的系统的iso文件 (用来制作的U盘需要是FAT32格式的,可以通过格式化U盘更改) 通过UltraISO来进行启动盘的制作 二、利用U盘启动盘安装ubuntu16.04 (1)bios设置: 1.插上制作好的启动盘,开机,进入logo界面按Esc进入Startup Menu,选择BIOS Setup: 2.在BIOS Setup里面选择Advanced,再进入Boot Options: 3.如图禁用UEFI模式,使用传统的Legacy模式(注意此处要把USB调整到第一项): 4.完成设置回到Main选项,Save Changes and Exit,选择yes保存更改,就进入了U盘启动安装界面。 (2)安装ubuntu16.04 1.选择中文版或者英文版都行,为了方便以后google,建议英文版: 2.这一步都不用选,无需下载更新,不然会影响安装的速度: 3.选择”Something else”,方便我们自己分区,自定义安装的磁盘属性、大小等: 4.分区:由于惠普Z840是256G的固态+2T的机械,所以考虑运行速度(特别是做深度学习),将Swap、/boot、/三个分区都放在固态里面,机械就只放/home分区。我的分区具体如下,可做参考: Swap:64G(考虑Z840内存为32G,所以两倍完全够用),分区类型选择logical; /boot:1G(这是系统引导分区,一般的500M完全够,我用1G是为了看起来舒服),分区类型primary; /:191G(这相当于Windows的C盘,大点肯定没问题),分区类型primar; /home:2T(用来存放个人文档、软件包等等),分区类型logical。 (注意:最下面的Device for boot loader installation我们要选择我们刚刚分区的时候/boot的磁盘好,我的是sda2,这是为了每次启动的时候引导启动ubuntu系统,非常重要!!!) 等待安装……………..完成,重启电脑 三、无法引导ubuntu启动问题 这是本文章的重点,我也是在上面踩了好久,来来回回装了几十遍系统,终于摸到点底~ 重启过后我们会发现系统报错,直接进入了grub rescue自救界面,首先说一下产生的原因: 引起这类问题的原因有很多,比如在windows系统中删除linux系统或者是直接格式化linux盘(我之前就是这么做的,因为方便快捷,结果导致这个问题,坠入了这个深坑),linux系统到启动分区被更改了……总之就是grub配置文件已经被损坏,导致不能正常启动,而进入了救援模式。 主要分为一下几个步骤: 1. 利用 ls 命令列出磁盘信息: grub rescue> ls 比如说,结果为: (hd0,msods1),(hd0,msdos2),(hd0,msdos3),(hd1,msdos2),….. 继续利用 ls 命令来查找 ubuntu 分区:这里需要注意区分在安装ubuntu时是否单独分了/boot分区(因为有些博客里面说不用给/boot分区可解决这个问题,但是我尝试了好像不能解决我的这个问题,所以找了其他的资料,进行尝试) grub rescue> ls (hd0,msdos1)/boot/grub # 未单独分出/boot分区 grub rescue> ls (hd0,msdos1)/grub # 单独进行啦/boot分区 针对以上所示到磁盘分区逐个调用上述命令,直到结果显示没有错误,而是列出一系列文件为止。我的是 ls (hd0,msdos3)/grub 到时候列出了一些文件,说明找到了ubuntu分区。

爬虫系列(四)–全站爬取

爬虫系列(四)–全站爬取 全站爬取需要的数据基于一个这样的假设:某网站的页面上存在该网站其他页面的连接,通过这些连接跳转的新的页面进行数据的爬取。在开始这个之前,要先明白栈和队列。本篇中介绍的是单线程的实现方式,大规模的爬取需要多线程,分布式爬取。 1.实现步骤 (1)准备几个起始链接加入待队列Q中,例如Q=[“http://www.xxx.com/aaa/”,”http://www.xxx.com/bbb/”,”http://www.xxx.com/ccc/”] (2)并将这几个链接加入一个入队集合S中,S={“http://www.xxx.com/aaa/”,”http://www.xxx.com/bbb/”,”http://www.xxx.com/ccc/”}这个集合作用是保证一个网页只爬取一次。 (3)从Q中取出一个链接url(出队,取出队首元素,并从队列中删除该元素),如果Q中没有链接,结束爬取。如果有链接url=”http://www.xxx.com/aaa/”,进行(4)步骤。 (4)对url爬取,保存需要的数据(写到文件中,建议使用json格式保存,一行一个页面),找出该页面上的所有链接urls (5)把符合我们要求的连接(例如以http://www.xxx.com 开头的链接)找出来,判断每一个连接urli是否在S中。如果不在S中,把urli加入S,urli入队 (6)继续执行(3)步骤 注意1:这个是广度优先爬取,如果把队换成栈,会变成深度优先爬取。如果没有特殊的需求,一般都是使用广度优先爬取。 注意2:对于一个小网站来说,这样操作没有什么问题,但是有些网站页面很多,Q和S中存储的连接太多直接撑爆内存,这时可以实现一个硬盘队列(栈)和硬盘集合,本系列文章不实现这些功能。 注意3:有些网站的连接到站内的url形如”/aaa?a=1&b=2″,需要改写成”http://域名/aaa?a=1&b=2″ 注意4:有些网站会根据短时间内一个ip访问大量页面制定反爬虫策略,可以爬取一个页面后,休眠一段时间接着爬取 2.代码实现(代码仅对于代码中要爬取的网站有效,其他网站需要重新配置规则) import time import os import json from urllib import request from lxml import etree header_dict = { "Accept":"application/json, text/javascript, */*; q=0.01", "Accept-Language":"zh-CN,zh;q=0.9", "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", } def get_http(load_url,header=None): res="" try: req = request.Request(url=load_url,headers=header)#创建请求对象 coonect = request.urlopen(req)#打开该请求 byte_res = coonect.read()#读取所有数据,很暴力 try: res=byte_res.decode(encoding='utf-8') except: try: res=byte_res.decode(encoding='gbk') except: res="

打印机驱动安装教程

工作中,尤其是从事半文秘工作的人,不是全文秘,没有安装打印机驱动经验,这里就来说说如何安装佳能打印机驱动。 准备安装资料 -佳能打印驱动 安装步骤 1.我这里是压缩文件,解压后,点击Setup.exe开始安装。 2.要同意才能下一步安装。 3.根据指示下一步,安装。 4.根据指示下一步,安装。 5.这里要选择打印机相应型号的驱动,添加到安装驱动列表,下一步。 6.点击添加端口,选择Standard TCP/IP port,确认,下一步。 7.添加打印机IP地址和端口名,下一步。

登录注册样例(附带输入信息检验) springmvc

1 注册界面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> </span> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>买家注册title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="${pageContext.request.contextPath}/conf1/css/font-awesome.min.css"> <link rel="stylesheet" href="${pageContext.request.contextPath}/conf1/css/ionicons.min.css"> <link rel="stylesheet" href="${pageContext.request.contextPath}/conf1/dist/css/adminlte.min.css"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" > head> <script type="text/javascript"> function checkForm(){ if($.trim($("#name").val())==""){ alert("请填写名字"); $("#name").focus(); return false; } if($("#name").val().length>50){ alert("名字长度不得大于50个字符"); $("#name").focus(); return false; } if($.trim($("#username").val())==""){ alert("请填写用户名"); $("#username").focus(); return false; } if($("#username").val().length>50){ alert("用户名长度不得大于50个字符"); $("#username").focus(); return false; } if($.trim($("#password").val())==""){ alert("请填写密码"); $("#password").focus(); return false; } if($("

安全杂谈|《暗网》:互联网领域的水下冰山

原文链接: http://blog.51cto.com/13620939/2175554 电影:《解除好友2:暗网》 上映时间:2018 国家:美国 类型:恐怖 导演:斯蒂芬·思科 主演:贝蒂·加布里埃尔/科林·伍德尔/瑞贝卡·瑞滕豪斯/安德鲁斯·李斯 如果某天你在街上捡到一个Macbook,你会怎样处理它呢? 在电影《解除好友2:暗网》中,一位男青年捡到了一台Macbook,它则将其拿回家后猜对了密码成功进入了系统,然而他在把玩的过程中却发现电脑非常卡顿,于是,这位年轻人通过视频远程请教懂电脑的朋友,并在朋友的帮助下找到了电脑中被隐藏的文件夹。在这个文件夹中,有一个叫“The River”的程序和一个叫“奉献”的装满了视频的子文件夹。 男青年和他的朋友们打开了这些文件,发现The River是一个古老的聊天室,一但打开就会自动连到一个无法追踪的网域。而“奉献”文件夹中则是绑架、虐待、非法***的犯罪实录视频,这些视频内容极其冷漠、纪实、反人类,几乎每一个完全超越了普通人能够接受的黑暗极限。害怕与恐惧支配着男青年和他的朋友们,然而一切都晚了,随着他们电脑的摄像头被打开,声音被录制,个人照片、住址等等个人信息被曝光,男青年与他们的朋友们一个一个被杀害,而这制造这一切的凶手,都来自于那个叫The River的网络世界。 《解除好友2:暗网》自上映以来,便受到了广大悬疑爱好者们的追捧,其被称为近些年来小成本电影中不可不看的佳作。在追捧的同时,回顾影片的情节,则更令人不寒而栗,它的恐怖之处不在于妖魔鬼怪,而是在于心理层面的恐惧。 事实上,影片中的The River影射了我们实际生活中的“深网”,那么究竟什么是“深网”呢?所谓“深网”指的是只能通过特殊软件、授权或对电脑作特别设置才能访问、在流行的搜索引擎上无法查到的特殊网络。他们在互联网上的内容占了整个互联网全部内容的96%。 那么真实的深网真的像影片中说的那么可怕吗?事实上,深网上确实存在着部分血腥暴力的站点,这些小众就是暗网,但是就和普通网站里有存在只有一小众人才能接受的站点一样,暗网在深网里也只是占了极少数。之所以会有各种奇奇怪怪的传说,从某种程度上来说正是由于我们对部分现象的原因缺少认知,加上部分人士的推波助澜,才会越传越偏。 既然深网那么像秘密组织,并且还是非公开的,一般人很难进去吧?那就大错特错了。其实深网依旧是公开站点,它只是与普通的公网相隔绝而已。至于很难接触,其实只是缺失途径罢了。 其实暗网是我们身边真实存在的,今天带大家了解“暗网”这部电影是为了让大家意识到它所带来的现实的危害,如果想对它进行一个深入的了解,这里给大家分享一个安全通专门为大家讲解深网和暗网是什么的课程。 https://www.sectown.cn/open/course/32 from=wechatpush 转载于:https://blog.51cto.com/13620939/2175554

centos取消休眠失误导致进不了图形界面解决方法

我的centos只要一暗屏,就开不了机,所以我就不想让屏幕变暗,以前是通过设置自动挂起的时间来解决的,但最长也就到两小时,如果还没有操作进行,屏幕就灭了,然后只能强关重启电脑。但我就是想要它一直亮着,任何时间都能进行操作。 所以我就在网上找方法找到了一个方法,修改xorg.conf这个文件内容,网上的这一方法可能就是针对他们的电脑适用吧。我改后就卡在开机那块了,差点吓死人,经营了这么久的系统就这样完了。 并不是,我们改的是显示器和显卡的配置,我们只是进不了图形界面,所以在开机后,直接按ctrl+shift+1~6进字符界面把你改的配置文件改回来就行了。

dom节点生成图片

1,业务要求将dom节点生成图片,注意点,移动端dom节点不可以使用%,rem等布局。要是用px来布局,并且使用640的设计稿,适配320px的手机屏幕。要在服务器上才可以,我是用node+express搭建的服务器环境。如果有自己的环境可以直接引用下面代码 2依赖的js:html2canvas.js和canvas2image.js,为了省事我引入jq。 1dom绘制成为canvas————–html2canvas /* html2canvas 0.5.0-beta3 Copyright (c) 2016 Niklas von Hertzen Released under License */ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.html2canvas=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0x80 (not a basic code point)', 'invalid-input': 'Invalid input' }, /** Convenience shortcuts */ baseMinusTMin = base - tMin, floor = Math.floor, stringFromCharCode = String.

Bootstrap-前端框架

Bootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局、移动设备优先的 WEB 项目。 Bootstrap4 目前是 Bootstrap 的最新版本,是一套用于 HTML、CSS 和 JS 开发的开源工具集。利用我们提供的 Sass 变量和大量 mixin、响应式栅格系统、可扩展的预制组件、基于 jQuery 的强大的插件系统,能够快速为你的想法开发出原型或者构建整个 app 。 。。。。。。。。。。。。。 Bootstrap4 与 Bootstrap3 Bootstrap4 是 Bootstrap 的最新版本,与 Bootstrap3 相比拥有了更多的具体的类以及把一些有关的部分变成了相关的组件。 http:/ /www.iis7.com/b/wzjk/ 同时 Bootstrap.min.css 的体积减少了40%以上。 。。。。。。。。。。。。 创建第一个 Bootstrap 4 页面 1、添加 HTML5 doctype Bootstrap 要求使用 HTML5 文件类型,所以需要添加 HTML5 doctype 声明。 HTML5 doctype 在文档头部声明,并设置对应编码 。。。。。。。 移动设备优先 为了让 Bootstrap 开发的网站对移动设备友好,确保适当的绘制和触屏缩放,需要在网页的 head 之中添加 viewport meta 标签。 如右所示: width=device-width 表示宽度是设备屏幕的宽度。 initial-scale=1 表示初始的缩放比例。 shrink-to-fit=no 自动适应手机屏幕的宽度。 。。。。。。。。。。 Bootstrap 4 CDN 国内推荐使用 BootCDN 上的库: Bootstrap4 CDN : : : : 。。。。。。 容器类 Bootstrap 4 需要一个容器元素来包裹网站的内容。 我们可以使用以下两个容器类: .