xmind导入导出支持图片功能
在开发用例管理平台的过程中,需要使用xmind来管理用例。所以也涉及到xmind用例的导入导出功能,
在开始的时候,xmind文件中没有图片,所以使用xmind,xmindparser包就可以完成改任务。现在新增需求,
要求支持xmind文件中图片的导入导出。原有的包,并不支持图片的操作,所以需要对这两个包进行一些改造。
1.环境 python3.8
2.xmind版本,xmind8,xmindzen
3.需要的python包 xmind包,xmindparser包
xmindparser包改造
针对xmind8版本,需要改动xreader.py文件的image_of方法
原方法:
def image_of(node):
img = node.find('img')
if img is not None:
return '[Image]'
因为项目需要图片的内容信息,还有图片的大小,所以将图片的附件、高、宽,拼接一起返回
改造后方法:
def image_of(node):
img = node.find('img')
if img is not None:
src_attribute = img.get('{http://www.w3.org/1999/xhtml}src')
height_attribute = img.get('{http://www.w3.org/2000/svg}height')
width_attribute = img.get('{http://www.w3.org/2000/svg}width')
return str(src_attribute) + ':' + str(height_attribute) + ':' + str(width_attribute)
return None
针对xmindzen版本,需要改动zenreader.py文件的image_of方法
def image_of(node):
img = node.get('image', None)
if img is not None:
文章目录 Java 7新特性深度解析:提升效率与功能一、Switch中添加对String类型的支持二、数字字面量的改进三、异常处理(捕获多个异常)四、增强泛型推断五、NIO2.0(AIO)新IO的支持六、SR292与InvokeDynamic七、Path接口八、fork/join计算框架 Java 7新特性深度解析:提升效率与功能 一、Switch中添加对String类型的支持 Switch语句可以使用原始类型或枚举类型。
Java引入了另一种类型,可以在switch语句中使用:字符串类型。
public class switchAddString { public static void main(String[] args) { String s = "a"; switch (s) { case "a": System.out.println("a"); break; case "b": System.out.println("b"); break; default: System.out.println("default"); } } } 编译器在编译时的处理情形
仅有一个case和default,则直接转换为if…else… 。有多个case。先将String转换为hashCode,然后相应的进行处理。 二、数字字面量的改进 数字中可加入分隔符: Java7中支持在数字量中间添加’_’作为分隔符。下划线仅仅能在数字中间。编译时编译器自己主动删除数字中的下划线。 Java7添加二进制表示。 public static void main(String[] args) { int i = 10; System.out.println("i=" + i); // 二进制 int j = 0b1010; // 十六进制 int k = 0x1234; // 1,000,000 int l = 1_000_000; // 1,000,000 int m = 1__000_000; System.
问题:
warning: in the working copy of , LF will be replaced by CRLF the next time Git touches it warning:
今天上传git时报错,使用Ai;得知; 解决:
将 Git 配置为不自动转换换行符,使用以下命令
我使用该命令就不报错了;
git config --global core.autocrlf false 如果你只想对当前项目进行配置,可以省略 --global 选项。 git 的 Windows 客户端基本都会默认设置 core.autocrlf=true
如果你希望 Git 在 Windows 上自动转换 CRLF 到 LF,但不想在提交时转换回 CRLF,你可以设置:
git config --global core.autocrlf true 如果你在 Unix/Linux 系统上工作,希望 Git 保持 LF 换行符不变,设置为: git config --global core.autocrlf input
十年前,广东三合电子实业有限公司(以下简称:三合实业)正式成立,同年成为华为金牌伙伴,由此也开启了与华为深度“结缘”的十年。
十年来,作为华为“铁杆”的合作伙伴,三合实业始终与华为“并肩前行”。特别是在分销业务领域,三合实业作为华为分销业务最早的地市开拓者,不断帮助华为把分销业务深入到广东省的各个地市之中,同时自身也保持了高速发展。
早在2017年,三合实业的销售额就突破亿元,昂首迈入华为“三亿俱乐部”;2021年,三合实业更是创下了公司成立以来的最好业绩,销售额突破8亿元;与此同时,三合实业的业务范围也从最初的ICT产品分销延伸到了系统集成、软件开发和ICT服务等领域,并赢得了众多客户的一致信赖与广泛好评。
在今年举办的华为中国合作伙伴大会2024上,三合实业也荣获华为颁发的“坤灵功勋合作伙伴奖”,正所谓“陪伴是最长情的告白”莫不过如此。那么,在这背后,是什么原因推动了三合实业和华为一起走过了十载的“风雨同舟路”呢?
十载风雨同舟路
苏轼曾诗云:“古之立大事者,不惟有超世之才,亦必有坚韧不拔之志”,此句诗可浓缩成“洞察”、“实力”和“坚持”六个字,用它形容三合实业和华为的十载合作历程恰如其分。
据广东三合电子实业有限公司分销产品董事长张俊朋介绍,在签约成为华为金牌伙伴之前,公司就合作过不少的ICT品牌,但并没有和这些品牌碰撞出“火花”,直到2014年遇到华为,尽管此时华为的政企业务刚刚起步,还未成为领域里“头号玩家”,但三合实业却坚定地选择了华为。
“虽然我们此前也接触过很多的ICT品牌,但一直在原地兜兜转转,始终处在摸索期,但自从14年踏上了华为这艘大船之后,我们看到了方向也看到了目标,因为我们相信在华为这个大平台上,公司的未来有着无限成长的可能。”张俊朋说。
确实如此,回头来看三合实业当初选择华为是非常有“前瞻性”的,成为华为金牌伙伴的第一年,公司的业绩就完成了500万元;两年后的2016年,三合实业的业绩更是做到了持续翻番,实现了2000万元的营收。
2017年是双方合作的一个“分水岭”,此时华为政企业务开始大力拓展“分销生态圈”,同时随着数字化转型的不断展开,华为判断中小城市的数字化建设将日益深入,地市级的市场规模也将会得到空前的增长,因此这就需要更多的合作伙伴深入地市级市场进行更为广泛的覆盖。
张俊朋告诉笔者,面对全新的市场机遇,此时的三合实业也经历了一番“痛苦的抉择”,一是虽然和华为的合作取得了不错的业绩,但离公司制定的目标仍有一定的距离,因此公司团队也在思考如何更好地融入华为的生态伙伴体系,并和华为一起实现更大的共赢;二是,当时公司对进入地市级市场也有一定的“疑虑”,因为并不确定投入产出是否有较高的回报,但综合考量之下,三合实业还是决定“放手一搏”,跟随华为的步伐进入地市级市场。
“最终我们还是希望改变自己,当时也做好了破釜沉舟的准备,而这个决定也让三合实业成为了跟随华为第一批进入地市级市场的金牌合作伙伴。”张俊朋回忆说,而进入地市级市场之后,三合实业发现下沉市场其实是一片未开拓的“蓝海”市场。
当年,三合实业销售额首次突破亿元大关,并昂首迈入华为“三亿俱乐部”。正是有了这样的“示范效应”,不少华为的合作伙伴也开始大规模进入地市级市场。数据显示,仅2018年,华为就覆盖了国内300多个地市级市场。
此后,华为再次从组织、能力、资金、营销等方面加大对地市业务的投入。在华为的一系列政策的“牵引”之下,三合实业对地市级市场也展开了“精耕细作”的耕耘,同时在分销业务之外,公司在商业市场也得到了华为的大力支持,而这也推动了三合实业的业绩进一步实现了“高歌猛进”的增长,尤其是进入地市级市场之后,公司每年的业务都是以亿元为单位在实现增长。
2021年,三合实业的销售额更是一举突破8亿元,一跃变成了广东地区ICT行业的明星企业,不仅能为各行业客户提供云计算、大数据、网络信息安全、智能安防、数据中心建设等行业应用解决方案和专业的全方位技术服务,同时其业务广泛覆盖政务、安全、互联网、通讯、金融、交通、电力、制造、教育、医疗等行业领域,真正成为了一家“立足广州,面向全国”的ICT技术服务商。
奋楫逐浪向未来
在张俊朋看来,一路和华为合作下来,华为有几个方面给他留下了深刻的印象。
一方面,就是华为的企业文化和核心价值观,“以客户为中心,以奋斗者为本,长期坚持艰苦奋斗”,是华为在发展过程中形成的企业文化和核心价值观,而对这种价值观的坚持,也让三合实业对华为从最初存在质疑到认可、到信任;从陌生到了解、到熟悉;从流程不匹配到共同优化磨合、到最终平滑对接。同样,三合实业也把华为的文化和价值观引入公司内部的管理和建设之中,以华为为镜,不断优化管理和人才结构,并通过组织各种内部活动,增强员工的凝聚力和战斗力。
另一方面,是华为具备强大的研发实力,以及拥有丰富的ICT产品线,这也是一直以来吸引三合实业和华为合作的关键因素。“华为的品牌拉力非常强,同时产品线也非常齐全,因此我们代表华为进入地市级市场,举办一些合作伙伴的招募活动,就会变得比较的容易,而且很多行业客户也认可华为这个品牌,这让我们在行业打单的过程中,也变得更加的有信心和底气。”张俊朋说。
也正因此,虽然过去两年由于受到外部市场变化的影响,三合实业的发展从“高速期”进入到了“平稳期”,但公司仍然持续强化和华为的合作深度和广度。特别是进入2023年,华为启动了分销业务变革,通过全新组织、市场倾斜,产品定制,伙伴激励等策略,打造健康有序的分销伙伴体系,希望让整个分销的秩序和效率得以大幅度提高,同时让每一层渠道伙伴都各有侧重,分工明确,进一步推动整个分销生态得以良性和稳定发展。
在此基础上,针对分销市场,华为还提出了坚持“长期主义”的主张,并首次为分销市场打造了专属的品牌——“华为坤灵”和适销产品,核心就是希望和合作伙伴一起,完成对区域市场的进一步“下沉”和对中小企业的广泛覆盖,更快地加速中小企业数智化转型的步伐。
对此,张俊朋表示,华为针对分销市场打造的坤灵品牌和产品,涵盖了数通、光、行业感知、计算等产品线,这些产品目前在市场上的热度非常之高,而公司也实现了产品的无缝“切换”,与此同时随着华为加大对分销市场的投入和变革,也要求合作伙伴进一步“下沉”市场,从过去的地市级市场进入到区县级市场,目前公司也在紧密配合华为,大力发展精英级别的分销合作伙伴,共同做大做强分销市场。
当然,这种变化也对三合实业的分销业务团队提出了更高的要求和挑战。“在此过程中,我们需要花更多的时间和精力,以及投入更多的分销人力资源,更多地走入区县级市场了解当地的合作伙伴,并且让合作伙伴熟悉坤灵的品牌和产品,以及建立和公司后续的合作和商务流程等,这些打基础的工作肯定不是一蹴而就的,不过发展分销精英伙伴,我们也不会一味追求数量,更关键的还是重视质量,追求有质量的增长。面向未来,三合实业也将一如既往的同华为一起,以更适销的产品、更优的渠道体系、营销体系、市场回报成就伙伴,服务好更多行业客户。”张俊朋最后强调说。
从三合实业和华为一起走过的十年“风雨同舟路”中,我们看到了三合实业坚定选择华为之后,始终以不惧挑战、不畏艰难的心态勇敢向前,由此不仅为三合实业的持续发展找到了“确定性”,同时也让公司实现了成长和蜕变,更在这个数智化时代,成功和华为打造了共生共赢、相互成就的生态合作模式“新典范”。
申耀的科技观察,由资深科技媒体人申斯基创办,20+年企业级科技内容传播工作经验,长期专注产业互联网、企业数智化、ICT基础设施、汽车科技等内容的观察和思考。
❤ 解析若依框架之前台修改 1、ruoyi修改页面标题-网页logo-页面标题-登录名称 一般在vue项目public文件夹下命名为“favicon.ico”
❤ 处理步骤
第1步:将图标重命名为“favicon.ico”,并放在项目根目录 下。
第2步:然后在index.html中引入,title中修改页面标题。
第3步:修改build文件夹下 webpack .dev.conf.js和webpack.prod.conf.js文件中的内容。
第五步:重新已经成功
修改网页上的logo ruoyi-ui --> public --> favicon.ico,把这个图片换成你自己的logo
修改网页标题 根目录下的vue.config.js
const name = process.env.VUE_APP_TITLE || ‘若依管理系统’ // 网页标题
换成自己网站标题
修改页面中的logo ruoyi-ui --> src --> assets --> logo --> logo.png,把这个图片换成你自己的logo
修改页面标题 ruoyi-ui --> src --> layout --> components --> Sidebar --> Logo.vue
title: ‘若依管理系统’, 换成自己网站的名称(或者全局搜索)
修改登录页面名称 ruoyi-ui --> src -->views 下的login.vue文件中的
<h3 class="title">若依后台管理系统</h3> 修改成自己的管理后台名称
修改注册系统页面显示名称 ruoyi-ui --> src -->views 下的register.
目录
代码分享
utils文件
uniapp使用插件使用
zdp-date-picker使用说明
本组件用到了uni-ui的uni-popup弹窗组件
废话不多说直接上代码
代码分享 <template> <view class="content-pop"> <!-- <uni-popup ref="popup" type="bottom"> --> <view class="pop-cont" :class="showCont?'open':''"> <view class="zdp-pop"> <view class="top-cont"> <view class="close-cont" @click="close(1)"> 取消 </view> <!-- 可以自定义显示 --> <slot name="text" :scope="{range,zdpdate}"> <view class="text-info"> 请选择时间 <view> {{selInfo}} </view> </view> </slot> <view class="save-cont" @click="close(2)"> 确认 </view> </view> <view class="tabs-cont"> <view class="tab-list" v-for="item in tabs" :class="item.value==activeIdx?'active':''" @click="handleTabs(item.value)"> {{item.label}} </view> </view> <view class="date-cont"> <picker-view :value="value" @change="handleChange" class="picker-view"> <picker-view-column v-for="obj in SelArr"
经常听一些媒体介绍一些新型的开发语言,所以最近心血来潮,安装了几种感受了一些。
先看名气,如ziglang,网址为:Home ⚡Zig Programming Language 号称是可以取代C语言的一门新语言,其实我主要是受下面这篇文章的影响:Zig 编写的“全家桶” JavaScript 运行时 Bun,性能完爆 Node.js 和 Deno - OSCHINA - 中文开源技术交流社区
Bun是一个要取代大名鼎鼎Node.js的东西,Bun牛啊。而Bun是Zig语言编写的。那看看Zig语言。发现Zig语言还没有发正式版本,截至到2024.07.03,其最新版本还是0.13.0。然后想着写一个TCP的服务程序吧,发现如果用Zig语言自己的标准库中的网络发现,不太好精细的控制socket的特性,如果用Zig语言的C语言接口,发现经常要转换数据类型,虽然Zig语言可以直接使用C语言的结构体,但这种结构体与Zig语言原生的结构体是不兼容的,折腾了半天,发现如果真要写一个高性能的网络程序,还是等Zig语言的标准库成熟之后再说吧,当前还是直接用C语言来写比较方便。
从功能上看,Zig语言今后是有可能取代C语言的,但当前还没有到稳定版本,取代的路还漫漫长。
又看看了北欧大神奥丁语言Odin:Overview | Odin Programming Language
看了看Odin语言,其与golang比较类似,但语法比golang更灵活,这个语言感觉是golang的兄弟,不过我没有更仔细的尝试。
然后又看了看号称是比Python快68000倍的mojo语言,发现其现在主攻方向是AI, 其提供的一键安装的脚本只有 Ubuntu 20.04/22.04 LTS,不支持其它发行版本的Linux,感觉有点low啊。这个语言是由 LLVM 和 Swift 编程语言的联合创始人 Chris Lattner 创办的,名气大,易用性需要改进,成熟度还不够。
在github上还发现了另一款号称可以取代Python语言的语言:
GitHub - exaloop/codon: A high-performance, zero-overhead, extensible Python compiler using LLVM
Codon的运行速度确实比Python快很多,但目前Python很多的库还没有移植过来,估计成熟度还不如mojo语言,但一键安装包没有象mojo语言那样只能在Ubuntu 20.04/22.04上安装,只要下载下来通用的Linux安装跑,就可以跑。
对于初学者,不管是mojo还是Codon取代python看起来还有点早,当前还是把Python学好比较实在。
之前一直喜爱lua语言,还发现一块可以编译成独立程序的lua语言:
Nelua
nelua语言与lua一样小巧,这个语言粗粗试了试,感觉比较值得今后进一步研究。
还发现两款号称试better C的语言:
GitHub - c2lang/c2compiler: the c2 programming language
C3 | An evolution, not a revolution
相信有的小伙伴在刚开始接触linux时,不知道如何把文件上传到linux中,本文介绍两种方式供大家使用(推荐使用第二种)
一.scp传输 scp C:\\..... root@165.3.3.3 /root/..... 使用上述指令,即可实现将制定文件传输到服务器中,其中C…以及/root/…需要换成你自己的路径。165… . . 需要换成服务器的ip地址。
二.使用rz,sz工具 1.工具安装 apt install lrzsz 2.上传文件 上传普通文件 rz 上传压缩包 rz -be 3.下载文件 sz 总结 本文介绍了两种linux与本地文件传输的方法,欢迎大家评论点赞。
众所周知(反正不管你知不知道),kafka-maneger更名了,现在叫cmak!原因是什么呢?据不可靠小道信息说,原kafka-manager这个名字涉及到kafka商标使用问题,应该是被律师函警告了,所以就换名了~
1.下载地址: https://github.com/yahoo/CMAK 下载后,解压后如上图
注:本次下载最新版本包,之前的老版本下载后还需要自己编译代码然后再部署使用,新版不用,根本不用!
2.解压缩后,将解压包放到合适的位置,然后修开配置文件application.conf 修改如下, 红框中的改成自己的集群地址就OK了,如果是本机部署,直接写本机ip
注:kafka-manager.zkhosts后续会废弃掉,可以注释掉,只保留cmak.zkhosts配置
3.启动cmak 进入目录cmak-3.0.0.6/bin下sh cmak
启动成功
4.进入平台 地址:http://172.30.19.168:9000/ 5. 添加add clusters 参数添加:
然后保存就行了
保存完就可以看到下图,红框的内容,第一次部署是没有红框内容的,只有添加完clusters才会出现
6.愉快的使用 7.启动日志报错:Failed to get broker metrics for BrokerIdentity(0,localhost,-1,false,true,Map(PLAINTEXT -> 9092)) 如果报错会影响Mwtrics模块没数据
报错信息: 2024-07-02 19:38:12,373 - [ERROR] - from kafka.manager.actor.cluster.BrokerViewCacheActor in kafka-manager-system-akka.actor.default-dispatcher-8 Failed to get broker metrics for BrokerIdentity(0,localhost,-1,false,true,Map(PLAINTEXT -> 9092)) java.lang.IllegalArgumentException: requirement failed: No jmx port but jmx polling enabled! at scala.Predef$.require(Predef.scala:281) at kafka.manager.jmx.KafkaJMX$.doWithConnection(KafkaJMX.scala:39) at kafka.manager.actor.cluster.BrokerViewCacheActor.$anonfun$updateBrokerMetrics$3(BrokerViewCacheActor.scala:359) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) at scala.
CentOS 7.9 更换源教程 总结
# 下载 wget yum -y install wget # 备份 yum 源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云的yum源到 /etc/yum.repos.d/ # 此处以 CentOS 7 为例,如果是其它版本或者系统的话,请看:http://mirrors.aliyun.com/repo/ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 清除缓存 yum clean all # 更新本地 yum 缓存 yum makecache # 更新 yum 中的所有软件包 yum -y update 以下是步骤!! 查看版本
cat /etc/redhat-release https://blog.csdn.net/XiaoXinYAYAYA/article/details/139620079
CentOS 7是一个使用比较广泛,也比较流行的Linux发行版,但是默认的yum源常常无法满足我们的需求。以下是以阿里源为例的详细换源教程。
1、备份原有源文件 备份原有的源文件,以备不时之需。命令如下:
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、安装依赖工具 sudo yum install -y wget 3、更换源 下载新的源文件,指令如下:
享元模式(Flyweight Pattern)
定义 享元模式通过共享技术来支持大量细粒度的对象,以减少内存中的对象数量。其核心思想是将对象的状态分为内部状态和外部状态,内部状态是不变的,可以被多个对象共享;外部状态是随环境改变而改变的,不能共享,必须由客户端保持。
属于结构型模式。
适用场景 系统有大量相似对象:这些对象除了几个参数外基本相同,可以通过共享来减少内存消耗。需要缓冲池的场景:如数据库连接池、线程池等,通过共享对象池中的对象来提高资源利用率。对象创建成本较高:创建对象的成本较高时,使用享元模式可以减少对象的创建数量,降低成本。 标准示例 Flyweight 抽象的享元角色
这是所有具体享元类的超类,为这些类规定出需要实现的公共接口。通常包含一些与内部状态相关的操作,这些内部状态是可以在多个享元对象之间共享的。
/** * 抽象享元角色 */ public interface IFlyweight { /** * 业务方法 * @param extrinsicState 外在状态 */ void operation(String extrinsicState); } ConcreteFlyweight 具体的享元角色
实现抽象享元角色所规定的接口。如果有内部状态的话,必须负责为内部状态提供存储空间。享元对象的内部状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。
/** * 具体享元角色 */ public class ConcreteFlyweight implements IFlyweight{ //内在状态,内在状态不会改变 private String intrinsicState; public ConcreteFlyweight(String intrinsicState){ this.intrinsicState = intrinsicState; } /** * 业务方法 * @param extrinsicState 外在状态 */ public void operation(String extrinsicState) { System.out.println("Object address:" + System.
【算法-动态规划】斐波那契数列的魔法:第N项的秘密 引言技术概述动态规划:定义与魅力核心特性与优势代码示例 技术细节分析与难点 实战应用优化与改进常见问题 引言 在计算机科学的浩瀚宇宙中,算法如同星辰,指引着程序设计者前行的方向。C++,作为一门高性能的编程语言,其算法技术更是璀璨夺目,尤其是动态规划,它像是数学与逻辑的交响乐,演绎着最优解的旋律。今天,我们将聚焦于一个经典问题——斐波那契数列的第N项求解,通过动态规划的视角,揭开其背后的数学之美和编程之妙。
技术概述 动态规划:定义与魅力 动态规划(Dynamic Programming,简称DP),是一种用于解决最优化问题的算法思想,它通过将原问题分解为互相重叠的子问题,然后自底向上构建解决方案,避免了重复计算,极大地提高了算法的效率。在斐波那契数列的求解中,动态规划展现出了其独特的魅力。
核心特性与优势 避免重复计算:通过存储已计算过的子问题结果,避免了指数级的时间复杂度。自底向上的构建方式:从最简单的子问题开始,逐步构建更复杂问题的解,确保了计算的有序性和效率。通用性强:适用于多种最优化问题,包括但不限于斐波那契数列。 代码示例 #include<iostream> #include<vector> long long fibonacci(int n) { std::vector<long long> dp(n+1, 0); dp[0] = 0; dp[1] = 1; for(int i = 2; i <= n; i++) { dp[i] = dp[i-1] + dp[i-2]; } return dp[n]; } int main() { int n = 10; // 求解斐波那契数列的第10项 std::cout << "The " << n << "th Fibonacci number is: " << fibonacci(n) << std::endl; return 0; } 技术细节 动态规划的核心在于识别和存储子问题的解,对于斐波那契数列而言,每个数是前两个数的和。通过构建一个数组dp,我们能够有效地存储并复用计算结果,从而将原本O(2^n)的时间复杂度降低至O(n)。
目录
一. Kafka介绍
1. 应用场景
2. 版本对比
二. Kafka安装
1. 前置环境
(1)安装JDK
2. 软件安装
(3)环境变量配置
(3)服务启动
三. Console测试
基础命令
(1)列出Kafka集群中所有存在的主题
(3)创建一个新的主题
(3)删除主题
(4)描述主题
(5)启动生产者
(6)启动消费者
四. 注册系统服务
1. Systemd服务配置
2. Kafka服务控制
一. Kafka介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。其持久化层本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,这使它作为企业级基础设施来处理流式数据非常有价值。
1. 应用场景 Kafka可以看作是一个能够处理消息队列的中间件,适用于实时的流数据处理,主要用于平衡好生产者和消费者之间的关系。
生产者 生产者可以看作是数据源,可以来自于日志采集框架,如Flume,也可以来自于其它的流数据服务。当接收到数据后,将根据预设的Topic暂存在Kafka中等待消费。对于接收到的数据将会有额外的标记,用于记录数据的被消费【使用】情况。
消费者 消费者即数据的使用端,可以是一个持久化的存储结构,如Hadoop,也可以直接接入支持流数据计算的各种框架,如Spark - Streaming。消费者可以有多个,通过订阅不同的Topic来获取数据。
2. 版本对比 Kafka的0.x和1.x可以看作是上古版本了,最近的更新也是几年以前,从目前的场景需求来看,也没有什么特别的理由需要使用到这两个版本了。
2.x 在进行版本选择时,通常需要综合考虑整个数据流所设计到的计算框架和存储结构,来确定开发成本以及兼容性。目前2.x版本同样是一个可以用于生产环境的版本,并且保持着对Scala最新版本的编译更新。
3.x 3.x是目前最新的稳定版,需要注意的是,Kafka的每个大版本之间的差异较大,包括命令参数以及API调用,所以在更换版本前需要做好详细的调查与准备,本文以3.x的安装为例。
二. Kafka安装 解压安装的操作方式可以适用于各种主流Linux操作系统,只需要解决好前置环境问题。
1. 前置环境 此前,运行Kafka需要预先安装Zookeeper。在Kafka 2.8.0版本以后,引入了Kraft(Kafka Raft)模式,可以使Kafka在不依赖外部Zookeeper的前提下运行。除此之外Kafka由Scala语言编写,需要JVM的运行环境。
(1)安装JDK Ubuntu/Debian:
sudo apt install openjdk-8-jdk CentOS/RedHat:
sudo yum install java-1.8.0-openjdk 安装完成后可以使用java-version命令验证【可省去环境变量配置】。
在Mac上,默认情况对NTFS磁盘的挂载方式是只读(read-only)的,其实Mac原生是支持NTFS的,但是后来由于微软的限制,苹果把这个功能给屏蔽了,但是我们可以通过命令行方式打开这个选项。
接入移动硬盘后,我们首先查看一下挂载信息
$ sudo mount $ /dev/disk2s1 on /Volumes/新加卷 (ntfs, local, nodev, nosuid, read-only, noowners) 可以看到默认的挂载方式是把磁盘挂载成了只读(read-only)的。
下面我们通过下面的命令来把磁盘挂载成可写的。
$ sudo umount /Volumes/新加卷 $ sudo mount -t ntfs -o rw,auto,nobrowse /dev/disk2s1 /data/mydisk/ 文章来源: Mac挂载NTFS移动硬盘进行读写操作
目录
1.概论
1.1.实现锁的要素
1.2.阻塞队列
1.3.Lock接口和Sync类
2.各种锁
2.1.互斥锁
2.1.1.概论
2.1.2.源码
1.lock()
2.unlock()
2.2.读写锁
2.3.Condition
2.3.1.概论
2.3.2.底层实现
1.概论 1.1.实现锁的要素 JAVA中的锁都是可重入的锁,因为不可重入的试用的时候很容易造成死锁。这个道理很好想明白:
当一个线程已经持有一个锁,并在持有该锁的过程中再次尝试获取同一把锁时,如果没有重入机制,第二次请求会被阻塞,因为锁已经被自己持有。这会导致线程自我死锁,因为它在等待自己释放的锁。
可重入是指获取锁的线程可以继续重复的获得此锁。其实我们想都能想到要实现一把锁需要些什么,首先肯定是:
标志位,也叫信号量,标记锁的状态和重入次数,这样才能完成持有锁和释放锁。
接下来要考虑的是拒接策略,当前锁被持有期间,后续的请求线程该怎么处理,当然可以直接拒绝,JAVA的选择委婉点,选择了允许这些线程躺在锁上阻塞等待锁被释放。要实现让线程躺在锁上等待,我们想想无非要:
需要支持对一个线程的阻塞、唤醒
需要记录当前哪个线程持有锁
需要一个队列维护所有阻塞在当前锁上的线程
OK,以上四点就是JAVA锁的核心,总结起来就是信号量+队列,分别用来记录持有者和等待者。
1.2.阻塞、唤醒操作
首先我们来看看阻塞和唤醒的操作,在JDK中提供了一个Unsafe类,该类中提供了阻塞或唤醒线程的一对操作 原语——park/unpark:
public native void unpark(Object var1); public native void park(boolean var1, long var2); 这对原语最终会调用操作系统的程序接口执行线程操作。
1.2.阻塞队列 拿来维护所有阻塞在当前锁上的线程的队列能是个普通队列吗?很显然不是,它的操作必须是线程安全的是吧,所以这个队列用阻塞队列实现才合适。什么是阻塞队列:
阻塞队列提供了线程安全的元素插入和移除操作,并且在特定条件下会阻塞线程,直到满足操作条件。
说到JDK中的阻塞队列,其核心就是AbstractQueuedSynchronizer,简称AQS,由双向链表实现的一个元素操作绝对安全的队列,用来在锁的实现中维护阻塞在锁上的线程上的队列的这个角色。
来看看AQS的源码:
它有指向前后节点的指针、有一个标志位state、还有一个提供线程操作原原语(阻塞、唤醒)的unsafe类。
所以其实AQS就长这样:
点进源码可以看到其随便一个方法都是线程安全的:
由于本文不是专门聊AQS这里就不扩展了,反正知道AQS是一个线程安全的阻塞队列就对了。
1.3.Lock接口和Sync类 JAVA中所有锁的顶级父接口,用来规范定义一把锁应该有那些行为职责:
public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); } JAVA中所有锁的实现都是依托AQS去作为阻塞队列,每个锁内部都会实现一个Sync内部类,在自身Sync内部以不同的策略去操作AQS实现不同种类的锁。
使用css,让div消失在视野中的方法 display: none;visibility: hidden;opacity:0;通过定位隐藏元素通过margin隐藏元素 display: none; display:none是彻底消失,不在文档流中占位,浏览器也不会解析该元素;
如果给一个元素设置了display: none,那么该元素以及它的所有后代元素都会隐藏,它是前端开发人员使用频率最高的一种隐藏方式。隐藏后的元素无法点击,无法使用屏幕阅读器等辅助设备访问,占据的空间消失。
visibility: hidden; visibility:hidden是视觉上消失了,在文档流中占位,浏览器会解析该元素;
给元素设置visibility: hidden也可以隐藏这个元素,但是隐藏元素仍需占用与未隐藏时一样的空间,也就是说虽然元素不可见了,但是仍然会影响页面布局。
使用visibility:hidden比display:none性能上要好,display:none切换显示时visibility,页面产生回流(当页面中的一部分元素需要改变规模尺寸、布局、显示隐藏等,页面重新构建,此时就是回流。所有页面第一次加载时需要产生一次回流),而visibility切换是否显示时则不会引起回流
CSS3的transition支持visibility属性,但是并不支持display,由于transition可以延迟执行,因此可以配合visibility使用纯css实现hover延时显示效果。提高用户体验。
opacity:0; opacity:0;和visibility:hidden;有些类似,是视觉上消失了,在文档流中占位,浏览器会解析该元素;
opacity:0;不会引起回流;
visibility:hidden; display:none; 不会触发任何事件
opacity可以触发事件如点击事件
通过定位隐藏元素 通过定位隐藏元素会影响布局
通过margin隐藏元素 通过margin隐藏元素会影响布局
在 Visual Studio Code(VSCode)开发C或C++项目时,c_cpp_properties.json 文件是一个非常重要的配置文件,主要由微软提供的 C/C++ 扩展(C/C++ extension from Microsoft)使用。它主要用于配置 IntelliSense(代码自动补全)、代码分析、调试等功能。以下是该文件的作用及其各部分的详细说明。
1. 文件位置 通常,c_cpp_properties.json 文件位于 .vscode 目录中,即:
.vscode/ ├── c_cpp_properties.json └── ... 2. 主要作用 配置 IntelliSense:设置编译器路径、头文件搜索路径等信息,使得 VSCode 能够提供高效的代码补全、代码跳转等功能。配置编译器:指定编译器类型和版本,确保代码分析和调试信息与实际编译器一致。配置调试和运行环境:为不同的操作系统和环境(如 Windows、Linux、macOS)定制不同的编译和运行配置。 3. 配置文件结构 c_cpp_properties.json 文件结构通常如下:
{ "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**" ], "defines": [ "_DEBUG", "UNICODE" ], "compilerPath": "C:/path/to/gcc.exe", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "gcc-x64" } ], "version": 4 } 接下来是对每个配置项的详细说明:
4. 配置项说明 configurations:这是一个配置数组,你可以为不同的平台和环境定义多个配置。 name:配置的名称,例如 Win32, Linux, Mac, Custom 等,方便区分和选择。includePath:头文件搜索路径。在解析代码时,VSCode 会在这些路径中搜索头文件。支持使用占位符和环境变量,如 ${workspaceFolder} 表示当前工作区的根目录,或 ${workspaceFolder}/** 表示递归包含所有子目录。defines:定义预处理器宏。例如 _DEBUG, UNICODE, MY_DEFINE=1 等,模拟编译器预定义宏。compilerPath:指定C/C++编译器的路径,VSCode将使用它来获取编译器相关信息。例如,C:/MinGW/bin/gcc.
1.下载MySQL安装MySQL
选Custom选项为高级自定义模式
2.配置MySQL环境
安装好之后,在桌面右键点击我的电脑(有些是此电脑),然后点击属性,进入系统信息设置,接着点击高级,进入环境变量界面,进入环境变量界面,编辑path变量,输入mysql安装路径下的bin目录,这里的是mysql默认安装目录
步骤1:在桌面上右击【此电脑】图标,在弹出的快捷菜单中选择【属性】菜单命令。
步骤2:打开【系 统】窗口,单击【高级系统设置】链接。
步骤3:打开【系统属性】对话框,选择【高级】选项卡,然 后单击【环境变量】按钮。
步骤4:打开【环境变量】对话框,在系统变量列表中选择path变量。
步骤 5:单击【编辑】按钮,在【编辑环境变量】对话框中,将MySQL应用程序的bin目录 (D:\Program Files\MySQL\MySQL Server 8.0\bin)添加到变量值中,用分号将其与其他路径分隔开。
步骤6:添加完成 之后,单击【确定】按钮,这样就完成了配置path变量的操作,然后就可以直接输入 MySQL命令来登录 数据库了。
在数字化时代,云服务成为了许多开发者和企业不可或缺的工具,而Amazon Web Services(AWS)作为全球领先的云服务提供商,提供了丰富的服务和强大的计算能力。对于初学者或初创企业而言,AWS的“免费套餐”是一个极佳的起点,它允许用户在一年内免费使用一系列基础服务,包括服务器(EC2实例)。本文将指导你如何高效利用AWS的免费套餐,享受一年的免费服务器使用权。
第一步:注册AWS账户
首先,访问AWS官方网站(https://aws.amazon.com/)并点击“创建免费账户”。按照指引完成注册流程,需要提供有效的信用卡信息以验证身份,但不用担心,在不超出免费套餐额度的情况下,AWS不会收取任何费用。
第二步:了解免费套餐详情
注册完成后,务必详细阅读AWS免费套餐的具体内容。该套餐包括但不限于:
t2.micro EC2实例:一个微型的云服务器,适合运行简单的网站、博客或进行轻量级应用开发。Elastic Block Store (EBS)存储:提供一定量的免费存储空间用于EC2实例的数据盘。Amazon RDS免费数据库:可创建一个微型数据库实例,适用于学习和测试。S3存储:提供有限的存储空间,用于存放静态文件等。 第三步:启动你的第一个EC2实例
登录AWS管理控制台,选择“EC2”服务。点击“启动实例”,在实例市场中选择Amazon Linux 2 AMI或Ubuntu等免费操作系统镜像。选择t2.micro实例类型,这是免费套餐支持的实例类型。配置实例详细信息,如安全组设置。为了简单起见,可以创建一个新的安全组,并开放必要的端口(如HTTP 80, HTTPS 443)。添加存储,使用默认的EBS配置即可。完成其他设置后,点击“启动”。如果这是你的首次使用,还需要创建或选择一个密钥对来远程访问实例。 第四步:管理与优化使用
监控资源使用:利用AWS的Cost Explorer工具监控你的服务使用情况,确保不超出免费额度。停止非必要服务:当你不需要使用EC2实例时,记得将其停止而不是终止,这样可以避免不必要的费用。利用AWS免费学习资源:AWS提供了大量免费的培训和认证材料,帮助你更高效地使用其服务。 结语
通过上述步骤,你就可以充分利用AWS的免费套餐,在一年内享受免费的服务器服务。这不仅为个人学习提供了便利,也为初创企业降低了初期成本。记住,合理规划和管理你的云资源是关键,以确保在享受免费服务的同时,避免产生意外费用。AWS的免费套餐是一个绝佳的起点,助你在云计算的道路上迈出坚实的第一步。
目录
一、安装Maven
1、官网下载maven链接地址:Maven – Download Apache Maven
2、下载完成后,解压到某一路径下。E:\JavaTools\apache-maven-3.9.8为例,实际配置环境变量时以自己安装的路径为准。
二、配置环境变量
1、右键此电脑–>属性–>高级系统设置–>环境变量
2、新建变量MAVEN_HOME = E:\JavaTools\apache-maven-3.9.8(以自己的安装路径为准)
3、编辑变量Path,添加变量值%MAVEN_HOME%\bin
4、然后win+R运行cmd,输入mvn -version,如图所示则配置成功
三、配置本地仓库
1、在E:\JavaTools路径下新建maven-repository文件夹,用作maven的本地库。
编辑2、在路径E:\JavaTools\apache-maven-3.9.8\conf下找到settings.xml文件
编辑3、找到节点localRepository,在注释外添加
四、配置仓库下载镜像
1、在settings.xml配置文件中找到mirrors节点
五、配置JDK
1、在settings.xml配置文件中找到profiles节点添加如下配置 jdk-1.8 true 1.8 2、配置完成,win+R运行cmd,输入mvn help:system测试,配置成功则本地仓库(E:\Tools\Maven\maven-repository)中会出现一些文件
六、IDEA配置Maven
1、打开IDEA首页,选择Customize,然后选择All settings...(快捷键 Ctrl+Alt+S 直接进入设置)
编辑
2、在搜索框中输入maven,查找与Maven相关的配置,然后点击Maven
编辑
3、推荐配置:设置Maven在不联网的情况下使用本地插件
4、点击Apply,点击OK,返回主页;
5、查看Settings for New Projects中的配置(未生效需要从新修改)如下图所示:
一、安装Maven 1、官网下载maven链接地址:Maven – Download Apache Maven Binary是可执行版本,已经编译好可以直接使用。Source是源代码版本,需要自己编译成可执行软件才可使用。tar.gz和zip两种压缩格式,其实这两个压缩文件里面包含的内容是同样的,只是压缩格式不同tar.gz格式的文件比zip文件小很多,用于unix操作系统。zip格式用于Windows操作系统,但在Windows系统使用WinRar工具一样能够解压缩tar.gz格式 2、下载完成后,解压到某一路径下。E:\JavaTools\apache-maven-3.9.8为例,实际配置环境变量时以自己安装的路径为准。 二、配置环境变量 1、右键此电脑–>属性–>高级系统设置–>环境变量 2、新建变量MAVEN_HOME = E:\JavaTools\apache-maven-3.9.8(以自己的安装路径为准) 3、编辑变量Path,添加变量值%MAVEN_HOME%\bin 4、然后win+R运行cmd,输入mvn -version,如图所示则配置成功 三、配置本地仓库 1、在E:\JavaTools路径下新建maven-repository文件夹,用作maven的本地库。 2、在路径E:\JavaTools\apache-maven-3.9.8\conf下找到settings.xml文件 3、找到节点localRepository,在注释外添加 <localRepository>E:\JavaTools\maven-repository</localRepository>
localRepository节点用于配置本地仓库,本地仓库其实起到了一个缓存的作用,它的默认地址是 C:\Users\用户名.m2
当我们从maven中获取jar包的时候,maven首先会在本地仓库中查找,如果本地仓库有则返回;如果没有则从远程仓库中获取包,并在本地库中保存。
此外,我们在maven项目中运行mvn install,项目将会自动打包并安装到本地仓库中。