前端技术
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
[ClickHouse并发控制机制 ]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
Saiku
...企业应建立跨部门协作机制,确保在危机时刻能够迅速响应,减少损失。 这些案例和观点不仅为企业提供了宝贵的参考,也为Saiku等开源BI工具的用户提供了借鉴。在日常使用过程中,除了关注工具本身的性能优化外,更应该重视系统恢复计划的制定和完善,以应对潜在的风险。通过不断学习和实践,我们可以更好地保护自己的数据资产,确保业务持续稳定运行。
2024-11-18 15:31:47
37
寂静森林
HessianRPC
...下,服务降级和熔断器机制的设计显得尤为重要。实际上,这类问题并不仅仅局限于HessianRPC,而是广泛存在于各类分布式系统中。 例如,今年年初,某知名电商平台在双十一促销期间就遭遇了类似的挑战。由于订单量激增,部分非核心服务出现了延迟甚至宕机的情况。尽管平台迅速启动应急预案,但由于缺乏完善的降级策略,还是对用户体验造成了较大影响。事后复盘发现,主要原因在于系统架构中某些模块未能及时实施服务降级措施,导致整体性能下降。这一事件再次提醒我们,在面对大规模流量冲击时,必须提前做好充分准备。 与此同时,行业内也在积极探索新的解决方案。例如,Spring Cloud Alibaba团队最近发布了一款名为Sentinel的新工具,专门用于解决分布式系统中的限流、熔断等问题。Sentinel不仅支持多种编程语言,还提供了丰富的监控指标和动态调整能力,能够帮助企业更好地应对突发状况。此外,开源社区也涌现出一批优秀的项目,如Resilience4j等,它们借鉴了Netflix Hystrix的设计理念,但在实现上更加轻量化且易于集成。 从长远来看,随着5G、物联网等新技术的发展,未来的应用场景将变得更加复杂多样。这意味着开发者不仅要掌握扎实的技术功底,还需要具备敏锐的洞察力,能够预见潜在风险并采取有效措施加以规避。希望本文提到的经验能够为大家带来启发,在实际工作中避免重蹈覆辙。同时,建议广大技术人员持续关注行业动态,积极学习最新的技术和最佳实践,以不断提升自身的专业水平。
2025-05-01 15:44:28
18
半夏微凉
Apache Lucene
...强调了索引合并和缓存机制的重要性。 同时,Java 17的发布也为开发者提供了新的工具和改进,如更强的类型推断和更好的性能优化。这些新特性使得处理NullPointerException等常见异常变得更加容易,从而提升了代码的质量和稳定性。根据Oracle官方文档,Java 17引入了若干新特性,包括密封类(Sealed Classes)、记录类型(Record Patterns)等,这些都可以帮助开发者更安全地编写代码。 此外,对于那些正在寻找更强大、更易于扩展的搜索解决方案的企业而言,基于Lucene的分布式搜索系统,如Solr和Elasticsearch,正变得越来越受欢迎。这些系统不仅提供了高度的可伸缩性和容错性,还能通过集群管理工具轻松地进行部署和维护。例如,Elasticsearch的官方文档中详细介绍了如何使用Kubernetes进行部署,这为企业提供了更为便捷的解决方案。 综上所述,无论是通过优化现有技术还是采用新兴工具,企业都能够更好地应对大数据时代的挑战,提供更快、更准确的搜索服务。而对于开发者而言,掌握最新的编程语言特性和搜索技术,将有助于他们在竞争激烈的市场中脱颖而出。
2024-10-16 15:36:29
89
岁月静好
转载文章
...实现了较为方便的手动控制,下面对这个过程进行一下梳理。 -------------------------------------------------------------------------------------分界线------------------------------------------------------------------------------------- 1.首先是参考了这一篇文章:https://zhuanlan.zhihu.com/p/336990051 主要介绍了两种方式解决这个问题: 使用racadm温度调控,但是配置教程是Ubuntu16.04下的,过程中有些linux语句在18.04中运行报错,本身对linux就不是很熟,然后我果断放弃。 更新BIOS 和IDRAC,他2022年3月3日通过更新版本,实现了风扇转速的控制,但是我2022年6月,按照他给的下载版本,更新了,发现没用啊??!!回退版本没用,更新版本也没用,就很离谱,难道因为他是2080ti,我是3090的问题??操作步骤如下: 参考该博客对服务器IDRAC配置 https://www.dell.com/support/kbdoc/zh-cn/000177212,查看解决方案中的开机自检期间为F2进行配置 配置好后,在服务器后后面有个IDRAC的网线插口,用网线与笔记本连接,连接成功后会显示未识别网络(如果是红叉的话是没有连接成功,检查上一步,尝试关机重启等),修改IP地址,跟上一步设置的服务器IP在同一网段,不是同一IP!!,比如服务器是192.168.0.120,笔记本可以设置192.168.0.100。(https://new.qq.com/omn/20210119/20210119A01ROV00.html) IE浏览器打开192.168.0.100网址,提示不安全,然后忽略掉,输入账号密码就可以进去了 进去后在下图位置,上传更新文件进行安装。 2.后面又看到一篇博客:https://blog.csdn.net/qq_36810544/article/details/115734795这篇博客比上边那篇早,应该是有参考吧,说是更新版本就行了,然并卵啊,可能是因为他是Ubuntu20.04,我是18.04的原因? 3.最后没招了,用IPMITOOL手动调节吧,参考了博客:https://blog.51cto.com/u_15072918/4392813 这篇博客也是更新后仍然无法识别3090(实际上我下的新版本的IDRAC是可以识别出有GPU的,但是还是显示不可用哇),所以就把IDRAC的版本回退到3.30以下使用IPMITOOL进行行手动调节转速了。 具体步骤如下: 将IDRAC回退到3.30版本,下载地址:https://www.dell.com/support/home/zh-cn/drivers/driversdetails 有的版本IDRAC可能需要把IMPI取消禁用,就在笔记本访问的IP地址的网页里修改即可,应该是在IDRAC设置中,没找到的话应该是不需要操作。 下载IPMITOOLWIN版本程序后解压,终端cd进入该文件夹,然后运行ipmitool命令: 关闭自动控制:ipmitool -I lanplus -U 用户名 -P 密码 -H 服务器地址 raw 0x30 0x30 0x01 0x00 设置风扇转速:ipmitool -I lanplus -U 用户名 -P 密码 -H 192.168.0.120 raw 0x30 0x30 0x02 0xff 0x64 ,最后两位对应16进制的风扇转速。64对应100%。 3.转速现在是可以手动调节了,但是每次都要执行终端命令太麻烦了,然后我写了一个小的gui界面,可以更方便地对风扇转速进行调节。界面如下,可以通过+和-增加和降低风速,也可以设定数值进行Set。 为了防止过热,最低风扇转速设置成了30%。需要注意:这个文件中IDRAC的IP必须是192.168.0.120才可以。 本文就先写到这里了,调节软件如果有需求的话可以后续上传,我在程序中也放了IPMITOOLWIN的文件,不需要再进行下载。有更好的解决方法也欢迎评论区分享。 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_42686221/article/details/125478351。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-02-24 14:29:07
174
转载
转载文章
...0。Spring以其控制反转(IoC)和面向切面编程(AOP)等特性著称,能帮助开发者构建高质量、松耦合的应用系统。在该项目中,Spring负责管理和整合各组件,如数据源配置、事务管理以及集成Mybatis实现业务逻辑层的功能。 DAO(Data Access Object)接口 , 在软件开发领域,DAO是一种设计模式,常用于将底层的数据访问细节与业务逻辑分离。在本文中,创建的UserMapper.java文件就是一个DAO接口示例,定义了一系列与用户表t_user相关的CRUD操作方法,如保存(save)、更新(update)、删除(delete)、按ID查找(findById)以及查询所有用户信息(findAll)。通过这种方式,业务层代码只需调用这些接口方法即可进行数据库操作,无需关心具体的SQL执行细节。 XML映射文件 , 在Mybatis框架中,XML映射文件用于描述SQL语句以及SQL结果如何映射到Java对象上。例如,UserMapper.xml文件就是对UserMapper.java接口中的方法对应的SQL实现,每个方法对应一个SQL片段,并通过 参数名 的方式引用Java方法传递过来的参数,确保SQL执行时能够动态绑定参数值,同时也提供了处理结果集映射到Java对象的方法,实现了ORM(对象关系映射)功能。
2023-09-05 11:56:25
114
转载
转载文章
...先进的动态数据流处理机制,使得大规模实时数据能够得到即时、流畅的可视化展现,尤其适用于金融交易、物联网监控等对时效性要求极高的场景。同时,针对日益增长的无障碍需求,amCharts 5也将改进图表元素的可访问性设计,确保视障用户通过辅助技术也能准确理解数据信息。 此外,amCharts团队正积极与各大开源社区合作,持续丰富地图库资源,并计划将更多开源地理空间数据项目纳入支持范围,让用户能更加便捷地创建符合特定业务需求的地图图表。通过这些升级,amCharts 5旨在巩固其作为行业领先的数据可视化工具的地位,赋能各行业用户高效、精准地洞察并传达复杂数据背后的价值。
2023-09-17 18:18:34
352
转载
Apache Solr
...性使其能够轻松应对高并发访问,保障服务的稳定性和可靠性。 技术趋势与创新 随着人工智能和机器学习技术的发展,Apache Solr正在融合更多智能化元素,提升搜索结果的相关性和个性化推荐能力。例如,通过引入自然语言处理(NLP)算法,Solr能够更好地理解用户查询意图,提供更加智能的搜索建议。此外,Solr还在探索与NoSQL数据库的集成,以实现更高效的数据存储和检索,满足复杂应用场景的需求。 面向未来的挑战与机遇 尽管Apache Solr展现出强大的应用潜力,但未来仍面临诸多挑战,包括如何在日益增长的数据量下保持性能,如何优化跨地域的分布式搜索体验,以及如何在隐私保护日益严格的环境下提供安全的搜索服务等。同时,这也为开发者和研究者提供了广阔的研究空间和创新机会,例如探索基于量子计算的新型搜索算法,或者开发更高效的索引和查询优化技术。 结论 Apache Solr作为现代搜索引擎架构的重要组成部分,其应用与发展趋势紧密关联着信息检索技术的进步。面对不断变化的市场需求和技术挑战,Solr将继续在性能优化、智能化搜索、分布式架构等方面寻求突破,为用户提供更加高效、智能、个性化的搜索体验。随着新技术的不断涌现,Solr有望在未来的搜索领域发挥更为重要的作用,引领搜索引擎技术的发展潮流。 通过以上分析可以看出,Apache Solr不仅在当前的搜索引擎架构中扮演着核心角色,而且在技术趋势和未来应用上展现出了巨大的潜力和可能性。随着科技的不断进步,Apache Solr的应用场景和功能将进一步拓展,为用户提供更加丰富、便捷的信息获取方式。
2024-08-08 16:20:18
138
风中飘零
Spark
...标。 4. 错误重试机制 合理配置Spark任务的重试策略,避免因一次失败而影响整体进程。 5. 性能监控工具 集成性能监控工具(如Prometheus、Grafana)有助于实时监控系统性能,预防内存泄漏等严重问题。 六、总结与展望 日志记录是Spark应用程序开发和维护过程中的关键环节。哎呀,你知道吗?程序员们在遇到bug(小错误)的时候,那可是得使出浑身解数了!他们可不是对着电脑屏幕发呆,而是会仔细地分析问题,就像侦探破案一样。找到问题的源头后,他们就开始了他们的“调试大作战”,就像是医生给病人开药一样精准。通过这些努力,他们能优化代码,让程序跑得更顺畅,就像给汽车加了润滑剂,不仅跑得快,还稳当当的。这样,我们的应用就能更加可靠,用户用起来也更舒心啦!哎呀,你懂的,随着咱们每天产生的数据就像自来水一样哗哗流,那处理这些数据的大数据工具就得越来越厉害才行。特别是那些记录我们操作痕迹的日志管理系统,不仅要快得跟闪电一样,操作起来还得像玩手机游戏一样简单,最好还能自己动脑筋分析出点啥有价值的信息来。这样,未来日志记录这事儿就不仅仅是记录,还能帮我们找到问题、优化流程,简直就是一大神器嘛!所以,你看,这发展方向就是越来越智能、好用、高效,让科技真正服务于人,而不是让人被科技牵着鼻子走。 --- 通过本文的探讨,我们不仅学习了如何理解和利用Spark的日志信息来诊断问题,还了解了一些实用的调试技巧和最佳实践。希望这些内容能帮助你更有效地管理你的Spark应用程序,确保其在复杂的数据处理场景下稳定运行。
2024-09-07 16:03:18
141
秋水共长天一色
Kibana
...分类、存储分级、权限控制等多个方面的综合管理。专家指出,企业应当根据自身业务特点制定个性化的数据保留方案,避免一刀切的做法。例如,对于金融行业的交易记录,可能需要长期保存以便审计追踪;而对于社交媒体平台上的用户评论,则可以根据算法评估其活跃度,定期清理低价值内容。 此外,随着全球范围内数据主权意识的增强,各国政府纷纷出台更为严格的法律法规。欧盟的《通用数据保护条例》(GDPR)就是一个典型代表,它明确规定了个人数据的收集、使用、存储和传输标准,并赋予用户更多的知情权和控制权。在中国,《个人信息保护法》的实施同样对企业提出了更高的合规要求。因此,企业在制定数据保留策略时,必须充分考虑国际国内的法律框架,确保合法合规运营。 总之,数据管理不仅是技术问题,更是战略问题。只有通过科学合理的数据保留策略,才能在保障业务发展的同时,赢得客户信任和社会认可。未来,随着人工智能、区块链等新兴技术的发展,数据管理将迎来更多创新机遇和挑战。企业和机构需要持续关注行业动态,不断提升自身的数据治理能力,以适应快速变化的技术环境。
2025-04-30 16:26:33
19
风轻云淡
转载文章
...ter> 标签控制文本的居中显示,不能在 HTML5 中使用。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>这是一些文本。</p><center>这个文本居中对齐。</center><p>这是一些文本</p></body></html> 20、HTML <button> 标签 <button> 标签用来设置 HTML 中的按钮。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><button type="button" onclick="alert('Hello world!')">Click Me!</button></body></html> 21、HTML <br> 标签 <br> 标签是空标签,可插入一个简单的换行符。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>使用br元素<br>在文本中<br>换行。</p></body></html> 22、HTML <dt> 标签 <dt> 标签只能够作为 <dl> 标签的一个子元素出现,常常后跟一个 <dd> 标签。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><dl><dt>咖啡</dt><dd>黑色的热饮</dd><dt>牛奶</dt><dd>白色的冷饮</dd></dl></body></html> 23、HTML <fieldset> 标签 <fieldset> 标签内的一组表单元素会在 WEB 浏览器中以特殊的方式显示,比如不同样式的边界、3D效果等。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><form><fieldset><legend>个人信息:</legend>姓名: <input type="text"><br>邮箱: <input type="text"><br>生日: <input type="text"></fieldset></form></body></html> 24、HTML <embed> 标签 <embed> 标签用来定义在页面中嵌入的内容,比如插件。比如,在下面的实例中我们嵌入了一个 flash 动画: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><embed src="/statics/demosource/helloworld.swf" tppabs="http://W3Cschool.com/tags/helloworld.swf"></body></html> 25、HTML <font> 标签 - HTML5 不支持 <font> 标签的使用示例如下所示,该标签已经过时,因此我们不建议您使用该标签。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p><font size="3" color="red">这是一些文本!</font></p><p><font size="2" color="blue">这是一些文本!</font></p><p><font face="verdana" color="green">这是一些文本!</font></p></body></html> 26、HTML <label> 标签 <label> 标签是一种常见的表单控件,触发对应表单控件功能,让用户在使用表单的时候能够有更好的体验。参考下述的实例: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>点击其中一个文本标签选中选项:</p><form action="/statics/demosource/demo-form.php"><label for="male">Male</label><input type="radio" name="sex" id="male" value="male"><br><label for="female">Female</label><input type="radio" name="sex" id="female" value="female"><br><br><input type="submit" value="提交"></form></body></html> 记录一些重要标签! 本篇文章为转载内容。原文链接:https://blog.csdn.net/chehec2010/article/details/85060460。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-10-11 23:43:21
297
转载
转载文章
...Audio – 音频控制器◈ Qtransmission – BT 下载工具(Qt 界面版本)◈ Quassel – IRC 客户端◈ ScreenGrab – 截屏制作工具◈ Skanlite – 扫描工具◈ 启动盘创建工具 – USB 启动盘制作工具◈ Trojita – 邮件客户端◈ VLC – 媒体播放器◈ MPV 视频播放器 测试 Lubuntu 20.04 LTS LXQt 版 Lubuntu 的启动时间不到一分钟,虽然是从 SSD 启动的。 LXQt 目前需要的内存比基于 Gtk+ 2 的 LXDE 稍微多一点,但是另一种 Gtk+ 3 工具包也需要更多的内存。 在重新启动之后,系统以非常低的内存占用情况运行,大约只有 340 MB(按照现代标准),比 LXDE 多 100 MB。 LXQt 不仅适用于硬件较旧的用户,也适用于那些希望在新机器上获得简约经典体验的用户。 桌面布局看起来类似于 KDE 的 Plasma 桌面,你觉得呢? 在左下角有一个应用程序菜单,一个用于显示固定和活动的应用程序的任务栏,右下角有一个系统托盘。 Lubuntu 的 LXQt 版本可以很容易的定制,所有的东西都在菜单的首选项下,大部分的关键项目都在 LXQt “设置”中。 值得一提的是,LXQt 在默认情况下使用流行的 Openbox 窗口管理器。 与前三个发行版一样,20.04 LTS 附带了一个默认的黑暗主题 Lubuntu Arc,但是如果不适合你的口味,可以快速更换,也很方便。 就日常使用而言,事实证明,Lubuntu 20.04 向我证明,其实每一个 Ubuntu 的分支版本都完全没有问题。 结论 Lubuntu 团队已经成功地过渡到一个现代的、依然轻量级的、极简的桌面环境。LXDE 看起来被遗弃了,迁移到一个活跃的项目也是一件好事。 我希望 Lubuntu 20.04 能够让你和我一样热爱,如果是这样,请在下面的评论中告诉我。请继续关注! via: https://itsfoss.com/lubuntu-20-04-review/ 作者:Dimitrios Savvopoulos 选题:lujun9972 译者:qfzy1233 校对:wxy 本文由 LCTT 原创编译,Linux中国 荣誉推出 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39539807/article/details/111619265。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-05-17 18:52:15
319
转载
MySQL
...导致核心业务系统在高并发访问时频繁出现“Too many open files”的错误,严重影响用户体验。这一事件引发了业内对于数据库资源管理的关注。 事实上,此类问题并非孤立存在。根据权威机构发布的最新报告显示,近年来因数据库配置不当而导致的服务中断比例逐年上升。特别是在互联网行业,随着微服务架构的普及,单个应用程序可能依赖数十甚至上百个数据库实例,这对数据库的稳定性提出了更高要求。此外,随着人工智能算法模型训练需求的增长,大模型的数据存储与计算任务也给传统数据库带来了前所未有的压力。 针对上述趋势,国内外多家科技公司已经开始探索更加智能化的数据库运维解决方案。例如,谷歌推出的Cloud SQL自动扩展功能可以根据实时流量动态调整资源分配,从而有效缓解类似问题的发生;阿里云则推出了PolarDB-X产品线,专门针对超高并发场景进行了优化设计。这些创新举措表明,未来数据库运维将朝着自动化、智能化方向发展。 与此同时,开源社区也在积极贡献力量。Linux内核开发者近日宣布,将在即将发布的5.18版本中引入一项名为“FD-PIN”的新特性,该特性能够显著提高文件描述符管理效率,为数据库等高性能应用场景提供更多可能性。这无疑为解决“Too many open files”这类经典问题提供了全新思路。 综上所述,无论是从技术演进还是实际案例来看,如何高效管理数据库资源已成为当下亟待解决的重要课题。作为从业者,我们需要紧跟时代步伐,不断学习新技术,同时注重实践经验积累,唯有如此才能更好地应对未来的挑战。
2025-04-17 16:17:44
109
山涧溪流_
转载文章
...提交到运算设备的一种机制,多个queue可以映射到同一个设备。 Parallel kernel Parallel kernel允许代码并行执行,对于一个不具有相关性的循环数据操作,可以用Parallel kernel并行实现 在C++代码中的循环实现 for(int i=0; i < 1024; i++){a[i] = b[i] + c[i];}); 在Parallel kernel中的并行实现 h.parallel_for(range<1>(1024), [=](id<1> i){A[i] = B[i] + C[i];}); 通用的并行编程模板 h.parallel_for(range<1>(1024), [=](id<1> i){// CODE THAT RUNS ON DEVICE }); range用来生成一个迭代序列,1为步长,在循环体中,i表示索引。 Host Accessor Host Accessor是使用主机缓冲区访问目标的访问器,它使访问的数据可以在主机上使用。通过构建Host Accessor可以将数据同步回主机,除此之外还可以通过销毁缓冲区将数据同步回主机。 buf是存储数据的缓冲区。 host_accessor b(buf,read_only); 除此之外还可以将buf设置为局部变量,当系统超出buf生存期,buf被销毁,数据也将转移到主机中。 矢量相加源代码 根据上面的知识,这里展示了利用DPC++实现矢量相加的代码。 //第一行在jupyter中指明了该cpp文件的保存位置%%writefile lab/vector_add.cppinclude <CL/sycl.hpp>using namespace sycl;int main() {const int N = 256;// 初始化两个队列并打印std::vector<int> vector1(N, 10);std::cout<<"\nInput Vector1: "; for (int i = 0; i < N; i++) std::cout << vector1[i] << " ";std::vector<int> vector2(N, 20);std::cout<<"\nInput Vector2: "; for (int i = 0; i < N; i++) std::cout << vector2[i] << " ";// 创建缓存区buffer vector1_buffer(vector1);buffer vector2_buffer(vector2);// 提交矢量相加任务queue q;q.submit([&](handler &h) {// 为缓存区创建访问器accessor vector1_accessor (vector1_buffer,h);accessor vector2_accessor (vector2_buffer,h);h.parallel_for(range<1>(N), [=](id<1> index) {vector1_accessor[index] += vector2_accessor[index];});});// 创建主机访问器将设备中数据拷贝到主机当中host_accessor h_a(vector1_buffer,read_only);std::cout<<"\nOutput Values: ";for (int i = 0; i < N; i++) std::cout<< vector1[i] << " ";std::cout<<"\n";return 0;} 运行结果 统一共享内存 (Unified Shared Memory USM) 统一共享内存是一种基于指针的方法,是将CPU内存和GPU内存进行统一的虚拟化方法,对于C++来说,指针操作内存是很常规的方式,USM也可以最大限度的减少C++移植到DPC++的代价。 下图显示了非USM(左)和USM(右)的程序员开发视角。 类型 函数调用 说明 在主机上可访问 在设备上可访问 设备 malloc_device 在设备上分配(显式) 否 是 主机 malloc_host 在主机上分配(隐式) 是 是 共享 malloc_shared 分配可以在主机和设备之间迁移(隐式) 是 是 USM语法 初始化: int data = malloc_shared<int>(N, q); int data = static_cast<int >(malloc_shared(N sizeof(int), q)); 释放 free(data,q); 使用共享内存之后,程序将自动在主机和运算设备之间隐式移动数据。 数据依赖 使用USM时,要注意数据之间的依赖关系以及事件之间的依赖关系,如果两个线程同时修改同一个内存区,将产生不可预测的结果。 我们可以使用不同的选项管理数据依赖关系: 内核任务中的 wait() 使用 depends_on 方法 使用 in_queue 队列属性 wait() q.submit([&](handler &h) {h.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 2; });}).wait(); // <--- wait() will make sure that task is complete before continuingq.submit([&](handler &h) {h.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 3; });}); depends_on auto e = q.submit([&](handler &h) { // <--- e is event for kernel taskh.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 2; });});q.submit([&](handler &h) {h.depends_on(e); // <--- waits until event e is completeh.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 3; });}); in_order queue property queue q(property_list{property::queue::in_order()}); // <--- this will make sure all the task with q are executed sequentially 练习1:事件依赖 以下代码使用 USM,并有三个提交到设备的内核。每个内核修改相同的数据阵列。三个队列之间没有数据依赖关系 为每个队列提交添加 wait() 在第二个和第三个内核任务中实施 depends_on() 方法 使用 in_order 队列属性,而非常规队列: queue q{property::queue::in_order()}; %%writefile lab/usm_data.cppinclude <CL/sycl.hpp>using namespace sycl;static const int N = 256;int main() {queue q{property::queue::in_order()};//用队列限制执行顺序std::cout << "Device : " << q.get_device().get_info<info::device::name>() << "\n";int data = static_cast<int >(malloc_shared(N sizeof(int), q));for (int i = 0; i < N; i++) data[i] = 10;q.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 2; });q.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 3; });q.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 5; });q.wait();//wait阻塞进程for (int i = 0; i < N; i++) std::cout << data[i] << " ";std::cout << "\n";free(data, q);return 0;} 执行结果 练习2:事件依赖 以下代码使用 USM,并有三个提交到设备的内核。前两个内核修改了两个不同的内存对象,第三个内核对前两个内核具有依赖性。三个队列之间没有数据依赖关系 %%writefile lab/usm_data2.cppinclude <CL/sycl.hpp>using namespace sycl;static const int N = 1024;int main() {queue q;std::cout << "Device : " << q.get_device().get_info<info::device::name>() << "\n";//设备选择int data1 = malloc_shared<int>(N, q);int data2 = malloc_shared<int>(N, q);for (int i = 0; i < N; i++) {data1[i] = 10;data2[i] = 10;}auto e1 = q.parallel_for(range<1>(N), [=](id<1> i) { data1[i] += 2; });auto e2 = q.parallel_for(range<1>(N), [=](id<1> i) { data2[i] += 3; });//e1,e2指向两个事件内核q.parallel_for(range<1>(N),{e1,e2}, [=](id<1> i) { data1[i] += data2[i]; }).wait();//depend on e1,e2for (int i = 0; i < N; i++) std::cout << data1[i] << " ";std::cout << "\n";free(data1, q);free(data2, q);return 0;} 运行结果 UMS实验 在主机中初始化两个vector,初始数据为25和49,在设备中初始化两个vector,将主机中的数据拷贝到设备当中,在设备当中并行计算原始数据的根号值,然后将data1_device和data2_device的数值相加,最后将数据拷贝回主机当中,检验最后相加的和是否是12,程序结束前将内存释放。 %%writefile lab/usm_lab.cppinclude <CL/sycl.hpp>include <cmath>using namespace sycl;static const int N = 1024;int main() {queue q;std::cout << "Device : " << q.get_device().get_info<info::device::name>() << "\n";//intialize 2 arrays on hostint data1 = static_cast<int >(malloc(N sizeof(int)));int data2 = static_cast<int >(malloc(N sizeof(int)));for (int i = 0; i < N; i++) {data1[i] = 25;data2[i] = 49;}// STEP 1 : Create USM device allocation for data1 and data2int data1_device = static_cast<int >(malloc_device(N sizeof(int),q));int data2_device = static_cast<int >(malloc_device(N sizeof(int),q));// STEP 2 : Copy data1 and data2 to USM device allocationq.memcpy(data1_device, data1, sizeof(int) N).wait();q.memcpy(data2_device, data2, sizeof(int) N).wait();// STEP 3 : Write kernel code to update data1 on device with sqrt of valueauto e1 = q.parallel_for(range<1>(N), [=](id<1> i) { data1_device[i] = std::sqrt(25); });auto e2 = q.parallel_for(range<1>(N), [=](id<1> i) { data2_device[i] = std::sqrt(49); });// STEP 5 : Write kernel code to add data2 on device to data1q.parallel_for(range<1>(N),{e1,e2}, [=](id<1> i) { data1_device[i] += data2_device[i]; }).wait();// STEP 6 : Copy data1 on device to hostq.memcpy(data1, data1_device, sizeof(int) N).wait();q.memcpy(data2, data2_device, sizeof(int) N).wait();// verify resultsint fail = 0;for (int i = 0; i < N; i++) if(data1[i] != 12) {fail = 1; break;}if(fail == 1) std::cout << " FAIL"; else std::cout << " PASS";std::cout << "\n";// STEP 7 : Free USM device allocationsfree(data1_device, q);free(data1);free(data2_device, q);free(data2);// STEP 8 : Add event based kernel dependency for the Steps 2 - 6return 0;} 运行结果 本篇文章为转载内容。原文链接:https://blog.csdn.net/MCKZX/article/details/127630566。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-07-22 10:28:50
322
转载
转载文章
...务,如模拟用户输入、控制窗口、处理文件和目录等。在本文中,作者利用win32api模块中的mouse_event和keybd_event函数实现了对鼠标点击、移动以及键盘按键的模拟操作,这对于自动化测试、脚本编写以及需要自动交互的应用场景尤为实用。 用户界面自动化(UI Automation) , 用户界面自动化是一种软件测试方法和技术,旨在通过编写脚本或程序代替人工操作,实现对应用程序用户界面的各种元素(如按钮、文本框、菜单等)进行自动化的点击、输入、验证等交互行为。在本文中,作者通过Python win32api模块模拟键盘和鼠标事件,从而实现在Windows环境下对用户界面的自动化控制,这是用户界面自动化的一种具体实践形式,常用于提高测试效率、减少重复工作并确保软件功能稳定可靠。
2023-06-07 19:00:58
55
转载
Logstash
...能、稳定的时间戳处理机制将成为技术领域的重要课题。在此背景下,开源社区的作用愈发凸显。GitHub上活跃的开发者们不断贡献新的插件和补丁,为Logstash等工具注入更多创新元素。例如,最近有人提交了一个名为“DynamicTimestamp”的插件,它可以根据上下文动态调整时间戳格式,为用户提供了一种全新的视角。 值得注意的是,时间戳问题不仅仅局限于技术层面,它还涉及到组织架构和流程设计。一些领先的企业已经开始尝试将日志管理系统与业务流程紧密结合,通过建立跨部门协作机制,确保数据采集、存储和分析的一致性。这种做法不仅提高了工作效率,也为企业的长期发展奠定了坚实的基础。总之,时间戳问题虽看似琐碎,但它却是衡量一家公司技术实力的关键指标之一。在未来,随着技术的进步和社会需求的变化,这一领域的研究必将迎来更加广阔的空间。
2025-05-13 15:58:22
28
林中小径
ElasticSearch
...ve、impala、clickhouse等大数据计算引擎:鸟枪换炮,其实用作全文索引和搜索的场景并不合适,你可能依旧会使用sql数据库那样用like做交互 2. 方案选择 调研之后,可能会发现对于数据量相对大一点的搜索场景,在当下流行的数据库或计算引擎中,elasticsearch是其中最合适的解决方案。 无论是sql的like、还是mongo的regex,在线上环境下,数据量较多的情况下,都不是很高效的查询,甚至有的公司的dba会禁止在线上使用类似的查询语法。 与elasticsearch是“亲戚”的,大家还常提到lucene、solr,但是无论从现在的发展趋势还是公司运维人才的储备(不得不说当下的运维人才中,对es熟悉的人才会更多一些),elasticsearch是相对较合适的选择。 一些大数据计算引擎,其实更多的适合OLAP场景。当然也完全可以使用,因为比如clickhouse、starrocks等的查询速度已经发展的非常快。但你会发现在中文分词搜索上,实现起来有一定困扰。 所以,如果你不差机器,首选方案还是elasticsearch。 3. elasticsearch的适用场景 3.1 经典的日志搜索场景 提到elasticsearch不得不提到它的几个好朋友: 一些公司里经常用elasticsearch来收集日志,然后用kibana来展示和分析。 展开来说,举个例子,你的app打印日志打印到了线上日志文件,当app出现故障你需要做定位筛查的时候,可能需要登录线上机器用grep命令各种查看。 但如果你不差机器资源,可以搭建上述架构,app的日志会被收集到elasticsearch中,最终你可以在kibana中查看日志,kibana里面可以很方面的做各种筛查操作。 这个流畅大概是这样的: 3.2 通用搜索场景 但是没有上图的beats、logstash、kibana,elasticsearch可以自己工作吗?完全可以的! elasticsearch也支持单机部署,数据规模不是很大的情况下,表现也是不错的。所以,你也不用担心因为自己机器资源不够而对elasticsearch望而却步。当然,单机部署的情况下,更多的适合自己玩,对于可靠性的要求就不能太苛刻了。 如果你在用宝塔,那你可以在宝塔面板,左侧“软件商店”中直接找到elasticsearch,并“没有痛苦”的安装。 本篇文章主要讨论选型,所以不涉及安装细节。 3.2.1 性能顾虑 上面提到了“表现”,其实性能只是elasticsearch的一个方面,主要你的机器资源足够(机器资源?对,包括你的机器个数,elasticsearch可以非常方便的横向扩展,以及单机的配置,cpu+内存,内存越高越好,elasticsearch比较吃内存!),它一定会给你很好的性能反应。试想,公司里的app打印线上日志的行数其实可比一般业务系统产生的订单数量要大很多很多,elasticsearch都可以常在日志的实时分析,所以如果你要做通用场景,而且机器资源不是问题,这是完全行得通的。 3.2.2 易用性和可玩性 此外,在使用elasticsearch的时候,会有很多的可玩性。这里不引经据典,呈现很多elasticsearch官方文章的列举优秀特性(当然,确实很优秀!)。 这里举几个例子: (1)中文分词:第一章提到的其它引擎几乎很难实现,elasticsearch对分词器的支持是原生的,因为elasticsearch天生就为全文索引而生,elasticsearch的汉语名字就是“弹性搜索”。这家伙可是专门搞搜索的! 有的朋友可能不了解分词器,比如你的一个字段里存储“今天我要吃冰激凌”,在分词器的加持下,es最终会存储为“今天|我|要|吃|冰激凌”,并且使用倒排索引的形式进行存储。当你搜索“冰激凌”的时候,可以很快的反馈回来。 关于elasticsearch的原理,这里不展开说明,分词器和倒排索引是elasticsearch的最基本的概念。如果有不了解的朋友,可以自行百度一下。而且这两个概念,与elasticsearch其实不挂钩,是搜索中的通用概念。 关于倒排索引,其核心表现如下图: 如果你要用mysql、mongo实现中文分词,这......其实挺麻烦的,可能在后面的版本支持中会实现的很好,但在当前的流行版本中,它们对中文分词是不够友好的。 mysql5.7之后支持外挂第三方分词器,支持中文分词。而在数据量较大的情况下,mysql的多机器部署几乎很难实现,elasticsearch可以很容易的水平扩展。 mongo支持西方语言的分词,但不支持中文、日语、汉语等东方语言,你需要在自己的逻辑代码中实现分词器。 ngram分词,你看看效果:依旧是“今天我要吃冰激凌”,ngram二元分词后即将得到结果“今天、天我、我要、要吃、吃冰、冰激、激凌”。这....,那你搜索冰激凌就搜不出来!咋办呢,当然可以使用三元分词。但是更好的解决方案还是中文分词器,但它们原生并不支持的。 (2)自定义排名场景:比如你的搜索“冰激凌”,结果中返回了有10条,这10条应该有你想对它指定的顺序。最简单的就是用默认的得分,但是如果你想人为干预这个得分怎么办? elasticsearch支持function_score功能(可以不用,这个是增强功能),es会在计算最终得分之前回调这个你指定的function_score回调函数,传入原始得分、行的原始数据,你可以在里面做计算,比如查询其它参考表、或查看是否是广告位,以得到新的score返回给用户。 function_scrore的功能不展开描述,是一个在自定义得分场景下十分有用又简单易用的功能!下面是一个使用示例,不仅如此,它是支持自定义函数的,自由度非常高。 (3)文本高亮:你用mysql或mongo也可以实现,比如用户搜索“冰激凌”,你只需要在逻辑代码中对“冰激凌”替换为“<span class='highlight-term'>冰激凌</span>”,然后前端做样式即可。但如果用户搜索了“好吃的冰激凌”咋办呢?还有就是英文大小写的场景,用户搜索"MAIN",那结果及时匹配到了“main”(小写的),这个单词是否应该高亮呢?也许这时候你会用业务代码实现toLowerCase下基于位置下标的匹配。 挺麻烦的吧,elasticsearch,自动可以返回高亮字段!并且可以自由指定高亮的html前后标签。 (4)实在太多了....这家伙天生为索引而生,而且版本还在不断地迭代。不差机器的话,用用吧! 4. 退而求其次 4.1 普通数据库 尽管elasticsearch在搜索场景下,是非常好用的利器!但是它比较消耗机器资源,如果你的数据规模并不大,而且想快速实现功能。你可以使用mysql或mongo来代替,完全没有问题。 技术是为了解决特定业务场景下的问题,结合当前手头的资源,适合自己的才是最好的。也许你搞了一个单机器的elasticsearch,单机器内存只有2G,它的表现并不会比mysql、mongo来的好。 当然,如果你为了使用上边提到的一些优秀的独有的特性,那elasticsearch一定还是最佳选择! 对于mysql(关系型数据库)和mongo(文档数据库)的区别这里不展开描述了,但对于搜索而言,两种都合适。有时候选型也不用很纠结,其实都是差不太多的东西,适合自己的、自己熟悉的、运维起来顺手的,就是最好的。 4.2 普通数据库实现中文分词搜索的原理 尽管mysql在5.7以后支持外挂第三方分词器,mongo在截止目前的版本中也不支持中文分词(你可能会看到一些文章中说可以指定language为chinese,但其实会报错的)。 其实当你选择普通数据库,你就不得不在逻辑代码中自己实现一套索引分词+搜索分词逻辑。 索引分词+搜索分词?为什么分开写,如果你有用过elasticsearch或solr,你会知道,在指定字段的时候,需要指定index分词器和search分词器。 下面以mongo为例做简要说明。 4.2.1 index分词器 意思是当数据“索引”截断如何分词。首先,这里必须要承认,数据之后存储了,才能被查询。在搜索中,这句话可以换成是“数据只有被索引了,才能被搜索”。 这时候请求打过来了,要索引一条数据,其中某字段是“今天我要吃冰激凌”,分词后得到“今天|我|要|吃|冰激凌”,这个就可以入库了。 如果你使用elasticsearch或solr,这个过程是自动的。如果你使用不支持外观分词器的常规数据库,这个过程你就要手动了,并把分词后的结果用空格分开(最好使用空格,因为西方语言的分词规则就是按空格拆分,以及逗号句号),存入数据库的一个待搜索的字段上。 效果如下图: 本站的其它博文中有介绍IKAnalyzer:https://www.52itw.com/java/6268.html 4.2.2 search分词器 当用户的查询请求打过来,用户输入了“好吃的冰激凌”,分词后得到“好吃|冰激凌”(“的”作为停用词stopwords,被自动忽略了,IKAnalyzer可以指定停用词表)。 于是这时候就回去上图的数据库表里面搜索“好吃 冰激凌”(与index分词器结果统一,还是用空格分隔)。 当然,对于mongo而言,你需要事先开启全文索引db.xxx.ensureIndex({content: "text"}),xxx是集合名,content是字段名,text是全文索引的标识。 mongo搜索的时候用这个语法:db.xxx.find( { $text: { $search: "好吃 冰激凌" } },{ score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } ) 4.2.3 索引库和存储库分开 为了减少单表的大小,为了让普通的列表查询、普通筛选可以跑的更快,你可以对原有的数据原封不动的做一张表。 然后对于搜索场景,再单独对需要被搜索的字段单独拎一张表出来! 然后二者之间做增量信号同步或定时差额同步,可能会有延迟,这个就看你能容忍多长时间(悄悄告诉你,elasticsearch也需要指定这个refresh时间,一般是1s到几秒、甚至分钟级。当然,二者的这个时间对饮的底层目的是不一样的)。 这样,搜索的时候先查询搜索库,拿到一个指针id的列表,然后拿到指针id的列表区存储里把数据一次性捞出来。当然,也是支持分页的,你查询搜索库其实也是普通的数据库查询嘛,支持分页参数的。 4.3 存储库和索引库的延伸阅读 很多有名的开源软件也是使用的存储库与索引库分离的技术方案,如apache atlas: apache atlas对于大数据领域的数据资产元数据管理、数据血缘上可谓是专家,也涉及资产搜索的特性,它的实现思路就是:从搜索库中做搜索、拿到key、再去存储库中做查询。 搜索库:上图右下角,可以看到使用的是elasticsearch、solr或lucene,多个选一个 存储库:上图左下角,可以看到使用的是Cassandra、HBase或BerkeleyDB,多个选一个 虽然apache atlas在只有搜索库或只有存储库的时候也可以很好的工作,但只针对于数据量并不大的场景。 搜索库,擅长搜索!存储库,擅长海量存储!搜索库多样化搜索,然后去存储库做点查。 当你的数据达到海量的时候,es+hbase也是一种很好的解决方案,不在这里展开说明了。
2024-01-27 17:49:04
540
admin-tim
转载文章
...手给大家分享一下运动控制器之ZMC420SCAN控制器如何操作进行双振镜运动。 一ZMC420SCAN硬件介绍 1.功能介绍 ZMC420SCAN总线控制器支持ECAT/RTEX总线连接,支持最多达20轴运动控制,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等;采用优化的网络通讯协议可以实现实时的运动控制。ZMC420SCAN总线控制器支持脉冲轴/总线轴/振镜轴混合插补。 ZMC420SCAN系列运动控制器支持以太网,RS232通讯接口和电脑相连,接收电脑的指令运行,可以通过CAN总线去连接各个扩展模块,从而扩展输入输出点数或运动轴。 ZMC420SCAN系列运动控制卡的应用程序可以使用VC,VB,VS,C++,C等软件来开发,程序运行时需要动态库zmotion.dll。调试时可以把ZDevelop软件同时连接到控制器,从而方便调试、方便观察。 2.硬件接口 3.振镜控制过程 激光振镜是一种专门用于激光加工领域的特殊的运动器件,激光振镜头内包含的主要元件是激光发生器,两个电机和两个振镜片,它靠两个电机分别控制两个振镜片X和Y反射激光,形成XY平面的运动,这两个电机使用控制器上的振镜轴接口控制。 激光振镜不同于一般的电机,激光振镜具有非常小的惯量,且在运动的过程中负载非常小,只需要带动反射镜片,系统的响应非常快。 ZMC420SCAN支持XY2-100振镜协议,支持运动控制与振镜联合插补运动。 上位机通过网口与控制器相连,通过XY2-100振镜协议进行控制振镜轴的运动,通过总线协议或者脉冲模式控制伺服轴运动。 使用ZMC420SCAN控制器的振镜轴接口连接激光振镜头,每个振镜轴接口内包含两路振镜通道信号,分别控制振镜片X、Y的偏转,从而控制了激光打到工件的位置。 4. 控制器PWM模拟量介绍 ZMC420SCAN的外部通用输出口0-11都具有PWM输出功能,PWM 输出受正常输出功能的控制,只有输出口状态ON的时候PWM才能实际输出,这样可以用来控制激光能量。 ZMC420SCAN控制器存在两路模拟量输入输出,可进行控制激光器能量输出,模拟量精度为12位。(DA采用了内部电源) 5.控制器基本信息 轴0-3为普通脉冲轴,振镜0为轴4、轴5控制振镜XY,振镜1为轴6、轴7控制XY。 二C++ 进行振镜+运动控制开发 1. 新建MFC项目并添加函数库 (1)在VS2015菜单“文件”→“新建”→ “项目”,启动创建项目向导。 (2)选择开发语言为“Visual C++”和程序类型“MFC应用程序”。 (3)点击下一步即可。 (4)选择类型为“基于对话框”,下一步或者完成。 (5)找到厂家提供的光盘资料,路径如下(64位库为例)。 A.进入厂商提供的光盘资料找到“8.PC函数”文件夹,并点击进入。 B.选择“函数库2.1”文件夹。 C.选择“Windows平台”文件夹。 D.根据需要选择对应的函数库这里选择64位库。 E.解压C++的压缩包,里面有C++对应的函数库。 F.函数库具体路径如下。 (6)将厂商提供的C++的库文件和相关头文件复制到新建的项目里面。 (7)在项目中添加静态库和相关头文件。 A.先右击项目文件,接着依次选择:“添加”→“现有项”。 B.在弹出的窗口中依次添加静态库和相关头文件。 (8)声明用到的头文件和定义控制器连接句柄。 至此项目新建完成,可进行MFC项目开发。 2.查看PC函数手册,熟悉相关函数接口 (1)PC函数手册也在光盘资料里面,具体路径如下:“光盘资料\8.PC函数\函数库2.1\ZMotion函数库编程手册 V2.1.pdf” (2)链接控制器,获取链接句柄。 ZAux_OpenEth()接口说明: (3)振镜运动接口。 为振镜运动单独封装了一个运动接口,使用movescanabs指令进行运动,采用FORCE_SPEED参数设置运动过程中的速度,运动过程中基本不存在加减速过程,支持us级别的时间控制。 3. MFC开发控制器双振镜运动例程 (1)例程界面如下。 (2) 链接按钮的事件处理函数中调用链接控制器的接口函数ZAux_OpenEth(),与控制器进行链接,链接成功后启动定时器1监控控制器状态。 //网口链接控制器void CSingle_move_Dlg::OnOpen(){char buffer[256]; int32 iresult;//如果已经链接,则先断开链接if(NULL != g_handle){ZAux_Close(g_handle);g_handle = NULL;}//从IP下拉框中选择获取IP地址GetDlgItemText(IDC_IPLIST,buffer,255);buffer[255] = '\0';//开始链接控制器iresult = ZAux_OpenEth(buffer, &g_handle);if(ERR_SUCCESS != iresult){g_handle = NULL;MessageBox(_T("链接失败"));SetWindowText("未链接");return;}//链接成功开启定时器1SetWindowText("已链接");SetTimer( 1, 100, NULL ); } (3)通过定时器监控控制器状态 。 void CSingle_move_Dlg::OnTimer(UINT_PTR nIDEvent) {// TODO: Add your message handler code here and/or call defaultif(NULL == g_handle){MessageBox(_T("链接断开"));return ;}if(1 == nIDEvent){CString string;float position = 0;ZAux_Direct_GetDpos( g_handle,m_nAxis,&position); //获取当前轴位置string.Format("振镜X1轴位置:%.2f", position );GetDlgItem( IDC_CURPOS )->SetWindowText( string );float NowSp = 0;ZAux_Direct_GetVpSpeed( g_handle,m_nAxis,&NowSp); //获取当前轴速度string.Format("振镜X1轴速度:%.2f", NowSp );GetDlgItem( IDC_CURSPEED)->SetWindowText( string );ZAux_Direct_GetDpos(g_handle, m_nAxis+1, &position); //获取当前轴位置string.Format("振镜Y1轴位置:%.2f", position);GetDlgItem(IDC_CURPOS2)->SetWindowText(string);ZAux_Direct_GetVpSpeed(g_handle, m_nAxis+1, &NowSp); //获取当前轴速度string.Format("振镜Y1轴速度:%.2f", NowSp);GetDlgItem(IDC_CURSPEED2)->SetWindowText(string);ZAux_Direct_GetDpos(g_handle, m_nAxis + 2, &position); //获取当前轴位置string.Format("振镜X2轴位置:%.2f", position);GetDlgItem(IDC_CURPOS3)->SetWindowText(string);NowSp = 0;ZAux_Direct_GetVpSpeed(g_handle, m_nAxis + 2, &NowSp); //获取当前轴速度string.Format("振镜X2轴速度:%.2f", NowSp);GetDlgItem(IDC_CURSPEED3)->SetWindowText(string);ZAux_Direct_GetDpos(g_handle, m_nAxis + 3, &position); //获取当前轴位置string.Format("振镜Y2轴位置:%.2f", position);GetDlgItem(IDC_CURPOS4)->SetWindowText(string);ZAux_Direct_GetVpSpeed(g_handle, m_nAxis + 3, &NowSp); //获取当前轴速度string.Format("振镜Y2轴速度:%.2f", NowSp);GetDlgItem(IDC_CURSPEED4)->SetWindowText(string);int status = 0; ZAux_Direct_GetIfIdle(g_handle, m_nAxis,&status); //判断当前轴状态if (status == -1){GetDlgItem( IDC_CURSTATE )->SetWindowText( "当前状态:停 止" );}else{GetDlgItem( IDC_CURSTATE )->SetWindowText( "当前状态:运动中" );} }CDialog::OnTimer(nIDEvent);} (4)通过启动按钮的事件处理函数获取编辑框的移动轨迹,并设置振镜轴参数操作振镜轴运动。 void CSingle_move_Dlg::OnStart() //启动运动{if(NULL == g_handle){MessageBox(_T("链接断开状态"));return ;}UpdateData(true);//刷新参数int status = 0; ZAux_Direct_GetIfIdle(g_handle, m_nAxis,&status); //判断当前轴状态 if (status == 0) //已经在运动中{ return;} //设定轴类型 1-脉冲轴类型 for (int i = 4; i < 8; i++){ZAux_Direct_SetAtype(g_handle, i, m_Atype);ZAux_Direct_SetMerge(g_handle,i,1);//设置脉冲当量ZAux_Direct_SetUnits(g_handle, i, m_units);//设定速度,加减速ZAux_Direct_SetLspeed(g_handle, i, m_lspeed);ZAux_Direct_SetSpeed(g_handle, i, m_speed);ZAux_Direct_SetForceSpeed(g_handle, i, m_speed);ZAux_Direct_SetAccel(g_handle, i, m_acc);ZAux_Direct_SetDecel(g_handle, i, m_dec);//设定S曲线时间 设置为0表示梯形加减速 ZAux_Direct_SetSramp(g_handle, i, m_sramp);}//使用MOVESCANABS运动int axislist[2] = { 4,5 };float dposlist[2] = { 0,0 };ZAux_MoveScanAbs(2, axislist, dposlist);CString str;GetDlgItem(IDC_EDIT_POSX1)->GetWindowText(str);float dbx = atof(str);GetDlgItem(IDC_EDIT_POSY1)->GetWindowText(str);float dby = atof(str);dposlist[0] = dbx;dposlist[1] = dby;ZAux_MoveScanAbs(2, axislist, dposlist);GetDlgItem(IDC_EDIT_POSX2)->GetWindowText(str);dbx = atof(str);GetDlgItem(IDC_EDIT_POSY2)->GetWindowText(str);dby = atof(str);dposlist[0] = dbx;dposlist[1] = dby;ZAux_MoveScanAbs(2, axislist, dposlist);GetDlgItem(IDC_EDIT_POSX3)->GetWindowText(str);dbx = atof(str);GetDlgItem(IDC_EDIT_POSY3)->GetWindowText(str);dby = atof(str);dposlist[0] = dbx;dposlist[1] = dby;ZAux_MoveScanAbs(2, axislist, dposlist);GetDlgItem(IDC_EDIT_POSX4)->GetWindowText(str);dbx = atof(str);GetDlgItem(IDC_EDIT_POSY4)->GetWindowText(str);dby = atof(str);dposlist[0] = dbx;dposlist[1] = dby;ZAux_MoveScanAbs(2, axislist, dposlist);//第二个振镜运动//使用MOVESCANABS运动axislist[0] = 6;axislist[1] = 7;dposlist[0] = 0;dposlist[1] = 0;ZAux_MoveScanAbs(2, axislist, dposlist);GetDlgItem(IDC_EDIT_POSX5)->GetWindowText(str);dbx = atof(str);GetDlgItem(IDC_EDIT_POSY5)->GetWindowText(str);dby = atof(str);dposlist[0] = dbx;dposlist[1] = dby;ZAux_MoveScanAbs(2, axislist, dposlist);GetDlgItem(IDC_EDIT_POSX6)->GetWindowText(str);dbx = atof(str);GetDlgItem(IDC_EDIT_POSY6)->GetWindowText(str);dby = atof(str);dposlist[0] = dbx;dposlist[1] = dby;ZAux_MoveScanAbs(2, axislist, dposlist);GetDlgItem(IDC_EDIT_POSX7)->GetWindowText(str);dbx = atof(str);GetDlgItem(IDC_EDIT_POSY7)->GetWindowText(str);dby = atof(str);dposlist[0] = dbx;dposlist[1] = dby;ZAux_MoveScanAbs(2, axislist, dposlist);GetDlgItem(IDC_EDIT_POSX8)->GetWindowText(str);dbx = atof(str);GetDlgItem(IDC_EDIT_POSY8)->GetWindowText(str);dby = atof(str);dposlist[0] = dbx;dposlist[1] = dby;ZAux_MoveScanAbs(2, axislist, dposlist);UpdateData(false); } (5) 通过断开按钮的事件处理函数来断开与控制卡的连接。 void CSingle_move_Dlg::OnClose() //断开链接{// TODO: Add your control notification handler code hereif(NULL != g_handle){KillTimer(1); //关定时器KillTimer(2);ZAux_Close(g_handle);g_handle = NULL;SetWindowText("未链接");} } (6)通过坐标清零按钮的事件处理函数移动振镜轴回零到中心零点位置,不直接使用dpos=0,修改振镜轴坐标。 void CSingle_move_Dlg::OnZero() //清零坐标{if(NULL == g_handle){MessageBox(_T("链接断开状态"));return ;}// TODO: Add your control notification handler code hereint axislist[2] = { 4,5 };float dposlist[2] = { 0 };ZAux_Direct_MoveAbs(g_handle,2,axislist,dposlist); //设置运动回零点} 三调试与监控 编译运行例程,同时通过ZDevelop软件连接控制器对控制器状态进行监控 。 ZDevelop软件连接控制器监控控制器的状态,查看振镜轴对应参数,并可搭配示波器检测双振镜轨迹。 设置振镜轴运动,首先需要将轴类型配置成21振镜轴类型,并对应配置振镜轴的速度加减速等参数才可操作振镜进行运动。 通过ZDevelop软件的示波器监控双振镜运动运行轨迹。 视频演示。 开放式激光振镜+运动控制器(六)-双振镜运动 本次,正运动技术开放式激光振镜+运动控制器(六):双振镜运动,就分享到这里。 更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。 本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_57350300/article/details/123402200。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-12-04 17:33:09
339
转载
转载文章
...i.cfg可以灵活的控制web访问端的权限. 4.主机定义文件 定义你要监控的对象,这里定义的“host_name”被应用到其它的所有配置文件中,这个是我们配置Nagios 必须修改的配置文件. [root@test objects] vim hosts.cfg define host{ host_name Nagios-Server ; 设置主机的名字,该名字会出现在hostgroups.cfg 和services.cfg 中。注意,这个名字可以不是该服务器的主机名。 alias Nagios服务器 ; 别名 address 192.168.81.128 ; 主机的IP 地址 check_command check-host-alive ; 检查使用的命令,需要在命令定义文件定义,默认是定义好的。 check_interval 1 ; 检测的时间间隔 retry_interval 1 ; 检测失败后重试的时间间隔 max_check_attempts 3 ; 最大重试次数 check_period 24x7 ; 检测的时段 process_perf_data 0 retain_nonstatus_information 0 contact_groups sagroup ; 需要通知的联系组 notification_interval 30 ; 通知的时间间隔 notification_period 24x7 ; 通知的时间段 notification_options d,u,r ; 通知的选项 w—报警(warning),u—未知(unkown) c—严重(critical),r—从异常情况恢复正常 } define host{ host_name Nagios-Client alias Nagios客户端 address 192.168.81.129 check_command check-host-alive check_interval 1 retry_interval 1 max_check_attempts 3 check_period 24x7 process_perf_data 0 retain_nonstatus_information 0 contact_groups sagroup notification_interval 30 notification_period 24x7 notification_options d,u,r } 5.主机组定义文件 主机组定义文件,可以方便的将相同功能或者在应用上相同的服务器添加到一个主机组里,在WEB 界面可以通过HOST Group 方便的查看该组主机的状态信息. 将刚才定义的两个主机加入到主机组中,针对生产环境就像把所有的MySQL 服务器加到一个MySQL主机组里,将Oracle 服务器加到一个Oracle 主机组里,方便管理和查看,可以配置多个组. [root@test objects] vim hostgroups.cfg define hostgroup { hostgroup_name Nagios-Example ; 主机组名字 alias Nagios 主机组 ; 主机组别名 members Nagios-Server,Nagios-Client ; 主机组成员,用逗号隔开 } 6.服务定义文件 服务定义文件定义你需要监控的对象的服务,比如本例为检测主机是否存活,在后面会讲到如何监控其它服务,比如服务器负载、内存、磁盘等. [root@test objects] vim services.cfg define service { host_name Nagios-Server ; hosts.cfg 定义的主机名称 service_description check-host-alive ; 服务描述 check_period 24x7 ; 检测的时间段 max_check_attempts 3 ; 最大检测次数 normal_check_interval 3 retry_check_interval 2 contact_groups sagroup ; 发生故障通知的联系人组 notification_interval 10 notification_period 24x7 ; 通知的时间段 notification_options w,u,c,r check_command check-host-alive } define service { host_name Nagios-Client service_description check-host-alive check_period 24x7 max_check_attempts 3 normal_check_interval 3 retry_check_interval 2 contact_groups sagroup notification_interval 10 notification_period 24x7 notification_options w,u,c,r check_command check-host-alive } 7.服务组定义文件 和主机组一样,我们可以按需将相同的服务放入一个服务组,这样有规律的分类,便于我们在WEB端查看. [root@test objects] vim servicegroups.cfg define servicegroup{ servicegroup_name Host-Alive ; 组名 alias Host Alive ; 别名设置 members Nagios-Server,check-host-alive,Nagios-Client,check-host-alive } 8.联系人定义文件 定义发生故障时,需要通知的联系人信息.默认安装完成后,该配置文件已经存在,而且该文件不仅定义了联系人,也定义了联系人组,为了条理化的规划,我们把联系人定义放在contacts.cfg文件里,把联系人组放在contactgroups.cfg文件中. [root@test objects] mv contacts.cfg contacts.cfg.bak [root@test objects] vim contacts.cfg define contact{ contact_name maoxian ; 联系人的名字 alias maoxian ; 别名 service_notification_period 24x7 ; 服务报警的时间段 host_notification_period 24x7 ; 主机报警的时间段 service_notification_options w,u,c,r ; 就是在这四种情况下报警。 host_notification_options d,u,r ;同上。 服务报警发消息的命令,在command.cfg 中定义。 service_notification_commands notify-service-by-email 服务报警发消息的命令,在command.cfg 中定义。 host_notification_commands notify-host-by-email email wangyx088@gmail.com ; 定义邮件地址,也就是接收报警邮件地址。 } 9.联系人组定义文件 联系人组定义文件在实际应用中很有好处,我们可以把报警信息分级别,报联系人分级别存放在联系人组里面.例如:当发生一些警告信息的情况下,只发邮件给系统工程师联系人组即可,但是当发生重大问题,比如主机宕机了,可以发给领导联系人组. [root@test objects] vim contactgroups.cfg define contactgroup{ contactgroup_name sagroup ; 组名 alias Nagios Administrators ; 别名 members maoxian ; 联系人组成员 } 10.命令定义文件 commands.cfg 命令定义文件是Nagios中很重要的配置文件,所有在hosts.cfg还是services.cfg使用的命令都必须在命令定义文件中定义才能使用.默认情况下,范例配置文件已经配置好了日常需要使用的命令,所以一般不做修改. 11.时间段定义文件 timeperiods.cfg 我们在检测、通知、报警的时候都需要定义时间段,默认都是使用7x24,这也是默认配置文件里配置好的,如果你需要周六日不做检测,或者在制定的维护时间不做检测,都可以在该时间段定义文件定义好,这样固定维护的时候,就不会为大量的报警邮件或者短信烦恼 [root@test objects] cat timeperiods.cfg |grep -v "^" |grep -v "^$" 可以根据业务需求来更改 12.启动Nagios 1> 修改配置文件所有者 [root@test objects] chown -R nagios:nagios /usr/local/nagios/etc/objects/ 2> 检测配置是否正确 [root@test objects] /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg 如果配置错误,会给出相应的报错信息,可以根据信息查找,注意,如果配置文件中有不可见字符也可以导致配置错误 3> 重载Nagios [root@test objects] service nagios restart 本文出自 “毛线的linux之路” 博客,请务必保留此出处http://maoxian.blog.51cto.com/4227070/756516 本篇文章为转载内容。原文链接:https://blog.csdn.net/gzh0222/article/details/8549202。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-11-16 20:48:42
484
转载
转载文章
...OAuth2.0授权机制的应用等,这对于提升自建WebService的安全等级具有极高的参考价值。 综上所述,在实际开发和运维过程中,结合最新的技术和最佳实践,不断优化和完善WebService的实现方案,既能提高系统的稳定性和效率,也能确保其在面对各种挑战时具备足够的安全性和适应性。
2023-05-30 18:31:58
91
转载
转载文章
...票期权是一种长期激励机制,允许员工在未来特定时间内以预先约定的价格购买公司股票的权利。在本文所述的互联网公司中,很多公司向员工提供股票期权作为福利之一,旨在让员工分享公司的成长收益,增强归属感,并鼓励员工与公司共同长期发展。
2023-01-11 22:59:19
530
转载
转载文章
... NT 提供的功能来控制 Cache Manager 的工作组大小。除了和 NT 所有版本相容之外,还提供原始程式码。 检视系统时钟的解析度,同时也是计时器解析度的最大值。 Contig 希望能够快速地将常用的档案进行磁碟重组吗?使用 Contig 最佳化个别档案,或是建立新的连续档案。 Ctrl2cap 这是一种核心模式驱动程式,展示键盘输入筛选只在键盘类别驱动程式之上,目的是为了将大写锁定按键转换至控制按键。这个层级的筛选允许在 NT 「发现」按键之前,先进行转换和隐藏按键。包括完整的来源。此外,Ctrl2cap 还会显示如何使用 NtDisplayString() 将讯息列印至初始化的蓝色萤幕。 DebugView Sysinternals 的另一个首开先例:这个程式会拦截分别由 DbgPrint 利用装置驱动程式,和 OutputDebugString 利用 Win32 程式所做的呼叫。它能够在您的本机上或跨往际往路,在不需要作用中的侦错工具情况下,检视和录制侦错工作阶段输出。 DiskExt 显示磁碟区磁碟对应。 Diskmon 这个公用程式会撷取全部的硬碟活动,或是提供系统匣中的软体磁碟活动指示器的功能。 DiskView 图形化磁区公用程式。 Du 依目录检视磁碟使用状况。 EFSDump 检视加密档案的资讯。 Filemon 这个监控工具让您即时检视所有档案系统的活动。 Handle 这个易於操纵的命令列公用程式能够显示档案开启的种类和使用的处理程序等更多资讯。 Hex2dec 十六进位数字和十进位数字相互转换。 Junction 建立 Win2K NTFS 符号连结。 LDMDump 倾印逻辑磁碟管理员的磁碟上之资料库内容,其中描述 Windows 2000 动态磁碟分割。 ListDLLs 列出所有目前载入的 DLL,包括载入位置和他们的版本编号。2.0 版列印载入模组的完整路径名称。 LiveKd 使用 Microsoft 核心侦错工具检视即时系统。 LoadOrder 检视在您 WinNT/2K 系统上载入装置的顺序。 LogonSessions 列出系统上的作用中登入工作阶段。 MoveFile 允许您对下一次开机进行移动和删除命令的排程。 NTFSInfo 使用 NTFSInfo 检视详细的 NTFS 磁碟区资讯,包括主档案表格 (MFT) 和 MFT 区的大小和位置,还有 NTFS 中继资料档案的大小。 PageDefrag 将您的分页档和登录 Hive 进行磁碟重组。 PendMoves 列举档案重新命名的清单,删除下次开机将会执行的命令。 Portmon 使用这个进阶的监视工具进行监视序列和平行连接埠活动。它不仅掌握所有标准的序列和平行 IOCTL,甚至会显示传送和接收的资料部份。Version 3.x 具有强大的新 UI 增强功能和进阶的筛选功能。 Process Monitor 即时监控档案系统、登录、程序、执行绪和 DLL 活动。 procexp 任务管理器,这个管理器比windows自带的管理器要强大方便的很多,建议替换自带的任务管理器(本人一直用这个管理器,很不错)。此工具也有汉化版,fans可以自己搜索下载 ProcFeatures 这个小应用程式会描述「实体位址扩充」的处理器和 Windows 支援,而没「没有执行」缓冲区溢位保护。 PsExec 以有限的使用者权限执行处理程序。 PsFile 检视远端开启档案有哪些。 PsGetSid 显示电脑或使用者的 SID。 PsInfo 取得有关系统的资讯。 PsKill 终止本机或远端处理程序。 PsList 显示处理程序和执行绪的相关资讯。 PsLoggedOn 显示使用者登录至一个系统。 PsLogList 倾印事件记录档的记录。 PsPasswd 变更帐户密码。 PsService 检视及控制服务。 PsShutdown 关机及选择重新启动电脑。 PsSuspend 暂停及继续处理程序。 PsTools PsTools 产品系列包括命令列公用程式,其功能有列出在本机或远端电脑上执行的处理程序、远端执行的处理程序、重新开机的电脑和倾印事件记录等等。 RegDelNull 扫描并删除登录机码,这些登录机码包括了标准登录编辑工具无法删除的内嵌式 Null 字元。 RegHide 建立名为 "HKEY_LOCAL_MACHINE\Software\Sysinternals\Can't touch me!\0" 并使用原生 API 的金钥,而且会在此金钥内建立一个值。 Regjump 跳至您在 Regedit 中指定的登录路径。 Regmon 这个监视工具让您即时看到全部的登录活动。 RootkitRevealer 扫描您系统上 Rootkit 为基础的恶意程式码。 SDelete 以安全的方法覆写您的机密档案,并且清除因先前使用这个 DoD 相容安全删除程式所删除档案後而释放的可用空间。包括完整的原始程式码。 ShareEnum 扫描网路上档案共用并检视其安全性设定,来关闭安全性漏洞。 Sigcheck 倾印档案版本资讯和验证系统上的影像皆已完成数位签章。 Strings 搜寻 binaryimages 中的 ANSI 和 UNICODE 字串。 Sync 将快取的资料清除至磁碟。 TCPView 作用中的通讯端命令列检视器。 VolumeId 设定 FAT 或 NTFS 磁碟区 ID。 Whois 看看谁拥有一个网际网路位址。 Winobj 最完整的物件管理员命名空间检视器在此。 ZoomIt 供萤幕上缩放和绘图的简报公用程式。 转自:http://www.360doc.com/content/15/0323/06/20545288_457293504.shtml 本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_33515088/article/details/80721846。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2024-01-22 15:44:41
103
转载
转载文章
...网络安全性设施,用于控制进出特定网络的数据包,确保仅允许合法、安全的网络流量通过。在文中,由于防火墙对计算机之间的通信进行了限制,导致MPI进程间的连接失败,需要调整或临时关闭防火墙规则以便于MPI程序能够在多台计算机间正常通信和执行并行计算任务。 共享目录 , 共享目录是指在网络环境中的一个或多个用户可以访问的同一文件系统位置,通常通过网络文件系统(NFS)或其他共享协议实现。在本篇文章中,为了确保MPI并行程序在多台机器间正确运行,需要将包含可执行文件和其他必要资源的目录设置为共享,确保所有参与计算的节点都能够访问到这些资源。
2023-04-09 11:52:38
114
转载
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
chmod u+x file
- 给文件所有者添加执行权限。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
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
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"