Ubuntu系统下安装软件出现报错:con not perform the following tasks@TOC
检查软件源,实在不行改为国内源。
或者等待网络再次下载。
以下内容为多个来源整合而成,若遇到前后软件版本不符,请无视。具体版本以符合自身Linux系统为准。
CentOS默认是不识别windows的ntfs分区的,我们使用ntfs-3g工具进行挂载。
1.
首先下载ntfs-3g:
网址:http://pkgs.repoforge.org/rpmforge-release/
说明:pmforge是一个安全而稳定的软件仓库。
LZ使用的版本是 rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
或者自行在网上下载 ntfs-3g,用以下方法自行安装:
PS:若使用此方法,请跳过第二步。
⑴安装ntfs-3g前要先安装编译器,如果不安装gcc后面编译ntfs-3g时会失败。
# yum install gcc //安装编译器,一直按Y即可,如果不安装gcc后面编译ntfs-3g时会失败,gcc是一种用语lonux系统下编程的编译器,
# mkdir /usr/local/ntfs3g //创建文件夹ntfs3g,用于后面编译安装NTFS-3g
# cd /usr/local/src //linux下默认源代码包存放位置;源码包编译安装位置:/usr/local/软件名
⑵安装ntfs-3g
# tar zxvf ntfs-3g_ntfsprogs-2011.4.12.tgz
# cd ntfs-3g_ntfsprogs-2011.4.12
# ./configure --prefix=/usr/local/ntf3g //编译,指定安装目录/usr/local/ntf3g,可以不指定
# make
# make install
2.
安装rpmforge:
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
安装好之后就可以直接使用yum命令安装ntfs-3g:
yum install fuse-ntfs-3g
3.
完成后查看文件系统: fdisk -l,可以根据磁盘大小区别各个分区。
在 /home/cxl/桌面/ 路径下创建文件夹wd,we,wf,分别用来挂载DEF盘,因为不必在linux系统中使用C盘,故不用挂载。(这是lz自己使用的路径,各位可以根据自己的情况在不同路径下创建不同的文件夹)(目录最好直接建在桌面,方便直接打开)
4.
使用命令挂载:
mount -t ntfs-3g /dev/sda5 /home/cxl/桌面/wd
mount -t ntfs-3g /dev/sda6 /home/cxl/桌面/we
效果 面包屑作用 面包屑应该是我们在项目中经常使用的一个功能,一般情况下它用来表示我们当前所处的站点位置,也可以帮助我们能够更快的回到上个层级
原始方式 最笨的方法就是在每个需要面包屑的页面中固定写好
<template> <div class="example-container"> <el-breadcrumb separator="/"> <el-breadcrumb-item v-for="(item,index) in breadList" :key="index" :to="{ path: item.path }" >{{item.name}}</el-breadcrumb-item> </el-breadcrumb> </div> </template> <script> export default { name: "Example", data() { return { breadList: [{ name: "首页", path: "/home" }, { name: "系统设置", path: "/setting" }, { name: "用户管理", path: "/setting/usermanage" }] }; } }; </script> 如果按照上述方式去实行的话,虽然我们可以完成面包屑的功能,但是它不够灵活,在每个需要的页面添加,带来的维护成本是巨大的。
最主要的是你们的产品天天变需要咋办,还不累死。有人说登哥我就喜欢这么改,只有这样我才会有工作量。
好吧那当我没说,但是我劝你善良,登哥劝你一句,把那些大量重复的工作尽可能的赶紧做完,剩下的时间你才能自由安排,进行充能呀。
否则,你拿什么进步?普通的人总是喜欢抱怨没有时间,而优秀的人就是这么把时间省下来的。他们知道什么事情重要,什么事情不重要。
利用Route路由元信息 把路径结构配置在 Route meta 属性中
const router = new Router({ routes: [{ path: '/example', name: 'example', component: Example, meta: { breadList: [{ name: "
C99中的描述:
"An integer character constant is a sequence of one or more multibyte characters enclosed
in single-quotes, as in 'x'. A wide character constant is the same, except prefixed by the
letter L. With a few exceptions detailed later, the elements of the sequence are any
members of the source character set; they are mapped in an implementation-defined
manner to members of the execution character set."
"An integer character constant has type int.
题目:
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
进阶:你可以在 O(n) 的时间解决这个问题吗?
示例 1:
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.
示例 2:
输入:nums = [0]
输出:0
示例 3:
输入:nums = [2,4]
输出:6
示例 4:
输入:nums = [8,10,2]
输出:10
示例 5:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127
提示:
1 <= nums.length <= 2 * 104
0 <= nums[i] <= 231 - 1
文章目录 一、帧中继云是什么?二、使用步骤1.搭建网络拓扑图2.配置网络设备各端口IP地址3.配置静态路由(使目标可达)4.配置中继云5.对接中继云接口(使网络连通)6.执行ping测试(测试线路的连通性) 一、帧中继云是什么? 解释:帧中继(FrameRelay)是一种用于连接计算机系统的面向分组的通信方法。它主要用在公共或专用网上的局域网互联以及广域网连接。大多数公共电信局都提供帧中继服务,把它作为建立高性能的虚拟广域连接的一种途径。
二、使用步骤 1.搭建网络拓扑图 网络拓扑图如下(示例):
给路由器添加HWIC-2T模块(电源关闭状态下进行)
说明:RouterB路由器和RouterA操作相同
2.配置网络设备各端口IP地址 RouterA执行的命令:
Router>en Router#conf t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#int s0/0/0 Router(config-if)#clock rate 64000 Router(config-if)#ip add 192.168.1.10 255.255.255.0 添加IP地址 Router(config-if)#no shutdown 启动接口 Router(config-if)#encapsulation frame-relay 封装中继接口 Router(config-if)#frame-relay interface-dlci 101 设置中继接口号 Router(config-if)#frame-relay lmi-type ansi 设置中继接口类型 Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.10.1 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#end Router# %SYS-5-CONFIG_I: Configured from console by console Router#w Building configuration... [OK] RouterB执行的命令:
文章目录 前言一、位运算的分类与展现效果二、原理三、边界值测试四、总结 前言 最近接触到了java位运算,之前对位运算的了解仅仅停留在表现结果上:乘2除以2,对背后的原理并不了解,现在学习记录一下。
一、位运算的分类与展现效果 java位运算可以分为左移和右移,其中右移还有无符号右移。
java只对整型位移,可以分为int体系和long体系。int体系包括(byte, short, int, char),long体系只包含long。int体系中进行位运算时,除int类型外都会先转换为int再进行运算。.
无符号右移指的是,向右移动时,左边补位的是0。
一般来说,右移左移常用作乘2n 或者除以2n。(右移除以2n,左移乘以2n)
int i1 = 4; int r1 = i1 >> 2; // 除以2^2 int r2 = i1 << 2; // 乘以2^2 System.out.println(r1); // 1 System.out.println(r2); // 16 二、原理 位运算实际上是将数值对应的二进制进行左右位移操作。java中数值的存储、运算是以补码的形式进行的。数值有三种存储方式:原码、反码、补码。
原码的最高位为符号位(0为正数,1为负数),其余位用于存储数值,以8位整型为例,2对应:
0000 0010 -2对应:
1000 0010 反码和补码的正数都与原码相同。反码的负数在原码的基础上进行,除符号位外,其余按位取反。例如2的反码为:
0000 0010(正数不变) -2的反码为:
1111 1101 补码在反码的基础上进行,反码加1就变成补码。
2:
0000 0010(正数不变) -2为:
1111 1110 8位整型,反码可以表示的范围为:[-128,127]
-128的反码表示为:
1000 0000 可以理解为:
1 1000 0000(原) => 1 0111 1111(反) => 1 1000 0000(补) => 1000 0000(补) (查看了一些解释,-128的补码规定为1000 0000,若不理解,可以先跳过。)
读者朋友,下午好。
这里从JVM的堆、栈、方法区(常量池)、本机直接内存四个维度分别制造OOM-Out Of Memory。
目的:
1、怎样的操作会导致在指定区域发生OOM?或者StackOverFlow?
2、出现这种情况时候如何分析?如何解决。(不是重点,后面学习了各种检测工具之后回头思考)
以下代码示例均来自:
《深入理解Java虚拟机 JVM高级特性与最佳实践》 周志明著 第三版
机械工业出版社
1、堆溢出 要使堆溢出,只需要创建大量对象即可,并且保证对象在使用。
package com.cmh.concurrent.jvm; import java.util.ArrayList; import java.util.List; /** * Author: 起舞的日子 * Date:2021/5/15 3:33 下午 * <p> * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/hmc/myjvm */ public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject> list = new ArrayList<>(); while (true) { list.add(new OOMObject()); } } } 报错信息:
java.lang.OutOfMemoryError: Java heap space Dumping heap to /Users/hmc/myjvm/java_pid5636.
用xmanager连接Linux的配置步骤:1、在Linux系统下,修改/etc/X11/xdm/Xaccess文件,找到下面的语句:
# * #any host can get a login window
去掉最前面的#号,成为
* #any host can get a login window
2、修改/etc/X11/gdm/gdm.conf文件,找到下面的语句:
[xdmcp]
Enable=false
将其中的Enable=false 改为Enable=true 或 Enable=1。
同时我们要确保存在下面的语句存在:Port=177
3、修改/etc/inittab文件,将下面的语句
id:3:initdefault
改为如下,如果原来就是,就不用更改。id:5:initdefault
同时,找到如下文字所在的地方,
x:5:respawn:/etc/X11/prefdm -nodaemon
将它修改为x:5:respawn:/usr/bin/gdm
4、修改/etc/X11/xdm/xdm-config的最后一行,在displayManager.requestPort:0前面加上一个!号,结果如下:
!DisplayManager.requestPort: 0
5、确保/etc/X11/xdm/Xservers的属性为444,/etc/X11/xdm/Xsetup_0的属性为755.
6、如果Linux机器配置有防火墙,为防止防火墙将通过177端口(即xdmcp服务)的数据过虑,我们必须加上如下的规则:
iptables -A INPUT -p udp -s 0/0 -d 0/0 --dport 177 -j ACCEPT
至此为止,我们在Linux下的配置xdm已经基本完成。重启服务器后,在xbrowser的address栏中输入Linux服务器的IP地址就可以登录了。
当三个点A、B、C的坐标分别为A(x1,y1)、B(x2,y2)、C(x3、y3)时,三角形面积为,
S=(x1y2-x1y3+x2y3-x2y1+x3y1-x2y2)。
解:设三个点A、B、C的坐标分别为A(x1,y1)、B(x2,y2)、C(x3、y3)。
那么A、B、C三点可围成一个三角形。
AC与AB边的夹角为∠A。
那么向量AB=(x2-x1,y2-y1)、向量AC=(x3-x1,y3-y1)。
令向量AB=a,向量AC=b,
则根据向量运算法则可得,
|a·b|=|a|·|b|·|cosA|,
那么cosA=|a·b|/(|a|·|b|),则sinA=√((|a|·|b|)^2-(|a·b|)^2)/(|a|·|b|)。
那么三角形的面积S=|a|·|b|·sinA=√((|a|·|b|)^2-(|a·b|)^2)
又a·b=(x2-x1)*(x3-x1)+(y2-y1)*(y3-y1),
那么可得三角形的面积S=(x1y2-x1y3+x2y3-x2y1+x3y1-x2y2)。
扩展资料:
1、向量的运算
对于向量a=(x1,y1),b=(x2,y2),c(x3,y3)则向量的运算法则如下。
(1)数量积
对于向量a=(x1,y1),b=(x2,y2),且a,b之间的夹角为A,那么
a·b=b·a、(λa)·b=λ(a·b)、(a+b)·c=a·c+b·c。
a·b=|a|·|b|·cosA,
(2)向量的加法
a+b=b+a、(a+b)+c=a+(b+c)
(3)向量的减法
a+(-b)=a-b
2、正弦定理应用
在任意△ABC中,角A、B、C所对的边长分别为a、b、c,
那么a/sinA=b/sinB=c/sinC。
且三角形面积S=1/2absinC=1/2acsinB=1/2bcsinA。
参考资料来源:百度百科-向量
参考资料来源:百度百科-正弦定理
Caused by: java.lang.ClassNotFoundException: com.netflix.config.DeploymentContext$ContextKey
我实在完成cloud2020.0.0的断路器聚合监控Turbine和hystrix是报错,不要一上来就想着换版本,多试试说不定就ok了,曾经有个问题搞了我两天,我就是不换版本,最后终于赵到问题所在了。
错误信息:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2021-05-16 14:42:42.721 ERROR 3632 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration': Unsatisfied dependency expressed through field 'externalConfigurations'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurableEnvironmentConfiguration' defined in class path resource [org/springframework/cloud/netflix/archaius/ArchaiusAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.
pyspark 使用graphdataframes踩坑记 报错ModuleNotFoundError: No module named 'graphframes'接着报错java.lang.ClassNotFoundException: org.graphframes.GraphFramePythonAPI官方网链接无法下载graphframes-xxx.jar包如果运行时报错java.lang.ClassNotFoundException: com.typesafe.scalalogging.slf4j.LazyLogging如果运行时再报错java.lang.ClassNotFoundException: com.typesafe.scalalogging注意下载的小版本号要一致,否则会有问题。 pyspark 没有集成graphX包,只能使用第三方的graph打他frames,虽然完全具备graphx的功能,但是第一次进行安装,很容易踩坑。笔者踩坑1-2天,终于爬了起来! 报错ModuleNotFoundError: No module named ‘graphframes’ ModuleNotFoundError Traceback (most recent call last)
in 1 from pyspark.sql import SparkSession
2 from pyspark.sql import SQLContext
----> 3 from graphframes import *
4 from pyspark.sql.types import *
5
ModuleNotFoundError: No module named ‘graphframes’
解决办法:下载与spark版本一致的graphdataframes源码包
放到python所在的site-packages目录下
下载网址:
https://spark-packages.org/package/graphframes/graphframes
选择zip下载,注意必须要跟spark的版本号一致。下载后解压,把pyhon目录下的整个包拷贝到python解释器下的lib->site-packages(替换成你本机的python所在路径)
接着报错java.lang.ClassNotFoundException: org.graphframes.GraphFramePythonAPI 因为缺少graphframes-xxx.jar包,下载jar包
官方网链接无法下载graphframes-xxx.jar包 无论使用mvn下载,还是使用repo搜索都无法下载所需要的jar包。踩坑了很久,最后竟然是下载jar包的网站http://dl.bintray.com/关闭,而官方的网站jar包下载链接没有更新。所以从这个https://repos.spark-packages.org/网址下载成功。参照如下的格式修改所需要下载的版本号即可。
http://dl.bintray.com/spark-packages/maven/graphframes/graphframes/0.7.0-spark2.4-s_2.11/graphframes-0.7.0-spark2.4-s_2.11.jar
由于http://dl.bintray.com/网站已经关闭,但是官网的jar下载链接还没有更新。需要修改下载路径为:
https://repos.spark-packages.org/graphframes/graphframes/0.7.0-spark2.4-s_2.11/graphframes-0.7.0-spark2.4-s_2.11.jar
jar包加载的方法:
可以通过pyspark --jars 方式加载,也可以拷贝到pyspark目录下,重启pyspark。
笔者采用第二种方法
仅供自己学习记录
LeetCode刷题日记2021-5-16 题目描述
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
**进阶:**你可以在 O(n) 的时间解决这个问题吗?
示例 1:
输入:nums = [3,10,5,25,2,8] 输出:28 解释:最大运算结果是 5 XOR 25 = 28. 示例 2:
输入:nums = [0] 输出:0 示例 3:
输入:nums = [2,4] 输出:6 示例 4:
输入:nums = [8,10,2] 输出:10 示例 5:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70] 输出:127 提示:
1 <= nums.length <= 2 * 10^40 <= nums[i] <= 2^31 - 1 题解思路
效果如下:
我是怎么想的:
总共需要打印6行字母,那么就需要一个循环来控制打印第几行,大概代码如下:
for(int i=0;i<6;i++)
{
}
每行都会打印字母,而且循环越往后,需要打印的字母越多,那么每行打印字母也需要一个循环,比如打印F到A这需要一个循环,其它也是同样的道理。每行打印完都需要输出一个换行,所以代码变成下面这样
for(int i=0;i<6;i++)
{
for(char j='F';XXXXX;j--)
{
}
printf("%c",j);
}
因为每行都是从F开始打印的,所以j的初始值肯定是F,有因为每次是从F往A这个方向打印的,那么肯定有j--这个操作,上面的代码不难理解。
真正难的是j=‘F’后面这个进入循环的条件,这个怎么想。
用列举法推出来的。
当i=0的时候,需要打印第一行字母,此时j='F',那么我们给j一个什么样的关系表达式,才能够让j只能取到'F'这一个值呢?
是不是j>'F'-1
char j='F',j>'F'-1;j-- j的定义域只能取到‘F’
当i=1的时候,需要打印第二行字母,也就是需要里面的循环执行两次,那么给j一个什么样的表达式,才能够让j的值渠道'F'和‘E’呢? 是不是j>'F'-2;
我们不能直接把'F'-1和'F'-2这两个表达式直接写进去,不然输出的是固定值,我们想要这两个值和i发生一定的关系
当i=0时候,我们希望j>'F'-1='F'-(0+1)
当i=1时候,我们希望j>'F'-2='F'-(1+1)
当i=3时候,我们希望j>'F'-4='F'-(3+1)
所以通项公式就是j>'F'-(i+1)
最后代码如下:
int main(void)
{for (int i = 0; i < 6; i++)
{for (char j = 'F'; j > 'F'-(i+1); j--)
{
printf("%c",j);
}
printf("\n");
}return 1;
}
update:2018.10.2
这次思考过程和上次完全不一样。
首先需要一个外层循环来控制打印的行,共需要打印6行,每循环一次打印一行数据。还需要一个内层循环控制要打印的字符
由于,内存循环每次都是从F开始打印的,所以内存循环每次都要初始化变量为F,每次打印一个字符后就让字符减去1,这样就可以打印比F小的那个字符了,那要打印多少个字符呢?我们需要用一个变量来记录,然后每进行一次外层循环这个变量的值都要+1,因为第二行要比第一行多打印一个字符。
int main(void)
{charch ;//当前要打印的字符int row_count=1;//每行需要打印额字符个数,从第一行开始intcount;//打印了几个字符了for (int i = 0; i < 6; i++,row_count++)
421.数组中两个数的最大异或值 题目描述 给你一个整数数组nums,返回nums[i] XOR nums[j]的最大运算结果,其中0 ≤ i ≤ j < n。
进阶:你可以在O(n)的时间解决这个问题吗?
示例1
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.
示例2
输入:nums = [0]
输出:0
示例3
输入:nums = [2,4]
输出:6
示例4
输入:nums = [8,10,2]
输出:10
示例5
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127
提示
1 <= nums.length <= 2 * 104 0 <= nums[i] <= 231 - 1 O(n)时间复杂度以内 把每个数字按bit位拆分成0-1字典树。
将每个数字的二进制位,从高位到低位存储到前缀树中,也就是说前缀树中仅有0和1这两个数字。
每个数字跟字字典树进行异或,其中最长的分支,就是最大值。
代码演示
Java 0-1字典树
public class OneQuestionPerDay421 { public static void main(String[] args) { Solution s = new Solution(); int array1[] = {3,10,5,25,2,8}; System.
1.最近邻点法 (贪心策略 TSP) 2. 最短连接 TSP问题 贪心算法 #include<stdio.h> #include<iostream> using namespace std; //采用最近邻点贪心策略求TSP问题。 int TSP1(double arc[6][6],int w)//假定从顶点w出发 { int n=6; int edgeCount=0;//哈密顿回路的边数 int TSPLength=0; int min,u,v; int flag[n]={0}; // 顶点均未加入哈密顿回路 u=w;//w为出发点 u为加入到哈密顿回路的点 flag[w]=1; while(edgeCount<n-2) //已经加入一个出发点,只需要再4个点 0 1 2 3 四次找点 { min=100; for(int j=1;j<n;j++) //求arc[u]的最小值 { if((flag[j]==0) && (arc[u][j]!=0) &&((arc[u][j]!=100e5))&& (arc[u][j]<min)) //j点没有被加入哈密顿回路 排除自己 找到最小值 { v=j;//v点最终是距离u点最近的点 min=arc[u][j]; } } //找到距离u点的最近的点,把它加入哈密顿回路 TSPLength+=arc[u][v]; flag[v]=1; edgeCount++; cout<<u<<"-->"<<v<<endl; u=v; //把v点赋值给u,接下来找距离v点最近的点 while循环控制直到所有点都被加入进去 } cout<<v<<"-->"<<w<<endl;//输出最后的回边 return (TSPLength+arc[u][w]);//返回最终的最短哈密顿回路的长度!
说明
自己的笔记本已经全盘做成了Linux系统了,用着还好,苦于常用的五笔输入法在Arch下有点不太好装,参考wiki弄好了,这里简单记录下
这里使用ibus-rime
原因有二:
ibus-rime功能强大,支持注音、拼音、倉頡5、五筆86
其他输入法安装很不方便,一般最后的支持是2012年,太古老了……
ArchLinux下简单记录
1、安装ibus
# pacman -S ibus
2、编辑~/.bashrc,在最后添加
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
4、初始化ibus
#ibus-setup
3、使用pacman安装ibus-rime或者用yaourt -S ibus-rime安装也是一样的(前提是你装了yaourt)
#pacman -S ibus-rime
4、进入这个目录,如果没有rime,请自行创建
$cd ~/.config/ibus/rime
5、在rime目录下,创建default.custom.yaml
patch:
schema_list:
- schema: wubi86
小技巧:
复制的时候使用鼠标复制,insert状态,ctrl+shift+v,这样就能直接粘贴到vim中了
6、运行命令
# ibus-daemon &
7、在状态栏找到
右击,preferences->InputMethod->add->chinese得到如图,close
8、super+space切换输入法到rime,点击
有个Deploy或部署点一下,会出现五笔86字样,此时就配置好了,如果出现的是abc,点一下就会变了,最后的图shutter截不到。
如上。
Ubuntu/Debian下简单记录
#安装ibus框架、rime、五笔库
sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 ibus-rime librime-data-wubi
装完重启ibus
ibus restart
设置ibus框架
sudo ibus-setup
点击input method--> 添加输入法 汉语-Rime
1、安装BIND软件
软件包bind,提供域名服务的主要程序及相关文件。
软件包bind-utils,提供对DNS服务器的测试工具程序,如nslookup。
注释:BIND是最受欢迎的能够提供域名服务的DNS服务程序。
[root@localhost ~]# mount /dev/cdrom /mnt----挂光盘
[root@localhost ~]# rpm -ivh /mnt/Packages/bind-9.8.2-2-0.
17.rcl.e16.i686.rpm-----用rpm装bind软件包
[root@kimi ~]# rpm -ivh /mnt/Packages/bind-utils-9.8.2-0.17.
rc1.el6.i686.rpm-----用rpm装bind-utils软件包
2、查询是否安装bind软件包 [root@localhost ~]# rpm -qa | grep "bind"
3、配置BIND的主配置文件 注释:主配置文件用于设置named服务的全局配置,注册区域和访问控制等各种运动参数。
[root@localhost ~]# vi /etc/named.conf
options {
listen-on port 53 { 192.168.80.10; }; //设置本地IP地址为监听地址
directory "/var/named";
allow-query { any; }; //允许任何人访问DNS服务器
};
4、配置区域数据文件,并构建了主域名服务器 注释:区域数据文件用于存放某个DNS区域的地址解析记录(正向和反向记录)。
[root@localhost ~]# vi /etc/named.rfc1912.zones
zone "benet.com" IN { type master; //设置类型为正主区域 file "benet.com.zone"; //区域数据文件为benet.com.zone allow-transfer { 192.
关于网页登陆
缓存本地配合vuex的store
state:{ token:getToken(), name: '', avatar: '', }, mutations:{ SET_TOKEN: (state, token) => { state.token = token; //并不在这里改变本地的token,这里仅仅改变store里面的token }, }, actions:{ loginAction({commit},userInfo){ return new Promise((resolve,reject)=>{ reqLogin({...userInfo}).then(res=>{ commit('SET_TOKEN',res.data); setToken(res.data) resolve() }).catch(err=>{ //1.提示 //2.reject() reject() }) }) }, // 获取用户信息,并不缓存本地 GetInfo({ commit, state }) { return new Promise((resolve, reject) => { getInfo(state.token).then(res => { const user = res.data.user const avatar = user.avatar == "" ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar; if (res.
题目介绍 力扣232题:https://leetcode-cn.com/problems/implement-queue-using-stacks/
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false 说明:
你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。 进阶:你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。
分析 我们要用栈来实现队列。一个队列是 FIFO 的,但一个栈是 LIFO 的。为了满足队列的 FIFO 的特性,我们需要将入栈的元素次序进行反转,这样在出队时就可以按照入队顺序依次弹出了。
想要反转,简单的想法是只要把所有元素依次弹出,并压入另一个栈,自然就变成本来栈底元素到了栈顶了。所以我们的实现,需要用到两个栈。
方法一:入队时反转 一种直观的思路是,最终的栈里,按照“自顶向下”的顺序保持队列。也就是说,栈顶元素是最先入队的元素,而最新入队的元素要压入栈底。我们可以用一个栈来存储元素的最终顺序(队列顺序),记作stack1;用另一个进行辅助反转,记作stack2。
最简单的实现,就是直接用stack2,来缓存原始压栈的元素。每次调push,就把stack1中的元素先全部弹出并压入stack2,然后把新的元素也压入stack2;这样stack2就是完全按照原始顺序入栈的。最后再把stack2中的元素全部弹出并压入stack1,进行反转。
代码演示如下:
// 用两个栈实现队列:入队时翻转 public class MyQueue { // 定义两个栈 Stack<Integer> stack1; Stack<Integer> stack2; public MyQueue() { stack1 = new Stack<>(); stack2 = new Stack<>(); } // 入队方法 public void push(int x){ // 1.
torch.utils.data.DataLoader主要是对数据进行batch的划分,除此之外,特别要注意的是输入进函数的数据一定得是可迭代的。如果是自定的数据集的话可以在定义类中用def__len__、def__getitem__定义。
使用DataLoader的好处是,可以快速的迭代数据。
import torch import torch.utils.data as Data torch.manual_seed(1) # reproducible BATCH_SIZE = 5 # 批训练的数据个数 x = torch.linspace(1, 10, 10) # x data (torch tensor) y = torch.linspace(10, 1, 10) # y data (torch tensor) # 先转换成 torch 能识别的 Dataset torch_dataset = Data.TensorDataset(x, y) # 把 dataset 放入 DataLoader loader = Data.DataLoader( dataset=torch_dataset, # torch TensorDataset format batch_size=BATCH_SIZE, # mini batch size shuffle=True, # 要不要打乱数据 (打乱比较好) num_workers=2, # 多线程来读数据 ) for epoch in range(3): # 训练所有!
idea 右下分支名前有警告,在合并其他分支或者别的操作时git提示错误:You have not concluded your merge (MERGE_HEAD exists). Please, commit your changes before you merge.
应该是在合并分支没有解决冲突结束合并导致。
Git->Merge 选择继续合并或者结束合并即可
如果没有分支问题Merge是没有这两个选项的
https://blog.csdn.net/qq_31112205/article/details/103046794
文章目录
1. IDEA 配置 VM Options
1.1 IDEA 配置 VM Options
1.2 spring 项目注入用户环境变量
2. Tomcat 部署配置用户环境变量
2.1 Windows: standard environment variables
2.2 Linux: user defined CLASSPATH variables
1. IDEA 配置 VM Options
1.1 IDEA 配置 VM Options
此处以维护用户环境变量 DES_SECRET 用于配置文件加密的秘钥为例;spring 项目可通过 org.springframework.core.env.Environment 获取变量的 value
SpringMVC 项目
可以配置 VM Options 项
SpringBoot 项目
可以配置 Environment variables 项或者 VM Options
1.2 spring 项目注入用户环境变量
配置后用户环境变量后,项目可通过 PropertiesUtil.getProperty(“DES_SECRET”) 获取配置的 value。
项目打包后放入 tomcat_home/webapps 路径下,运行 startup.
这是我在某论坛看到别人分享的故事,觉得可以展开聊一下,对于我们这些中年程序员,可以裸辞吗?
前言 首先介绍一下主人公的情况。目前所在的是一家小的创业公司,待了3年多,薪资一般吧,之前在一家中型上市企业也干了三年,因为想涨薪所以跳到现在这家小公司。
就在年前,公司年终总结,公司老板会和各组负责人找每个员工谈话。面试来的时候,公司承诺每年多次调薪,也有项目奖金,干了三年,调过两次薪,项目奖金一分没见到,单双周上班,他寻思这几年互联网发展也不太好,没有就没有吧。
公司上班,不说九九六吧,也是每天至少九个小时,各个项目无缝切换。
不说平时加班多,年末偶尔加到12点,单双周不够用,甚至组长叫他周末家里加班。当然除了加班太晚报销打车之外,加班是无偿的,对,没有任何补助。
于是他就在今年年初裸辞了…
能力是没问题的,对自己的技术比较自信,想寻求更好的发展,工作和生活能够平衡一点。
但是最近的一次 Android 面试让他心好累,被面试官怼得体无完肤……于是他迷茫了。
工作经历 由于这几年公司也在转型。工作经历大概可以分为 3 个阶段。
第一阶段是从进公司开始做 android app 开发,无论是外包或者公司的主力产品都做过。
第二阶段是做 ROM 开发,由于公司规模不大,除了硬件和底层的东西外,基本上是一个人负责了整个 ROM 的修改,编译,发布(基于 MTK 的某一个 rom,然后做一些 android framework 层面上“奇奇怪怪”的定制)。
第三阶段,也就是当前。之前做的 ROM 所适配的手机销量未达预期,公司也不再准备投入更多,基本上是做做简单的维护。而他被分配的新任务是做机器学习的一些东西,比如 Tensorflow, OpenCV 做做图片处理,训练之类的。
相信诸位看了上边的经历,大概也猜到他现在所面临的问题。即,当前在一线做 android app 开发,而他的目标仍然是想找 android 开发的职位。
他自己可能也没想到,自己会在面试中沦落到如此尴尬的境地。面试官问的技术大部分都用过,就是不知道怎么去描述…后面大概面试了10家公司,只有一家收到了offer,工资比上家公司还低了3k,于是更迷茫了。
所以,你还敢裸辞吗? 要不要辞职,你要看看自己:
1、为什么要辞职?工作不开心?学不到东西?有更好的计划并且愿意为之努力?
2、辞职以后想要做什么?如果没想好,那么请一定不要辞职以后再想,相信我,你会很容易陷入焦虑或者懒惰的恶性循环里,然后又不得不被迫找工作,再一次想辞职,再一次~~~恶性循环
3、任何一个行业,如果你真的很牛了,会发现,当整个行业都很低迷的时候依旧有你是盈利的,当整个行业都很牛市的时候也依旧有熊的一塌糊涂的。所以,不要以整体不好就判定所有都不好,不能以偏概全,当然也不能以平均水平衡量整体发展。
所以,我并不想回答为什么最好不要裸辞的原因,我只想说,辞职不辞职,问问自己以上的问题,想好了,做出你自己的决定就好,决定了,就努力做下去,不要去在意别人说你的对还是错。当然,说起来容易,做起来很难。
如果你觉得现在的工作差强人意,想辞职又不敢辞,最好的办法就是提前做好技术储备,未雨绸缪。如果工作中一直是curd boy,那你务必在闲暇时间找方法突破:看其他人的代码、看领导的代码、看开源代码、动手玩开源代码、多看计算机经典书籍等,这些都是突破的方法。
比如想要跳槽进大厂,以下知识必须牢固掌握:
算法和数据结构:数组、链表、二叉树、堆栈、排序算法、B+/B-树、DP(动态规划)等;计算机网络:HTTP、DNS、ARP、TCP、IP、ICMP、UDP等;操作系统:IO、存储器、多线程/多进程、同步机制、处理器调度及死锁、设备管理、通道等;计算机组成原理:冯诺依曼计算机组成、计算机层次结构、计算机性能指标等;选定一门主攻的语言方向,比如Python、C++、Java等,并真正攻克它。 这些都是高附加值的知识!
其实这些高附加值的知识和能力可以边工作边看计算机经典大厚书获得。这里也给大家推荐一份我整理的计算机经典书籍书单:我把大学和工作中用的经典电子书库(包含数据结构、Java相关、程序员认知、职场发展)、面试找工作的资料汇总都打包放在这了:
如果不方便查看,我已经整理成了一份PDF包含Android入门,基础—高级的全部系列知识点,还有新技术学习笔记。
由于篇幅限制,这里只能展示部分内容,朋友们如果需要这份完整版的PDF资料合集,微信扫描下方CSDN官方二维码【免费获取】。 尾声 裸辞确实是有一定的风险,虽然不建议,但是选择裸辞也并没有错,有可能之前的工作真的很让你痛苦,你确实是想辞职调整一下自己,以后找个更适合自己的工作,估计再让你选一次你还有可能会选择裸辞。
其实年龄这个东西真的无法控制,无论你做什么,年龄还是会不断的增长,这个对所有人都是公平的。也许有人40+也还是会裸辞找工作的,所以还是要放宽心,不要过多的焦虑,集中精力去找下一份工作。只要你足够厉害,工作会主动找上你。
在默认情况下,CenOS 7 中是没有安装极点五笔输入法的。如果你已经习惯了使用五笔输入,而不是拼音输入法,那么则需要自己在终端中手动安装。那么,CentOS 7 究竟怎样安装极点五笔输入法呢?
软件名称:极点五笔 V7.13 纯净安装标准版软件大小:6.75MB更新时间:2010-09-21立即下载
一、安装五笔输入法
1、首先,进入系统后,在桌面右击鼠标,打开终端。
2、在终端中键入 su root,回车后输入 root 密码,登录到 root 帐号。
注意:在输入密码时,屏幕上不会显示任何字符,你只需正确输入后回车即可。
3、登录root 后,再键入yum remove ibus,移除现有的输入法框架。
4、在移除过程中,会弹出询问确认是否真的移除,键入 y ,回车继续。
5、移除完毕后,再键入 yum install ibus ibus-table,回车后重新安装输入法框架。同样,在执行过程中会询问是否确认安装,键入 y回车继续。
6、然后,输入 yum install ibus ibus-table-wubi 安装极点五笔输入法,并且在执行过程中键入 y确认下载和安装。
7、安装成功后,键入 exit 退出 root 帐号,然后再关闭终端窗口。当然,你也可以不退出直接关闭终端(这会在关闭时弹出一个警告提示框,直接无视即可),这是没有关系的。
二、添加输入源
安装好输入法后,还需要到“区域和语言”设置中将该输入法添加进来。具体的操作方法是:
1、首先,打开“应用程序”-“系统工具”-“设置”。
2、在设置中双击打开“区域和语言”。
3、再点击“+”号增加输入源。
4、在输入源中,点击“汉语(中国)”。
5、最后,选中极点五笔输入法,再点击“添加”按钮。
三、切换输入法
当需要使用极点五笔输入法时,用鼠标在语言栏上选择“极点五笔输入法”,然后就可以使用五笔进行汉字输入了。
相关推荐:
一、profile 文件
1、profile 文件的作用
profile(/etc/profile),用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效。当用户登录(login)时,文件会被执行,并从/etc/profile.d目录的配置文件中查找 shell 设置。
2、在profile中添加环境变量
一般不建议在/etc/profile文件中添加环境变量,因为在这个文件中添加的设置会对所有用户起作用。当需要添加时,我们可以按以下方式添加,添加一个 HOST 值为 test.com 的环境变量:
export HOST=test.com
添加时,可以在行尾使用;号,也可以不使用。一个变量名可以对应多个变量值,多个变量值使用:分隔。
添加环境变量后,需要重新登录才能生效,也可以使用source命令强制立即生效:
source /etc/profile
查看是否生效可以使用echo命令:
$ echo $HOST
test.com
二、bashrc 文件
这个文件用于配置函数或别名。bashrc 文件有两种级别:系统级的位于/etc/bashrc、用户级的~/.bashrc,两者分别会对所有用户和当前用户生效。
bashrc文件只会对指定的shell类型起作用,bashrc 只会被 bash shell 调用。
三、bash_profile 文件
bash_profile 只对单一用户有效,文件存储于~/.bash_profile,该文件是一个用户级的设置,可以理解为某一个用户的 profile 目录下。这个文件同样也可以用于配置环境变量和启动程序,但只针对单个用户有效。
和 profile 文件类似,bash_profile 也会在用户登录(login)时生效,也可以用于设置环境变量。但与 profile 不同,bash_profile 只会对当前用户生效。
想了解更多相关文章,请前往专栏 -- Linux系统
选项 选项说明
log_file =
审计日志文件的完整路径。如果您配置守护进程向除默认/var/log/audit/外的目录中写日志文件时,一定要修改它上面的文件权限,使得只有根用户有读、写和执行权限。所有其他用户都不能访问这个目录或这个目录中的日志文件
log_format =
写日志时要使用的格式。当设置为RAW时,数据会以从内核中检索到的格式写到日志文件中。当设置为NOLOG时,数据不会写到日志文件中,但是如果用dispatcher选项指定了一个,则数据仍然会发送到审计事件调度程序中
priority_boost = 审计应采用多少优先级推进守护进程。必须是非负数。0表示没有变化
flush = 多长时间向日志文件中写一次数据。值可以是NONE、INCREMENTAL、DATA和SYNC之一
freq = 如果flush设置为INCREMETNAL,审计守护进程在写到日志文件中前从内核中接收的记录数
num_logs =
max_log_file_action设置为ROTATE时要保存的日志文件数目。必须是0~99之间的数。如果设置为小于2,则不会循环日志。如果递增了日志文件的数目,就可能有必要递增/etc/audit/audit.rules中的内核backlog设置值,以便留出日志循环的时间。如果没有设置num_logs值,它就默认为0,意味着从来不循环日志文件
dispatcher =
当启动这个守护进程时,由审计守护进程自动启动程序。所有守护进程都传递给这个程序。可以用它来进一步定制报表或者以与您的自定义分析程序兼容的不同格式产生它们。由于调度程序用根用户特权运行,因此使用这个选项时要极其小心。这个选项不是必需的
disp_qos =
控制调度程序与审计守护进程之间的通信类型。有效值为lossy和lossless。如果设置为lossy,若审计守护进程与调度程序之间的缓冲区已满(缓冲区为128千字节),则发送给调度程序的引入事件会被丢弃。然而,只要log_format没有设置为nolog,事件就仍然会写到磁盘中。如果设置为lossless,则在向调度程序发送事件之前和将日志写到磁盘之前,调度程序会等待缓冲区有足够的空间
max_log_file = 以兆字节表示的最大日志文件容量。当达到这个容量时,会执行max_log_file
_action指定的动作
max_log_file_action =
当达到max_log_file的日志文件大小时采取的动作。值必须是IGNORE、SYSLOG、SUSPEND、ROTATE和KEEP_LOGS之一。如果设置为IGNORE,则在日志文件达到max_log_file后不采取动作。如果设置为SYSLOG,则当达到文件容量时会向系统日志/var/log/messages中写入一条警告。如果设置为SUSPEND,则当达到文件容量后不会向日志文件写入审计消息。如果设置为ROTATE,则当达到指定文件容量后会循环日志文件,但是只会保存一定数目的老文件,这个数目由num_logs参数指定。老文件的文件名将为audit.log.N,其中N是一个数字。这个数字越大,则文件越老。如果设置为KEEP_LOGS,则会循环日志文件,但是会忽略num_logs参数,因此不会删除日志文件
space_left =
以兆字节表示的磁盘空间数量。当达到这个水平时,会采取space_left_action参数中的动作
space_left_action =
当磁盘空间量达到space_left中的值时,采取这个动作。有效值为IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和HALT。如果设置为IGNORE,则不采取动作。如果设置为SYSLOG,则向系统日志/var/log/messages写一条警告消息。如果设置为EMAIL,则从action_mail_acct向这个地址发送一封电子邮件,并向/var/log/messages中写一条警告消息。如果设置为SUSPEND,则不再向审计日志文件中写警告消息。如果设置为SINGLE,则系统将在单用户模式下。如果设置为SALT,则系统会关闭
action_mail_acct =
负责维护审计守护进程和日志的管理员的电子邮件地址。如果地址没有主机名,则假定主机名为本地地址,比如root。必须安装sendmail并配置为向指定电子邮件地址发送电子邮件
admin_space_left =
以兆字节表示的磁盘空间数量。用这个选项设置比space_left_action更多的主动性动作,以防万一space_left_action没有让管理员释放任何磁盘空间。这个值应小于space_left_action。如果达到这个水平,则会采取admin_space_left_
action所指定的动作
admin_space_left_action =
当自由磁盘空间量达到admin_space_left指定的值时,则采取动作。有效值为IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和HALT
disk_full_action =
如果含有这个审计文件的分区已满,则采取这个动作。可能值为IGNORE、SYSLOG、SUSPEND、SINGLE和HALT
disk_error_action =
如果在写审计日志或循环日志文件时检测到错误时采取的动作。值必须是IGNORE、SYSLOG、SUSPEND、SINGLE和HALT之一
说明:/etc/sysconfig/auditd文件可以用来设置带EXTRAOPTIONS参数的auditd的命令行选项。唯一的命令行选项-f以调试模式安排守护进程。如果启用了调试模式,则会出现标准错误消息而不是日志文件。AUDITD_LANG设置值可以用来修改守护进程的位置。如果设置为none,则所有位置信息会从审计环境中删除。如果AUDITD_CLEAN
_STOP选项设置为yes,则当用service auditd stop命令停止守护进程时,会删除审计规则与观察器。
(3)审计规则文件/etc/audit/audit.rules
要添加审计规则,可在/etc/audit/audit.rules文件中用下面的语法:
-a ,
以下在 CentOS 6 下的 audit.rules 下配置,请根据不同的环境进行修改。
两个大整数(如位数超过1000)的四则运算,显然基本数据类型已经不能保存,因此不能按照一般方法来计算,我们需要声明一个数组来保存每个整数,并且记录长度,即位数。数组中的每一个元素便对应整数当中的每一位,并且数组要提前初始化为0。在存每个数的时候按高位对应数组的高地址,低位对应低地址,即逆向存储。然后按运算法则对数组中的每一个元素即每一位进行运算。
注:为了方便起见,在读入大整数时将其以字符串的形式读入,然后再将其转换为int型存入数组。
一、大整数定义 const int MAX = 1000;//最大长度 typedef struct BigNumber {//大整数 int number[MAX];//保存每一位 int len;//位数 BigNumber() {//构造函数,初始化结构体变量 memset(number, 0, sizeof(number));//初始化数组每一位为0 len = 0;//初始化长度为0 } }; 二、字符串转化为整数 BigNumber convert(string str) { //将字符串转换为整形并保存在数组中 BigNumber a; int length = str.length(); a.len = length;//保存长度 for (int i = 0; i < length; ++i) {//逐位转换 a.number[i] = str[length - i - 1] - '0'; } return a; } 三、两个大整数的比较 #include <iostream> #include <cstring> using namespace std; const int MAX = 1000; typedef struct BigNumber { int number[MAX]; int len; BigNumber() { memset(number, 0, sizeof(number)); len = 0; } }; BigNumber convert(string str) { //将字符串转换为整形并保存在数组中 BigNumber a; int length = str.
Bazel是谷歌推出的一套编译系统,这是官网,Github地址https://github.com/bazelbuild/bazel。官方描述其优点如下,
我觉得最大优点是支持多语言吧,Java,C++,Go等等都是原生支持,一套系统可以编译多个语言。下面就看下如何简单使用,本文使用Debian10,Ubuntu也是一样。
一 安装 首先要在系统中添加Bazel的apt repository,
sudo apt install curl gnupg curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg sudo mv bazel.gpg /etc/apt/trusted.gpg.d/ echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list 然后更新一下,
sudo apt update 最后是安装,
sudo apt install bazel 也可以指定安装版本,本文写作时,其最新release版本是4.0.0,
sudo apt install bazel-4.0.0 如果安装时指定了版本,还需要创建一个软连接来连接一下,这样就可以在命令行使用bazel了
sudo ln -s /usr/bin/bazel-4.0.0 /usr/bin/bazel 最后看一下版本,以确认是否安装成功,
bazel --version # 4.0.0 二 使用 1. 简单例子 先来一个helloworld的例子,执行下面命令去创建工程,
mkdir -p stage1/main touch stage1/WORKSPACE touch stage1/main/hello.
一. Set类型基础
1. 类型说明
1个key→多个value,value的值不重复!
Set一种无序且元素内容不重复的集合,不用做重复性判断了,和我们数学中的集合概念相同,可以对多个集合求交集、并集、差集,key可以理解成集合的名字。
注:set 用哈希表来保持字符串的唯一性,没有先后顺序,是按照自己的一个存储方式来遍历,因为没有保存插入顺序。
2. 常用指令Api说明
3. 常用Api说明
(1).SetAdd:添加数据,可以单独1个key-1个value,也可以1个key-多个value添加
(2).SetLength:求key集合的数量
(3).SetContains:判断key集合中是否包含指定值
(4).SetRandomMember:随机获取指定key集合中的一个值或n个值
(5).SetMembers:获取key中的所有值,数据类型要一致,便于存储
(6).SetRemove:删除key集合中的指定value(1个或多个)
(7).SetPop:随机删除指定key集合中的一个值或n个值,并返回这些值。
(8).SetCombine:求多个元素的交并差
a.SetOperation.Intersect:交集
b.SetOperation.Union:并集
c.SetOperation.Difference:差集
(9).SetCombineAndStore:把多个元素的交并差,放到一个新的元素集合中
二. Set类型案例
1.抽奖
(1) 背景:用户参与抽奖,抽奖大致分两类:
A:只抽1次,1次抽n个人。
B:抽多次,比如三等奖抽3名,二等奖抽2名,一等奖抽1名。
(2) 技术分析:
主要利用Set结构元素的不重复性和获取随机数的方法来实现,以“specialPrize”为key,参与用户的id当做value
A:用户点击参与抽奖则执行SetAdd方法。
B:可以获取所有参与用户SetMembers 和 判断某个用户是否参与抽奖了SetContains
C:随机抽一次奖用SetRandomMember或SetRandomMembers,因为不需要删除
多次抽奖用SetPop,因为抽完要删掉。
(3) 代码分析
2. 微信或微博中消息的点赞(或者某篇文章的收藏)
(1). 背景
微信朋友圈用户A的某条消息的点赞功能,要实现点赞、取消点赞、获取点赞列表、获取点赞用户数量、判断某用户是否点赞过。
(2). 技术分析
利用Set结构, 以用户Id-消息id作为key,点赞过该消息的用户id作为value。
A:点赞 SetAdd方法
B:取消点赞 SetRemove方法
C:获取点赞列表 SetMembers方法
D:获取点赞用户数量 SetLength方法
E:判断某用户是否点赞过 SetContains方法
该案例容易理解,此处不写代码了。
3.关注模型
(1).背景
比如微博关注或者共同好友的问题,以微博关注为例,要实现:同时关注、关注的和、关注A的用户中也关注B的、当A进入B页面,求可能认识的人。
(2). 技术分析
利用Set结构,一个博主对应一个Set结构,博主的id作为key,关注该博主的用户id作为value。
A:关注和取消关注: SetAdd方法 和 SetRemove方法
解决 No such file or directory问题 1、问题:写python时有时候会遇到底下报错No such file or directory,例如
出现了FileNotFoundError: [Errno 2] No such file or directory: ‘pgmpy/utils/example_models/asia.bif.gz’
2、错误的解决方法:\python\venv\Lib\site-packages\pgmpy\utils\的路径下创建example_models并在相关网站下载asia.bif.gz在该路径中。结果就是不行。
3、解决方法:
方法一:改变文件的读写路径,改变库里的读写路径(没试,第三方库不太好改)
方法二:在编写代码的上一级创建此目录,
在.py文件的上一级创建pgmpy/utils/example_models/asia.bif.gz,运行成功了
linux系统下使用anaconda创建虚拟环境 创建虚拟环境 conda create -n xxxxx(你需要定义环境的名字) python=xxx(你需要的py版本) 激活环境: conda activate xxxxx(你的环境名字) 3.退出当前环境:
conda deactivate List item 配置国内源安装相关库:
因为我们大部分都在国内,科学上网没那么方便,所以借助国内源进行安装,网速不会受到限制。(我使用但是清华源),相比于国外,国内源可是飞一般的速度。
#配置常用库国内源,方便安装Numpy,Matplotlib等
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ #配置国内源,安装PyTorch用
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ #显示源地址(方便我们确认下载地址)
conda config --set show_channel_urls yes 安装pytorch** 进入官网,选择自己要装的pytorch、torchvision、cudatoolkit等。
我要安装的是:
#CUDA 10.0
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch 我在linusx系统下安装遇到的问题是:网络问题,老是下载不下来,遇到报错奇多,“中道崩殂”异常难受,于是选择了诸多解决办法:
其一:使用镜像源延长下载时间,同时提升下载速度
命令:
pip --default-timeout=100 install 库名称 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.con
当然,也可以使用其他镜像源,当然我都失败了。
其二:最暴力的方法,直接安装离线文件。
直接离线包安装,离线包地址:torch本地文件下载地址
要找cuda版本的,否则会报无法支持的错误。
最主要的问题解决了,就可以开始安装其他包了,然后开始愉快的炼丹生活。
首先安装telnet包,使用rpm -ivh telnet...命令
1、确定你的telnet服务打开没有:
[root@111 ~]# chkconfig --list|grep telnet
telnet: off
krb5-telnet: off
[root@111 ~]#
注意检查结果这里是关闭状态
2、打开telnet服务:
[root@111 ~]# chkconfig --level 35 telnet on
[root@111 ~]# chkconfig --list|grep telnet
telnet: on
krb5-telnet: off
[root@111 ~]#
检查已经被打开了
3、修改登陆文件securetty,主要增加要登陆的终端点
[root@111 ~]# vi /etc/securetty
增加几个pts/x:
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
……
保存退出:
4、测试登录:
[root@111 ~]# telnet 192.168.0.201
Trying 192.168.0.201...
Connected to 111 (192.168.0.201).
Escape character is '^]'.
Red Hat Enterprise Linux AS release 4 (Nahant Update 3)
Parallels Desktop for Mac 是一个无需重启即可在 Mac 上运行 Windows 的软件。近日,Parallels Desktop 更新到 16 版本,适合最新的 Windows 10 更新和 macOS Big Sur,售价 498 元起。
以下是详细信息:
关于 Parallels Desktop
在 Mac 上运行 Windows
在 MacBook, MacBook Pro, iMac, iMac Pro, Mac mini 或 Mac Pro上 同时使用 Windows 与 macOs (无需重启)。在Mac与Windows应用程序之间共享文件和文件夹、复制粘贴图像和文本,以及拖放文件。
Parallels Desktop 16 更新
未来准备
更适合最新的 Windows 10 更新和 macOS Big Sur(发布后),设计焕然一新、安装更轻松等。Parallels Desktop 持续保持最新状态,因此即使弹出新的 macOS、Windows 或 Linux 版本,您也可以不间断地继续工作。
提升性能
Parallels Desktop 16 中的性能得到了大大提升,它是目前最快的 Parallels Desktop for Mac 版本,启动速度是旧版本的两倍。恢复和退出 Windows 系统的速度也最高提速 20%。Parallels Desktop 用户总共可运行超过 200,000 个 Windows 应用程序,而使用版本 16,您可以运行更多应用程序。
今天在继续学习吴恩达ML视频的时候发现函数定义之后无法正常使用,如图所示:
原因是用word编写好函数之后在matlab中打开编辑器显示是乱码,于是重新在txt文件中重新编写函数,经过实验之后成功了。
总结:在编写函数的时候如果出现定义失败,那可能是由于编辑器的问题,可以尝试改用txt文本。
练习5 1.分三行将你的学号、姓名、和班级写入文本文件name.txt中,然后将文件name.txt中的内容输出到屏幕上显示。
with open(r"E:\Code\python\pythonClass\ninth\name.txt",'w',encoding='utf-8')as f: f.writelines('0001' + '\n') f.writelines('小明' + '\n') f.writelines('1702班' + '\n') f.close() with open(r"E:\Code\python\pythonClass\ninth\name.txt",'r',encoding='utf-8')as f: print(f.read()) f.close() 2.从一个文本文件grade.txt内读入任意多个学生的分数,求出最高分,最低分和平均分输出
with open("grade.txt", 'r') as f: ls = [] for s in f: s = s.strip("\n") ls.append(int(s)) print(max(ls)) print(min(ls)) print("{:.1f}".format(sum(ls)/len(ls))) 3.从文件in162.txt中读入10个以磅为单位的重量值,将其转换为以千克为单位的值并求和,将计算所得的和输出。说明:一磅等于0.454千克。
fo = open('in162.txt','r') s = fo.readline() a = [] ls = s.split(' ') for i in ls: a.append(eval(i)) sum = 0.0 for j in a: sum = sum + j wight = sum * 0.
练习4 1.社区为了补助困难家庭,对所有收入低于2000元(不含2000元)的家庭,增加相当于其收入30%的补助。
编写程序实现:输入若干个家庭的收入列表(在同一行,以逗号隔开),计算并输出增加补助后的家庭收入列表。
输出的每个收入后跟一个空格,最后一个收入后没有空格。
money_list = list(eval(input())) new_list = [] for i in money_list: if i < 2000: i = i + i * 0.3 new_list.append(i) else: new_list.append(i+0.0) for i in new_list: print(i, end=' ' if i != new_list[-1] else '') 2 。 学校举办新生歌手大赛,每个选手的成绩由评委的评分去掉一个最高分和一个最低分剩下评分的平均值得到。
编写程序实现:输入第一行指定n,从第二行开始每行输入一个评委的得分(共n行),计算选手的成绩,并输出。
n=int(input()) min=100 max=0 sum=0 for i in range(0,n): s=float(input()) sum=sum+s if(s>max): max=s if(s<min): min=s sum=sum-min-max c=sum/(n-2) print("该歌手最终成绩为{:.1f}".format(c)) 3.计算Fibonacci数列的前20项的值,并保存到列表中。
用户输入序号(1~20),输出数列中相应的值。
def fib(n): if n == 0: return [0] elif n == 1: return [0, 1] else: lst = fib(n - 1) lst.
练习2 1.将输入的字符串垂直输出
string = input() for i in string: print(i) 2.用户输入一个字符串,判断该字符串是否为回文,如是回文输出“是回文”,否则输出“不是回文”。
a = input("") b = a[::-1] if a == b: print("是回文") else: print("不是回文") 3.用户输入一个字符串,倒序输出。
a=input("") b=a[::-1] print(b) 4.用户输入一个小数,用format格式化输出,保留3位小数。
a=eval(input("")) print("{:.3f}".format(a)) 5.用户在三行中分别输入一个字符串s和两个整数m,n,输出字符串s中位于m和n(包括m但不包括n)之间的子字符串。
s=input("") m=int(input("")) n=int(input("")) print(s[m:n]) 6.输入一元二次方程三个系数,输出方程的解。
from math import * coef = input() # 处理coef字符串,获得一元二次方程的系数 coef = coef.split(" ") a = eval(coef[0]) b = eval(coef[1]) c = eval(coef[2]) d = b ** 2 - 4 * a * c if d < 0: # 如果方程无解 print("
练习一 1.从键盘输入两个整数a,b,一个操作符op,计算并输出a op b的结果
a = int(input()) op = input() b = int(input()) if op == '+': print(f'{a}+{b}={a+b}') elif op == '-': print(f'{a}-{b}={a-b}') elif op == '*': print(f'{a}*{b}={a*b}') elif op == '/': print(f'{a}/{b}={a/b}') 2.用户输入三角形的长和宽,要求输出三角形的面积,保留小数点2位。
a = float(input()) b = float(input()) c = 0.5 * a * b print("{0:.2f}".format(c)) 3.根据键盘输入的PM值提示不同的信息
PM = float(input()) if 0 <= PM < 35: print("空气优质,快去户外运动!") elif 35 <= PM < 75: print("空气良好,适度户外活动!") elif PM >= 75: print("
java8中提供了Lambda表达式,常用的操作如下:
list.stream().collect()来进行操作,collect中传入的参数如下:
<R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner); Supplier 提供容器,供后续accumulator和combiner使用 public interface Supplier<T> { T get(); } Supplier只有一个方法,get返回一个容器,accumulator和combiner方法都会传入
accumulator 处理Supplier提供的T容器和stream中的元素U @FunctionalInterface public interface BiConsumer<T, U> { void accept(T t, U u); default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) { Objects.requireNonNull(after); return (l, r) -> { accept(l, r); after.accept(l, r); }; } } accumulator 中的accept的方法接收两个参数,Supplier提供的容器T以及stream中的元素U,在accept方法中对其进行处理,常见的比如:T是一个ArrayList 将U类型元素添加到list中
combiner 用来将所有accumulator处理后的结果T进行处理 如果是多线程处理情况下,每个线程都会有一个supplier,最后需要将这些结果合并。
常见用法:
实现类实现 List<JSONObject> jsons = data.
安装vcs工具,需要借助installer工具来进行安装。
首先从官网下载vcs的安装包。我这里是vcs的最新版本,2020.12-SP1版本。
下载的安装包内容如下所示:
将该安装包,拷贝到内网服务器。
启动installer。然后填入安装包目录,点击Next。
installer工具会解压该安装包,等待一会即可。
在下一个界面,输入工具的安装位置。然后点击next。
工具选择页面,选择vcs。
在下一个界面,选择要安装的工具版本。这里根据自己的操作系统选择。我这里只下载了x86平台的,没有下载aarch64平台的。所以只有x86平台的选项。
工具确认界面,直接点击Accept,Install。进行安装。
工具安装中,等待安装完毕即可。
安装完毕,点击finish。
弹出的界面,点击dismiss。
自此,vcs工具安装完毕。
一,SHELL本地变量:
本地变量就如同局部变量一样,只在本SHELL中起作用。它不会影响到其他SHELL中的变量。
格式:NAME=value
1,变量的调用:在变量前加$
$ echo $HOME
/home/hbwork
$ WEEK=Satur
$ echo Today is $WEEKday
Today is$echo Today is ${WEEK}day //若变量和其他字符组成新的字,这时就必须给变量加上大括号{},以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能。
Today is Saturday
2,显示变量值
可以使用echo命令。需要注意的是,使用变量的时候必须在变量名前加上$符号。另外可以使用set命令,显示所有本地SHELL变量。包括SHELL中预定义了一些环境变量,且用户自己已经定义过的本地变量也会在其中显示。
3,Shell变量赋值从右到左进进行赋值(变量未赋值时,shell不报错,而是赋值为空!)
$ X=$Y Y=y
$ echo $X
y
$ Z=z Y=$Z
$ echo $Y
$
4,使用unset命令删除变量的赋值
$ Z=hello
$ echo $Z
hello
$ unset Z
$ echo $Z
$
5,有条件的命令替换 (测试变量是否已经赋值)
在Bourne Shell中可以使变量替换在特定条件下执行,即有条件的环境变量替换。 这种变量替换总是用大括号括起来的。
${variable: -value}变量替换时将使用命令行中定义的默认值,但变量的值并没有因此而改变。variable是一变量值,value是变量替换使用的默认值
例:$echo Hello $UNAME
结果显示:Hello
$echo Hello ${UNAME: -there}
环境搭建
使用语言 python3
安装imagemagick(pdf转jpg是内部需要调用到此工具)
apt-get install imagemagick
安装libreoffice(此工具用于将word文档转化成pdf文件)
apt-get install libreoffice
安装python wand,PIL库
pip install wand
pip install PIL
PDF转JPG
先转png,再转jpg是为了避免出现黑色,透明等背景,造成转换出来的图片与pdf文件显示不一样
from PIL import Image as Image2
from wand.image import Image
from wand.color import Color
def convert_pdf_to_jpg(filename):
end_length = len(filename.split('.')[-1]) + 1
title = filename[0:-end_length]
title = title.split('/')[-1]
#resolution为分辨率,background为背景颜色
with Image(filename=filename, resolution=150, background=Color('White')) as img :
#页数
length = len(img.sequence)
#如果页数超过1页,生成的文件名会依次加上页码数
with img.convert('png') as converted:
path = 'static/local_images/%s.png' % title
一、六大设计原则 单一职责原则依赖倒置原则开闭原则里氏替换原则接口隔离原则迪米特法则 1、单一职责原则 一个类只负责一件事
2、依赖倒置原则 抽象不应该依赖于具体实现,具体实现可以依赖于抽象
3、开闭原则 对修改关闭、对扩展开放
4、里氏替换原则 父类可以被子类无缝替换,且原有功能不受任何影响
5、接口隔离原则 使用多个专门的协议,而不是一个庞大臃肿的协议
协议中的方法尽量少
6、迪米特法则 一个对象应当对其他对象有尽可能少的了解
高内聚、低耦合
二、责任链 问题:
解决方案:
BusinessObject.h
@class BusinessObject; typedef void(^CompletionBlock)(BOOL handled); typedef void(^ResultBlock)(BusinessObject * _Nullable handler, BOOL handled); @interface BusinessObject : NSObject // 下一个响应者(响应链构成的关键) @property (nonatomic, strong) BusinessObject *nextBusiness; // 响应者的处理方法 - (void)handle:(ResultBlock)result; // 各个业务在该方法当中做实际业务处理 - (void)handleBusiness:(CompletionBlock)completion; @end BusinessObject.m
#import "BusinessObject.h" @implementation BusinessObject // 责任链入口方法 - (void)handle:(ResultBlock)result { CompletionBlock completion = ^(BOOL handled) { // 当前业务处理掉了,上抛结果 if (handled) { result(self, handled); } else { // 沿着责任链,指派给下一个业务处理 if (self.
目录
前言
1.需求分析
2.具体实现
2.1效果展示
2.1.1常见样式
2.1.2 Tab 宽度等分
2.1.3 Page 内容不一致
2.1.4 Index 覆盖 Tab
2.2实现步骤
2.2.1布局分析
2.2.2功能实现
3.使用步骤
3.1基本使用
3.2属性说明 4.注意事项
5.最后
前言 最近被分配到做项目小程序端的任务,做到原生端常见的 TabLayout + ViewPager 实现的 Tab 切换页面时,发现小程序未提供类似可以直接使用的 TabLayout 组件。
网上搜寻发现小程序端需要实现 Tab 切换效果,多是通过 scroll-view 和 swiper 联动实现,并且 指示器 没有过渡效果,多是闪现跳到下一个 Tab 。因此自行研究实现接近原生端的 TabLayout 组件。
1.需求分析 下图是小程序 小米Lite 的 Tab 切换效果:切换 Page 时,Tab 下方的指示器(红色横条)是没有滚动效果而是直接闪现到下一个 Page 的,这也是市面上小程序常见的 Tab 切换效果。
小程序 小米Lite Tab切换效果 原生端 TabLayout 常见的功能就是我们的目标效果,所以 目标效果如下:
指示器(Index)具有切换过渡效果;指示器(Index)需可自定义,常见的有:可固定宽度、可与 Tab 内容等宽、可覆盖在 Tab 上;Tab 可自定义、可支持自动适应父控件宽度等分 Tab 宽度;当 Tab 总宽度超出父控件宽度时,Tab 行支持滚动且切换 Page 时保证当前 Tab 可见;支持 Page 切换监听 通过了解小程序组件及技术支持,选定通过 scroll-view 、swiper 、swiper-item 、movable-area 、movable-view 配合 插槽 和 抽象节点 来实现自定义组件 tab-layout 。
写在前面的话 自己的经历 从大一开始,接触深度学习这一块也已经三年了。从当初懵懂无知的小白,终于变成了现在的调参小能手(实力自嘲)。整个学习过程其实挺艰辛的,具体的过程就不在这篇博客中说了(之后会有具体的总结)。但其实就我自己而言,如果说在这方面知识点突增的机会的话,现在想一想竟然都是和论文有关:
第一次读论文是在大一的时候,当时是打算做一个学校建筑物识别的微信小程序(自我感觉挺不错的,拍照识别,3D建模返回信息)。然后就在相关经验0的情况下找到了一篇相关的论文建筑物图像识别研究(别问我为啥不是知网,当时根本不知道这东西),然后就一直跟着这上面做笔记,如图所示。
也是从这个契机,才算打开了数字图像处理的大门(各种图像原理,形态变换。更巧的是现在大三又开了一门《数字图像处理》的课程,上过了之后,才发现自己还是太天真。所以在边学习的时候,也在更新相关的学习知识点。可见博客Hanzoe带你学数字图像处理-第一章)。当然这里面涉及的还是比较片面的部分知识,为了更加了解这方面的知识。便趁着实验室免费购书的机会,白嫖了一本《OpenCV算法精讲》。然后就开始恶补(上课看,通宵看,疯狂做笔记)。当然也是各种算法推导,代码复现。
现在回想起来那段时光还是充满慢慢的幸福感,就很充实。在琢磨了一遍之后,又恰好在实验室的技术小组中轮到本人做技术分享,还无疑问的我重讲了一遍OpenCV,记得足足讲了两个多小时(67页PPT),自认为满满的干货,毕竟这种技术分享最大的受益者其实还是分享者,相当于巩固了一遍知识。毕竟学习不能只有输入,还必须输出。但是琢磨了一遍之后,才发现貌似有点偏离比赛了,关于神经网络的知识倒是全给忘记了。不过幸好还学过一些Tensorflow的知识(入门必备-猫狗识别),在这个基础上添添改改,还算顺利的拿到了一个二等奖。
2. 第二次开始接触。是最近在做的2020国家级大创关于药草识别的一个APP。我主要负责的就是图像识别模块,当时毕竟也已经大二、大三了。轮子该怎么用还是懂的,所以没啥困难的就做出来了(现在想想这就是调参侠吧)。本来以为这样就可以结项了,突然老师说还要准备一篇论文。原谅初出茅庐的我还没对论文有啥概念,于是赶了几天出炉论文v1(当时大概是3月多)。后面老师就又找到我说:你这毫无创新啊?投不了的。于是我又不得不去研究了一下,并且在老师的帮助下,开始大量阅读论文(58篇),同时开始参加我们学校的研究生例会,学长学姐们也给了我很多帮助。然后提出了针对知识蒸馏方面的一些想法(也算是小改进吧)。不得不说,通过这次之后感觉算是弄明白自己到底该怎么学习(之前完全就是摸黑前行吧)。
为什么从论文开始? 也是从以上两个认为比较重要的经历吧,同时根据在多次参加研究生例会的经验(我们学校大概就是研一开始大量阅读论文并且开始提出自己的一些想法,研二开始选择一方面写一篇小论文,研三大概就是毕业论文了)以及老师的一些看法:在顶级学校的某些专业(比如人工智能),都是大一开始接触论文了(想想自己也是运气好,勉强算看了一篇),大二大三可以试着发出一些论文。
所以在经过了这一系列的见闻后,在大三也就是最近我开始在我们实验室的技术小组尝试一些改革(毕竟算是一个技术组长),让大一大二新生们早一些接触论文,为未来打下基础(深度学习这方面,说实话不考研不太行),如果现在开始有了一定的论文阅读量,研一的时候就可以无缝衔接甚至超过很多同阶段的同学。
话又说回来,在我自己开始动手写第一篇论文的过程中,其实也远不止这么简单。反反复复十几个小版本,三次大的框架整改。改到最后才回归到问题本质(这也是后面会说的)。最后才体会到另一位老师的话:写论文并不是强制去写什么创新、强制去发现什么。恰恰相反,是你发现了有这么一个问题,你觉得可以尝试以下解决,所以有了这篇论文。按我的话来解释就是:不是为了论文而勉强论文,而是因为存在问题,想去解决问题,才有的论文。(就我自己平常看看的网上相关新闻时事以及自己阅读的一些论文,感觉这方面却很少有人做到),再用恋词朱伟老师的话更通俗的来说就是:少一些物质的追求,多一些无所谓的热爱!
以上的一些描述可能就是原因吧,可能写的重点不突出,但是想说的都已经在里面了。
总之,开了这个专题的博客的原因就是想让还没有写过论文但是想去尝试的同学有一个借鉴,我会大概叙说一些比较重要的步骤。如果是已经投过的大佬们,就请当一个饭后闲谈。
再说以下我自己的情况吧:
一作:论文普刊一篇,准备投稿一篇(目前老师在帮忙精修,打算投英文期刊,目标SCI/EI吧),已投一篇(EI会议,其实也挺水的,不过在6月有机会做一次口头报告,算是涨经验、增加阅历了吧),准备再写一篇(还得看情况,毕竟还要面临考研现状,都已经5月了,还没结束一轮)二作:一篇(EI会议) 结束语 以上,就是一些自己的闲谈。仁者见仁智者见智,有错误的地方欢迎大家指出来。如果有赞同、反对的意见,也欢迎在评论区留下您的足迹。本人不怕被打击,只希望能和大家共同进步,希望大家能在这个专题中学到东西。最后补上一句很喜欢的话:Life is just like a game of chess.Notwithstanding an unimpressive pwan moving at a snail pace,who ever withseen my retreat a bit.(人生如棋,我愿为卒。行动虽缓,谁曾见我退却一步(我走的很慢,但却从不回头))
PS 由于平常还需要准备考研以及还有其他的几个专题也在更新,所以可能会写的很慢,望谅解。
一、问题 最近学习AI,需要在Ubuntu下安装TensorFlow。结果TensorFlow装好后,import TensorFlow时报错:
Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
二、网上已有的办法尝试 网上目前已有的解决方法是在命令行中安装cuda。例如
https://blog.csdn.net/qq_28193019/article/details/103146116 https://blog.csdn.net/qq_26018075/article/details/111546689 上面两篇文章的思路相同,一个是装10.0版本,一个是装11.0版本。
但是我尝试了上面的方法后,却行不通。可能是镜像配置有问题吧,速度很慢。因此需要使用下面的离线下载方法。
三、使用离线下载办法 打开cuda的官网下载网址:https://developer.nvidia.com/zh-cn/cuda-downloads 依次选择Linux->x86_64->20.04->deb(local) 走到这里,如果执行官方推荐的命令,可能还是会失败。因此有一个小技巧:在windows中利用迅雷下载,下载这两个文件(尤其是第二个2.4G的大文件)。复制链接,在迅雷中点新建下载任务,下载窗口自动弹出来,点立即下载。
网速快的话几分钟就下载好了。然后利用Xshell工具自带的Xftp,把下载好的文件传到ubuntu(这个步骤很容易,后面有机会再写个文章吧)。
四、安装cuda 其实就是cuda官网的安装方法执行一遍就好了(去掉下载的两个命令)。
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 sudo dpkg -i cuda-repo-ubuntu2004-11-1-local_11.1.0-455.23.05-1_amd64.deb sudo apt-key add /var/cuda-repo-ubuntu2004-11-1-local/7fa2af80.pub sudo apt-get update sudo apt-get -y install cuda 五、测试 python
import tensorflow
如果看到上面的提示,恭喜,问题解决!
代码详细注释,仅供交流与参考,不作商业用途
代码参考北京理工大学嵩天老师
import requests #导入第三方库 import re import os def getHTMLText(url): try: r = requests.get(url, timeout = 30) #timeout超时响应参数,这里是30秒 r.raise_for_status() #判断是否异常,200为正常 r.encoding = r.apparent_encoding #编码方式 return r.text #返回内容 except: return "" def parsePage(ilt, html): try: plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html) tlt = re.findall(r'\"raw_title\"\:\".*?\"', html) #*?前一个字符0次获无限次扩展,这里是.(任何单个字符)无限扩展,知道 “ 结束 img = re.findall(r'\"pic_url\"\:\".*?\"', html) sal = re.findall(r'\"view_sales\"\:\".*?\"', html) for i in range(len(plt)): price = eval(plt[i].split(":")[1]) #使用.split以 : 为界限分割,[1]取分割后的第二部分, eval函数去掉双引号 title = eval(tlt[i].split(":")[1]) image = eval(img[i].
1:对springcloud理解? Spring cloud是一个基于Spring Boot实现的服务治理工具包,用于微服务架构中管理和协调各个服务的。
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
2:为什么要使用springcloud? spring开发配置太复杂。springboot简化了spring项目开发。而springboot虽然开发服务容易,服务管理却不好整,所以出来了cloud来管理服务;
1:单体项目的缺点
①编译难,部署难,测试难
②技术选择难
③扩展难
使用微服务架构就可以解决单体项目缺点。
2:微服务的优点
1复杂度可控-每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界。由于体积小、复杂度低,每个微服务可由一个小规模开发团队完全掌控,易于保持高可维护性和开发效率
2独立部署-微服务具备独立的运行进程,所以可以独立部署
3技术选型灵活-每个团队可以根据自身服务的需求和行业发展的现状,自由选择最适合的技术栈,甚至重构微服务
4容错-在微服务架构下,故障会被隔离在单个服务中
5扩展- 每个服务可以根据实际需求独立进行扩展
微服务架构。随着系统业务量的不断增多,单一的一套系统可能无法对应高并发,且系统变得越来越臃肿,后期难以维护。这种情况下会采用微服务架构设计,为了让单一模块变得更加清晰容易维护,且使某个模块儿的负载能力变得更加强大,添加集群也更为方便。
3:对springcloud各组件的理解 Springcloud大概有接近二十个组件,常用的有服务发现注册Eureka 、配置中心config、服务网关Zuul 、负载均衡Ribbon (feign包含了他)、断路器Hystrix (feign包含了他)
由于是微服务架构,由多个单体项目组成,就会有各自的通信地址,所以我们用服务发现注册Eureka来管理通信地址,配置中心config来管理配置文件并放到gitee上去保存,服务发现注册包含了服务端EurekaServer和客户端EurekaClient,(可以讲心跳机制),微服务EurekaServer在启动时会将通信地址发给注册中心EurekaClient,形成通信列表,也就是服务注册;微服务从注册中心获取一份微服务通信地址,自己向别的微服务通过通信地址找到的该微服务通信地址基于HTTP发起请求叫做服务发现;
当有多个微服务时,根据业务需求可能会有多个服务者,也就是功能一样的两个模块。需要对他们发起的请求进行处理,所以我们需要负债均衡负载均衡Ribbon,通过负载均衡来控制请求的分发,负载均衡常用算法有轮询(公平,两个都一样),随机,加权轮询(哪个厉害点就多给点,能者多劳)。
但是一个服务出现延迟时,所有的请求都阻塞在依赖的服务,高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险也就是雪崩,所以我们需要用到断路器Hystrix,将出现问题的服务通过熔断、降级等手段隔离开来,这样不影响整个系统的主业务,所以维护起来更方便。具体方式有:资源隔离(线程池隔离和信号量隔离),熔断(熔断,半熔断,闭合),降级(服务熔断后返回一个预先设定好的托底数据);
当服务都能正常运行时,我们不能让所有都来访问,要有一个保安来拦截不该进来的请求,比如爬虫和其余不合法的请求,所以我们用到了服务网关Zuul,zuul还能自定义过滤器,比如自定义一个accesstoken,不带accesstoken的不让访问。有效的保证了服务的安全性。