公司有个user_main表 结构如下
索引如下
慢sql
SELECT * FROM user_main WHERE updateTime >= '2021-09-08 01:30:02.01' AND updateTime <= '2021-09-10 01:30:01.664' AND RIGHT(userId,1) = 2 AND userId>10000 ORDER BY userId ASC LIMIT 1000; 指定索引 FORCE INDEX (idx_updateTime)
SELECT * FROM user_main FORCE INDEX (idx_updateTime) WHERE updateTime >= '2021-09-08 01:30:02.01' AND updateTime <= '2021-09-10 01:30:01.664' AND RIGHT(userId,1) = 2 AND userId>10000 ORDER BY userId ASC LIMIT 1000; 执行计划
参考:mysql-2000多万性能与force index强制指定索引
目录
一、效果图
1、第一版本:在屏幕底部开始显示 2、第二版本:点击任意位置都可以显示
3、第三版本:给任意控件添加点赞效果
二、代码
1、第一版本代码 源码:
示例:
2、第二版本代码
源码(主要是增加了ontouchEvent的处理还有修改贝塞尔四个点的坐标范围):
示例:
3、第三版本代码(主要是增加了ontouchlistener)
源码:
示例:
一、效果图 1、第一版本:在屏幕底部开始显示 2、第二版本:点击任意位置都可以显示 3、第三版本:给任意控件添加点赞效果 二、代码 1、第一版本代码 源码: package com.example.lovelayout; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.PointF; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RelativeLayout; import java.util.Random; import androidx.core.content.ContextCompat; public class MyLoveLayout extends RelativeLayout { private int[] imgResId; private Random random; private int mWidth; private int mHeight; private int drawableWidth; private int drawableHeight; public MyLoveLayout(Context context) { this(context, null); } public MyLoveLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyLoveLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); imgResId = new int[]{R.
项目场景: Latext参考文献引用顺序
问题描述: 一般来说,引用bib格式的参考文献时,会这么写:
\bibliographystyle{plain}
\bibliography{%filename%.bib}
结果就是尽管 .bib 文件是按照全文文献出现顺序来写的,通篇文献引用顺序仍然混乱
解决方案: plain的意思是用作者的姓名排序,而不是按照引用顺序,所以改成 \bibliographystyle{unsrt} 即可按照bib中出现顺序来排序
注意:一定要将bibliographystyle 写在bibliography的前面结果才有效
\bibliographystyle{unsrt}
\bibliography{ref}
本系列文章旨在通俗易懂的讲清楚YUV格式以及相互之间的转换。本文的主要目的是介绍常见YUV抽样格式,包含在内存中的排布存储。
1. 基础概念
1.0 采样位深
1.1 RGB
1.2 YUV
1.3 yuv数据采样
1.4 数据存储
1.4.1. 平面(planar)格式
1.4.2 半平面(half-planar) 格式
1.4.3. 打包(packed)格式
2 YUV格式
2.1 YUV444
2.1.1 采样
2.1.2 存储
2.2 YUV422
2.2.1 采样
2.1.2 存储
2.3 YUV420
2.3.2 存储
2.4 YUV411
2.4.1 采样
2.4.2 存储
2.5 其他YUV
2.5 常见YUV格式对比
参考
附件
Wireshark(四):网络性能排查之TCP重传与重复ACK 原文出处: EMC中文支持论坛 作为网络管理员,很多时间必然会耗费在修复慢速服务器和其他终端。但用户感到网络运行缓慢并不意味着就是网络问题。
解决网络性能问题,首先从TCP错误恢复功能(TCP重传与重复ACK)和流控功能说起。之后阐述如何发现网络慢速之源。最后,对网络各组成部分上的数据流进行概况分析。这几张内容将会帮助读者识别,诊断,以及排查慢速网络。
更多信息
接下来的内容,较多是黑白图片了。虽然看起来有点不爽,但还是很值得一看。
TCP错误恢复功能:
TCP的错误恢复功能是定位,诊断及修复网络延时的最佳工具。延时可以在单程也可以往返方向测量。高延时是网络管理员的头号大敌。本节我们讨论TCP高延时是如何导致序列号和确认号乱序的。
TCP重传:
主机报文重传是TCP最基本的错误恢复功能,它的目的是防止报文丢失。
报文丢失的可能因素有很多种,包括应用故障,路由设备过载,或暂时的服务宕机。报文级别速度是很高的,而通常报文丢失是暂时的,因此TCP能够发现和恢复报文丢失显得尤为重要。
决定报文是否有必要重传的主要机制是重传计时器(retransmission timer),它的主要功能是维护重传超时(RTO)值。当报文使用TCP传输时,重传计时器启动,收到ACK时计时器停止。报文发送至接收到ACK的时 间称为往返时间(RTT)。对若干次时间取平均值,该值用于确定最终RTO值。在最终RTO值确定之前,确定每一次报文传输是否有丢包发生使用重传计时 器,下图说明了TCP重传过程。
当报文发送之后,但接收方尚未发送TCP ACK报文,发送方假设源报文丢失并将其重传。重传之后,RTO值加倍;如果在2倍RTO值到达之前还是没有收到ACK报文,就再次重传。如果仍然没有收 到ACK,那么RTO值再次加倍。如此持续下去,每次重传RTO都翻倍,直到收到ACK报文或发送方达到配置的最大重传次数。
最大重传次数取决于发送操作系统的配置值。默认情况下,Windows主机默认重传5次。大多数Linux系统默认最大15次。两种操作系统都可配置。
示例如下图:
TCP重传过程发送的第一个报文如下图所示(图片不很清楚,已经尽力了):
这是一个TCP PSH/ACK报文①,包含648字节数据②,从10.3.30.1发送至10.3.71.7。这是一个典型的数据报文。
在通常情况下,第一个报文发送之后很快会收到TCP ACK报文。然而,在这个case里,第二个是重传报文。可以在Packet list面板里看到。Info栏清楚的标明“TCP Retransmission”,报文以黑色背景红色字体标出。下图是Packet List面板中的重传示例(仍然不清楚,但可参见上图):
也可以在Packet Details和Packet Bytes面板中查看来确定是否是重传报文,如下图所示:
注意此报文与源报文相同(除了IP标识和checksum字段)。要验证这一点,比较两个报文的Packet Bytes①。
在Packet Details面板,注意到重传报文在SEQ/ACK Analysis下面有些额外的信息②。这些信息是由Wireshark提供的而并非报文本身。SEQ/ACK Analysis告诉我们这确实是一个重传报文,RTO值是0.206秒,此时的RTO是基于报文1的时间增量。
检查剩下的报文会得到类似的结果,不同之处只有IP标识和checksum,以及RTO值。要使报文之间的时间间隔形象化,在Packet List面板中查看Time栏,如下图所示。这里可以看到RTO值的翻倍增长关系。
TCP重复ACK以及快速重传:
重复ACK是指在接收方收到乱序报文时,所发出的一类TCP报文。TCP使用报文头的序列号和确认号以有效保证数据按照发送的顺序接收和重组。
当TCP连接建立以后,握手过程中交换的一个最重要的信息是初始序列号(ISN)。一旦连接双方设定了ISN之后,接下来发送的报文所包含的序列号增加一个数据载荷值。
假设有个主机ISN是5000,发送500字节报文至接收方。一旦报文接收之后,接收端回复一个ACK号为5500的TCP ACK报文,基于以下公式:
Sequence Number In + Bytes of Data Received = Acknowledgment Number Out
按照上述计算结果,返回发送端的确认编号实际上是接收端希望收到的序列号。示例如下图:
数据接收方通过序列号来检查报文丢失。接收方通过追踪接收到的序列号,能够确认序列号是否乱序。当接收方收到一个不正常的序列号,它会假设传输过程中有报 文丢失。为了正确重传数据,接收方必须拥有丢失报文,所以它发送包含有丢失报文正确序列号的ACK报文,以便发送方重传此报文。
当重传主机从发送端接收到3个重复ACK时,它会假设此报文确实在传送中丢失,并且立即发送一个快速重传。一旦触发了快速重传,所有正在传输的其他报文都被放入队列中,直到快速重传报文发送为止。过程如下图所示:
承接上文的彩图:
本例中第一个报文如下图:
这是一个TCP ACK报文,从数据接收端(172.31.136.85)发给发送端(195.81.202.68)①,确认前一个报文所发送的数据。
此报文中的确认编号是1310973186②,应当是下一个接收报文的序列号,如下图所示:
不幸的是接收端的序列号是1310984130①,并不是所期望的值。这意味着报文在传送中丢失。接收端注意到报文乱序,并且在第三个报文中发送重复ACK,如下图所示:
可以通过以下两种方式之一来确认这是一个重复ACK:
在Packet Detaisl面板中的Info栏。报文呈现黑色背景红色字体。
服务端常用推送技术有:
1、客户端轮询:ajax定时拉取
2、服务端主动推送:WebSocket。全双工的,本质上是一个额外的tcp连接,建立和关闭时握手使用http协议,其他数据传输不使用http协议,更加复杂一些,适用于需要进行复杂双向数据通讯的场景。
3、服务端主动推送:SSE (Server Send Event)。html5新标准,用来从服务端实时推送数据到浏览器端,
直接建立在当前http连接上,本质上是保持一个http长连接,轻量协议简单的服务器数据推送的场景,使用服务器推送事件, SSE技术是基于单工通信模式,只是单纯的客户端向服务端发送请求,服务端不会主动发送给客户端。服务端采取的策略是抓住这个请求不放,等数据更新的时候才返回给客户端,当客户端接收到消息后,再向服务端发送请求,周而复始。
这篇文章介绍Springboot中使用SseEmitter实现消息推送。
1、服务端:
package com.iscas.biz.test.sse; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 测试SSE推送消息 * * @author zhuquanwen * @vesion 1.0 * @date 2021/9/11 21:01 * @since jdk1.8 */ @RestController @RequestMapping(path = "sse/test") public class SseControllerTest { private static Map<String, SseEmitter> sseCache = new ConcurrentHashMap<>(); @GetMapping(path = "subscribe", produces = {MediaType.TEXT_EVENT_STREAM_VALUE}) public SseEmitter push(String id) throws IOException { // 超时时间设置为3s,用于演示客户端自动重连 SseEmitter sseEmitter = new SseEmitter(30000L); // 设置前端的重试时间为1s sseEmitter.
问题描述: 前提:能通过远程软件控制服务器桌面!并操控服务器!在同一个局域网中,一台电脑能ping通服务器,但是不能ssh连接;服务器自身能ssh连接:ssh username@localhost; 解决办法: 我的解决办法是:关闭服务器防火墙
服务器为:Ubuntu系统:
查看防火墙当前状态 sudo ufw status 查看防火墙版本 sudo ufw version 开启防火墙 sudo ufw enable 关闭防火墙 sudo ufw disable 允许外部访问本机 sudo ufw default allow 拒绝外部访问主机 sudo ufw default deny 允许外部访问53端口 sudo ufw allow 53 拒绝外部访问53端口 sudo ufw deny 53 允许某个IP地址访问本机所有端口 sudo ufw allow from (IP): sudo ufw allow from 192.168.1.1 点赞,关注,收藏👍,➕,👀点赞,关注,收藏👍,➕,👀点赞,关注,收藏👍,➕,👀
💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪
注:arcgis无法联网启动
ArcGIS10联网无法启动问题解决 _json20080301-CSDN博客
(写在开始:以下为夜间灯光数据处理部分,本人非地理、测绘相关专业,因毕业设计需要灯光数据支持所以自学了处理,下面是我的学习记录和处理经验记录,仅供参考,专业的问题我也回答不了QAQ,毕设已经结束了,应该不会更深入研究。记录部分参考了很多教程,但图和过程确实是自己总结记录的,所以归入原创)
处理记录1:
一、夜间灯光数据处理
1.处理教程:3分钟搞定!ArcGIS夜间灯光数据获取下载与可视化处理 - 知乎
2.处理中需要夜间灯光数据和省市矢量边界数据,分别获取:
其中省市矢量边界下载处理:GIS全国各个省市矢量边界下载/获取/处理 - 知乎 ,下载地址:https://www.webmap.cn/commres.do?method=result100W(全国地理信息资源目录服务系统) 【p.s.:下载目的:毕业论文撰写中,夜间灯光数据处理需要地理信息中的行政区数据】
考虑京津冀协同发展趋势,此处下载数据覆盖京津冀三个省市,分别为K49,J49,K50,J50
(备用江浙沪:
)
1.2 夜间灯光数据处理方法总结+软件安装
Arcgis10.2
(P.S.本来打算安装10.4,但是装完显示出错;后面尝试安装10.2,但是无法启动服务器,后面用了10.4内破解文件的内容,弄好了)
1.3 数据导入
行政区矢量数据 :数据例如J49.pdb.zip需要先解压,然后在软件目录中连接文件夹,arcgis会将.pdb文件夹识别为数据库,将其中BOUA文件添加到图层中
1.4 数据处理
参考1:B站教程:arcgis灯光分析_哔哩哔哩_bilibili
参考2:知乎专栏:GIS全国各个省市矢量边界下载/获取/处理 - 知乎(GIS全国各个省市矢量边界下载/获取/处理)
--北京
1)行政区识别处理
由于K49缺乏BOUA文件,且影响较小,所以暂时不使用,合并 K50,J49,J50为(数据管理工具——常规——合并工具)
利用【融合】去除图中的线(数据管理工具——制图综合——融合工具进行消除)
利用【套索工具】选出北京的区,并保存到文件夹:
(也可以直接根据各区编号范围直接进行过滤)
(后更名为BeiJing)
2)将夜间灯光数据添加到图层,并进行裁切(数据管理工具-栅格-栅格处理-裁剪)
--报错999999,
①利用【要素】-【修复几何】修复BeiJing,再次尝试(失败)
②查看日志文件,【C:\Users\DELL\AppData\Roaming\ESRI\Desktop10.2\ArcToolbox\History】 ,啥也没看出来(失败)
③对北京进行投影(数据管理工具—投影和变换—栅格—投影栅格),转换将坐标系从CGCS_2000转变为1984(保存在defult.pdb/BeiJing_Project),与夜间灯光数据一致,处理后尝试裁剪(失败)
④查看官方解决方案(Arcgis报错 ERROR 999999的解决方法汇总_toto+的博客-CSDN博客 ),尝试多种解决方法,最终在将文件目录改短后(D:/clip ),成功裁剪,撒花★
3)投影夜景数据,栅格-投影栅格,保存至defult.pdb/BeiJing_clip_ProjectRaster
4)分析
--没有许可(因为破解版???)
解决:自定义-扩展模块-勾选Spatia Analyst
即可继续使用
在表格中显示分区统计(保存到defult.pdb/ZonalSt_BeiJing3),包括sum,Mean等
5)北京区之间面积相差较大,因此选用平均值绘图,并输出表格
1 空格是重复上一次命令
2 鼠标中键双击则所有的图都会显示出来能看见,如果你误操作图(放的很大或缩的很小)不知在哪里,可以用。
3 一个命令用完后可通过空格或esc结束命令。
4 F8 正交
5 F10极轴追踪
输入命令都是在英文输入状态下,没有执行任何命令才可以
6 输入e,按空格即可
7 打开图层管理 输入 la
7
模电
模拟信号:随处可见的自然信号都是模拟信号,
模拟信号在时间上和取值上都是连续的,
画出来就是一条连续的曲线,可以完全地“模拟”自然信号。
模电是指用来对模拟信号进行传输、变换、处理、放大、测量和显示等工作的电路。
模拟信号是指连续变化的电信号。
模拟电路是电子电路的基础,它主要包括放大电路、信号运算和处理电路、振荡电路、调制和解调电路及电源等。
数电
数字信号:在时间上和取值上都是不连续的。
数字信号存在“采样”,数字信号的值只能在采样点变化。
数字信号存在“量化”,数字信号的值只能取到一些不连续的固定值,
比如只能取0,1,2,3,不能取到中间的1.1,1.2,1.428571……
数字电路中使用的数字信号一般只能取0和1。
数电指的是用数字信号完成对数字量进行算术运算和逻辑运算的电路称为数字电路,或数字系统。
由于它具有逻辑运算和逻辑处理功能,所以又称数字逻辑电路。
现代的数字电路由半导体工艺制成的若干数字集成器件构造而成。
逻辑门是数字逻辑电路的基本单元。
存储器是用来存储二进制数据的数字电路。
从整体上看,数字电路可以分为组合逻辑电路和时序逻辑电路两大类。
使用、处理模拟信号的电路,就是模拟电路;
使用、处理数字信号的电路,就是数字电路。
同时处理模拟和数字信号的电路(比如数模转换器、数控振荡器),被称为数模混合电路,但是要强行二分归类的话一般归入模拟电路。
在React项目的开发中经常会遇到,保存一些当前页面的数据,
防止用户刷新导致页面出现报错或者是空白
详情页的数据,是通过列表页路由跳转传过来的id,去后台拿的数据
如果用户刷新当前页面,就会导致拿不到id,这个时候就会出现下面情况:
这个时候需要用到redux-persist,
```javascript import { createStore, combineReducers, applyMiddleware, compose } from 'redux' import reducers from './reducers' import { persistStore, persistReducer } from 'redux-persist' import storage from 'redux-persist/lib/storage' import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2' import thunk from 'redux-thunk' import { playMode } from '../common/js/config' import { loadSearch, loadPlay, loadFavorite } from '../common/js/cache' const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; //持久化配置 const persistConfig = { key: 'globalData', storage: storage, stateReconclier: autoMergeLevel2, blacklist: ['deviceData']//写在这块的数据不会存在 storage } const myPersistReducer = persistReducer(persistConfig, combineReducers(reducers)) const store = createStore( myPersistReducer, { globalBackgroundColor:'#1890ff',//全局主题色 currentDeviceId:''//当前设备Id }, composeEnhancers(applyMiddleware(thunk))) export const persistor = persistStore(store) export default store 之后改写reducer.
Emoji表情 将对应emoji表情的符号码复制后输入你的markdown文本即可显示emoji表情。
如:blush:,显示为😊
人物 syntaxpreviewsyntaxpreviewsyntaxpreview:bowtie::bowtie::smile:😄:laughing:😆:blush:😊:smiley:😃:relaxed:☺️:smirk:😏:heart_eyes:😍:kissing_heart:😘:kissing_closed_eyes:😚:flushed:😳:relieved:😌:satisfied:😆:grin:😁:wink:😉:stuck_out_tongue_winking_eye:😜:stuck_out_tongue_closed_eyes:😝:grinning:😀:kissing:😗:kissing_smiling_eyes:😙:stuck_out_tongue:😛:sleeping:😴:worried:😟:frowning:😦:anguished:😧:open_mouth:😮:grimacing:😬:confused:😕:hushed:😯:expressionless:😑:unamused:😒:sweat_smile:😅:sweat:😓:disappointed_relieved:😥:weary:😩:pensive:😔:disappointed:😞:confounded:😖:fearful:😨:cold_sweat:😰:persevere:😣:cry:😢:sob:😭:joy:😂:astonished:😲:scream:😱:neckbeard::neckbeard::tired_face:😫:angry:😠:rage:😡:triumph:😤:sleepy:😪:yum:😋:mask:😷:sunglasses:😎:dizzy_face:😵:imp:👿:smiling_imp:😈:neutral_face:😐:no_mouth:😶:innocent:😇:alien:👽:yellow_heart:💛:blue_heart:💙:purple_heart:💜:heart:❤️:green_heart:💚:broken_heart:💔:heartbeat:💓:heartpulse:💗:two_hearts:💕:revolving_hearts:💞:cupid:💘:sparkling_heart:💖:sparkles:✨:star:⭐️:star2:🌟:dizzy:💫:boom:💥:collision:💥:anger:💢:exclamation:❗️:question:❓:grey_exclamation:❕:grey_question:❔:zzz:💤:dash:💨:sweat_drops:💦:notes:🎶:musical_note:🎵:fire:🔥:hankey:💩:poop:💩::💩:+1:👍:thumbsup:👍:-1:👎:thumbsdown:👎:ok_hand:👌:punch:👊:facepunch:👊:fist:✊:v:✌️:wave:👋:hand:✋:raised_hand:✋:open_hands:👐:point_up:☝️:point_down:👇:point_left:👈:point_right:👉:raised_hands:🙌:pray:🙏:point_up_2:👆:clap:👏:muscle:💪:metal:🤘:fu:🖕:walking:🚶:runner:🏃:running:🏃:couple:👫:family:👪:two_men_holding_hands:👬:two_women_holding_hands:👭:dancer:💃:dancers:👯:ok_woman:🙆:no_good:🙅:information_desk_person:💁:raising_hand:🙋:bride_with_veil:👰:person_with_pouting_face:🙎:person_frowning:🙍:bow:🙇:couplekiss::couplekiss::couple_with_heart:💑:massage:💆:haircut:💇:nail_care:💅:boy:👦:girl:👧:woman:👩:man:👨:baby:👶:older_woman:👵:older_man:👴:person_with_blond_hair:👱:man_with_gua_pi_mao:👲:man_with_turban:👳:construction_worker:👷:cop:👮:angel:👼:princess:👸:smiley_cat:😺:smile_cat:😸:heart_eyes_cat:😻:kissing_cat:😽:smirk_cat:😼:scream_cat:🙀:crying_cat_face:😿:joy_cat:😹:pouting_cat:😾:japanese_ogre:👹:japanese_goblin:👺:see_no_evil:🙈:hear_no_evil:🙉:speak_no_evil:🙊:guardsman:💂:skull:💀:feet:🐾:lips:👄:kiss:💋:droplet:💧:ear:👂:eyes:👀:nose:👃:tongue:👅:love_letter:💌:bust_in_silhouette:👤:busts_in_silhouette:👥:speech_balloon:💬:thought_balloon:💭:feelsgood::feelsgood::finnadie::finnadie::goberserk::goberserk::godmode::godmode::hurtrealbad::hurtrealbad::rage1::rage1::rage2::rage2::rage3::rage3::rage4::rage4::suspect::suspect::trollface::trollface: 自然 syntaxpreviewsyntaxpreviewsyntaxpreview:sunny:☀️:umbrella:☔️:cloud:☁️:snowflake:❄️:snowman:⛄️:zap:⚡️:cyclone:🌀:foggy:🌁:ocean:🌊:cat:🐱:dog:🐶:mouse:🐭:hamster:🐹:rabbit:🐰:wolf:🐺:frog:🐸:tiger:🐯:koala:🐨:bear:🐻:pig:🐷:pig_nose:🐽:cow:🐮:boar:🐗:monkey_face:🐵:monkey:🐒:horse:🐴:racehorse:🐎:camel:🐫:sheep:🐑:elephant:🐘:panda_face:🐼:snake:🐍:bird:🐦:baby_chick:🐤:hatched_chick:🐥:hatching_chick:🐣:chicken:🐔:penguin:🐧:turtle:🐢:bug:🐛:honeybee:🐝:ant:🐜:beetle:🐞:snail:🐌:octopus:🐙:tropical_fish:🐠:fish:🐟:whale:🐳:whale2:🐋:dolphin:🐬:cow2:🐄:ram:🐏:rat:🐀:water_buffalo:🐃:tiger2:🐅:rabbit2:🐇:dragon:🐉:goat:🐐:rooster:🐓:dog2:🐕:pig2:🐖:mouse2:🐁:ox:🐂:dragon_face:🐲:blowfish:🐡:crocodile:🐊:dromedary_camel:🐪:leopard:🐆:cat2:🐈:poodle:🐩:paw_prints:🐾:bouquet:💐:cherry_blossom:🌸:tulip:🌷:four_leaf_clover:🍀:rose:🌹:sunflower:🌻:hibiscus:🌺:maple_leaf:🍁:leaves:🍃:fallen_leaf:🍂:herb:🌿:mushroom:🍄:cactus:🌵:palm_tree:🌴:evergreen_tree:🌲:deciduous_tree:🌳:chestnut:🌰:seedling:🌱:blossom:🌼:ear_of_rice:🌾:shell:🐚:globe_with_meridians:🌐:sun_with_face:🌞:full_moon_with_face:🌝:new_moon_with_face:🌚:new_moon:🌑:waxing_crescent_moon:🌒:first_quarter_moon:🌓:full_moon:🌕:waning_gibbous_moon:🌖:last_quarter_moon:🌗:waning_crescent_moon:🌘:last_quarter_moon_with_face:🌜:first_quarter_moon_with_face:🌛:moon:🌔:earth_africa:🌍:earth_americas:🌎:earth_asia:🌏:volcano:🌋:milky_way:🌌:partly_sunny:⛅️:octocat::octocat::squirrel::squirrel::waxing_gibbous_moon:🌔 物体 syntaxpreviewsyntaxpreviewsyntaxpreview:bamboo:🎍:gift_heart:💝:dolls:🎎:school_satchel:🎒:mortar_board:🎓:flags:🎏:fireworks:🎆:sparkler:🎇:wind_chime:🎐:rice_scene:🎑:jack_o_lantern:🎃:ghost:👻:santa:🎅:christmas_tree:🎄:gift:🎁:bell:🔔:no_bell:🔕:tanabata_tree:🎋:tada:🎉:confetti_ball:🎊:balloon:🎈:crystal_ball:🔮:cd:💿:dvd:📀:floppy_disk:💾:camera:📷:video_camera:📹:movie_camera:🎥:computer:💻:tv:📺:iphone:📱:phone:☎️:telephone:☎️:telephone_receiver:📞:pager:📟:fax:📠:minidisc:💽:vhs:📼:sound:🔉:speaker:🔈:mute:🔇:loudspeaker:📢:mega:📣:hourglass:⌛️:hourglass_flowing_sand:⏳:alarm_clock:⏰:watch:⌚️:radio:📻:satellite:📡:loop:➿:mag:🔍:mag_right:🔎:unlock:🔓:lock:🔒:lock_with_ink_pen:🔏:closed_lock_with_key:🔐:key:🔑:bulb:💡:flashlight:🔦:high_brightness:🔆:low_brightness:🔅:electric_plug:🔌:battery:🔋:calling:📲:email:✉️:mailbox:📫:postbox:📮:bath:🛀:bathtub:🛁:shower:🚿:toilet:🚽:wrench:🔧:nut_and_bolt:🔩:hammer:🔨:seat:💺:moneybag:💰:yen:💴:dollar:💵:pound:💷:euro:💶:credit_card:💳:money_with_wings:💸:e-mail:📧:inbox_tray:📥:outbox_tray:📤:envelope:✉️:incoming_envelope:📨:postal_horn:📯:mailbox_closed:📪:mailbox_with_mail:📬:mailbox_with_no_mail:📭:door:🚪:smoking:🚬:bomb:💣:gun:🔫:hocho:🔪:pill:💊:syringe:💉:page_facing_up:📄:page_with_curl:📃:bookmark_tabs:📑:bar_chart:📊:chart_with_upwards_trend:📈:chart_with_downwards_trend:📉:scroll:📜:clipboard:📋:calendar:📆:date:📅:card_index:📇:file_folder:📁:open_file_folder:📂:scissors:✂️:pushpin:📌:paperclip:📎:black_nib:✒️:pencil2:✏️:straight_ruler:📏:triangular_ruler:📐:closed_book:📕:green_book:📗:blue_book:📘:orange_book:📙:notebook:📓:notebook_with_decorative_cover:📔:ledger:📒:books:📚:bookmark:🔖:microscope:🔬:telescope:🔭:name_badge:📛:newspaper:📰:football:🏈:basketball:🏀:soccer:⚽️:baseball:⚾️:tennis:🎾:8ball:🎱:rugby_football:🏉:bowling:🎳:golf:⛳️:mountain_bicyclist:🚵:bicyclist:🚴:horse_racing:🏇:snowboarder:🏂:swimmer:🏊:surfer:🏄:ski:🎿:spades:♠️:hearts:♥️:clubs:♣️:diamonds:♦️:gem:💎:ring:💍:trophy:🏆:musical_score:🎼:musical_keyboard:🎹:violin:🎻:space_invader:👾:video_game:🎮:black_joker:🃏:flower_playing_cards:🎴:game_die:🎲:dart:🎯:mahjong:🀄️:clapper:🎬:memo:📝:pencil:📝:book:📖:art:🎨:microphone:🎤:headphones:🎧:trumpet:🎺:saxophone:🎷:guitar:🎸:shoe:👞:sandal:👡:high_heel:👠:lipstick:💄:boot:👢:shirt:👕:tshirt:👕:necktie:👔:womans_clothes:👚:dress:👗:running_shirt_with_sash:🎽:jeans:👖:kimono:👘:bikini:👙:ribbon:🎀:tophat:🎩:crown:👑:womans_hat:👒:mans_shoe:👞:closed_umbrella:🌂:briefcase:💼:handbag:👜:pouch:👝:purse:👛:eyeglasses:👓:fishing_pole_and_fish:🎣:coffee:☕️:tea:🍵:sake:🍶:baby_bottle:🍼:beer:🍺:beers:🍻:cocktail:🍸:tropical_drink:🍹:wine_glass:🍷:fork_and_knife:🍴:pizza:🍕:hamburger:🍔:fries:🍟:poultry_leg:🍗:meat_on_bone:🍖:spaghetti:🍝:curry:🍛:fried_shrimp:🍤:bento:🍱:sushi:🍣:fish_cake:🍥:rice_ball:🍙:rice_cracker:🍘:rice:🍚:ramen:🍜:stew:🍲:oden:🍢:dango:🍡:egg:🥚:bread:🍞:doughnut:🍩:custard:🍮:icecream:🍦:ice_cream:🍨:shaved_ice:🍧:birthday:🎂:cake:🍰:cookie:🍪:chocolate_bar:🍫:candy:🍬:lollipop:🍭:honey_pot:🍯:apple:🍎:green_apple:🍏:tangerine:🍊:lemon:🍋:cherries:🍒:grapes:🍇:watermelon:🍉:strawberry:🍓:peach:🍑:melon:🍈:banana:🍌:pear:🍐:pineapple:🍍:sweet_potato:🍠:eggplant:🍆:tomato:🍅:corn:🌽 地点 syntaxpreviewsyntaxpreviewsyntaxpreview:house:🏠:house_with_garden:🏡:school:🏫:office:🏢:post_office:🏣:hospital:🏥:bank:🏦:convenience_store:🏪:love_hotel:🏩:hotel:🏨:wedding:💒:church:⛪️:department_store:🏬:european_post_office:🏤:city_sunrise:🌇:city_sunset:🌆:japanese_castle:🏯:european_castle:🏰:tent:⛺️:factory:🏭:tokyo_tower:🗼:japan:🗾:mount_fuji:🗻:sunrise_over_mountains:🌄:sunrise:🌅:stars:🌠:statue_of_liberty:🗽:bridge_at_night:🌉:carousel_horse:🎠:rainbow:🌈:ferris_wheel:🎡:fountain:⛲️:roller_coaster:🎢:ship:🚢:speedboat:🚤:boat:⛵️:sailboat:⛵️:rowboat:🚣:anchor:⚓️:rocket:🚀:airplane:✈️:helicopter:🚁:steam_locomotive:🚂:tram:🚊:mountain_railway:🚞:bike:🚲:aerial_tramway:🚡:suspension_railway:🚟:mountain_cableway:🚠:tractor:🚜:blue_car:🚙:oncoming_automobile:🚘:car:🚗:red_car:🚗:taxi:🚕:oncoming_taxi:🚖:articulated_lorry:🚛:bus:🚌:oncoming_bus:🚍:rotating_light:🚨:police_car:🚓:oncoming_police_car:🚔:fire_engine:🚒:ambulance:🚑:minibus:🚐:truck:🚚:train:🚋:station:🚉:train2:🚆:bullettrain_front:🚅:bullettrain_side:🚄:light_rail:🚈:monorail:🚝:railway_car:🚃:trolleybus:🚎:ticket:🎫:fuelpump:⛽️:vertical_traffic_light:🚦:traffic_light:🚥:warning:⚠️:construction:🚧:beginner:🔰:atm:🏧:slot_machine:🎰:busstop:🚏:barber:💈:hotsprings:♨️:checkered_flag:🏁:crossed_flags:🎌:izakaya_lantern:🏮:moyai:🗿:circus_tent:🎪:performing_arts:🎭:round_pushpin:📍:triangular_flag_on_post:🚩:jp:🇯🇵:kr:🇰🇷:cn:🇨🇳:us:🇺🇸:fr:🇫🇷:es:🇪🇸:it:🇮🇹:ru:🇷🇺:gb:🇬🇧:uk:🇬🇧:de:🇩🇪 符号 syntaxpreviewsyntaxpreviewsyntaxpreview:one:1️⃣:two:2️⃣:three:3️⃣:four:4️⃣:five:5️⃣:six:6️⃣:seven:7️⃣:eight:8️⃣:nine:9️⃣:keycap_ten:🔟:1234:🔢:zero:0️⃣:hash:#️⃣:symbols:🔣:arrow_backward:◀️:arrow_down:⬇️:arrow_forward:▶️:arrow_left:⬅️:capital_abcd:🔠:abcd:🔡:abc:🔤:arrow_lower_left:↙️:arrow_lower_right:↘️:arrow_right:➡️:arrow_up:⬆️:arrow_upper_left:↖️:arrow_upper_right:↗️:arrow_double_down:⏬:arrow_double_up:⏫:arrow_down_small:🔽:arrow_heading_down:⤵️:arrow_heading_up:⤴️:leftwards_arrow_with_hook:↩️:arrow_right_hook:↪️:left_right_arrow:↔️:arrow_up_down:↕️:arrow_up_small:🔼:arrows_clockwise:🔃:arrows_counterclockwise:🔄:rewind:⏪:fast_forward:⏩:information_source:ℹ️:ok:🆗:twisted_rightwards_arrows:🔀:repeat:🔁:repeat_one:🔂:new:🆕:top:🔝:up:🆙:cool:🆒:free:🆓:ng:🆖:cinema:🎦:koko:🈁:signal_strength:📶:u5272::u5272::u5408::u5408::u55b6::u55b6::u6307::u6307::u6708::u6708::u6709::u6709::u6e80:🈵:u7121::u7121::u7533::u7533::u7a7a::u7a7a::u7981::u7981::sa:🈂️:restroom:🚻:mens:🚹:womens:🚺:baby_symbol:🚼:no_smoking:🚭:parking:🅿️:wheelchair:♿️:metro:🚇:baggage_claim:🛄:accept:🉑:wc:🚾:potable_water:🚰:put_litter_in_its_place:🚮:secret:㊙️:congratulations:㊗️:m:Ⓜ️:passport_control:🛂:left_luggage:🛅:customs:🛃:ideograph_advantage:🉐:cl:🆑:sos:🆘:id:🆔:no_entry_sign:🚫:underage:🔞:no_mobile_phones:📵:do_not_litter:🚯:non-potable_water:🚱:no_bicycles:🚳:no_pedestrians:🚷:children_crossing:🚸:no_entry:⛔️:eight_spoked_asterisk:✳️:eight_pointed_black_star:✴️:heart_decoration:💟:vs:🆚:vibration_mode:📳:mobile_phone_off:📴:chart:💹:currency_exchange:💱:aries:♈️:taurus:♉️:gemini:♊️:cancer:♋️:leo:♌️:virgo:♍️:libra:♎️:scorpius:♏️:sagittarius:♐️:capricorn:♑️:aquarius:♒️:pisces:♓️:ophiuchus:⛎:six_pointed_star:🔯:negative_squared_cross_mark:❎:a:🅰️:b:🅱️:ab:🆎:o2:🅾️:diamond_shape_with_a_dot_inside:💠:recycle:♻️:end:🔚:on:🔛:soon:🔜:clock1:🕐:clock130:🕜:clock10:🕙:clock1030:🕥:clock11:🕚:clock1130:🕦:clock12:🕛:clock1230:🕧:clock2:🕑:clock230:🕝:clock3:🕒:clock330:🕞:clock4:🕓:clock430:🕟:clock5:🕔:clock530:🕠:clock6:🕕:clock630:🕡:clock7:🕖:clock730:🕢:clock8:🕗:clock830:🕣:clock9:🕘:clock930:🕤:heavy_dollar_sign:💲:copyright:©️:registered:®️:tm:™️:x:❌:heavy_exclamation_mark:❗️:bangbang:‼️:interrobang:⁉️:o:⭕️:heavy_multiplication_x:✖️:heavy_plus_sign:➕:heavy_minus_sign:➖:heavy_division_sign:➗:white_flower:💮:100:💯:heavy_check_mark:✔️:ballot_box_with_check:☑️:radio_button:🔘:link:🔗:curly_loop:➰:wavy_dash:〰️:part_alternation_mark:〽️:trident:🔱:black_large_square:⬛️:white_large_square:⬜️:white_check_mark:✅:white_square_button:🔳:black_square_button:🔲:black_circle:⚫️:white_circle:⚪️:red_circle:🔴:large_blue_circle:🔵:large_blue_diamond:🔷:large_orange_diamond:🔶:small_blue_diamond:🔹:small_orange_diamond:🔸:small_red_triangle:🔺:small_red_triangle_down:🔻:shipit::shipit:
错误信息:
[root@m1 ~]# ntpdate time.windows.com 8 Sep 15:11:43 ntpdate[12534]: no server suitable for synchronization found 解决办法:
[root@n2 ~]# vim /etc/hosts 最后添加: 168.61.215.74 time.windows.com 注意:这个地址可能会变,如果这个地址不行的话,就到宝藏网站输入:time.windows.com,查看其对应的ip地址,进行替换就好了。
修改后:
[root@m1 ~]# ntpdate time.windows.com 8 Sep 15:12:37 ntpdate[12761]: adjust time server 168.61.215.74 offset -0.004850 sec
使用补空法创建了一棵二叉树,并且实现了先序遍历、中序遍历、后序遍历、层次遍历功能。
1、定义结点类:
要创建二叉树首先要定义二叉树的结点类,二叉树上每一个结点有3个成员变量,一个存放当前结点的值,其余两个是指针类型,分别指向此节点的左孩子和右孩子;
class Node { public: char data; Node* lchild; //指向左孩子 Node* rchild; //指向右孩子 }; using Tree = Node*; 2、使用补空法创建二叉树
补空法是指:如果结点没有孩子,在写遍历序列时,在其孩子的位置补‘#’(也可是别的有特殊定义的字符)。
使用先序序列创建二叉树时,先判断字符是否为'#':如果是,说明此处没有结点,指针空指;如果不是,说明有结点,先动态创建一个新结点,给数据域赋值,然后递归创建左子树、递归创建右子树。
void CreateTree(Tree& t) { char c; cin >> c; if (c == '#') { t = nullptr; //没有结点就空指 } else //创建新结点 { t = new Node; t->data = c; CreateTree(t->lchild); CreateTree(t->rchild); } } 3、先序遍历
非常简单,分为三步:打印当前结点数据、递归左孩子、递归右孩子(根左右)
递归前要确保左|右孩子存在(左|右孩子的指针不空)
void DLR(const Tree& t) { cout << t->data << " "
题解:
C++
class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.size()<2) return nums.size(); int j=0; for(int i=1;i<nums.size();i++) { if(nums[i]!=nums[j]) nums[++j]=nums[i]; } return ++j ; } }; 通过循环,把与之前不同的换到前面去,相同的不做改变,这样后面的不同的数字就能将前面相同的数字覆盖住。可以换一种思考方法。与其找相同的数字把它删掉,不如把不同的数字找出来换到前面来替换向相同的。就需要一个标记位,用来标定换到哪。++j来进行移动和标记。
###
i++与++i的区别:
i++是先将i存入堆栈,在对i+1。
++i是先对i+1再将结果存入堆栈!
如果有兴趣了解更多相关知识,可以来我的个人博客看看:eyes++的个人空间
零:Tomcat的介绍 Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为10.0.5。
一:下载Tomcat 首先前往官网:tomcat下载
我这里是下载了Tomcat9,点进Tomcat9,我使用的是64位绿色版。
二:安装Tomcat 因为我是下载了绿色版的,直接解压就行。
目录介绍:
bin 专门用来存放Tomcat服务器的可执行程序 conf 专门用来存放Tomcat服务器的配置文件 lib 专门用来存放Tomcat服务器的jar包 logs 专门用来存放Tomcat服务器的运行时输出的日记信息 temp 专门用来存放Tomcat服务器运行时产生的临时数据 webapps 专门用来存放部署的Web工程 work 是Tomcat工作时的目录,用来存放Tomcat运行时jsp翻译为Servlet的源码,和Session钝化的目录 三:启动Tomcat服务器 找到Tomcat目录下的bin目录下的startup.bat文件,双击启动。
发现出现了乱码,这时候可以在配置文件修改编码方式。打开conf文件夹下的logging.properties文件,找到java.util.logging.ConsoleHandler.encoding = UTF-8,将UTF-8改为GBK
然后保存修改,重启服务器就好了:
如果点击startup.bat时黑窗一闪而过,那就是因为没有配置好JAVA_HOME环境变量,JAVA_HOME时JDK的安装目录。
除了双击startup.bat启动,还可以用命令行的方式启动,命令行进入Tomcat的bin目录:输入命令catalina run
四:停止Tomcat服务器 直接关闭tomcat窗口使用快捷键ctrl+c找到Tomcat的bin目录下的shutdown.bat,双击停止服务器(该方法为主要方法) 五:修改Tomcat的端口号 Tomcat默认端口号是8080,但8080端口是被用于WWW代理服务的,可以实现网页浏览,Vue项目的预览就是开启8080端口,因此该端口经常被占用,因此通常都需要修改端口号。
端口号范围是1-65535,1000以内的端口号是系统使用的,修改端口尽量不要使用1000以内的,但是我老师要求修改为端口号为88。修改前还可以看看端口占用情况,打开命令提示符,输入netstat -ano。
现在来修改Tomcat端口号,找到Tomcat目录下的conf目录,找到server.xml并打开,找到Connector标签修改端口号。
修改完端口号后需要重启才能生效,成功后效果如下:
六:在idea中整合Tomcat 打开idea的设置,打开应用程序服务器,点击加号添加:
pt-osc无论是什么DDL SQL,都会新建新表来替换,不分DDL类型,但是执行期间允许DDL操作,而ONLINE DDL则分为了好几类DDL,有的DDL仅需修改元数据,有的DDL仅需在本身ibd文件上新建索引页,有的需要rebuild table,这三种类型执行期间支持DML操作,但是COPY TABLE 类型不支持DML操作。
如果MySQL版本是5.6之前,不支持online ddl操作的,pt-online-schema-change是一个非常好的选择;
如果MySQL的版本是5.6以上的,支持online-ddl的,优先考虑使用online ddl,但是如果是ddl SQL 在online DDL中 需要copy table to tmp table,则建议使用pt-online-schema-change来处理,比如修改列数据类型的DDL,online DDL则是需要copy table to tmp table,期间仅支持查询,不支持DML操作,这个时候,就可以使用pt-online-schema-change来处理,因为它也是拷贝临时表格,并且执行期间支持DML操作;
如果执行Online DDL,但是对从库的延迟非常敏感,针对需要copy table 跟rebuild table这两类DDL SQL,需要考虑是否可以在从库设置并行复制,如果不行,则优先选择pt-online-schema-change。
ALTER TABLE tbl_name DROP PRIMARY KEY, ALGORITHM=COPY; ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY; #修改数据类型 ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE; #只支持修改varchar(255) ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY; ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY; ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE; screen pt-online-schema-change --user=root --password=123456 --host=192.
什么是“云原生”?云原生该怎么落地?
什么是“云原生”?云原生该怎么落地?
云原生的四要素
微服务:几乎每个云原生的定义都包含微服务,跟微服务相对的是单体应用,微服务有理论基础,那就是康威定律,指导服务怎么切分,很玄乎,凡是能称为理论定律的都简单明白不了,不然就忒没b格,大概意思是组织架构决定产品形态,不知道跟马克思的生产关系影响生产力有无关系。
微服务架构的好处就是按function切了之后,服务解耦,内聚更强,变更更易;另一个划分服务的技巧据说是依据DDD来搞。
容器化:Docker是应用最为广泛的容器引擎,在思科谷歌等公司的基础设施中大量使用,是基于LXC技术搞的,容器化为微服务提供实施保障,起到应用隔离作用,K8S是容器编排系统,用于容器管理,容器间的负载均衡,谷歌搞的,Docker和K8S都采用Go编写,都是好东西。
DevOps:这是个组合词,Dev+Ops,就是开发和运维合体,不像开发和产品,经常刀刃相见,实际上DevOps应该还包括测试,DevOps是一个敏捷思维,是一个沟通文化,也是组织形式,为云原生提供持续交付能力。
持续交付:持续交付是不误时开发,不停机更新,小步快跑,反传统瀑布式开发模型,这要求开发版本和稳定版本并存,其实需要很多流程和工具支撑。
云原生的定义
很多人都会问“到底什么是云原生?”
实际上,云原生是一条最佳路径或者最佳实践。更详细的说,云原生为用户指定了一条低心智负担的、敏捷的、能够以可扩展、可复制的方式最大化地利用云的能力、发挥云的价值的最佳路径。
因此,云原生其实是一套指导进行软件架构设计的思想。按照这样的思想而设计出来的软件:首先,天然就“生在云上,长在云上”;其次,能够最大化地发挥云的能力,使得我们开发的软件和“云”能够天然地集成在一起,发挥出“云”的最大价值。
所以,云原生的最大价值和愿景,就是认为未来的软件,会从诞生起就生长在云上,并且遵循一种新的软件开发、发布和运维模式,从而使得软件能够最大化地发挥云的能力。说到了这里,大家可以思考一下为什么容器技术具有革命性?
其实,容器技术和集装箱技术的革命性非常类似,即:容器技术使得应用具有了一种“自包含”的定义方式。所以,这样的应用才能以敏捷的、以可扩展可复制的方式发布在云上,发挥出云的能力。这也就是容器技术对云发挥出的革命性影响所在,所以说,容器技术正是云原生技术的核心底盘。
云原生的技术范畴
云原生的技术范畴包括了以下几个方面:
第一部分是云应用定义与开发流程。这包括应用定义与镜像制作、配置 CI/CD、消息和 Streaming 以及数据库等。
第二部分是云应用的编排与管理流程。这也是 Kubernetes 比较关注的一部分,包括了应用编排与调度、服务发现治理、远程调用、API 网关以及 Service Mesh。
第三部分是监控与可观测性。这部分所强调的是云上应用如何进行监控、日志收集、Tracing 以及在云上如何实现破坏性测试,也就是混沌工程的概念。
第四部分就是云原生的底层技术,比如容器运行时、云原生存储技术、云原生网络技术等。
第五部分是云原生工具集,在前面的这些核心技术点之上,还有很多配套的生态或者周边的工具需要使用,比如流程自动化与配置管理、容器镜像仓库、云原生安全技术以及云端密码管理等。
最后则是 Serverless。Serverless 是一种 PaaS 的特殊形态,它定义了一种更为“极端抽象”的应用编写方式,包含了 FaaS 和 BaaS 这样的概念。而无论是 FaaS 还是 BaaS,其最为典型的特点就是按实际使用计费(Pay as you go),因此 Serverless 计费也是重要的知识和概念。
云原生思想的两个理论
在了解完云原生的技术范畴之后你就会发现,其所包含的技术内容还是很多的,但是这些内容的技术本质却是类似的。云原生技术的本质是两个理论基础。
第一个理论基础是:不可变基础设施。这一点目前是通过容器镜像来实现的,其含义就是应用的基础设施应该是不可变的,是一个自包含、自描述可以完全在不同环境中迁移的东西;
第二个理论基础就是:云应用编排理论。当前的实现方式就是 Google 所提出来的“容器设计模式”,这也是本系列课程中的 Kubernetes 部分所需主要讲解的内容。
基础设施向云演进的过程
首先为大家介绍一下“不可变基础设施”的概念。其实,应用所依赖的基础设施也在经历一个向云演进的过程,举例而言,对于传统的应用基础设施而言,其实往往是可变的。
大家可能经常会干这样一件事情,比如需要发布或者更新一个软件,那么流程大致是这样的,先通过 SSH 连到服务器,然后手动升级或者降级软件包,逐个调整服务器上的配置文件,并且将新代码直接都部署到现有服务器上。因此,这套基础设施会不断地被调整和修改。
但是在云上,对“云”友好的应用基础设施是不可变的。
这种场景下的上述更新过程会这么做:一旦应用部署完成之后,那么这套应用基础设施就不会再修改了。如果需要更新,那么需要现更改公共镜像来构建新服务直接替换旧服务。而我们之所以能够实现直接替换,就是因为容器提供了自包含的环境(包含应用运行所需的所有依赖)。所以对于应用而言,完全不需要关心容器发生了什么变化,只需要把容器镜像本身修改掉就可以了。因此,对于云友好的基础设施是随时可以替换和更换的,这就是因为容器具有敏捷和一致性的能力,也就是云时代的应用基础设施。
所以,总结而言,云时代的基础设施就像是可以替代的“牲口”,可以随时替换;而传统的基础设施则是独一无二的“宠物”,需要细心呵护,这就体现出了云时代不可变基础设施的优点。
基础设施向云演进的意义
所以,像这样的基础设施向“不可变”演进的过程,为我们提供了两个非常重要的优点。
1、基础设施的一致性和可靠性。同样一个镜像,无论是在美国打开,在中国打开,还是在印度打开都是一样的。并且其中的 OS 环境对于应用而言都是一致的。而对于应用而言,它就不需要关心容器跑在哪里,这就是基础设施一致性非常重要的一个特征。
2、这样的镜像本身就是自包含的,其包含了应用运行所需要的所有依赖,因此也可以漂移到云上的任何一个位置。
https://blog.csdn.net/baodewang/article/details/106837119
https://www.ilovematlab.cn/forum.php?mod=viewthread&tid=32794
https://ww2.mathworks.cn/help/stateflow/ug/using-output-events-to-activate-a-simulink-block.html
一、问题背景: 每天发送各个部门的财报到邮件. 由于部门较多,且数据量较大,导致单纯的表格模式数字量太多. 影响观看,且不易发现问题,分析数据。 二、项目初审,项目技术选型 1、后端做定时任务调度 2、后端提供明细数据接口 3、前端做数据页面展示 4、使用PhantomJS 实现网页截图功能 5、图片以对象存储的形势保存 6、定时任务推送数据 三、项目涉及的技术解决方案 1、PhantomJS 官网链接:https://www.cnblogs.com/bangejingting/p/6907628.html 1.1、phantomjs的安装 安装目录放在data目录下
$ cd /data/
远程下载
$ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
解压tar.bz2文件
$ tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
$ cd phantomjs-2.1.1-linux-x86_64/bin/
对可执行文件进行web用户授权
$ chown -R web:web bin/
将该脚本命令作为全局脚本
$ cp phantomjs /bin/
1.2、phantomjs的使用 调用脚本 参数为执行的js脚本文件 $ phantomjs --web-security=no xxx.js htmlPath imgPath 说明: --web-security=no // 解决跨域问题 xxx.js // 需要执行的脚本 htmlPath // 需要生成的网页地址, 可以是绝对路径下的html /data/html/index.html imgPath // 生成的图片地址及图片名称 /data/img/xxx.jpg xxx.js样例: var page = require('webpage').