1、两主机直连传输数据包过程 需要协议:tcp/ip 协议 、arp协议。
tcp/ip 四层:
4应用层 telnet、ftp、http、smtp、dns
3传输层 tcp、udp
2网络层 ip、icmp、arp、rarp
1数据链路层
注意:主机的arp表内容有:mac和ip
连接示意图:
左边是主机A
主机A:
应用层:我要和主机B建立可靠连接,并发送数据。
传输层:那我将用tcp,需要网络层将tcp syn发送给主机B
网络层:可是我的宝贝arp没有主机B的映射,先把数据包放在停车场等有映射了我再来取。
arp:那我发送个arp广播找主机B,B收到会恢复arp响应的 下面是arp广播格式:
主机B:
网络层:我收到个arp广播 我要转给arp
arp:收到主机A的mac和ip 让我添加到 arp表 然后我再应答。下面是应答格式:
主机A:
网络层:收到个arp,让我交给arp处理。
arp:好了收到B的 应答了 让我把B的IP和mac添加进arp表。然后告诉网络层我有B的映射了。
网络层:取出停车场的数据包发给B, 下面是格式:
这时B需要发送 syn ack 包 然后 A再发送 syn ack 包 完成三次握手 建立会话。
会话建立完成之后 就可以畅通的发送应用层数据包了:
A 发送数据包的格式:
B 回复的格式:
2、通过交换网络传播数据包 连接示意图:
左边是主机A。
交换机左边的端口是1。
注意:交换机的arp表中只有:mac和端口。
和上边的区别是多了个交换机, 主机A和B发送的数据包和上面一样。
交换机在此起到的作用:
1、遇到A发送的arp广播,交换机先将A的 mac和所在交换机端口的信息添加到表中。
2、然后将arp广播泛红到所有端口除了A所在的端口1。
3、B收到之后,发送arp应答包
4、交换机收到之后先把B的信息添加到表中,再把应答包转发给A。
3、通过路由网络传输数据包 连接示意图:
WebView可用于再程序中嵌入一个浏览器,完成加载和显示网页的任务
先在视图中添加WebView控件
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/web_view"/> </LinearLayout> 在MainActivity中实例化WebView对象,设定浏览器属性,调用WebView的setWebViewClient方法并传入WebViewClient实例,作用是从一个网页到另一个网页时,仍在WebView中显示,而不是打开系统浏览器,使用loadUri方法传入网址,即可访问该网址内容
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webView = findViewById(R.id.web_view); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient()); webView.loadUrl("http://www.baidu.com"); } 访问网络需要声明INTERNET权限,另外高于Android 9版本,默认情况下禁止明文支持,需要在application节点中声明android:usesCleartextTraffic=“true”
<uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name"
1、环境准备:
centos7 docker-ce-19.03.5 docker-compose version 1.25.4, build 8d51620a harbor-v1.8.0 2、安装docker :
官方安装文档:https://docs.docker.com/install/linux/docker-ce/centos/
3、安装docker-compose:
官方安装文档:https://docs.docker.com/compose/install/
4、安装Harbor
1、下载安装包 # wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.1.tgz 2、解压并修改配置文件 # tar -zxvf harbor-offline-installer-v1.8.1.tgz -C /var/data/harbor # cd /var/data/harbor 150服务器上修改harbor.yml # vim harbor.yml hostname: 192.168.0.150 160服务器上修改harbor.yml # vim harbor.yml hostname: 192.168.0.160 3、执行安装脚本 # ./install.sh ✔ ----Harbor has been installed and started successfully.---- #看到这一行就表示成功了 Now you should be able to visit the admin portal at http://192.168.0.150. For more details, please visit https://github.
题目描述
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
输入
本题有多组数据,每组数据由一个正整数N组成。(N不大于100)
输出
对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。
样例输入
5
样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
代码实现
#include<stdio.h> int main() { int i,j,k,n; int count=0; int a[100][100]; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0,k=i;k>=0,j<=i;j++,k--) //向斜右上方逐渐填充 { a[k][j]=++count; } } for(i=0;i<n;i++) { for(j=0;j<n-i;j++) { printf("%d ",a[i][j]); } printf("\n"); } return 0; }
私有jar包导入 使用pom文件进行配置前 需要做哪些工作:1.点击右侧工具
2.输入命令:
install:install-file -Dfile=E:\projects\projects\SpringBootTry\libs\jackson-all-1.9.11.jar -DgroupId=jackson -DartifactId=jackson -Dversion=0.0.1 -Dpackaging=jar
点击执行,显示结果
下面就可以在pom文件进行配置使用啦
CAD2020操作手册 命令的输入 直接打
命令取消 按esc或者space也就是空格。
点坐标 图形是由点组成,所以点在制图中非常的重要。
相对坐标表示 前面加@
图纸大小选择 执行limits命令
然后CAD会提示,如果按enter就是使用默认值。
指定右上角点。
这个是程序默认执行的。也就是先左上角再右上角。
设置它的图形单位,角度单位,和它们的精度。 命令units
或者直接用鼠标定位。
查看命令文本 TEXTSRC和GRAPHSRC或者F2都可以查看。
导入出PDF文件 直接打入pdf就可以了。
绘制图形 删除 U
点 point
点类型 DDPTYPE
绘制等分点 MEASURE(DEVIDE)
绘制直线 LINE
绘制射线 RAY
绘制两个方向无限延长的直线 XLINE
绘制圆 CIRCLE然后再定三个点:切点,切点,半径。要指定圆心以及半径或直径。
绘制圆的中心线 CENTERMARK
绘制圆环 donut
确定内外径就行了。而且它的单位在CAD里面是比较大的,1cm基本看不见。
绘制椭圆 ELLIPSE
然后先指定椭圆的中心,再指定长轴。
绘制矩形 RECTANG
绘制正多边形 POLYGON
先输入要画的正多边形变数,然后在选取内接圆还是外接圆作为画图依据。
问: 外接圆和内接圆的选取有什么要求吗?
绘制多线段 多段线是由直线段、圆弧段构成,且可以有宽度的图形对象
与连续画的直线相区别。
右键确认。以圆的半径为参考基准。
下面有命令提示,按照要求打入相应的命令进行换风格。
绘制样条曲线 经过一系列给定点的样条曲线。这个就是从点到点的曲线。
填充对象 在画好的对象里面,打入hatch
填充颜色 这是一个可以叠加的命令。GRADIENT
对象捕捉 shift加上右键,具体用法还有待探索。
注释操作 先用菜单栏搞个注释。然后,打入x分离,然后再打ro调整注释文字的位置。
选择对象 select
前端和后端哪个工资高?事实上,两个都是属于技术研发岗位,都是高薪有前途的职业,不存在说哪个工资更高些,都基本在一万到五万之间,工资的差别主要体现在个人技术上。要问做前端好还是做后端好?其实无论做前端还是做后端,只要有实力,其实差别并不大。主要还是要看你喜欢哪个,适合哪个。
前端工作内容:
前端开发主要做的是用户所能看到的前端展示界面。前端开发用到的技术包括但不限于html5、css3、javascript、jquery、Bootstrap、Node.js 、AngularJs等技术。从开始的切页面,到现在复杂的前端单页应用,node服务端应用,移动端react-native等,前端的技术更新速度远远超过服务端的更新速度,这也就要求前端同学,需要不停的学习新的技术来跟上前端技术的升级,一旦松懈,就可能被淘汰。前端现在所覆盖的场景已经越来越广,从传统的前端,已经延伸到服务端,工具链,移动端等。而对于新手来说,前端入门是最容易的,现在很多人直接从主流框架开始学习前端,react, vue 看一看就可以直接开始项目开发了(但是不推荐,还是从HTML, CSS, ECMAScript 基础学期)前端入门容易,但是比较容易陷入API型程序员,各类框架和库都会用,但是都不够深入。服务端入门相对难,但是时间长了,比较容易构建技术壁垒,拉开差距。
后端工作内容:
开发主要做的是逻辑功能等模块,是用户不可见的。后端开发 以java为例 主要用到的 是包括但不限于Struts spring springmvc Hibernate Http协议 Servlet Tomcat服务器等技术。后端适合重逻辑,逻辑思维强的同学,技术难度相对是要比前端深的,虽然会基本的CURD就能从事后端开发,但是在云计算时代,只会CURD是迟早会被淘汰的,docker容器技术,serverless ,函数计算, devops 越来越多的新技术和新架构出来,需要很长时间去慢慢学习和积累,后端的学习是一个漫长的过程。
前端晋升发展:
一方面可以这样发展:初级程序员 → 中/高级程序员 → 架构师 → 技术经理 → 技术总监CTO。工资从最初的一万到两三万,再到四五万,最后年薪百万也是没问题的。不想做前端开发,可以考虑去转产品岗。前端转产品有着天然的优势,其次是产品经理的工资水平也不低,月薪四、五万多了去了。而且都说优秀的产品经理简直就是一个CEO的前身,这话一点也不假。因此前端无论是做技术还是转管理都是大有前途的。
后端晋升发展:
都说核心技术栈都是后端的,这话也有一定道理,毕竟做后端要求有扎实的技术能力。因此做后端专攻技术的比较多,一开始也是一万左右,四、五后工资可以翻四五倍都是小意思。JAVA是作为后端开发的。现在后端开发主要是PHP和JAVA,当然还要加上数据库MySQL、Oracle。PHP比较适合交互比较少的后端,适合小规模的应用。JAVA做后端安全性、稳定性都较好,所以大、中企业用JAVA开发。当然后端开发还有C++等语言,C++的特点是开发快、成本低,一些手机游戏就用C++作为后端语言。因此后端的需求还是十分广泛的。总之做后端只要有过硬的技术,在企业里一定有自己的一席之地。
总之,前端和后端工资和职业发展前景就都不错。大家在选择做前端还是做后端的时候,最重要的是看自己的喜好,毕竟适合自己的才是最好的。
filecoin 编译过程中需要下载 proof-params 文件,默认从 IPFS官方网关(https://ipfs.io/ipfs/) 拉取,可通过环境变量IPFS_GATEWAY自定义,见 go-paramfetch
期间还需要从github下载 filecoin-ffi release tarball,见 install-filecoin ,可能会被墙,通过环境变量HTTPS_PROXY设置代理
具体执行命令如下:
git clone https://github.com/filecoin-project/go-filecoin.git cd go-filecoin # git checkout $USER_DEVNET_TAG git submodule update --init --recursive IPFS_GATEWAY=http://127.0.0.1:8080/ipfs/ HTTPS_PROXY=http://127.0.0.1:8010 go run ./build/main.go deps IPFS_GATEWAY=http://127.0.0.1:8080/ipfs/ HTTPS_PROXY=http://127.0.0.1:8010 go run ./build/main.go build Note:127.0.0.1:8080 为本地 IPFS 网关,127.0.0.1:8010 为代理服务
编译的 master 分支,能正常编译,但无法走完 Filecoin 官方 demo 流程。
知识背景 nextcloud是ownCloud原先的开发者弗兰克·卡利切离开以后创建了ownCloud的分支——Nextcloud。
NextCloud 是一款开源网络硬盘系统。任何人都可以自由的获取 NextCloud 程序,在家庭或公司构建私有且免费的网络硬盘。它是完全由你用户控制的私有、安全且功能完整的文件同步与共享解决方案。
下边开始介绍docker-compose安装nextcloud服务
安装docker和docker-compose docker安装链接:https://docs.docker.com/install/linux/docker-ce/centos/
docker-compose安装链接:https://docs.docker.com/compose/install/
编写docker-compose文件 version: '2' services: db: container_name: cloud_db image: mysql:5.7 volumes: - /var/data/cloud/mysql:/var/lib/mysql - /etc/localtime:/etc/localtime environment: MYSQL_ROOT_PASSWORD: nextcloud MYSQL_DATABASE: nextcloud nextcloud: container_name: cloud_web depends_on: - db image: nextcloud volumes: - /var/data/cloud/config:/var/www/html/config - /var/data/cloud/data:/var/www/html/data - /var/data/cloud/apps:/var/www/html/apps ports: - "8090:80" onlyoffice: container_name: cloud_office image: onlyoffice/documentserver ports: - "9100:80" networks: default: external: name: nextcloud 创建存放文件的路径,我这里是/var/data/cloud
执行前创建nextcloud网卡
docker network create nextcloud 启动容器服务,启动过程比较慢需要下载镜像,可以再执行前吧需要的镜像下载下来,过程不需要再赘述。
docker-compose up -d 服务启动以后,开始初始化nextcloud服务
今天遇到的servlet4.0在IDEA上的配置问题解决,根源主要是jsp文件和servlet中的url不相匹配。
web.xml中的 /:代表项目根路径http://localhost:8080/Myweb/
在src源文件下建立的servlet.class类中配置的@WebServlet(“/WelcomeServlet”) 中的 /:代表项目根路径http://localhost:8080/Myweb/
jsp中的/: 服务器根路径http://localhost:8080/
在WelcomeServlet类中,在地址栏上输入http://localhost:8080/Myweb/WelcomeServlet即可访问。在jsp文件中“/”代表的是http://localhost:8080/ ,所以要想从jsp文件的超链接或者表单申请访问servlet文件时要加上“/项目名”。
如何文件访问另一个文件,出现404问题,可以现在地址栏上分别输入两个文件的url,看是否能访问的到,如果分别能访问的到,则判断文件中url,是否匹配正确,注意 / 在不同文件中的不同表示路径。匹配两个文件的url对比,看路径是否写对。
注:在本文中我的项目名称时Myweb。
当使用HttpWebRequest进行访问时,结果提示为302重定向错误。
使用代码,
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "text/html"; request.AllowAutoRedirect = true;//设置自动重定向 request.ServicePoint.Expect100Continue = true;//设置自动重定向 request.MaximumAutomaticRedirections = 50;//允许最大重定向次数 request.CookieContainer = new CookieContainer(); //request.Timeout = 30000; //request.ReadWriteTimeout = 30000; ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) => { return true; }; request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); var heards = request.GetResponse().Headers; Stream myResponseStream = response.GetResponseStream(); using (StreamReader myStreamReader = new StreamReader(myResponseStream, encoding)) { string retString = myStreamReader.
c语言中(*a)[n]与*a[n]有什么区别 表面上看这些问题,好像是指针,但是,如何来正确判断这几个定义,需要我们首先有运算符优先级的概念。
在c语言中,[] 和 () 的优先级比星号(星号的名字叫做“指针运算符”)要高,所以,在这几个声明中,先看 [] 和 () 。
同时,这两个括号的运算符的结合顺序,是从左到右的。因此,int *a[n],实际上相当与int *(a[n]),也就是(int *)(a[n])。
让我们来逐步分析:
ElementType *a[n] : (int *)(a[n]) 首先是一个数组(比如,把 int * 换为 int,就是“元素是整形数据的数组”。那么,换为 int*,就是“元素是指向整形数据的数组的指针”简而言之就是 指向数组的指针 )。
ElementType(*a)[n] (记忆法-括2维): int (*a)[n] 改变了自然的运算符的优先级,相当于(int)((*a)[n])。一有指针就头疼,我们把指针先用b替换掉,就是int b[n],是一个n位数组,数组首地址(也就是数组名)是b。
那么,int (*a)[n]也是一个n位数组,但是这个数组的首地址是*a(这里的*是间指运算符),也就是说,*a的内容,是一个数组的首地址。
那么,a的内容是一个存放数组首地址的地址,这个数组中的元素都是int。实际上,a相当于是一个二维指针。
rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数,一般为0x7fff;
rand()范围是[0,RAND_MAX]
如果说是 10rand(),则对应的范围应该为[0.0,10RAND_MAX]
一般来说,rand() % (b-a+1)+ a ; 就表示 a~b 之间的一个随机整数。
即:
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a (结果值含a不含b)。
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a (结果值含a和b)。
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1 (结果值不含a含b)。
例如对5取余求模,结果都是小于5的,但是如果对6取余求模,结果是小于等于5
在编程序时,单纯的使用rand是无法产生真正的随机数的,如果想每次运行程序时产生的随机数都不一样,可以使用srand来初始化种子
当计算机正常开机后,这个种子的值是定了的。 为得到不同的随机数序列,则需改变这个种子的值。方法:在开始产生随机数前,调用一次srand(time(NULL))。
srand()一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的随机数。
-----补充------
生成浮点数随机数,a b为整数或浮点数
[0,1]—rand()*1.0/RAND_MAX
[a,b]—rand()1.0/RAND_MAX(b-a)+a
[a,b)—rand()1.0/(RAND_MAX+1)(b-a)+a
(a,b]—(rand()+1)1.0/(RAND_MAX+1)(b-a)+a
(a,b)—(rand()+1)1.0/(RAND_MAX+2)(b-a)+a
如果要获取store里面的state的city属性。首先来看看没有使用mapState的情况,
{{this.$store.state.city}} 再来看看使用mapState后
{{this.city}} 那么为什么会这样呢?先来看看官方的定义:当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:
首先什么是状态?即state,state又是用来存储一些数据的,所以不难理解。
看代码
import {mapState} from "vuex" // 使用mapState,此时,city已经被映射了,所以可以直接使用this.city去获取属性值 computed:{ //意思是将vuex中的city数据映射到组件的computed属性里 ...mapState(["city"]) } 还有一种使用方法,意思是将store里面的state里面的city属性映射到computed属性中的currentCity中。即currentCity代表了$store.state.city
computed:{ ...mapState({ currentCity:"city" }) }
第一中:
创建一个vue实例 <div id="app"> // mycom2 就是引入封装的公共组件 <mycom2></mycom2> </div> <!-- 定义再外面的 vue 模板组件而且是一个公共的组件 --> <template id="tmp1"> <div> <h1>我是一个公共组件</h1> </div> </template> var app = new Vue({ el: '#app', data: {}, method: {}, }); //开始封装一个公共的组件 Vue.component('mycom2', { template: '#tmp1' }) 第二种封装一个私有的组件
<!-- 这是一个私有的组件只能在 div id='SY'的里面才能被访问 --> <div id="SY"> <div> <login></login> </div> </div> <template id="tmp12"> <div> <h1>这是一个私有的组件只能在 div id='SY'的里面才能被访问</h1> </div> </template> var SY = new Vue({ el: '#SY', data: {}, method: {}, components: { // login 是组件名 login:{ template:'#tmp12' } } }) 组件里封装 data 和方法
权限问题,授权 给 root 所有sql 权限
mysql> grant all privileges on *.* to root@"%" identified by ".";
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
新建一个Android项目,修改资源、包名等多种信息后,出现错误: 程序包R不存在。
这种情况下,问题多出在包名。
尤其在java文件中没有写明『import **.R』时,IDE目测会去当前java文件的同包名找R;
这种情况下:
可以在该文件中写明(import 包名(AndroidManifest中的).R;),然后再build;另一种方法,如果这种文件少,也可先把报错的.java文件移动至于包名相同的目录进行调试;
一旦R文件匹配正确,就不会报找不到程序包R的错了。 后续资源文件出错的错误,报错信息都会明示哪些地方有问题,相对简单,按提示解决即可。
总结:
找不到程序包R,这句错误信息略显晦涩,通俗来讲就是:“
您引用的R可能与包名不符,非包名路径下的文件可能需要写明 “import 包名.R”。请在查验包名正确后重试”。
还有一种是,将鼠标点击用到R的地方,然后Alt+Enter出来详细说明,之后点击导入包就好了:
链接:https://codeforces.ml/contest/1296/problem/E1
This is an easy version of the problem. The actual problems are different, but the easy version is almost a subtask of the hard version. Note that the constraints and the output format are different.
You are given a string ss consisting of nn lowercase Latin letters.
You have to color all its characters one of the two colors (each character to exactly one color, the same letters can be colored the same or different colors, i.
Wireshark安装失败或找不到网络接口问题
Wireshark捕获数据包,主要依赖Winpcap或Npcap组件。从Wireshark 3.0开始,Npcap代替了Winpcap组件,成为Wireshark默认的网卡核心驱动。当用户安装Wireshark工具时,如果当前系统已经安装了Winpcap或Npcap组件的话,将会提示卸载系统中已安装的组件,并安装Wireshark依赖的版本。如果卸载组件失败,强制安装成功的话,将会出现找不到网络接口的错误。
另外,由于Npcap组件属于驱动程序。所以,安装的时候容易被杀毒或防火墙软件拦截,导致Npcap组件安装失败。在安装过程中,注意查看杀毒/防火墙软件的提示,及时允许组件的安装操作。因此,在安装Wireshark之前,最好关闭杀毒或防火墙软件。而且,确认当前系统中没有安装Winpcap或Npcap组件。这样,用户即可顺利安装Wireshark。
leetcode
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路 方法一:辅助栈同步
可以多开一个栈,来储存最小值,每次新数据进栈时,和之前的最小值进行比较,如果小于,则压入栈,否则,压入之前的最小值。
保持最小值栈和数据栈的长度一致,进栈出栈的操作要同步。
class MinStack: def __init__(self): """ initialize your data structure here. """ self.stack = [] self.min_stack = [] def push(self, x: int) -> None: self.stack.append(x) if len(self.min_stack)==0 or self.min_stack[-1] >x: self.min_stack.append(x) else: self.min_stack.append(self.min_stack[-1]) def pop(self) -> None: if self.stack: self.stack.pop() self.min_stack.pop() def top(self) -> int: return self.stack[-1] def getMin(self) -> int: if self.min_stack: return self.min_stack[-1] 方法二:辅助栈不同步
在弹出时,考虑如果弹出值为最小值,那么储存最小值的栈也需要弹出,否则只有数据栈弹出