前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[大规模数据集内存计算查询速度提升 ]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
c++
...程中,类是一种抽象的数据类型,它定义了一组属性(变量)和方法(函数),用于描述一类事物的共同特征和行为。在文章中,类被视为搭建程序结构的基本单元,例如通过定义一个Car类,可以描述汽车的颜色、速度等属性以及加速、刹车等行为,从而为后续创建具体对象提供模板。 对象 , 对象是类的实例化产物,它是基于类定义的具体实体。在文章中,对象通过调用类中的方法来执行特定的操作,比如创建一个Car对象后,可以调用其accelerate方法来模拟汽车加速的过程。对象使得抽象的概念得以具象化,便于在程序中进行实际操作和交互。 函数 , 函数是一段可重用的代码块,通常用来执行特定的任务或计算特定的结果。在文章中,函数起到了连接不同类和对象的作用,例如isFaster函数用于比较两个Car对象的速度。函数提高了代码的模块化程度,避免了重复编写相同逻辑,同时也增强了代码的可读性和维护性。
2025-03-25 15:39:59
11
幽谷听泉_
MySQL
...范围内爆发了一起针对数据库系统的网络攻击事件,多家企业的敏感数据遭到泄露,其中不乏一些未妥善配置权限的MySQL实例。这起事件再次提醒我们,权限管理不仅是理论上的重要环节,更是企业在数字化转型过程中的核心安全支柱。尽管MySQL本身提供了强大的权限控制系统,但许多企业在实际部署中往往忽略了权限配置的细节,甚至存在默认账户长期开放、权限过度授予等问题,这些问题在此次攻击中被放大,造成了不可估量的损失。 例如,某知名电商公司在此次事件中被曝出其内部多个数据库的权限设置过于宽松,导致攻击者能够轻松获取管理员权限并窃取大量客户信息。事后调查显示,该公司的数据库运维团队在日常管理中并未严格执行定期审查权限的流程,加之缺乏有效的监控机制,使得潜在风险未能及时暴露。此外,部分企业的开发人员在测试环境中遗留了一些具有高权限的账户,而这些账户在生产环境中未被妥善清理,最终成为攻击者的突破口。 针对此类问题,行业专家建议,企业应建立完善的权限管理体系,不仅要在技术层面实施最小权限原则,还应在制度上明确权限审批和审计流程。同时,定期开展数据库安全评估,利用自动化工具扫描潜在漏洞,确保所有账户和权限的设置符合最佳实践。此外,随着云计算和微服务架构的普及,跨环境的权限协同管理也变得尤为重要,企业需加强对云平台和第三方服务提供商的安全审查,避免因外部依赖引发的风险。 值得注意的是,此次事件并非孤立案例。近年来,数据库权限相关的安全问题频发,暴露出传统安全管理方式的不足。在此背景下,开源社区和技术厂商也在积极推出新的解决方案,比如通过AI驱动的智能权限分析工具,帮助企业实时检测异常行为并预警潜在威胁。这些技术手段的应用,将极大提升数据库安全防护能力,为企业构建更加坚固的数字防线提供支持。
2025-03-18 16:17:13
50
半夏微凉
转载文章
...但作为现代网页开发中提升无障碍性的重要标准,在讨论HTML标签和Web开发时具有相关性。 虚拟DOM , 在前端框架React、Vue.js等中提到的概念,虚拟DOM是一种抽象的数据结构,它将实际的DOM树映射为内存中的轻量级对象表示形式。通过比较前后两次渲染的虚拟DOM差异,框架可以在最小化DOM操作的情况下更新页面,从而提高页面渲染性能并减少不必要的重绘和回流。虽然文章没有涉及虚拟DOM,但在讨论现代Web开发技术和HTML标签的实际应用时,虚拟DOM是一个关键概念。 HTML5不支持的标签 , 随着HTML版本的迭代升级,一些旧版HTML中存在的标签因过时、有更好的替代方案或者不符合现代Web标准等原因,在HTML5及后续版本中不再被推荐或支持。例如,文章提到的<applet>标签用于嵌入Java小程序,但因为安全性和兼容性问题,在HTML5中已被废弃,开发者应采用更安全、更现代的技术实现类似功能。
2023-10-11 23:43:21
297
转载
Groovy
近年来,随着云计算和微服务架构的普及,越来越多的企业开始将目光投向动态语言如Groovy的应用场景。尽管Groovy已经存在多年,但它在现代软件开发中的角色依然不容忽视。特别是在Jenkins等持续集成/持续交付(CI/CD)工具中,Groovy脚本已成为不可或缺的一部分。最近,Jenkins社区宣布对其内置的Pipeline DSL(领域特定语言)进行重大更新,进一步增强了Groovy在CI/CD领域的影响力。 此次更新引入了更强大的表达能力和更高的灵活性,使得开发者能够更高效地编写复杂的流水线作业。例如,新的DSL支持并行任务执行、条件分支以及更为直观的状态监控机制。这对于需要频繁迭代的小型团队尤为有利,他们可以通过简化的脚本来加速项目的交付周期。此外,更新还优化了内存管理策略,减少了长时间运行流水线可能引发的资源消耗问题。 与此同时,另一项值得关注的趋势是Groovy在区块链技术中的应用探索。近期,某知名金融科技公司公开了一篇关于利用Groovy构建智能合约原型的研究报告。报告指出,由于Groovy具备良好的兼容性和扩展性,它可以作为连接传统金融系统与区块链生态的重要桥梁。研究人员通过实验验证了基于Groovy实现的智能合约能够在保证安全性的前提下大幅降低开发成本,并提高了系统的可维护性。 当然,任何技术都不是完美的。尽管Groovy拥有诸多优点,但其性能瓶颈始终是一个绕不开的话题。特别是在高并发环境下,Groovy相较于Java或其他编译型语言可能会显得力不从心。为此,一些创新企业正在尝试结合Groovy与Kotlin等现代化编程语言的优势,打造混合型解决方案。这种做法既保留了Groovy的灵活性,又弥补了其在性能上的不足。 总之,无论是作为CI/CD领域的中坚力量,还是新兴技术领域的探路者,Groovy都在不断适应新的挑战并展现出旺盛的生命力。对于希望提升开发效率、优化项目管理流程的技术人员而言,深入研究Groovy的最新发展无疑具有重要意义。
2025-03-13 16:20:58
62
笑傲江湖
转载文章
...统的编码和算法设计,数据科学、机器学习和人工智能的知识已经成为高级程序员的新标签。他们可能需要理解如何编写和维护复杂的AI模型,或者利用自动化工具进行持续集成和持续部署(CI/CD)。 此外,软技能的提升同样重要,比如跨部门合作、沟通能力、项目管理以及领导力。技术经理不仅需要协调团队,还要懂得如何在快速变化的技术环境中做出明智的战略决策。技术总监则需要具备战略视野,引导公司技术转型,适应数字化和云计算的大趋势。 正如古罗马哲学家塞内卡所说:“技术的进步并非为了使我们摆脱劳动,而是为了让我们能从事更有价值的工作。”未来的程序员,无论在哪个层级,都需要在专业技能和技术领导力上保持与时俱进,以适应行业的变革和创新。
2024-05-10 13:13:48
756
转载
RabbitMQ
...回的东西就像是个装满数据的盒子,但这个盒子是那种普通的字典格式的。可到了4.x版本呢,这玩意儿就有点变了味儿,返回的不再是那个简单的字典盒子了,而是一个“高级定制版”的对象实例,感觉像是升级成了一个有专属身份的小家伙。 因此,每次引入新工具之前,一定要先查阅官方文档,确认其最新的API规范。要是不太确定,不妨试试跑一下官方给的例程代码,看看有没有啥奇怪的表现。 (2)版本锁定的重要性 为了避免类似的问题再次发生,我在后续项目中采取了严格的版本管理策略。例如,在requirements.txt文件中明确指定依赖库的具体版本号,而不是使用通配符(如>=)。这样做的好处是,即使未来出现了更高级别的版本,也不会意外破坏现有功能。 下面是一段示例代码,展示了如何在pip中固定pika的版本为1.2.0: python requirements.txt pika==1.2.0 当然,这种方法也有缺点,那就是升级依赖时可能会比较麻烦。不过嘛,要是咱们团队人不多,但手头的项目特别讲究稳当性,那这个方法绝对值得一试! --- 4. 实战演练 修复旧代码,拥抱新世界 既然明白了问题所在,接下来就是动手解决问题了。嘿,为了让大家更清楚地知道怎么把旧版的API换成新版的,我打算用一段代码来给大家做个示范,保证一看就懂! 假设我们有一个简单的RabbitMQ生产者程序,如下所示: python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World!'") connection.close() 如果你直接运行这段代码,很可能会遇到如下警告: DeprecationWarning: This method will be removed in future releases. Please use the equivalent method on the Channel class. 这是因为queue_declare方法现在已经被重新设计为返回一个包含元数据的对象,而不是单纯的字典。我们需要将其修改为如下形式: python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() result = channel.queue_declare(queue='', exclusive=True) queue_name = result.method.queue channel.basic_publish(exchange='', routing_key=queue_name, body='Hello World!') print(" [x] Sent 'Hello World!'") connection.close() 可以看到,这里新增了一行代码来获取队列名称,同时调整了routing_key参数的赋值方式。这种改动虽然简单,但却能显著提升程序的健壮性和可读性。 --- 5. 总结与展望 从失败中学习,向成功迈进 回想起这次经历,我既感到懊恼又觉得幸运。真后悔啊,当时要是多花点时间去了解API的新变化,就不会在这上面浪费那么多精力了。不过话说回来,这次小挫折也让我学到了教训,以后会更注意避免类似的错误,而且也会更加重视代码的质量。 最后想对大家说一句:技术的世界瞬息万变,没有人能够永远站在最前沿。但只要保持好奇心和学习热情,我们就一定能找到通往成功的道路。毕竟,正如那句经典的话所说:“失败乃成功之母。”只要勇敢面对挑战,总有一天你会发现,那些曾经让你头疼不已的问题,其实都是成长路上不可或缺的一部分。 希望这篇文章对你有所帮助!如果你也有类似的经历或者见解,欢迎随时交流哦~
2025-03-12 16:12:28
106
岁月如歌
Logstash
...来管理和分析海量日志数据。然而,正如文章所提到的,时间戳问题依然是许多用户在使用Logstash时面临的最大挑战之一。这种现象不仅出现在传统IT行业,也在云计算、大数据分析等领域频频出现。例如,最近亚马逊云科技发布的《2023年企业日志管理现状报告》显示,超过60%的企业在日志处理过程中遇到了时间戳不一致的问题,而这直接影响了他们的业务决策效率。 与此同时,国内也有不少企业在实践中摸索出了更为高效的解决方案。以阿里巴巴集团为例,其自主研发的日志服务平台SLS(Log Service)特别针对时间戳处理进行了深度优化。该平台内置了多种时间戳解析算法,并支持用户自定义规则,极大地提升了日志处理的灵活性和准确性。此外,腾讯云也推出了类似的工具,通过引入机器学习技术,能够自动识别日志中的时间戳模式,大幅降低了人工干预的成本。 从更深层面来看,时间戳问题的背后反映了现代企业对实时数据分析需求的增长。随着物联网设备的普及以及边缘计算的兴起,未来日志数据的规模和复杂度将进一步增加。因此,如何构建更加智能、稳定的时间戳处理机制将成为技术领域的重要课题。在此背景下,开源社区的作用愈发凸显。GitHub上活跃的开发者们不断贡献新的插件和补丁,为Logstash等工具注入更多创新元素。例如,最近有人提交了一个名为“DynamicTimestamp”的插件,它可以根据上下文动态调整时间戳格式,为用户提供了一种全新的视角。 值得注意的是,时间戳问题不仅仅局限于技术层面,它还涉及到组织架构和流程设计。一些领先的企业已经开始尝试将日志管理系统与业务流程紧密结合,通过建立跨部门协作机制,确保数据采集、存储和分析的一致性。这种做法不仅提高了工作效率,也为企业的长期发展奠定了坚实的基础。总之,时间戳问题虽看似琐碎,但它却是衡量一家公司技术实力的关键指标之一。在未来,随着技术的进步和社会需求的变化,这一领域的研究必将迎来更加广阔的空间。
2025-05-13 15:58:22
28
林中小径
转载文章
...除等功能。此外,针对数据验证和业务逻辑封装,一些高级ORM库也引入了自定义描述符设计模式,以提供更为灵活且安全的数据访问控制。 另一方面,Python 3.9引入了新的__set_name__方法,该方法适用于描述符对象,以便在描述符被绑定到类属性时通知其宿主类和名称,为描述符提供了更多的上下文信息,增强了其在复杂场景下的适用性和可读性。 同时,随着Python异步编程的发展,一些库也开始尝试将描述符应用于异步环境,比如通过实现异步描述符来控制异步属性的获取和设置,确保在处理并发请求时能够遵循正确的执行顺序,从而提高程序性能和稳定性。 综上所述,描述符作为Python面向对象编程的核心技术之一,其应用正不断拓展深化,并随着Python语言的演进保持着极高的时效性和实用性。对于开发者而言,掌握并合理运用描述符机制不仅能提升代码质量,还能有效应对各种复杂的业务场景需求。
2023-05-07 19:03:49
95
转载
Kafka
...这么一送,它现在在大数据圈子里混得那叫一个风生水起,已经成了整个生态里头离不开的重要角色啦! 作为一个开发者,我对Kafka的第一印象是它超级可靠。无论是高吞吐量、低延迟还是容错能力,Kafka都表现得非常出色。大家有没有想过啊,“可靠”这个词到底是怎么来的?为啥说某个东西“靠谱”,我们就觉得它值得信赖呢?今天咱们就来聊聊这个事儿——比如说,你发出去的消息,咋就能保证它不会石沉大海、人间蒸发了呢?这可不是开玩笑的事儿,尤其是在大数据的世界里,丢一个消息可能就意味着丢了一笔订单或者错过了一次重要沟通。所以啊,今天我们就要揭开谜底,跟大家唠唠Kafka是怎么做到让消息“稳如老狗”的! 2. Kafka可靠性背后的秘密武器 Kafka的可靠性主要依赖于以下几个核心概念: 2.1 持久化与日志结构 Kafka将所有数据存储在日志文件中,并通过持久化机制确保数据不会因为服务器宕机而丢失。简单来说,就是把消息写入磁盘而不是内存。 java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("acks", "all"); props.put("retries", 0); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer producer = new KafkaProducer<>(props); producer.send(new ProducerRecord<>("my-topic", "my-key", "my-value")); producer.close(); 这段代码展示了如何发送一条消息到Kafka主题。其中acks="all"参数表示生产者会等待所有副本确认收到消息后才认为发送成功。 2.2 分区与副本机制 Kafka通过分区(Partition)来分摊负载,同时通过副本(Replica)机制来提高可用性和容错性。每个分区可以有多个副本,其中一个为主副本,其余为从副本。 java AdminClient adminClient = AdminClient.create(props); ListTopicsOptions options = new ListTopicsOptions(); options.listInternal(true); Set topics = adminClient.listTopics(options).names().get(); System.out.println("Topics: " + topics); 这段代码用于列出Kafka集群中的所有主题及其副本信息。通过这种方式,你可以检查每个主题的副本分布情况。 3. 生产者端的可靠性保障 作为生产者,我们需要确保发送出去的消息能够安全到达Kafka集群。这涉及到一些关键配置: - acks:控制生产者的确认级别。设置为"all"时,意味着必须等待所有副本确认。 - retries:指定重试次数。如果网络抖动导致消息未送达,Kafka会自动重试。 - linger.ms:控制批量发送的时间间隔。默认值为0毫秒,即立即发送。 java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("acks", "all"); props.put("retries", 3); props.put("linger.ms", 5); props.put("batch.size", 16384); Producer producer = new KafkaProducer<>(props); for (int i = 0; i < 100; i++) { producer.send(new ProducerRecord<>("my-topic", Integer.toString(i), Integer.toString(i))); } producer.close(); 在这个例子中,我们设置了retries=3和linger.ms=5,这意味着即使遇到短暂的网络问题,Kafka也会尝试最多三次重试,并且会在5毫秒内累积多条消息一起发送。 4. 消费者端的可靠性保障 消费者端同样需要关注可靠性问题。Kafka 有两种消费模式,一个叫 earliest,一个叫 latest。简单来说,earliest 就是从头开始补作业,把之前没看过的消息全都读一遍;而 latest 则是直接从最新的消息开始看,相当于跳过之前的存档,直接进入直播频道。 java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "test-group"); props.put("enable.auto.commit", "true"); props.put("auto.commit.interval.ms", "1000"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Arrays.asList("my-topic")); while (true) { ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord record : records) { System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); } } 这段代码展示了如何订阅一个主题并持续拉取消息。注意这里启用了自动提交功能,这样就不需要手动管理偏移量了。 5. 总结与反思 通过今天的讨论,我相信大家对Kafka的消息可靠性有了更深的理解。Kafka能从一堆消息队列系统里脱颖而出,靠的就是它在设计的时候就脑补了各种“灾难片”场景,比如数据爆炸、服务器宕机啥的,然后还给配齐了神器,专门对付这些麻烦事儿。 然而,正如任何技术一样,Kafka也不是万能的。在实际应用中,我们还需要结合具体的业务需求来调整配置参数。比如说啊,在那种超级忙、好多请求同时涌过来的场景下,就得调整一下每次处理的任务量,别一下子搞太多,慢慢来可能更稳。但要是你干的事特别讲究速度,晚一秒钟都不行的那种,那就得想办法把发东西的时间间隔调短点,越快越好! 总之,Kafka的强大之处在于它允许我们灵活地调整策略以适应不同的工作负载。希望这篇文章能帮助你在实践中更好地利用Kafka的优势!如果你有任何疑问或想法,欢迎随时交流哦~
2025-04-11 16:10:34
96
幽谷听泉
NodeJS
近年来,随着云计算和微服务架构的快速发展,容器化技术已经成为软件开发和运维领域不可或缺的一部分。Docker作为这一领域的领头羊,其影响力不断扩大,尤其是在Node.js社区中,越来越多的开发者开始采用Docker来简化开发、测试和部署流程。近期,一项关于全球开发者技术趋势的调查显示,超过60%的受访者表示他们在过去一年中使用过Docker进行项目管理,其中Node.js开发者占比尤为突出。这种趋势表明,容器化技术正在深刻改变软件开发的方式。 与此同时,Docker公司最近宣布了一项新的开源计划,旨在推动容器技术的标准化和安全性。这一计划名为“Open Container Initiative”(OCI),旨在制定一套通用的标准,使得不同厂商的容器技术能够更好地协同工作。这对于Node.js开发者而言是一个重要的利好消息,因为这意味着未来的Docker镜像将更加兼容,开发者可以更轻松地在不同平台上迁移和共享他们的应用。 此外,随着Kubernetes的兴起,容器编排工具逐渐成为主流。Kubernetes不仅支持Docker容器,还提供了强大的自动化管理能力,使得大规模部署Node.js应用变得更加高效。例如,某知名电商公司在去年成功将其电商平台迁移到基于Kubernetes的Docker容器集群上,不仅提升了系统的稳定性和扩展性,还显著降低了运维成本。 从长远来看,容器化技术将继续推动DevOps文化的普及,促进开发人员和运维团队之间的协作。正如Linux之父Linus Torvalds所说:“开源的本质在于合作而非竞争。”通过拥抱开源技术和社区的力量,开发者可以更快地创新并解决实际问题。对于Node.js开发者而言,掌握Docker和Kubernetes等工具,不仅是技术上的提升,更是职业发展的必要条件。在未来几年,我们有理由相信,容器化技术将在更多领域展现出其独特的价值,为软件行业带来更多的可能性。
2025-05-03 16:15:16
39
海阔天空
Javascript
...,以减少不必要的后台数据同步操作。这一举措显著降低了移动端设备的能耗和内存占用,得到了用户的普遍好评。 与此同时,Google Chrome团队也在最新版本中加强了对AbortError的支持,新增了一项名为“智能取消”的功能。这项功能可以根据用户的操作习惯动态调整未完成请求的优先级,从而提升整体浏览体验。例如,在用户快速切换页面时,系统会自动取消低优先级的任务,确保核心功能的流畅运行。这种技术不仅减少了资源浪费,还大幅缩短了页面加载时间。 从技术角度来看,AbortError的应用不仅仅局限于前端开发。在后端服务中,通过结合WebSocket和AbortSignal,开发者可以实现更高效的实时通信协议。例如,某知名在线教育平台利用这一特性,成功将课堂互动延迟从原来的500毫秒降低到100毫秒以下,极大改善了师生间的协作效率。 此外,随着《通用数据保护条例》(GDPR)在全球范围内的实施,AbortError也被赋予了新的法律意义。在涉及用户隐私的数据传输过程中,合理运用AbortError可以帮助企业更好地遵守法规要求,避免因违规操作而导致的巨额罚款。例如,某跨国科技公司在其云存储服务中引入了基于AbortError的权限管理系统,确保敏感信息在未经授权的情况下无法被访问或下载。 总之,AbortError作为现代Web开发的重要组成部分,正逐步渗透到各个领域。无论是提升用户体验、优化系统性能,还是保障数据安全,它都展现出了巨大的潜力。未来,随着更多创新应用场景的涌现,相信AbortError将在数字世界中发挥更大的作用。
2025-03-27 16:22:54
107
月影清风
转载文章
...以进一步探索当前并行计算技术的发展趋势以及MPI(Message Passing Interface)在现代高性能计算领域中的应用现状。 近年来,随着大数据和人工智能等领域的飞速发展,对计算能力的需求日益增长,MPI作为并行计算的重要通信接口标准,在解决大规模科学计算、机器学习等问题上发挥着关键作用。最新版本的MPICH已支持更多的优化策略和特性,如更好的多核CPU利用、对GPU加速计算的支持以及更高效的网络传输协议,以适应不断变化的高性能计算环境需求。 同时,微软Azure云平台和AWS Amazon EC2等云服务提供商也相继推出了预装MPI的高性能计算实例,用户无需在本地搭建复杂环境,即可直接在云端进行MPI并行程序开发与测试,极大地降低了使用门槛,促进了并行计算技术的普及与应用。 另外,随着跨平台开发需求的增长,开源社区也在积极推动MPICH在Linux、macOS等其他操作系统上的兼容性和性能优化。例如,Microsoft Research团队合作推出的Open MPI项目,旨在提供一个高度可扩展且跨平台的MPI实现,为开发者提供更多选择和灵活性。 此外,对于希望深入了解MPI编程原理及其实战技巧的读者,可以参考《Using MPI - 3rd Edition》这本书,作者详细解析了MPI的各种函数用法,并提供了大量实例代码,是MPI编程入门到精通的绝佳教程资源。 综上所述,无论是从MPI技术的最新进展、云计算环境下的并行计算解决方案,还是深入学习MPI编程的专业书籍推荐,都为那些想要在并行计算领域持续探索和实践的读者提供了丰富的延伸阅读内容。
2023-04-09 11:52:38
114
转载
转载文章
... / 表示 IP 数据包异常 / NIDS_WARN_TCP, / 表示 TCP 数据包异常 / NIDS_WARN_UDP, / 表示 UDP 数据包异常 / NIDS_WARN_SCAN / 表示有扫描攻击发生 / }; enum { NIDS_WARN_UNDEFINED = 0, / 表示未定义 / NIDS_WARN_IP_OVERSIZED, / 表示 IP 数据包超长 / NIDS_WARN_IP_INVLIST, / 表示无效的碎片队列 / NIDS_WARN_IP_OVERLAP, / 表示发生重叠 / NIDS_WARN_IP_HDR, / 表示无效 IP首部 ,IP 数据包发生异常 / NIDS_WARN_IP_SRR, / 表示源路由 IP数据包 / NIDS_WARN_TCP_TOOMUCH, / 表示 TCP 数据个数太多 , 因为在Libnids 中在同一时刻捕获的TCP 个数最大值为 TCP 连接参数的哈西表长度的 3/4/ NIDS_WARN_TCP_HDR, / 表示无效 TCP首部 ,TCP 数据包发生异常 / NIDS_WARN_TCP_BIGQUEUE, / 表示 TCP 接受的队列数据过多 / NIDS_WARN_TCP_BADFLAGS / 表示错误标记 / }; /Libnids 状态描述的是连接的逻辑状态, 真正的 TCP 连接状态有 11种 . TCP_ESTABLISHED TCP 连接建立 , 开始传输数据 TCP_SYN_SEND 主动打开 TCP_SYN_RECV 接受 SYN TCP_FIN_WAIT1 TCP_FIN_WAIT2 TCP_TIME_WAIT TCP_CLOSE TCP_CLOSE_WAIT TCP_LAST_ACK TCP_LISTEN TCP_CLOSING / define NIDS_JUST_EST 1 / 表示 TCP 连接建立 , 在此状态下就可以决定是否对此TCP 连接进行数据分析 , 可以决定是否捕获 TCP客户端接收的数据 ,TCP 服务端接收的数据 ,TCP 客户端接收的紧急数据或者TCP 客户端接收的紧急数据 / define NIDS_DATA 2 / 表示接收数据的状态 ,在这个状态可以判断是否有新的数据到达 ,如果有就可以把数据存储起来 , 可以在这个状态之中来分析 TCP 传输的数据 , 此数据就存储在half_stream 数据接口的缓存之中/ define NIDS_CLOSE 3 / 表示 TCP 连接正常关闭 / define NIDS_RESET 4 / 表是 TCP 连接被重置关闭 / define NIDS_TIMED_OUT 5 / 表示由于超时 TCP连接被关闭 / define NIDS_EXITING 6 / 表示 Libnids正在退出 , 在这个状态下可以最后一次使用存储在 half_stream 数据结构中的缓存数据 / / 校验和 / define NIDS_DO_CHKSUM 0 / 表示告诉 Libnids要计算校验和 / define NIDS_DONT_CHKSUM 1 / 表示告诉 Libnids不要计算校验和 / struct tuple4 / 描述一个地址端口对 , 它表示发送发IP 和端口以及接收方 IP 和端口 , 适用 TCP,UDP/ { u_short source; / 源 IP 地址的端口号/ u_short dest; / 目的 IP 地址的端口号/ u_int saddr; / 源 IP 地址 / u_int daddr; / 目的 IP 地址 / }; struct half_stream / 描述在 TCP 连接中一端的所有信息, 可以是客户端 , 也可以是服务端 / { char state; / 表示套接字的状态 , 也就是TCP 的状态 / char collect; / 可以表示有数据到达 , 此数据存放在data 成员中 , 也可以表示不存储此数据到 data中 , 此数据忽略 . 如果大于0 就存储 , 否则就忽略 / char collect_urg; / 可以表示有紧急数据到达 , 此数据就存放在urgdata 中 , 也可以表示不存储此数据到 urgdata中 , 此速数据忽略 . 如果大于0 就存储 , 否则就忽略 / char data; / 用户存储正常接受到的数据 / int offset; / 表示存储在 data 中数据的第一个字节的偏移量/ int count; / 表示从 TCP 连接开始已经存储到data 中的数据的字节数 / int count_new; / 有多少新的数据存储到 data 中, 如果为 0, 则表示没有新的数据到达 / int bufsize; int rmem_alloc; int urg_count; / 用来存储紧急数据 / u_int acked; u_int seq; u_int ack_seq; u_int first_data_seq; u_char urgdata; //存储紧急数据 u_char count_new_urg; / 表示有新的紧急数据到达 , 如果为0 表示没有新的紧急数据 / u_char urg_seen; //新的urg数据,不是以前重复的数据 u_int urg_ptr;/指向urg在流中的位置/ u_short window; u_char ts_on; u_char wscale_on; u_int curr_ts; u_int wscale; struct skbuff list; struct skbuff listtail; }; struct tcp_stream / 描述一个 TCP 连接的所有信息/ { struct tuple4 addr; char nids_state; struct lurker_node listeners; struct half_stream client; / 表示客户端信息 / struct half_stream server; / 表示服务端信息 / struct tcp_stream next_node; struct tcp_stream prev_node; int hash_index; struct tcp_stream next_time; struct tcp_stream prev_time; int read; struct tcp_stream next_free; }; struct nids_prm / 描述了 Libnids 的一些全局参数信息/ { int n_tcp_streams; / 表示哈西表大小 , 此哈西表用来存放tcp_stream 数据结构 , 默认值 1040.在同一时刻 Libnids 捕获的 TCP 数据包的最大个数必须是此参数值的3/4/ int n_hosts; / 表示哈西表的大小 , 此哈西表用来存储IP 碎片信息的 , 默认值为 256/ char device; / 表示网络接口 ,Libnids 将在此网络接口上捕获数据, 默认值为 NULL. 这样 Libnids将使用 pcap_lookupdev来查找可以用的网络接口 . 如果其值为 all, 表示捕获所有网络接口的数据/ char filename; / 表示用来存储网络数据的捕获文件 , 此文件的类型必须与 Libpcap 类型一致 , 如果设置了文件, 与此同时就应该设置 device 为 NULL,默认值为 NULL/ int sk_buff_size; / 表示的是数据接口 sk_buff 的大小 .sk_buff 是Linux 内核中一个重要的数据结构, 是用来进行数据包排队操作的 , 默认值为 168/ int dev_addon; / 表示在数据结构 sk_buff 中用于网络接口上信息的字节数. 如果是 -1( 默认值 ),那么 Libnids 会根据不同的网络接口进行修正 / void (syslog) (); / 是一个函数指针 , 默认值为nids_syslog() 函数 . 在 syslog函数中可以检测入侵攻击 , 如网络扫描攻击 , 也可以检测一些异常情况, 如无效 TCP 标记 / int syslog_level; / 表示日志等级 , 默认值是LOG_ALERT/ int scan_num_hosts; / 表示一个哈西表的大小 ,( 此哈西表用来存储端口扫描信息) 表示 Libnids 将要检测的同时扫描的端口数据 . 如果其值为 0,Libnids将不提供端口扫描功能 . 默认值 256/ int scan_delay; / 表示在扫描检测中 , 俩端口扫描的间隔时间, 以毫秒来计算 , 缺省值为 3000/ int scan_num_ports; / 表示相同源地址必须扫描的 TCP 端口数目 , 默认值为10/ void (no_mem) (char ); / 是一个函数指针 , 当Libnids 发生内存溢出时被调用/ int (ip_filter) (); / 是一个函数指针 , 此函数可以用来分析IP 数据包 , 当有 IP 数据包到达时 , 此函数就被调用. 如果此函数返回非零值 , 此数据包就被处理 ;如果返回零 , 此 IP 数据包就被丢弃. 默认值为 nids_ip_filter 函数 , 总是返回 1./ char pcap_filter; / 表示过滤规则 , 即Libpcap 的过滤规则 , 默认值为 NULL,表示捕获所有数据包 . 可以在此设置过滤规则 , 只捕获感兴趣的开发包/ int promisc; / 表示网卡模式 , 如果是非零, 就把此网卡设置为混杂模式 ; 否则 , 设为非混杂模式 . 默认值为1/ int one_loop_less; / 初始值为 0/ int pcap_timeout; / 表示捕获数据返回的时间 , 以毫秒计算. 实际上它表示的就是 Libpcap 函数中的 pcap_open_live函数的 timeout 参数 , 默认值 1024/ }; / 返回值 : 调用成功返回 1,失败返回 0 参 数 : 无 功 能 : 对 Libnids 初始化, 这是所有设计基于 Libnids 的程序最开始调用的函数 . 它的主要内容包括打开网络接口 , 打开文件 , 编译过滤规则 , 判断网络链路层类型, 进行必要的初始化工作 / int nids_init (void); / 返回值 : 无 参 数 : 回调函数名字 功 能 : 注册一个能够检测所有 IP 数据包的回调函数, 包括 IP 碎片 .e.g nids_register_ip_frag(ip_frag_function); void ip_frag_function(struct ip a_packet,int len) a_packet 表示接收的IP 数据包 len 表示接收的数据包长度 此回调函数可以检测所有的IP 数据包 , 包括 IP 碎片 / void nids_register_ip_frag (void ()); // / 返回值 : 无 参 数 : 回调函数名字 功 能 : 注册一个回调函数 , 此回调函数可以接收正常的IP 数据包 .e.g nids_register_ip_frag(ip_frag_function); void ip_frag_function(struct ip a_packet) a_packet 表示接收的IP 数据包 此回调函数可以接收正常的IP 数据包 , 并在此函数中对捕获数到的 IP数据包进行分析 . / void nids_register_ip (void ()); // / 返回值 : 无 参 数 : 回调函数 功 能 : 注册一个 TCP 连接的回调函数. 回调函数的类型定义如下 : void tcp_callback(struct tcp_stream ns,void param) ns 表示一个TCP 连接的所有信息 , param 表示要传递的参数信息 , 可以指向一个 TCP连接的私有数据 此回调函数接收的TCP 数据存放在 half_stream 的缓存中 , 应该马上取出来 ,一旦此回调函数返回 , 此数据缓存中存储的数据就不存在 了 .half_stream 成员 offset描述了被丢弃的数据字节数 . 如果不想马上取出来 , 而是等到存储一定数量的数据之后再取出来, 那么可 以使用函数nids_discard(struct tcp_stream ns, int num_bytes)来处理 . 这样回调函数返回时 ,Libnids 将丢弃缓存数据之前 的 num_bytes 字节的数据 .如果不调用 nids_discard()函数 , 那么缓存数据的字节应该为 count_new 字节 . 一般情况下, 缓存中的数据 应该是count-offset 字节 / void nids_register_tcp (void ()); / 返回值 : 无 参 数 : 回调函数 功 能 : 注册一个分析 UDP 协议的回调函数, 回调函数的类型定义如下 : void udp_callback(struct tuple4 addr,char buf,int len,struct ip iph) addr 表示地址端口信息buf 表示 UDP 协议负载的数据内容 len表是 UDP 负载数据的长度 iph 表示一个IP 数据包 , 包括 IP 首部 ,UDP 首部以及UDP 负载内容 / void nids_register_udp (void ()); / 返回值 : 无 参 数 : 表示一个 TCP 连接 功 能 : 终止 TCP 连接 . 它实际上是调用 Libnet的函数进行构造数据包 , 然后发送出去 / void nids_killtcp (struct tcp_stream ); / 返回值 : 无 参 数 : 参数 1 一个 TCP 连接 参数 2 个数 功 能 : 丢弃参数 2 字节 TCP 数据 , 用于存储更多的数据 / void nids_discard (struct tcp_stream , int); / 返回值 : 无 参 数 : 无 功 能 : 运行 Libnids, 进入循环捕获数据包状态. 它实际上是调用 Libpcap 函数 pcap_loop()来循环捕获数据包 / void nids_run (void); / 返回值 : 调用成功返回文件描述符 ,失败返回 -1 参 数 : 无 功 能 : 获得文件描述符号 / int nids_getfd (void); / 返回值 : 调用成功返回个数 ,失败返回负数 参 数 : 表示捕获数据包的个数 功 能 : 调用 Libpcap 中的捕获数据包函数pcap_dispatch() / int nids_dispatch (int); / 返回值 : 调用成功返回 1,失败返回 0 参 数 : 无 功 能 : 调用 Libpcap 中的捕获数据包函数pcap_next() / int nids_next (void); extern struct nids_prm nids_params; /libnids.c定以了一个全部变量 , 其定义和初始值在 nids_params/ extern char nids_warnings[]; extern char nids_errbuf[]; extern struct pcap_pkthdr nids_last_pcap_header; struct nids_chksum_ctl { / 描述的是计算校验和 , 用于决定是否计算校验和/ u_int netaddr; / 表示地址 / u_int mask; / 表示掩码 / u_int action; / 表示动作 , 如果是NIDS_DO_CHKSUM, 表示计算校验和; 如果是 NIDS_DONT_CHKSUM, 表示不计算校验和 / u_int reserved; / 保留未用 / }; / 返回值 : 无 参 数 : 参数 1 表示 nids_chksum_ctl 列表 参数 2 表示列表中的个数 功 能 : 决定是否计算校验和 . 它是根据数据结构nids_chksum_ctl 中的action 进行决定的 , 如果所要计算的对象不在列表中 , 则必须都要计算校验和 / extern void nids_register_chksum_ctl(struct nids_chksum_ctl , int); endif / _NIDS_NIDS_H / 本篇文章为转载内容。原文链接:https://blog.csdn.net/xieqb/article/details/7681968。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-02-08 17:36:31
309
转载
ElasticSearch
...一切看起来都很顺利,数据导入、索引创建啥的都没问题。但当我尝试对某些节点进行操作时,突然蹦出了这么一行错误: org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [SERVICE_UNAVAILABLE/2/no active shards]; 当时我心里那个急啊!赶紧去查文档,发现这是NodeNotActiveException的表现之一。简单说吧,就好比某个关键的小哥突然“罢工”了,可能是因为它内存不够用,或者网络断了啥的,结果整个团队的工作都乱套了,没法正常运转了。 我当时就纳闷了:“这不是应该自动恢复吗?为啥还要报错呢?”后来才明白,虽然ElasticSearch确实有自我修复机制,但有时候我们需要手动干预才能让它恢复正常。 --- 2. 理解背后的逻辑 为什么会出现这种问题? 在深入了解之前,我觉得有必要先搞清楚这个异常的根本原因。其实NodeNotActiveException并不是什么特别复杂的概念,它主要出现在以下几种情况: - 节点宕机:某个节点由于硬件故障或者网络问题离线了。 - 磁盘空间不足:如果某个节点的磁盘满了,ElasticSearch会自动将其标记为不可用。 - 配置错误:比如分配给节点的资源不够,导致其无法启动。 对于我来说,问题出在第二个点上——磁盘空间不足。我当时为了省钱,给服务器分配的空间少得可怜,结果没多久就发现磁盘直接爆满,把自己都吓了一跳!于是ElasticSearch很生气,直接把该节点踢出了集群。 --- 3. 解决方案一 扩容磁盘空间 既然问题找到了,那就动手解决吧!首先,我决定先扩展磁盘容量。这一步其实很简单,只要登录服务器,增加磁盘大小就行。具体步骤如下: bash 查看当前磁盘状态 df -h 扩展磁盘(假设你已经购买了额外的存储) sudo growpart /dev/xvda 1 sudo resize2fs /dev/xvda1 完成后记得重启ElasticSearch服务: bash sudo systemctl restart elasticsearch 重启之后,神奇的事情发生了——我的节点重新上线了!不过这里有个小技巧分享给大家:如果你不确定扩容是否成功,可以通过以下命令检查磁盘使用情况: bash df -h 看到磁盘空间变大了,心里顿时舒坦了不少。 --- 4. 解决方案二 调整ElasticSearch配置 当然啦,仅仅扩容还不够,还需要优化ElasticSearch的配置文件。特别是那些容易导致内存不足或磁盘占用过高的参数,比如indices.memory.index_buffer_size和indices.store.throttle.max_bytes_per_sec。修改后的配置文件大概长这样: yaml cluster.routing.allocation.disk.threshold_enabled: true cluster.routing.allocation.disk.watermark.low: 85% cluster.routing.allocation.disk.watermark.high: 90% cluster.routing.allocation.disk.watermark.flood_stage: 95% cluster.info.update.interval: 30s 这些设置的意思是告诉ElasticSearch,当磁盘使用率达到85%时开始警告,达到90%时限制写入,超过95%时完全停止操作。这样可以有效避免再次出现类似的问题。 --- 5. 实战演练 代码中的应对策略 除了调整配置,我们还可以通过编写脚本来监控和处理NodeNotActiveException。比如,下面这段Java代码展示了如何捕获异常并记录日志: java import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.indices.CreateIndexRequest; import org.elasticsearch.client.indices.CreateIndexResponse; public class ElasticSearchExample { public static void main(String[] args) { RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"))); try { CreateIndexRequest request = new CreateIndexRequest("test_index"); CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); System.out.println("Index created: " + response.isAcknowledged()); } catch (Exception e) { if (e instanceof ClusterBlockException) { System.err.println("Cluster block detected: " + e.getMessage()); } else { System.err.println("Unexpected error: " + e.getMessage()); } } finally { try { client.close(); } catch (IOException ex) { System.err.println("Failed to close client: " + ex.getMessage()); } } } } 这段代码的作用是在创建索引时捕获可能发生的异常,并根据异常类型采取不同的处理方式。如果遇到ClusterBlockException,我们可以选择延迟重试或者其他补偿措施。 --- 6. 总结与反思 成长路上的一课 通过这次经历,我深刻体会到,作为一名开发者,不仅要掌握技术细节,还要学会从实际问题出发,找到最优解。NodeNotActiveException这个错误看着不起眼,但其实背后有不少门道呢!比如说,你的服务器硬件是不是有点吃不消了?集群那边有没有啥小毛病没及时发现?还有啊,咱们平时运维的时候是不是也有点松懈了?这些都是得好好琢磨的地方! 最后,我想说的是,技术学习的过程就像爬山一样,有时候会遇到陡峭的山坡,但只要坚持下去,总能看到美丽的风景。希望这篇文章能给大家带来一些启发和帮助!如果还有其他疑问,欢迎随时交流哦~
2025-03-14 15:40:13
65
林中小径
转载文章
...现与视觉体验得到显著提升。 近期,Mozilla Hacks发布了一篇题为《利用WebAssembly和WebGPU打造高性能网页游戏》的文章,详细介绍了如何借助WebAssembly将C++等编译成可在浏览器中高效运行的代码,从而大幅提升游戏性能。同时,WebGPU作为下一代浏览器图形接口,为开发者提供了低级别的硬件访问权限,可以创建更复杂的3D图形和实时渲染效果,对于消除类游戏这类对响应速度有较高要求的游戏来说具有重大意义。 此外,游戏设计中的AI算法也是值得关注的方向。例如,运用深度学习和强化学习技术优化消除类游戏的智能提示系统,能有效提高玩家体验并延长游戏生命周期。一篇发表在“自然”杂志子刊上的论文就研究了AI在连连看等消除类游戏中的应用,展示了通过机器学习预测最佳消除路径的可能性。 总的来说,在继续深入实践HTML、CSS、JavaScript基础开发的同时,紧跟Web技术前沿进展,结合先进的编程语言、图形处理技术和AI算法,将有助于开发者打造出更为丰富、流畅且富有挑战性的消除类游戏产品,不断满足日益增长的用户体验需求。
2023-06-08 15:26:34
517
转载
转载文章
...Proxy实现复杂的数据绑定与更新逻辑。 此外,浏览器对ES6新特性的支持也在不断推进,当前所有现代浏览器均支持Proxy和Reflect。Mozilla开发者网络(MDN)提供了详尽的API文档和技术指南,帮助开发者更好地掌握这两个特性,并应用于日常开发工作中。 同时,在前端框架领域,除了Vue之外,React Hooks的useState和useEffect也从另一个角度实现了数据响应式,它们通过函数组件状态管理和副作用钩子机制,间接实现了对数据变化的监听。读者可以对比研究两种不同的响应式实现方式,理解它们各自的优势与应用场景。 最近,一些前沿的JavaScript库如MobX、RxJS等也在响应式编程上做出了新的探索,通过更高级的抽象和流处理思想,将响应式理念扩展到了异步编程和大规模应用架构层面。深入学习这些库的设计原理和实践案例,有助于我们拓宽视野,更好地适应未来JavaScript生态的发展趋势。 综上所述,无论是紧跟最新的JavaScript语言特性发展动态,还是深入探究各类前端框架的响应式实现原理,都有助于我们提升代码质量和开发效率,为构建高性能、易于维护的现代Web应用奠定坚实基础。
2023-01-11 12:37:47
680
转载
转载文章
...们了解到内核设计中的数据段共享漏洞可能导致恶意程序攻击其他进程。实际上,近年来,操作系统安全问题一直是全球信息安全领域的焦点话题之一。 近期,微软Windows操作系统的“PrintNightmare”漏洞引起了广泛关注。该漏洞存在于Windows Print Spooler服务中,允许远程攻击者执行任意代码并可能获取系统权限,影响范围涵盖多个Windows版本。研究人员通过发现并公开这一高危漏洞,促使微软紧急发布补丁进行修复,同时也警示我们在操作系统内核及服务设计时,应更加重视权限管理和资源隔离机制的严谨性。 此外,在开源操作系统Linux领域,内核安全团队也持续加强对内核模块加载、内存管理等方面的审查和加固。例如,对控制流强制技术(Control Flow Integrity, CFI)的研究与应用,旨在确保程序执行流程不被恶意篡改,从而降低因数据段共享引发的安全风险。 进一步了解操作系统内核安全可以从学术研究和技术实践两个层面着手。学术上,可查阅《Operating System Security》(由Alessandro Armando和Andrea Lanzi合著)等著作,书中详细解析了操作系统安全基础理论和实战案例;技术实践方面,积极参与开源社区如Linux内核项目的讨论与贡献,有助于紧跟内核安全防护的最新进展,并从中学习如何预防和应对类似本文所述的数据段共享漏洞。 总之,随着网络威胁环境的不断演变,操作系统内核安全的重要性日益凸显,只有不断提升内核安全防护能力,才能有效防范诸如利用全局描述符表漏洞进行的恶意攻击行为,确保用户数据和系统稳定性得到充分保障。
2023-03-14 19:08:07
256
转载
转载文章
...back:接收IMU数据,将IMU数据存到imu_msg_buffer中,这里只会利用开头200帧IMU数据进行静止初始化,不做其他处理。featureCallback:接收双目特征,进行后端处理。利用IMU进行EKF Propagation,利用双目特征进行EKF Update。静止初始化(initializeGravityAndBias):将前200帧加速度和角速度求平均, 平均加速度的模值g作为重力加速度, 平均角速度作为陀螺仪的bias, 计算重力向量(0,0,-g)和平均加速度之间的夹角(旋转四元数), 标定初始时刻IMU系与world系之间的夹角. 因此MSCKF要求前200帧IMU是静止不动的 sudo apt-get install libsuitesparse-devcd ~/catkin_ws/srcgit clone KumarRobotics/msckf_viocd ..catkin_make --pkg msckf_vio --cmake-args -DCMAKE_BUILD_TYPE=Release激活环境变量很关键source /devel/setup.bashroslaunch msckf_vio msckf_vio_euroc.launch注意文件路径rosrun rviz rviz -d rviz/rviz_euroc_config.rviz (改成你自己的rviz文件)rosbag play ~/data/euroc/MH_04_difficult.bag(改成你自己的rosbag文件) 可以看到,s_msckf的输出是没有轨迹的,可以增加如下脚本,将/odom存为/path,在rviz订阅即可可视化轨迹 脚本来自其issue:https://github.com/KumarRobotics/msckf_vio/issues/13 !/usr/bin/env pythonimport rospyfrom nav_msgs.msg import Odometry, Pathfrom geometry_msgs.msg import PoseStampedclass OdomToPath:def __init__(self):self.path_pub = rospy.Publisher('/slz_path', Path, latch=True, queue_size=10)self.odom_sub = rospy.Subscriber('/firefly_sbx/vio/odom', Odometry, self.odom_cb, queue_size=10)self.path = Path()def odom_cb(self, msg):cur_pose = PoseStamped()cur_pose.header = msg.headercur_pose.pose = msg.pose.poseself.path.header = msg.headerself.path.poses.append(cur_pose)self.path_pub.publish(self.path)if __name__ == '__main__':rospy.init_node('odom_to_path')odom_to_path = OdomToPath()rospy.spin() 或者增加一个draw_path的功能包: cpp为: include <stdio.h>include <stdlib.h>include <unistd.h>include <ros/ros.h>include <ros/console.h>include <nav_msgs/Path.h>include <std_msgs/String.h>include <nav_msgs/Odometry.h>include <geometry_msgs/Quaternion.h>include <geometry_msgs/PoseStamped.h>nav_msgs::Path path;ros::Publisher path_pub;ros::Subscriber odomSub;ros::Subscriber odom_raw_Sub;void odomCallback(const nav_msgs::Odometry::ConstPtr& odom){geometry_msgs::PoseStamped this_pose_stamped;this_pose_stamped.header= odom->header;this_pose_stamped.pose = odom->pose.pose;//this_pose_stamped.pose.position.x = odom->pose.pose.position.x;//this_pose_stamped.pose.position.y = odom->pose.pose.position.y;//this_pose_stamped.pose.orientation = odom->pose.pose.orientation;//this_pose_stamped.header.stamp = ros::Time::now();//this_pose_stamped.header.frame_id = "world";//frame_id 是消息中与数据相关联的参考系id,例如在在激光数据中,frame_id对应激光数据采集的参考系 path.header= this_pose_stamped.header;path.poses.push_back(this_pose_stamped);//path.header.stamp = ros::Time::now();//path.header.frame_id= "world";path_pub.publish(path);//printf("path_pub ");//printf("odom %.3lf %.3lf\n",odom->pose.pose.position.x,odom->pose.pose.position.y);}int main (int argc, char argv){ros::init (argc, argv, "showpath");ros::NodeHandle ph;path_pub = ph.advertise<nav_msgs::Path>("/trajectory",10, true);odomSub = ph.subscribe<nav_msgs::Odometry>("/firefly_sbx/vio/odom", 10, odomCallback);//ros::Rate loop_rate(50);while (ros::ok()){ros::spinOnce(); // check for incoming messages//loop_rate.sleep();}return 0;} cmakelists.txt cmake_minimum_required(VERSION 2.8.3)project(draw) Compile as C++11, supported in ROS Kinetic and newer add_compile_options(-std=c++11) Find catkin macros and libraries if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) is used, also find other catkin packagesfind_package(catkin REQUIRED COMPONENTSgeometry_msgsroscpprospystd_msgsmessage_generation)catkin_package( INCLUDE_DIRS include LIBRARIES learning_communicationCATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime DEPENDS system_lib) Build include_directories(include${catkin_INCLUDE_DIRS})add_executable(draw_path draw.cpp)target_link_libraries(draw_path ${catkin_LIBRARIES}) package.xml <?xml version="1.0"?><package><name>draw</name><version>0.0.0</version><description>The learning_communication package</description><!-- One maintainer tag required, multiple allowed, one person per tag --><!-- Example: --><!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --><maintainer email="hcx@todo.todo">hcx</maintainer><!-- One license tag required, multiple allowed, one license per tag --><!-- Commonly used license strings: --><!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --><license>TODO</license><!-- Url tags are optional, but multiple are allowed, one per tag --><!-- Optional attribute type can be: website, bugtracker, or repository --><!-- Example: --><!-- <url type="website">http://wiki.ros.org/learning_communication</url> --><!-- Author tags are optional, multiple are allowed, one per tag --><!-- Authors do not have to be maintainers, but could be --><!-- Example: --><!-- <author email="jane.doe@example.com">Jane Doe</author> --><!-- The _depend tags are used to specify dependencies --><!-- Dependencies can be catkin packages or system dependencies --><!-- Examples: --><!-- Use build_depend for packages you need at compile time: --><!-- <build_depend>message_generation</build_depend> --><!-- Use buildtool_depend for build tool packages: --><!-- <buildtool_depend>catkin</buildtool_depend> --><!-- Use run_depend for packages you need at runtime: --><!-- <run_depend>message_runtime</run_depend> --><!-- Use test_depend for packages you need only for testing: --><!-- <test_depend>gtest</test_depend> --><buildtool_depend>catkin</buildtool_depend><build_depend>geometry_msgs</build_depend><build_depend>roscpp</build_depend><build_depend>rospy</build_depend><build_depend>std_msgs</build_depend><run_depend>geometry_msgs</run_depend><run_depend>roscpp</run_depend><run_depend>rospy</run_depend><run_depend>std_msgs</run_depend><build_depend>message_generation</build_depend><run_depend>message_runtime</run_depend><!-- The export tag contains other, unspecified, tags --><export><!-- Other tools can request additional information be placed here --></export></package> vins_fusion: 双目vio等多系统 mkdir -p vins-catkin_ws/srccd vins-catkin_ws/srcgit clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.gitcd ..catkin_makesource devel/setup.bash按照readme 3.1 Monocualr camera + IMUroslaunch vins vins_rviz.launchrosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml (optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag 3.2 Stereo cameras + IMUroslaunch vins vins_rviz.launchrosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml (optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag 3.3 Stereo camerasroslaunch vins vins_rviz.launchrosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml (optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag<img src="https://github.com/HKUST-Aerial-Robotics/VINS-Fusion/blob/master/support_files/image/euroc.gif" width = 430 height = 240 /> 4. KITTI Example 4.1 KITTI Odometry (Stereo)Download [KITTI Odometry dataset](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) to YOUR_DATASET_FOLDER. Take sequences 00 for example,Open two terminals, run vins and rviz respectively. (We evaluated odometry on KITTI benchmark without loop closure funtion)roslaunch vins vins_rviz.launch(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yamlrosrun vins kitti_odom_test ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/ 4.2 KITTI GPS Fusion (Stereo + GPS)Download [KITTI raw dataset](http://www.cvlibs.net/datasets/kitti/raw_data.php) to YOUR_DATASET_FOLDER. Take [2011_10_03_drive_0027_synced](https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_drive_0027/2011_10_03_drive_0027_sync.zip) for example.Open three terminals, run vins, global fusion and rviz respectively. Green path is VIO odometry; blue path is odometry under GPS global fusion.roslaunch vins vins_rviz.launchrosrun vins kitti_gps_test ~/catkin_ws/src/VINS-Fusion/config/kitti_raw/kitti_10_03_config.yaml YOUR_DATASET_FOLDER/2011_10_03_drive_0027_sync/ rosrun global_fusion global_fusion_node<img src="https://github.com/HKUST-Aerial-Robotics/VINS-Fusion/blob/master/support_files/image/kitti.gif" width = 430 height = 240 /> 5. VINS-Fusion on car demonstrationDownload [car bag](https://drive.google.com/open?id=10t9H1u8pMGDOI6Q2w2uezEq5Ib-Z8tLz) to YOUR_DATASET_FOLDER.Open four terminals, run vins odometry, visual loop closure(optional), rviz and play the bag file respectively. Green path is VIO odometry; red path is odometry under visual loop closure.roslaunch vins vins_rviz.launchrosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/vi_car/vi_car.yaml (optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/vi_car/vi_car.yaml rosbag play YOUR_DATASET_FOLDER/car.bag 本篇文章为转载内容。原文链接:https://blog.csdn.net/slzlincent/article/details/104364909。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-09-13 20:38:56
311
转载
转载文章
...法,使用sudo命令提升执行权限,不过需要由管理员预先进行授权, 指定用户使用某些命令: 2. su命令的用途以及用法: 用途:以其他用户身份(如root)执行授权命令用法:sudo 授权命令 3.配置su的授权(加入wheel组)(pam_wheel认证模块:): 进入授权命令:1.visudo 或者 vim /etc/sudoers语法格式:1.用户 主机名=命令程序列表2.用户 主机名=(用户)命令程序列表-l:列出用户在主机上可用的和被禁止的命令;一般配置好/etc/sudoers后,要用这个命令来查看和测试是不是配置正确的;-v:验证用户的时间戳;如果用户运行sudo后,输入用户的密码后,在短时间内可以不用输入口令来直接进行sudo操作;用-v可以跟踪最新的时间戳;-u:指定以以某个用户执行特定操作;-k:删除时间戳,下一个sudo命令要求用求提供密码; 1.首先创建3个组 2.vim /etc/pam.d/su把第六行注释去掉保存退出 1. 以上两行是默认状态(即开启第一行,注释第二行),这种状态下是允许所有用户间使用su命令进行切换的 2.两行都注释也是运行所有用户都能使用su命令,但root下使用su切换到其他普通用户需要输入密码: 3.如果第–行不注释,则root 使用su切换普通用户就不需要输入密码( pam_ rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码。) 4.如果开启第二行,表示只有root用户和wheel1组内的用户才可以使用su命令。 5.如果注释第一行,开启第二行,表示只有whee1组内的用户才能使用su命令,root用户也被禁用su命令。 3.将liunan加入到wheel之后,hehe就有了使用su命令的权限 4.使用pam_wheel认证后,没有在wheel里的用户都不能再用su 5.whoami命令确定当前用户是谁 4.配置/etc/sudoers文件(授权用户较多的时候使用): visudo单个授权visudo 或者 vim /etc/sudoers记录格式:user MACHINE=COMMANDS可以使用通配符“ ”号任意值和“ !”号进行取反操作。%组名代表一整个组权限生效后,输入密码后5分钟可以不用重新输入密码。例如:visudo命令下user kiro=(root)NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/usermod代表 kiro主机里的user用户,可以无密码使用useradd命令,有密码使用usermod/etc/sudoers多个授权Host_Alias MYHOST= localhost 主机别名:主机名、IP、网络地址、其他主机别名!取反Host_Alias MAILSVRS=smtp,pop(主机名)User_Alias MYUSER = kiro,user1,lisi 用户别名:包含用户、用户组(%组名(使用引导))、还可以包含其他其他已经用户的别名User_Alias OPERATORS=zhangsan,tom,lisi(需要授权的用户)Cmnd_Alias MYCMD = /sbin/,/usr/bin/passwd 命令路劲、目录(此目录内的所有命令)、其他事先定义过的命令别名Cmnd_Alias PKGTOOLS=/bin/rpm,/usr/bin/yum(授权)MYUSER MYHOST = NOPASSWD : MYCMDDS 授权格式sudo -l 查询目前sudo操作查看sudo操作记录需启用Defaults logfile配置默认日志文件: /var/log/sudosudo -l 查看当前用户获得哪些sudo授权(启动日志文件后,sudo操作过程才会被记录) 1.首先用visudo 或者 vim /etc/sudoers进入,输入需要授权的命令 2.切换到taojian用户,因为设置了它不能使用创建用户的命令所以无法创建 六.开关机安全控制 1.调整BIOS引导设置 1.将第一引导设备设为当前系统所在硬盘2.禁止从其他设备(光盘、U盘、网络)引导系统3.将安全级别设为setup,并设置管理员密码 2.GRUB限制 1.使用grub2-mkpasswd-pbkdf2生成密钥2.修改/etclgrub.d/00_header文件中,添加密码记录3.生成新的grub.cfg配置文件 方法一: 通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。grub2-mkpasswd-pbkdf2 根据提示设置GRUB菜单的密码PBKDF2 hash of your password is grub.pbkd..... 省略部分内容为经过加密生成的密码字符串cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak 8cp /etc/grub.d/00_header /etc/grub.d/00_header.bak 9vim /etc/grub.d/00_headercat << EOFset superusers="root" 设置用户名为rootpassword_pbkdf2 root grub.pbkd2..... 设置密码,省略部分内容为经过加密生成的密码字符串EOF16grub2-mkconfig -o /boot/grub2/grub.cfg 生成新的grub.cfg文件重启系统进入GRUB菜单时,按e键将需要输入账号密码才能修改引导参数。 方法二: 1.一步到位2.grub2-setpassword 七.终端以及登录控制 1.限制root只在安全终端登录 安全终端配置文件在 /etc/securetty 2..禁止普通用户登录 1.建立/etc/nologin文件 2.删除nologin文件或重启后即恢复正常 vim /etc/securetty在端口前加号拒绝访问touch /etc/nologin 禁止普通用户登录rm -rf /etc/nologin 取消禁止 八.系统弱口令检测 1.JOHN the Ripper,简称为JR 1.一款密码分析工具,支持字典式的暴力破解2.通过对shadow文件的口令分析,可以检测密码强度3.官网网站:http://www.openwall.com/john/ 2.安装弱口令账号 1.获得Linux/Unix服务器的shadow文件2.执行john程序,讲shadow文件作为参数 3.密码文件的暴力破解 1.准备好密码字典文件,默认为password.lst2.执行john程序,结合--wordlist=字典文件 九.网络端口扫描 1.NMAP 1.—款强大的网络扫描、安全检测工具,支持ping扫描,多端口检测等多种技术。2.官方网站: http://nmap.orgl3.CentOS 7.3光盘中安装包,nmap-6.40-7.el7.x86_64.rpm 2.格式 NMAP [扫描类型] [选项] <扫描目标....> 安装NMAP软件包rpm -qa | grep nmapyum install -y nmapnmap命令常用的选项和扫描类型-p:指定扫描的端口。-n:禁用反向DNS 解析 (以加快扫描速度)。-sS:TCP的SYN扫描(半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。-sT:TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。-sF:TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对SYN数据包进行简单过滤,而忽略了其他形式的TCP attack 包。这种类型的扫描可间接检测防火墙的健壮性。-sU:UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。-sP:ICMP扫描,类似于ping检测,快速判断目标主机是否存活,不做其他扫描。-P0:跳过ping检测,这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法 ping通而放弃扫描。 总结: 1.账号基本安全措施:系统账号处理、密码安全控制、命令历史清理、自动注销 2.用户切换与提权(su、sudo) 3.开关机安全控制(BIOS引导设置、禁止Ctrl+Alt+Del快捷键、GRUB菜单设置密码) 4.终端控制 5.弱口令检测——John the Ripper 6.端口扫描——namp 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_67474417/article/details/123982900。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-05-07 23:37:44
100
转载
转载文章
...和响应,将业务逻辑、数据模型及用户界面分离;而MyBatis是一个优秀的持久层框架,负责与数据库交互,提供SQL语句的映射和结果集的自动转换功能,使得开发者可以更加关注业务逻辑的实现。 B/S结构 , B/S(Browser/Server)架构,即浏览器/服务器架构,是一种典型的网络应用模式。在本文所述的腕表交易系统中,用户的操作主要通过浏览器(Browser)进行,所有的计算和业务逻辑处理都由后台服务器(Server)来完成。用户无需安装特定的客户端软件,只需通过网页访问即可实现对系统的操作和数据交互,具有部署简单、更新方便、跨平台性强等优点。 MySQL数据库 , MySQL是一款开源的关系型数据库管理系统,广泛应用于Web应用开发中。在本文描述的腕表交易系统中,MySQL承担了存储系统运行所需的各种数据的任务,如用户信息、商品详情、订单记录等。其特点是安全性高、性能优越、支持大数据量处理,并且提供了丰富的SQL查询语言接口,便于开发者根据业务需求设计合理的数据库表结构并执行高效的数据库操作。
2023-03-21 18:24:50
67
转载
转载文章
...TreeNode("查询用户"); DefaultMutableTreeNode dmtn_jieyue = new DefaultMutableTreeNode("借阅管理"); DefaultMutableTreeNode dmtn_jieyue_insert = new DefaultMutableTreeNode("增加借阅信息"); DefaultMutableTreeNode dmtn_jieyue_update = new DefaultMutableTreeNode("修改借阅信息"); DefaultMutableTreeNode dmtn_jieyue_delete = new DefaultMutableTreeNode("删除借阅信息"); DefaultMutableTreeNode dmtn_jieyue_select = new DefaultMutableTreeNode("查询借阅信息"); dmtn_yonghu.add(dmtnQieHuan); dmtn_yonghu.add(dmtn_yonghu_insert); dmtn_yonghu.add(dmtn_yonghu_update); dmtn_yonghu.add(dmtn_yonghu_delete); dmtn_yonghu.add(dmtn_yonghu_select); dmtn_jieyue.add(dmtn_jieyue_insert); dmtn_jieyue.add(dmtn_jieyue_update); dmtn_jieyue.add(dmtn_jieyue_delete); dmtn_jieyue.add(dmtn_jieyue_select); dmtn1.add(dmtn_yonghu); dmtn1.add(dmtn_jieyue); JTree1 = new JTree(dmtn1); JTree1.addTreeSelectionListener(new swingJpanelShiJian(this)); JTree1.setBackground(Color.white); jpPinkLeft.setBackground(Color.white); //JTree1.setBounds(10,170,200,450);在这里是一句没效果的代码 jpPinkLeft.add(JTree1); this.add(jpRed);this.add(jpPinkLeft); this.add(jpGreenRightBottom2); this.add(jpBlueRightBottom1); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } class swingJpanelShiJian implements ActionListener, TreeSelectionListener{ //jieShou接收 //chuangTi窗体 public static swingJpanelQieHuan jieShou; public swingJpanelShiJian(swingJpanelQieHuan chuangTi){ jieShou=chuangTi; } @Override public void actionPerformed(ActionEvent arg0) { String neiRong=arg0.getActionCommand(); if(neiRong.equals("点赞界面")){ jieShou.jpBlueRightBottom1.setVisible(true); jieShou.jpGreenRightBottom2.setVisible(false); }else if(neiRong.equals("三连关注界面")){ jieShou.jpBlueRightBottom1.setVisible(false); jieShou.jpGreenRightBottom2.setVisible(true); } } @Override public void valueChanged(TreeSelectionEvent arg0) { DefaultMutableTreeNode str = (DefaultMutableTreeNode) jieShou.JTree1 .getLastSelectedPathComponent(); if (str.toString().equals("切换到登录界面")) { new newDengLu(); } else { } } } JTable初始化表格 package swing; public class mains { public static void main(String[] args) { new swingBiaoGe(); } } package swing; import java.util.Vector; import javax.swing.; import javax.swing.table.DefaultTableModel; public class swingBiaoGe extends JFrame{ //要声明 : 装载内容的容器,table的控件, 容器的标题, 容器的具体的内容。 public static JTable biaoGe=null;//JTable为表格的控件 //要声明装载内容的容器,如下: public static DefaultTableModel DTM=null; //Vector中: //一个放标题,一个放内容 //>表示只接受集合的类型 Vector biaoTi; Vector> neiRong; public swingBiaoGe(){ this.setLayout(null); this.setSize(600,600); this.setLocationRelativeTo(null); //给标题赋值: biaoTi=new Vector(); biaoTi.add("编号");biaoTi.add("姓名"); biaoTi.add("性别");biaoTi.add("年龄"); //给内容赋值: neiRong=new Vector>(); for(int i=0;i<5;i++){ Vector v=new Vector(); v.add("编号"+(i+6));v.add("诗书画唱"+(i+6)); v.add("性别"+(i+6));v.add("年龄"+(i+6)); neiRong.add(v); } //将内容添加到装载内容的容器中: DTM=new DefaultTableModel(neiRong,biaoTi); DTM=new DefaultTableModel(neiRong,biaoTi) { @Override public boolean isCellEditable(int a, int b) { return false; } }; biaoGe=new JTable(DTM); //设置滚动条: JScrollPane jsp=new JScrollPane(biaoGe); jsp.setBounds(10,10,400,400); this.add(jsp); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } JTable初始化数据,数据要求链接JDBC获取 create database yonghu select from shangpin; select from sp_Type; create table sp_Type( sp_TypeID int primary key identity(1,1), sp_TypeName varchar(100) not null ); insert into sp_Type values('水果'); insert into sp_Type values('零食'); insert into sp_Type values('小吃'); insert into sp_Type values('日常用品'); create table shangpin( sp_ID int primary key identity(1,1), sp_Name varchar(100) not null, sp_Price decimal(10,2) not null, sp_TypeID int, sp_Jieshao varchar(300) ); insert into shangpin values('苹果',12,1,'好吃的苹果'); insert into shangpin values('香蕉',2,1,'好吃的香蕉'); insert into shangpin values('橘子',4,1,'好吃的橘子'); insert into shangpin values('娃哈哈',3,2,'好吃营养好'); insert into shangpin values('牙刷',5,4,'全自动牙刷'); package SwingJdbc; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; public class biaoGe extends JFrame { class shiJian implements MouseListener, ActionListener { public biaoGe jieShou = null; public shiJian(biaoGe chuangTi) { this.jieShou = chuangTi; } @Override public void actionPerformed(ActionEvent arg0) { String name = jieShou.wenBenKuangName.getText(); String price = jieShou.wenBenKuangPrice.getText(); String type = jieShou.wenBenKuangTypeId.getText(); String jieshao = jieShou.wenBenKuangJieShao. getText(); String sql = "insert into shangpin values('" + name + "'" + ", " + price + "," + type + ",'" + jieshao + "')"; if (DBUtils.ZSG(sql)) { JOptionPane.showMessageDialog(null, "增加成功"); jieShou.chaxunchushihua(); } else { JOptionPane.showMessageDialog(null, "出现了未知的错误,增加失败"); } } @Override public void mouseClicked(MouseEvent arg0) { if (arg0.getClickCount() == 2) { int row = jieShou.biaoGe1.getSelectedRow(); jieShou.wenBenKuangBianHao .setText(jieShou.biaoGe1.getValueAt( row, 0).toString()); jieShou.wenBenKuangName .setText(jieShou.biaoGe1.getValueAt( row, 1).toString()); jieShou.wenBenKuangPrice .setText(jieShou.biaoGe1.getValueAt( row, 2).toString()); jieShou.wenBenKuangTypeId .setText(jieShou.biaoGe1.getValueAt( row, 3).toString()); jieShou.wenBenKuangJieShao .setText(jieShou.biaoGe1.getValueAt( row, 4).toString()); } if (arg0.isMetaDown()) { int num = JOptionPane.showConfirmDialog(null, "是否确认删除这条信息?"); if (num == 0) { int row = jieShou.biaoGe1 .getSelectedRow(); String sql = "delete shangpin where sp_id=" + jieShou.biaoGe1.getValueAt( row, 0) + ""; if (DBUtils.ZSG(sql)) { JOptionPane.showMessageDialog(null, "册除成功"); jieShou.chaxunchushihua(); } else { JOptionPane.showMessageDialog(null, "出现了未知的错误,请重试"); } } } } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } } static JButton zengJiaAnNiu = null; static DefaultTableModel biaoGeMoXing1 = null; static JScrollPane gunDongTiao = null; static JTable biaoGe1 = null; static JLabel wenZiBianHao, wenZiName, wenZiPrice, wenZiTypeId, wenZiJieShao; static JTextField wenBenKuangBianHao, wenBenKuangName, wenBenKuangPrice, wenBenKuangTypeId, wenBenKuangJieShao; static Vector BiaoTiJiHe = null; static Vector> NeiRongJiHe = null; JPanel mianBan1, mianBan2 = null; public biaoGe() { this.setTitle("登录后的界面"); this.setSize(800, 600); this.setLayout(null); this.setLocationRelativeTo(null); wenZiBianHao = new JLabel("编号"); wenZiName = new JLabel("名称"); wenZiPrice = new JLabel("价格"); wenZiTypeId = new JLabel("类型ID"); wenZiJieShao = new JLabel("介绍"); zengJiaAnNiu = new JButton("添加数据"); zengJiaAnNiu.setBounds(530, 390, 100, 30); zengJiaAnNiu.addActionListener(new shiJian(this)); this.add(zengJiaAnNiu); wenZiBianHao.setBounds(560, 100, 70, 30); wenZiName.setBounds(560, 140, 70, 30); wenZiPrice.setBounds(560, 180, 70, 30); wenZiTypeId.setBounds(560, 220, 70, 30); wenZiJieShao.setBounds(560, 260, 70, 30); this.add(wenZiBianHao); this.add(wenZiName); this.add(wenZiPrice); this.add(wenZiTypeId); this.add(wenZiJieShao); wenBenKuangBianHao = new JTextField(); wenBenKuangBianHao.setEditable(false); wenBenKuangName = new JTextField(); wenBenKuangPrice = new JTextField(); wenBenKuangTypeId = new JTextField(); wenBenKuangJieShao = new JTextField(); wenBenKuangBianHao.setBounds(640, 100, 130, 30); wenBenKuangName.setBounds(640, 140, 130, 30); wenBenKuangPrice.setBounds(640, 180, 130, 30); wenBenKuangTypeId.setBounds(640, 220, 130, 30); wenBenKuangJieShao.setBounds(640, 260, 130, 30); this.add(wenBenKuangBianHao); this.add(wenBenKuangName); this.add(wenBenKuangPrice); this.add(wenBenKuangTypeId); this.add(wenBenKuangJieShao); biaoGeFengZhuangFangFa(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } //biaoGeFengZhuangFangFa表格的封装方法 private void biaoGeFengZhuangFangFa() { BiaoTiJiHe = new Vector(); BiaoTiJiHe.add("编号"); BiaoTiJiHe.add("名称"); BiaoTiJiHe.add("价格"); BiaoTiJiHe.add("类型"); BiaoTiJiHe.add("介绍"); String sql = "select from shangpin"; ResultSet res = DBUtils.Select(sql); try { NeiRongJiHe = new Vector>(); while (res.next()) { Vector v = new Vector(); v.add(res.getInt("sp_ID")); v.add(res.getString("sp_Name")); v.add(res.getDouble("sp_price")); v.add(res.getInt("sp_TypeID")); v.add(res.getString("sp_Jieshao")); NeiRongJiHe.add(v); } biaoGeMoXing1 = new DefaultTableModel(NeiRongJiHe, BiaoTiJiHe) { @Override public boolean isCellEditable(int a, int b) { return false; } }; biaoGe1 = new JTable(biaoGeMoXing1); biaoGe1.addMouseListener(new shiJian(this)); biaoGe1.setBounds(0, 0, 500, 500); gunDongTiao= new JScrollPane(biaoGe1); gunDongTiao .setBounds(0, 0, 550, 150); mianBan1 = new JPanel(); mianBan1.add(gunDongTiao ); mianBan1.setBounds(0, 0, 550, 250); this.add(mianBan1); } catch (SQLException e) { e.printStackTrace(); } } public void chaxunchushihua() { if (this.mianBan1 != null) { this.remove(mianBan1); } biaoGeFengZhuangFangFa(); // 释放资源:this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } package SwingJdbc; import java.sql.; public class DBUtils { static Connection con=null; static Statement sta=null; static ResultSet res=null; //在静态代码块中执行 static{ try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //封装链接数据库的方法 public static Connection getCon(){ if(con==null){ try { con=DriverManager.getConnection ("jdbc:sqlserver://localhost;databaseName=yonghu","qqq","123"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return con; } //查询的方法 public static ResultSet Select(String sql){ con=getCon();//建立数据库链接 try { sta=con.createStatement(); res=sta.executeQuery(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return res; } //增删改查的方法 //返回int类型的数据 public static boolean ZSG(String sql){ con=getCon();//建立数据库链接 boolean b=false; try { sta=con.createStatement(); int num=sta.executeUpdate(sql); //0就是没有执行成功,大于0 就成功了 if(num>0){ b=true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return b; } } package SwingJdbc; public class mains { public static void main(String[] args) { new biaoGe(); } } 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39929646/article/details/114190817。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-01-18 08:36:23
526
转载
转载文章
...升级,从人工智能、云计算到大数据分析,新兴技术领域的崛起为技术人员提供了更为广阔的发展舞台。例如,在字节跳动等头部互联网企业中,技术研发人员不仅能够参与到创新项目中,还可能获得丰厚的股权激励,实现个人财富和职业价值的双重提升(参考《字节跳动员工持股计划:释放的价值与激励机制解读》)。 此外,对于技术人员而言,持续学习与技术积累显得尤为关键。近日,《中国程序员技术能力现状与发展趋势报告》指出,随着容器化、微服务架构的广泛应用,以及Docker、Kubernetes等技术的普及,对底层网络工作原理的理解和应用能力成为衡量开发人员技术水平的重要标准之一。 同时,团队协作与领导力培养也日益受到重视。据《哈佛商业评论》近期文章所述,在现代企业中,具有主动发现问题、解决问题意识,并能带领团队共同创新的技术管理者,往往能在组织内部获得更快的成长和更高的认可度。 综上所述,无论是在选择行业赛道还是在实际工作中,技术人才都应紧跟时代潮流,深化专业技能,积极主动地挖掘潜在问题并寻求解决方案,从而在快速变化的互联网行业中取得长足发展。而类似于张彦飞allen这样的经历分享,无疑为后来者提供了宝贵的经验借鉴和启示。
2023-02-06 11:38:24
233
转载
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
groups user
- 显示指定用户的所属组。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"