【开发工具 swagger】五分钟教你学会swagger

RECOMMEND

概述: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 Docker的应用场景 - Web 应用的自动化打包和发布。 - 自动化测试和持续集成、发布。 - 在服务型环境中部署和调整数据库或其他的后台应用。 - 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 docker能为我们带来什么? 今天开发应用程序所需要的不仅仅是编写代码。在每个生命周期阶段,工具之间的多种语言,框架,体系结构以及不连续的接口都会带来极大的复杂性。Docker简化并加速了您的工作流程,同时使开发人员可以自由选择每个项目的工具,应用程序堆栈和部署环境进行创新。 不论是Windows还是Linux的Docker容器均受Docker工具和API支持,可帮助您构建更好的软件: - 更快地上板,并避免浪费时间尝试建立开发环境,启动新实例并制作生产代码副本以在本地运行。 - 启用多语言开发并使用任何语言,堆栈或工具,而无需担心应用程序冲突。 - 通过将应用程序,配置和依赖项打包到一个隔离的容器中,消除了环境不一致和“在我的机器上工作”的问题。 - 减轻对应用程序安全性的担忧 ![](https://img-blog.csdnimg.cn/20200324125117888.png) 壹:docker安装 docker的安装其实非常简单,只需要下载他的安装包就能使用,但对于windows家庭版就不那么友好了,由于不支持Hyper-V,windows家庭版有两个选择:1、使用 docker toolbox来安装,非常简单,直接点下一步直到完成即可。本着不折腾不程序员的原则,显然我是会选择第二种。这才有了这篇教程。 如果你是windows专业版,企业版或教育版,请跳过第一步以及第三步。 一:使用docker toolbox安装 [传送门](http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/) 过程很简单,选择相应版本安装即可,反正我也没试过,略略略。 ![](https://img-blog.csdnimg.cn/20200324114721867.png) 二:非docker toolbox安装 1、开启Hyper-V 新建.cmd文件,是用管理员身份运行,运行后重启电脑。 ``` pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i" del hyper-v.txt Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL ``` 2、打开Hyper-V功能 打开你的控制面板,找到如下,勾选上Hyper-V功能功能模块。 ![](https://img-blog.csdnimg.cn/20200324114054396.png) 3、伪装成专业版 打开注册表,找到`HKEY_LOCAL_MACHINE\software\Microsoft\Windows NT\CurrentVersion`,点击CurrentVersion,在右侧找到EditionID,右键点击EditionID选择“修改“,在弹出的对话框中将第二项”数值数据“的内容改为Professional。 这里请注意,**请不要改你注册表里的其他东西,很有可能会造成系统崩溃**,改了这个没关系,只是骗骗系统,并且,它的值会在你下一次重启时修改回来,也不会影响你使用docker。 ![](https://img-blog.csdnimg.cn/2020032411440223.png) 4、安装docker 安装地址:[传送门](https://hub.docker.com/editions/community/docker-ce-desktop-windows) 点击`get docker`,即可下载,下载完成后直接安装即可。 ![](https://img-blog.csdnimg.cn/20200324115215686.png) 贰:安装kitematic Kitematic是一个 Docker GUI 工具,它可以更快速、更简单的运行Docker容器,虽然说我们安装的docker有简单的图形可视化,但Kitematic使用起来使一切变得更加的方便。 当然,你也可以选择不安装这个软件,使用起来也是没问题的。 1、下载软件 [传送门](https://github.com/docker/kitematic/releases) ![](https://img-blog.csdnimg.cn/20200324115442963.png) 2、安装 他的安装很简单,你只需要把他解压到docker安装目录的同级目录即可。 ![](https://img-blog.csdnimg.cn/20200324115633412.png) 叁:配置docker docker其实不需要配置什么,唯一需要配置的就是他的镜像源和他的环境变量,因为它默认使用国外的镜像源,下载起来非常的慢,所以我们只需要配置国内的镜像源就可以愉快的玩耍了。 1、环境变量:在他安装的时候就自动配置好了,如果没有配置,就把他的`C:\Program Files\Docker\Docker\resources\bin`与`C:\ProgramData\DockerDesktop\version-bin`配置到path下即可,路径根据自己的来。 2、配置镜像源:打开docker,看到如下,输入`registry-mirrors`的参数,你可以选择其一: - Docker官方提供的中国镜像库:https://registry.docker-cn.com - 七牛云加速器:https://reg-mirror.qiniu.com - 中国科学技术大学:https://docker.mirrors.ustc.edu.cn ![](https://img-blog.csdnimg.cn/20200324120334715.png) 肆:docker初体验 一:创建容器方法一 以安装`rabbitmq`为例,如果你要安装任何的镜像,可以到docker的官方仓库搜索:[传送门](https://registry.hub.docker.com/) - 1、搜索镜像 使用仓库,搜索到的结果,Description一般会描述这个镜像,并且告诉你怎么启动它,tags就是这个软件所有版本的镜像,你只要找到你需要的版本就行了,右边的命令就是你下载镜像的命令,你只需要在命令行中输入即可。 ![](https://img-blog.csdnimg.cn/20200324121057171.png) 除此之外你可以使用命令行搜索,命令:`docker search rabbitmq`,其中official就是标志是否为官方版本,推荐使用官方的版本。 ![](https://img-blog.csdnimg.cn/20200324122002877.png) - 2、下载: 我需要的是rabbitmq:3.7-management-alpine,所以我的命令是: ``` docker pull rabbitmq:3.7-management-alpine ``` - 3、启动 启动之前,使用docker images查看abbitmq的images id ``` docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq {上面查看的images id} -p为端口映射,容器端口映射到主机端口 -name为你的容器名称 -d为后台运行 ``` - 4、查看启动 ``` docker ps ``` - 5、相关命令: ``` 1、查看所有镜像 docker images 2、查看正在运行的容器 docker ps 3、查看所有容器 docker ps -a 4、运行已存在的容器 docker start {id} 5、停止已存在的容器 docker stop {id} 6、删除容器 (必须先停止容器) docker rm {容器id} 7、删除镜像 docker rmi {镜像id} 8、进入容器,推荐使用 docker exec -it {容器id} /bin/bash 9、进入容器 docker attach {容器id} 10、查看容器ip: docker inspect --format='{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) ``` 注:进入容器的后一种相对于前一种有着明显的缺陷:当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。 二:创建容器方法二 第二种方法就是使用kitematic来安装,使用kitematic安装变得非常简单,kitematic官方文档:[传送门](https://docs.docker.com/kitematic/userguide/) 打开软件,搜索相关镜像点击create即可。 ![](https://img-blog.csdnimg.cn/20200324122953831.png) 除了安装容器之外,我们可以使用他来管理我们的容器例如停止、重启、进入容器等操作以及容器相关的一些设置等,并且,你可以在这里看到你的容器的日志。 ![](https://img-blog.csdnimg.cn/20200324122925484.png) 作者有话 对我而言,作为学生,docker给我带来的最大的感受就是方便、快捷,节省了我电脑资源的开销以及跨平台可移植性,这无疑就是与dcoker采用的虚拟技术有关,以前安装一个应用需要去找安装包,安装、配置环境等等一系列操作,并且这个软件不管你是否用不用,都会占用你的一部分内存,自从我用了docker之后,所有的操作变得非常简单,简单到我只用cmd的几行命令就能轻松的使用。 至于他的平台可移植性,你在windows上的使用过的所有镜像、容器以及数据,他都能移植到linux等其他平台上,在重装系统后,相信大部分人都要安装自己所需要的软件、库等,而我只需要将docker的镜像复制过来,那么我又能拥有之前的数据了,并且,docker还提供了免费的仓库,供你去使用,你可以把自己的镜像、容器上传到你自己的仓库,等你使用的时候再去下载就可以使用了。 并且,在我使用的几个开发软件上都提供了docker的接口,你只需要简单的配置,就可以是你的开发工具连接到你的docker容器。 总的来说,docker绝对是值得学习的。
2020-03-24
概述 相信所有人包括程序员都离不开浏览器,而作为猿来说,谷歌浏览器是我们必不可少的工具,开发调试,查找资料都离不开他,所以说浏览器也是一款开发工具也不为过。 ![](https://img-blog.csdnimg.cn/20200322142629494.png) 浏览器经过过多年的发展,诞生了无数浏览器拓展程序,也就是插件,因为插件,我们使用浏览器变得更加便捷、实用。接下来,我将为大家介绍几款优秀的浏览器插件。 壹:插件安装 插件的安装分为两种,一种时从应用商店直接安装,还有一种就是下载,然后在安装到浏览器中。个人推荐第一种,因为官方的安全还快捷。 一:应用商店安装 进入商店,搜索相关插件,点击添加到chrome -> 确认添加拓展程序,然后他就会下载好自动安装,简直简单到不能简单到再简单了。 **注:**该方法需要梯子,后面会介绍一种,安装谷歌访问助手插件就可以。 ![](https://img-blog.csdnimg.cn/20200322162835163.png) 二:本地安装 第一步:首先在商店下载 ![](https://img-blog.csdnimg.cn/20200322161347990.png) 第二步:打开浏览器 -> 更多工具 -> 拓展程序 -> 打开开发者模式 -> 解压刚刚下载的插件 -> 拖至浏览器空白处 注意是crx后缀的文件。 ![](https://img-blog.csdnimg.cn/20200322161939244.png) 第三步:确认添加拓展程序 ![](https://img-blog.csdnimg.cn/20200322161807770.png) 注:有些浏览器可能会失败,因为谷歌做了限制,你可以下载浏览器开发板。 三:下载地址 > 1、[谷歌网上应用商店](https://chrome.google.com/webstore/category/extensions?utm_source=chrome-ntp-icon) > 2、[Extfans](https://www.extfans.com/) > 3、[chrome插件网](http://www.cnplugins.com/) 贰:插件 9、谷歌访问助手 谷歌访问助手是一款免费的谷歌服务代理插件,不用配置就可以正常访问谷歌的大部分服务,而且速度很不错。最简单易用的谷歌访问助手,为chrome扩展用户量身打造。可以解决chrome扩展无法自动更新的问题,同时可以访问谷歌google搜索,gmail邮箱,google学术等谷歌服务。 ![](https://img-blog.csdnimg.cn/20200322164345320.png) 资源:[传送门](https://pan.baidu.com/s/1tLoBE0XfDvcEBD9zcN82qg) 提取码: 6ebe 安装可以参考上面的本地安装,不过是把解压后的整个文件夹拖进去。 ![](https://img-blog.csdnimg.cn/20200322164511861.png) 8、google翻译 此扩展将向浏览器工具栏添加按钮。每当您想翻译正在访问的页面时,请单击“翻译”图标。 扩展还会自动检测你所在页面的语言是否与你在Google Chrome界面上使用的语言不同。如果是,则会在页面顶部显示横幅。单击横幅中的“翻译”按钮,使页面上的所有文本以新语言显示。 ![](https://img-blog.csdnimg.cn/202003221547402.png) 当你在浏览网页时,突然遇到了某个陌生单词,复制再去查询是不是太麻烦,有了这款你就能立马在本页面查询。![](https://img-blog.csdnimg.cn/20200322155919692.png) 它不仅支持单个单词的查询还能翻译整个页面,尤其当我们在访问英文的网站,或者英文的开发文档时。当然谷歌也有内嵌了google翻译,但是偶尔他并不会弹出来。所以这个插件还是有必要的。 ![](https://img-blog.csdnimg.cn/20200322155329765.png) ![](https://img-blog.csdnimg.cn/20200322155435242.png) 7、dark reader(夜猫子的福利) 这是一个护眼扩展程序,通过实时生成黑色主题,为每一个网站启用夜间模式。 Dark Reader反转明亮的颜色,使其网页内容具有高对比度并且在易于夜间阅读。 ![dark reader](https://img-blog.csdnimg.cn/20200322140100792.png) 黑色主题,适用于任何网站。关爱眼睛,就使用Dark Reader进行夜间和日间浏览。您可以调整亮度、对比度,应用棕褐色滤镜、黑暗模式,设置字体和忽略的网站列表。 Dark Reader无广告,也不会在任何地方发送用户的数据。它完全开源 https://github.com/darkreader/darkreader 。 笔者是经常要用浏览器的,无疑这款插件给我带来最的好处就是在熬夜时能让整个屏幕看起来不那么刺眼,并且在大部分网站,显示都是比较好的。 ![](https://img-blog.csdnimg.cn/20200322141054265.png) ![](https://img-blog.csdnimg.cn/20200322141133502.png) 当然,如果你的浏览器内容是暗黑的,而浏览器外观却是白亮的,那肯定受不了,这时候你同样可以为你的浏览器在谷歌的网上应用商店里找一款暗黑的主题。最终我的是这样的。 ![](https://img-blog.csdnimg.cn/20200322141628778.png) **值得注意的是,他可能会与同类插件有冲突,可能会导致显示有问题,我就遇到了百度显示不了内容,例如接下来我就要介绍的一款,这两款,你最好只选其中一款,作者推荐下一款,因为它可以安装暗黑的主题,还可以安装其他的,而这一款就只有这一个功能。** 6、stylish和stylus stylish曾经非常火爆,由于被知名软件工程师Robert Heaton爆出他会窃取用户的浏览历史,被谷歌下市,如今在谷歌应用商店里仍然搜得到,最终在介绍里留下了: > 我们非常重视您的隐私,所以我们必须保证您理解我们的隐私政策:为了向您提供Stylish服务,即显示与您访问的网页相关的和推荐的样式、以及安装次数,我们需要收集浏览数据。 > 详见我们的隐私政策:userstyles.org/login/policy。 好吧,处于安全的考虑,大家可以不用sytylish,那么就有了他的替代品stylus。 Stylus 是一个调整网页外观的用户样式管理器。它可让您轻松地为许多热门网站网站安装主题和皮肤。 ![stylus](https://img-blog.csdnimg.cn/2020032213553342.png) 他里面可以下载很多网站的样式,基本上比较大的几个都有,当然,如果你有能力,你也可以自己写样式。样式下载:[传送门](https://userstyles.org) 谷歌搜索安装插件前: ![](https://img-blog.csdnimg.cn/20200322142950902.pngpic_center) 安装插件后: ![](https://img-blog.csdnimg.cn/20200322143039458.pngpic_center) 百度pure安装前: ![](https://img-blog.csdnimg.cn/20200322143435550.png) 安装后:![](https://img-blog.csdnimg.cn/20200322143512499.png) 安装前: ![](https://img-blog.csdnimg.cn/20200322143610559.png) 安装后:![](https://img-blog.csdnimg.cn/20200322143624477.png) 相信大家区别已经看出来了,这里推荐两款主题: - 百度pure - 全局思源黑体 5、Fehelper 这时一款前端开发者工具,它具有相当强大的功能,是前端开发者必不可少的工具。 ![fehelper](https://img-blog.csdnimg.cn/20200322140446214.png) 以下为他的功能及介绍。 ![功能](https://img-blog.csdnimg.cn/20200322144212113.pngpic_center) 就拿我经常用的一个工具,需要请求数据,放回json数据,然后,他就会在浏览器显示美化,当然,你还可以复制一段json数据,他也能给你美化。 ![](https://img-blog.csdnimg.cn/20200322144901965.png) 自定义数据: ![](https://img-blog.csdnimg.cn/20200322145127334.png) 4、Adblock Plus 相信这个插件大家并不陌生,基本上大家都装着这个插件,它可以阻拦浏览器大部分广告,还支持自定义,享受没有恼人广告的网络世界。 Adblock Plus 是世界上最流行的浏览器扩展,世界各地有数百万用户在使用它。这是一个社区驱动的开源项目,有数百名志愿者为 Adblock Plus 的成功作出了贡献,以实现所有烦人的广告被自动阻挡。 Adblock Plus for Google Chrome 会阻挡: - 横幅 - YouTube 视频广告 - Facebook 广告 - 弹出窗口 - 所有其他显眼的广告 ![Adblock Plus](https://img-blog.csdnimg.cn/20200322140537144.png) 3、广告终结者 > 广告终结者是一款参考各种广告过滤插件开发的功能全面的免费开源广告过滤工具。广告终结者让你不用再忍受网页上烦人的广告,不需要开通所谓的VIP,做任务,也不需要找各种功能不全的广告插件,广告终结者集成广告过滤的所有功能,是你唯一需要的必备广告过滤扩展。 ![](https://img-blog.csdnimg.cn/20200322150719279.png) 相比`Adblock Plus`,其实我更喜欢广告终结者这一款插件,下面来看一下他的功能。 - 过滤网页上的各种类型广告 - 百度联盟等广告联盟的广告 - 淘宝,天猫,京东等商城广告 - 恶意弹窗广告 - 各种影响网页阅读的浮动广告 - 屏蔽视频广告 - 视频片头广告 - 视频暂停广告 - 视频下方的小广告 - 提升网页浏览体验 - 屏蔽广告,网页排版更整齐,更易阅读 - 屏蔽跟踪代码,防止个人隐私泄露 - 过滤广告、跟踪代码,网页加载速度更快 **看到没,他居然能屏蔽视频广告,虽然不能看vip视频,但是看视频时我又能省下60秒,岂不妙哉!!!** 有时会有失效,但是你可以在插件帮助页加群会有解决方法。 2、Infinity 新标签页 大家是否早已厌倦了360、2345、hao等一些充满广告的新标签页,一个清新的首页,总能给你打开浏览器的时候带来好的心情。 Infinity新标签页是一款基于html5的Chrome扩展程序,它重新定义了您的Chrome新标签页。 ![](https://img-blog.csdnimg.cn/20200322151445687.png) Infinity功能简介: - 一 、精美的图标(logo):扁平化设计风格,国内外200多个热门常用图标。 - 二、高清壁纸:从3万5千张超清壁纸中,一张一张搭配图标,精心挑选出365张,形成每日一图;当然你也可以从你自己电脑上选择图片作为壁纸。 - 三、云同步:时间备份数据到云端,一键从云端恢复。 - 四、智能邮件通知:Gmail邮件自动提醒功能。 - 五、待办事项:随时查看你要做的事和你做过的事。 - 六、个性化搜索:你可以选择你想使用的搜索引擎,你还可以定制个人的附加搜索引擎。 - 七、 App扩展管理:随时随地快捷方便的管理你的扩展。 - 八、历史记录管理:查看搜索你的记录。 - 九、笔记:记录生活点滴。 ![](https://img-blog.csdnimg.cn/20200322151705500.png) 1、Tampermonkey(油猴) 对于这款插件,我只能说一句:**牛逼,世界上最流行的用户脚本管理器,他的强大之处我就不说了,相信大家都有所体会。 Tampermonkey是最受欢迎的用户脚本管理器,拥有超过1000万用户。 Tampermonkey用于运行所谓的用户脚本(有时也称为Greasemonkey脚本)。用户脚本是一些小的计算机程序,例如向YouTube页面添加下载按钮、清理Facebook时间线或帮助玩在线游戏。 ![](https://img-blog.csdnimg.cn/20200322153211339.png) 对于很多人来说,这简直是白嫖党的福音啊,相信你安装了这个插件,有很多插件都可以卸载了。这里推荐几款笔者在使用的脚本,当然,你也可以自己去下载。[传送门](https://greasyfork.org/zh-CN/) - 【玩的嗨】VIP工具箱 - 网页限制解除(改) - 超星尔雅助手 - 百度网盘下载助手 作者有话 虽然插件给我们带来了很多方便,但是还是希望大家能够正确的用插件,尽量到官方的途径下载插件,毕竟以前就有很多插件会劫持浏览器、泄露隐私等问题。 最后,如果你有更好的插件,请在评论区告诉大家吧。点个赞再走吧,码字不易。
2020-03-22
概述: 对于一个猿来说,工欲善其事,必先利其器,一个好的开发工具就是程序员的左膀右臂,idea作为大部分java猿的开发工具,无疑是最好用的ide了。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 而idea的插件更是能够给我们日常开发带来很多便利,下面就是我想推荐给大家的几个插件。 ![plugina](https://img-blog.csdnimg.cn/20200317160711417.png) 壹:插件安装 idea的插件安装可以分为两种,第一种就是直接在idea里面下载、安装。第二种可以将压缩包先下载好,然后再在idea中导入,即可完成安装。下面所有的安装都可以通过这两种安装方式来安装。 注:插件安装重启idea生效 [jetbrains插件官网](https://plugins.jetbrains.com/) 一:在线安装 file -> setting -> plugins -> search -> install -> restart idea ![在线安装](https://img-blog.csdnimg.cn/20200317155508764.png) 二:本地安装 file -> setting -> plugins -> install plugins from disk-> 选择压缩包 -> ok -> restart idea ![本地安装](https://img-blog.csdnimg.cn/20200317160537509.png) 贰:插件: 一:炫酷 15、Activate-power-mode或者Intellij_power_mode_II 你试过在敲代码的时候像打游戏一样燃吗,当你装上这个插件的时候,每敲下一串代码,整个屏幕都在颤抖。 当然,这样的插件玩玩就好,在真实的开发环境要求的是速度。 14、background image plus 你的ide是不是除了黑色就是白色,顶多就带一点灰,而对于二次元的小伙伴,如果能在敲代码的时候也能欣赏自己的老婆,是不是很赞。该插件支持给你的idea添加背景图片。 设置:view->set background image ![background image plus](https://img-blog.csdnimg.cn/20200317145510935.png) 13、rainbow brackets 我们常常在开发中是否遇到括号太多,而找不到相应的括号,而尤其在删除代码的时候,及其困扰,是不是?而rainbow brackets恰好能解决这些问题。 这个插件可以实现配对括号相同颜色,并且实现选中区域代码高亮的功能。对增强写代码的有趣性和排错等都有一些帮助。 ![rainbow brackets](https://img-blog.csdnimg.cn/20200317145927430.png) 二:实用 12、translation 英语不好的人的福音来了,你是不是经常在看别人的代码,遇到很多英语单词不认识,而从idea里面复制不认识的单词,再去查就很麻烦对不对,这款插件你就能直接在idea里面实现单词或者语句的翻译。 使用:选中你要查询的单词或语句,右键,选择translate ![translate](https://img-blog.csdnimg.cn/20200317151341571.png) 11、statistic 显示项目统计信息。该插件显示按扩展名排序的文件以及大小,行数LOC等。用户可以使用“选择时刷新”按钮选择(项目/模块/包/文件)作用域。(此插件需要Java 1.8) 使用:点击控制台下方statistic按钮,再点击刷新按钮 ![statistic](https://img-blog.csdnimg.cn/2020031715163414.png) 10、RestfulToolkit RESTful服务开发的工具包。 - 1.一步一步导航到服务声明。(使用:Ctrl(Command)+ \或Ctrl + Alt + N) - 2.显示RESTful服务结构。 - 3.一个简单的http请求工具。 - 4.在请求方法,生成和复制查询参数,生成和复制URL等处添加一些有用的功能。 - 5,其他功能:转换为JSON; 转换为Java类,格式化json数据(Windows:Ctrl + Enter; Mac:Command + Enter)。 支持Spring框架(Spring MVC / Spring Boot 1.x,2.x) 支持JAX-RS 支持Java和Kotlin语言 ![RestfulToolkit](https://img-blog.csdnimg.cn/20200317152033418.png) 9、lombok 写实体类时,我们常常需要写他的set、get、构造方法等,lombok可以使代码现在变得非常容易,只需突出显示一个块并在IDE中键入注释即可。减轻代码审查的痛苦并提高代码质量。 注意:它需要在项目中引入依赖(pom.xml),在使用中只要加入@Data注解就可以 ```xml <!-- 引入lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> ``` ![lombok](https://img-blog.csdnimg.cn/20200317152504198.png) 8、alibaba Java coding guidelines 我们在刚写代码时,自己书写的代码会不规范,尤其在团队合作中,会时整个项目变得非常乱,而该插件与下面的sonarLint都能解决你的问题。会在你写代码的时候提醒你,从而使你的代码变得规范。 ![alibaba Java coding guidelines](https://img-blog.csdnimg.cn/20200317153244625.png) 7、sonarLint SonarLint是一个IDE扩展,可帮助您在编写代码时检测和修复质量问题。像拼写检查器一样,SonarLint可以使缺陷变形,因此可以在提交代码之前将其修复。您可以直接从IntelliJ IDEA插件存储库中获取它,然后它将在您编写代码(Java,Kotlin,Ruby,JavaScript,PHP和Python)时检测到新的错误和质量问题。 如果在SonarQube或SonarCloud上分析了您的项目,SonarLint可以连接到服务器以检索该项目的适当质量配置文件和设置。运行SonarLint需要Java 8。 使用:选择你要检测的文件,然后点击下方sonarLint,再点击运行按钮。 ![sonarLint](https://img-blog.csdnimg.cn/20200317153007803.png) 6、key promoter X 一个用于学习IntelliJ IDEA快捷方式的插件。 Key Promoter X可帮助您在工作时学习基本的快捷方式。当您在IDE内的按钮上使用鼠标时,Key Promoter X会显示您应该使用的键盘快捷键。这提供了一种简单的方法来学习如何用键盘按键代替繁琐的鼠标工作,并有助于过渡到更快的无鼠标开发。当前,它支持工具栏按钮,菜单按钮,工具窗口及其中的操作。 Key Promoter X工具窗口显示了您最常使用的鼠标操作的命中列表,并直接为您提供了可以使用的快捷方式。对于没有快捷方式的按钮,Key Promoter X会提示您直接创建一个。 ![Key Promoter X](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9wbHVnaW5zLmpldGJyYWlucy5jb20vZmlsZXMvOTc5Mi9zY3JlZW5zaG90XzE3MTA1LnBuZw?x-oss-process=image/format,png) 5、Mybatis-log-plugin MyBatis日志插件 把mybatis输出的sql日志还原成完整的sql语句。 将日志输出的sql语句中的问号?替换成真正的参数值。 通过“工具- > MyBatis的日志插件”。菜单或快捷键“Ctrl + Shift + ALT + O”的启用。点击窗口左边的“过滤器”按钮,可以过滤不想要输出的SQL语句 点击窗口左边的“格式SQL”的按钮,可以格式化输出的SQL语句。 选中控制台的SQL日志,右击“从选择还原SQL”菜单可以还原SQL语句。 前提条件:输出的SQL日志必须包含“准备”和“参数”。才能正常解析 ![Mybatis-log-plugin](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9wbHVnaW5zLmpldGJyYWlucy5jb20vZmlsZXMvMTAwNjUvc2NyZWVuc2hvdF8xNzM2Ny5wbmc?x-oss-process=image/format,png) 4、Free-idea-mybatis free-idea-mybatis是用于支持mybatis的想法的交换插件,这是主要功能: - 生成映射器xml文件 - 从代码导航到映射器mapper,然后从映射器mapper导航回代码 - 自动代码和错误提示 - 支持mybatis生成器GUI 3、CodeGlance 将类似于Sublime中的代码的微型地图嵌入到编辑器窗格中。使用您自定义的颜色突出显示语法,可同时使用浅色和深色主题。 ![CodeGlance](https://img-blog.csdnimg.cn/20200317154043841.png) 2、MyBatisCodeHelperPro 他的功能非常强大,然而他并不免费(29软妹币半年),下面有破解传送门,土豪请随意。 主要特征: - 通过Intellij数据库表生成mybatis原始代码或添加数据库连接 - 基于mybatis接口方法名称(例如spring data jpa)生成mybatis sql,使用此方法,无需使用if test即可为非连接查询支持generate语句编写大多数sql - 当您添加或删除列时,数据库generate crud可能会生成多次,插件将自动合并代码 - 完整的mybatis sql自动完成功能,在xml中识别mybatis标记,例如修剪集包含ect的地方,在这些标记后提供sql完成 - 从mybatis dao界面跳转到mapper xml 介绍:https://plugins.jetbrains.com/plugin/9837-mybatiscodehelperpro 破解:https://zhile.io/2019/04/23/mybatis-code-helper-pro-crack.html 1、aiXcode AiXcoder是使用最新AI技术的代码建议生成器。开发者的模型在超过1 TB的开源代码上进行了训练,并通过您自己的计算机提供服务。 ![aiXcode](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9maWxlLmFpeGNvZGVyLmNvbS9pbWcvZGVtby9uL2phdmExLmdpZg) 叁:作者有话 希望我的博文能够帮助到你,能够让你在开发过程中能够更加的便捷,最后,希望正在看这篇博文的你早日成为大佬,然后再来带带小菜鸡的我鸭。
2020-03-17
一、题目描述: 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为 O(h),h 为树的高度。 示例: >root = [5,3,6,2,4,null,7] > key = 3 >![](https://img-blog.csdnimg.cn/20210115133530614.png) >给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。 > >一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。 > ![](https://img-blog.csdnimg.cn/20210115133552237.png) >另一个正确答案是 [5,2,6,null,4,null,7]。 > ![](https://img-blog.csdnimg.cn/20210115133608480.png) 二、解答 分析 解题思路: 首先,这个题目可以根据删除的节点的左右节点来判断。 而找到该节点是非常简单的,因为这棵树是二叉搜索树,而二叉搜索树的特性,左节点的值一定小于该节点值,右节点的值一定大于该节点的值,所以直接搜索就可以找到该值。 所以重点在于怎么判断该节点的左右节点的情况。 大致可以分为四种: 1. 该节点没有左节点,也没有右节点 2. 该节点没有左节点,但有右节点 3. 该节点有左节点,但没有右节点 4. 该节点有左节点,也有右节点 第一种:对于第一种情况,直接将该节点删除即可。 第二种:对于第二种情况,直接删除节点,将左节点代替该节点。 第三种:对于第三种情况:直接删除节点,将右节点代替该节点。 第四种:对于第四种情况,又可以分为三种情况: 1. 该节点的左节点没有右节点,将左节点代替该节点。 2. 该节点的右节点没有左节点,将右节点代替该节点。 3. 对于都有的情况,为了保证二叉搜索树的结构,我们 ① :可以用该节点的左节点最右节点的值代替该节点;②:也可以用该节点的右节点的最左节点的值代替该节点。 >而对于最后的情况,也就是第四种情况的第三种情况, >需要注意 >①中,如果最右节点还有左节点,我们可以用最右节点的左节点的值代替最右节点所在的位置; >②中,如果最左节点还有右节点,我们可以用最左节点的右节点的值代替最左节点所在的位置。 **再一次总结归纳:** 其实,最后第四种情况的第三种就包括了前面所有的方面, 在找到该节点后: 1. 如果该节点的左节点不为空,我们用该节点的左节点最右节点的值代替该节点; 2. 否则,如果该节点的右节点不为空,我们可以用该节点的右节点的最左节点的值代替该节点。 3. 否则,将该节点置空。 找到该节点,非常容易,因为左节点的值一定小于该节点值,右节点的值一定大于该节点的值。 所以,从根节点开始遍历 1. 如果遍历到的节点的值大于该值,该值一定处于该节点的右子树,往右遍历即可。 2. 否则,如果遍历到的节点的值小于该值,该值一定处于该节点的左子树,往左遍历即可。 3. 否则,就是找到了该值,在进行上述操作即可。 >时间复杂度:O(h),其中 n 为树的高度。 代码 ```java /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode deleteNode(TreeNode root, int key) { if(root!=null){ if(root.val == key){ if(root.left != null){ root.val = leftMax(root); root.left = deleteNode(root.left, root.val); } else if(root.right != null){ root.val = rightMin(root); root.right = deleteNode(root.right, root.val); } else { root = null; } }else if(root.val>key){ root.left = deleteNode(root.left,key); }else{ root.right = deleteNode(root.right,key); } return root; } return null; } public int rightMin(TreeNode root) { root = root.right; while (root.left != null) root = root.left; return root.val; } public int leftMax(TreeNode root) { root = root.left; while (root.right != null) root = root.right; return root.val; } } ``` > 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:39.2 MB, 在所有 Java 提交中击败了8.92%的用户 三、官方解答 ```java class Solution { /* One step right and then always left */ public int successor(TreeNode root) { root = root.right; while (root.left != null) root = root.left; return root.val; } /* One step left and then always right */ public int predecessor(TreeNode root) { root = root.left; while (root.right != null) root = root.right; return root.val; } public TreeNode deleteNode(TreeNode root, int key) { if (root == null) return null; // delete from the right subtree if (key > root.val) root.right = deleteNode(root.right, key); // delete from the left subtree else if (key < root.val) root.left = deleteNode(root.left, key); // delete the current node else { // the node is a leaf if (root.left == null && root.right == null) root = null; // the node is not a leaf and has a right child else if (root.right != null) { root.val = successor(root); root.right = deleteNode(root.right, root.val); } // the node is not a leaf, has no right child, and has a left child else { root.val = predecessor(root); root.left = deleteNode(root.left, root.val); } } return root; } } ``` > 参考: > 1、[题目](https://leetcode-cn.com/problems/delete-node-in-a-bst/) > 2、[官方解答](https://leetcode-cn.com/problems/delete-node-in-a-bst/solution/shan-chu-er-cha-sou-suo-shu-zhong-de-jie-dian-by-l/) >本文首发于CSDN,作者:lomtom >原文链接:**[https://blog.csdn.net/qq_41929184/article/details/112662236](https://blog.csdn.net/qq_41929184/article/details/112662236)** >个人网站:**[https://lomtom.top](https://lomtom.top)**,公众号:**博思奥园**,同步更新。 > > **你的支持就是我最大的动力。** ![](https://img-blog.csdnimg.cn/20200405094243147.png)
2021-01-17
一、题目描述: 给定一个无重复元素的有序整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按如下格式输出: - "a->b" ,如果 a != b - "a" ,如果 a == b 示例 示例 1: >输入:nums = [0,1,2,4,5,7] 输出:["0->2","4->5","7"] 解释:区间范围是: [0,2] --> "0->2" [4,5] --> "4->5" [7,7] --> "7" 示例 2: >输入:nums = [0,2,3,4,6,8,9] 输出:["0","2->4","6","8->9"] 解释:区间范围是: [0,0] --> "0" [2,4] --> "2->4" [6,6] --> "6" [8,9] --> "8->9" 示例 3: >输入:nums = [] 输出:[] 示例 4: >输入:nums = [-1] 输出:["-1"] 示例 5: >输入:nums = [0] 输出:["0"] 提示: >0 <= nums.length <= 20 -231 <= nums[i] <= 231 - 1 nums 中的所有值都 互不相同 nums 按升序排列 二、解答 分析 解题思路: 1. 遍历整个数组,当相邻的数只相差1时,构成一个区间。 2. 当相邻的数相差大于1时,开始一个新的区间。 3. 当判断开始一个新的区间时,我们需要保存前面的区间。 4. 保存一个区间需要两个值分别记录区间开始的值,当前数的前一个数的值。 5. 唯一值得注意的是处理边界问题。 >时间复杂度:O(n),其中 n 为数组的长度。我们只需要遍历一次数组即可。 空间复杂度:O(1)。只需要常数空间存放若干变量。 代码 ```cpp class Solution { public List<String> summaryRanges(int[] nums) { int length = nums.length; List<String> result = new ArrayList<>(); if(length == 0){ return result; } int start = nums[0]; int now = nums[0]; int i = 1; for(;i < length;i++){ if(now + 1 == nums[i]){ now++; } else{ result.add(start == now?String.valueOf(start):start+"->"+now); start = now = nums[i]; } } result.add(start == now?String.valueOf(start):start+"->"+now); return result; } } ``` > 执行用时:7 ms, 在所有 Java 提交中击败了82.54%的用户 内存消耗:36.9 MB, 在所有 Java 提交中击败了53.76%的用户 改进 1. 因为当前数的前一个数的值,我可以通过当前的下标来获取,所以该值完全没有必要记录,所以可以省略该值 2. 省略该值之后,我只要通过下标来判断即可,所以在循环里,我只要判断前一个数加一与当前值不相等即可 ```java public List<String> summaryRanges(int[] nums) { int length = nums.length; List<String> result = new ArrayList<>(); if(length == 0){ return result; } int start = nums[0]; int i = 1; for(;i < length;i++){ if(nums[i - 1] + 1 != nums[i]){ result.add(start == nums[i - 1]?String.valueOf(start):start+"->"+nums[i - 1]); start = nums[i]; } } result.add(start == nums[i - 1]?String.valueOf(start):start+"->"+nums[i - 1]); return result; } ``` 这样做的好处就是节省了一定的空间。 三、官方解答 官方给出的题解也是一次遍历,但是是用双指针的方法,也就是使用维护下标low 和 high 分别记录区间的起点和终点,和我的大致思想也差不多。 ```cpp class Solution { public List<String> summaryRanges(int[] nums) { List<String> ret = new ArrayList<String>(); int i = 0; int n = nums.length; while (i < n) { int low = i; i++; while (i < n && nums[i] == nums[i - 1] + 1) { i++; } int high = i - 1; StringBuffer temp = new StringBuffer(Integer.toString(nums[low])); if (low < high) { temp.append("->"); temp.append(Integer.toString(nums[high])); } ret.add(temp.toString()); } return ret; } } ``` > 参考: > 1、[题目](https://leetcode-cn.com/problems/summary-ranges/) > 2、[官方解答](https://leetcode-cn.com/problems/summary-ranges/solution/hui-zong-qu-jian-by-leetcode-solution-6zrs/) >本文首发于CSDN,作者:lomtom 原文链接:**[https://blog.csdn.net/lomtom/article/details/112306554](https://blog.csdn.net/lomtom/article/details/112306554)** 个人网站:**[https://lomtom.top](https://lomtom.top)**,公众号:**博思奥园**,同步更新。 你的支持就是我最大的动力。 ![](https://img-blog.csdnimg.cn/20200405094243147.png)
2021-01-10
一、场景引入 前提背景 在某些场景下,例如淘宝京东这样海量的数据,高访问量的场景,无疑对数据库造成了相当大的负载,同时对于系统的稳定性和扩展性提出很高的要求。 而单个服务器所能够提供的服务以及负载都是有限的。 所以,为了系统的问题,以及较快的响应速度或处理能力,在数据库方面就有了集中解决方案,**分库分表,读写分离**,这些都能在一定程度上有效地减小单台数据库的压力。 而本文就是从读写分离角度来一探究竟。 实现原理 主要理解以下三个点就差不多了: **1、主机负责写操作** **2、从机负责读操作** **3、从机自动从主机中同步数据** 然而,我们对于一个新的东西,我们就要提出我们的哲学三问: ~~我是谁?我在那?我要干嘛?~~ **是什么?为什么?怎么做?** 1、什么是读写分离 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2、为什么要读写分离呢? 因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。 但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。 所以读写分离,解决的是,数据库的写入,影响了查询的效率。 3、什么时候要读写分离? 数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。都是解决方法。 4.主从复制、读写分离的基本设计 在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。 > 取自:[读写分离的实现原理及使用场景](https://blog.csdn.net/belalds/article/details/82655786) **这里使用docker进行数据库的安装,docker的优势以及就怎么安装docker就不多做赘述了,感兴趣的可以去翻一下我以前的文章。** 一、安装mysql 这里只安装了一个主机(master),一个从机(slave) ``` docker run --name mysql-master -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci docker run --name mysql-salve -p 33062:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ``` 二、配置同步 为什么? 如果不进行同步的配置,那么从机无法获取主机的数据,最终就会导致同步失败。 1、配置主机用户 ``` grant replication slave on *.* to 'lomtom'@'%' identified by '123456' ``` 2、修改配置文件 在从机中的配置文件加入以下参数。 1. 主机 ``` log-bin = /var/lib/mysql/binlog server-id =1 binlog-do-db =lomtomdb ``` 2. 从机 ``` server-id =2 ``` 1、修改配置文件(以master为例) ``` Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, as published by the Free Software Foundation. This program is also distributed with certain software (including but not limited to OpenSSL) that is licensed under separate terms, as designated in a particular file or component or in included license documentation. The authors of MySQL hereby grant you an additional permission to link the program and your derivative works with the separately licensed software that they have included with MySQL. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The MySQL Server configuration file. For explanations see http://dev.mysql.com/doc/mysql/en/server-system-variables.html [mysqld] log-bin = /var/lib/mysql/binlog server-id =1 binlog-do-db =lomtomdb pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql log-error = /var/log/mysql/error.log By default we only accept connections from localhost bind-address = 127.0.0.1 Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 ``` 2、拷贝(主从都需要拷贝,以master为例) 如果服务器有vi编辑器,直接使用vi编辑器即可。 ``` docker cp mysql.cnf mysql-master:/etc/mysql/mysql.conf.d/ ``` 3、重启mysql ``` docker restart mysql-master ``` 4、查看是否配置成功 ``` show master status; ``` 如果出现以下数据即为成功。 ![](https://img-blog.csdnimg.cn/20210107122208680.png) 5、在从机(slave)中配置主机(master) ``` 1、配置主机信息 change master to master_host='192.168.43.236',master_port=33061,master_user='lomtom',master_password='123456',master_log_file='binlog.000001',master_log_pos=154; 2、查看从机状态 show slave status; SLAVE_IO_RUNNING ,SLAVE_MYSQL_RUNNING两个值为YES即为正确启动,否则自己根据下方的错误提示修改配置 ``` 三、测试 在第一个数据库(master)创建我们配置的数据库,然后随意修改该数据库的数据,刷新slave,数据同步成功。 四、注意 1、因为在配置当中指定了数据库(lomtomdb),也就是`binlog-do-db`参数,所以从机只会同步主机中的lomtomdb数据库,其他数据库不同步。 2、修改配置文件时,`log-bin`参数所指定的目录一定是要mysql能够操作的文件,也就是说,如果你指定了其他目录,请给予mysql操作权限。 >参考: >[读写分离的实现原理及使用场景](https://blog.csdn.net/belalds/article/details/82655786) >[江南一点雨](https://mp.weixin.qq.com/s/R89aCCFvCvudLp6FUn2JjQ) >本文首发于CSDN,作者:lomtom 原文链接:**[https://blog.csdn.net/qq_41929184/article/details/112306554](https://blog.csdn.net/qq_41929184/article/details/112306554)** 个人网站:**[https://lomtom.top](https://lomtom.top)**,公众号:**博思奥园**,同步更新。 你的支持就是我最大的动力。
2021-01-07

CONTACT ME

You can contact me in the following ways

Copyright © 2019-2020 Made with love By LomTom | 湘ICP备19023870号 | 经历风雨 666 天 6 小时 6 分 6 秒