使用rust开发web服务
引言作为一个长期从事java的程序员,进行web服务开发第一件事就是寻找成熟的web及orm框架。在rust生态中成熟的web框架有很多,列如Actix-web、Rocket、Warp、Axum 等。 关于数据库访问有diesel这个非常成熟的ORM,还有sea-orm这样的后起之秀。diesel 不支持异步,而 sea-orm 支持异步,所以,有理由相信,随着 sea-orm 的不断成熟,会有越来越多的应用在 sea-orm 上构建。如果你觉得 ORM 太过笨重,繁文缛节太多,但又不想直接使用某个数据库的驱动来访问数据库,那么你还可以用 sqlx。 sqlx 提供了对多种数据库(Postgres、MySQL、SQLite、MSSQL)的异步访问支持,并且不使用 DSL 就可以对 SQL query...
工作笔记
...
新冠疫情史记
2020年 1月2日 央视:查处8名造谣者 1月3日 李文亮被训诫 1月5日 卫健委:未发现人传人 1月12日 李文亮住院。卫健委:可防可控 1月18日 武汉百举办万人宴 1月20日 钟南山:资料显示人传人 1月21日 湖北黄冈翁某患肺炎12天后死亡 ...
如何使用缓存优化系统性能?
本地缓存平时使用拦截器(例如 Fiddler)或浏览器 Debug 时,我们经常会发现一些接口返回 304 状态码 + Not Modified 字符串。如果我们对前端缓存技术不了解,就很容易对此感到困惑。浏览器常用的一种缓存就是这种基于 304 响应状态实现的本地缓存了,通常这种缓存被称为协商缓存。 协商缓存,顾名思义就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。 一般协商缓存可以基于请求头部中的 If-Modified-Since 字段与返回头部中的 Last-Modified 字段实现,也可以基于请求头部中的 If-None-Match 字段与返回头部中的 ETag 字段来实现。 两种方式的实现原理是一样的,前者是基于时间实现的,后者是基于一个唯一标识实现的,相对来说后者可以更加准确地判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。下面我们再来了解下整个缓存的实现流程: 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 ETag...
音频文件切割、合并
需求说明需要根据时间切割mp3、wav文件切割:列如一个时常2分钟的mp3,需要保留XX秒后的音频数据,XX秒之前则丢弃合并:需要在MP3或wav歌曲播放之前写入指定音频,将其连在一起 技术实现环境准备该工具为了快速实现本地化功能,采用了javafx8在切割MP3和WAV时使用到了第三方库jaudiotaggerpom依赖: 123456<!-- https://mvnrepository.com/artifact/net.jthink/jaudiotagger --><dependency> <groupId>net.jthink</groupId> <artifactId>jaudiotagger</artifactId> ...
完美复刻电视剧《三分野》中的心形代码
your browser does not support the video tag 1 分析需求画出心形并放大缩小模拟跳动 心形外部围绕一圈粒子 内部粒子随机分布,越靠近外部边缘的粒子越明显,跳动幅度越大 2 先画一个跳动的心2.1 设置画布123456789const canvas = document.createElement('canvas');const width = window.innerWidth;const height = window.innerHeight;document.body.append(canvas);const ctx = canvas.getContext('2d');ctx.strokeStyle = '#EEAEEE'ctx.fillStyle = '#EEAEEE'//将画笔移动到画布中央ctx.translate(width / 2,height / 2); 2.2...
MapStruct对象转换用法
官网地址:http://mapstruct.org/ MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个实体变化成一个实体。例如我们在实际开发中,DAO层的实体和一些数据传输对象(DTO),大部分属性都是相同的,只有少部分的不同,通过mapStruct,可以让不同实体之间的转换变的简单。我们只需要按照约定的方式进行配置即可。 MapStruct是一个可以处理注解的Java编译器插件,可以在命令行中使用,也可以在IDE中使用。MapStruct有一些默认配置,但是也为用户提供了自己进行配置的途径。 1 开发环境搭建–基于MavenMapStruct主要由两部分组成: org.mapstruct:mapstruct:包含了一些必要的注解,例如@Mapping。我们使用的JDK版本高于1.8,当我们在pom里面导入依赖时候,建议使用坐标是:org.mapstruct:mapstruct-jdk8,这可以帮助我们利用一些Java8的新特性。 ...
ros-topic通讯方式
[TOC] TopicTopic通讯概念多个Node节点都需要到ROS Master进行注册。 每个Node完成自己的功能逻辑。有的时候Node和Node间需要有数据的传递,这个时候ROS提供了一种数据通讯机制。 Node间进行通讯,其中发送消息的一方,ROS将其定义为Publisher(发布者),将接收消息的一方定义为Subscriber(订阅者)。考虑到消息需要广泛传播,ROS没有将其设计为点对点的单一传递,而是由Publisher将信息发布到Topic(主题)中,想要获得消息的任何一方都可以到这个Topic中去取数据。我们理解Topic的时候,可以认为Topic相当于一个聚宝盆,东西放进去后,不管同时有多少人来取,都可以拿到数据。 Topic通讯实现C++实现Publisher 1234567891011121314151617181920212223242526272829303132333435#include "ros/ros.h"#include <iostream>#include...
redis-cluster
什么是集群Cluster集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理 集群与哨兵有什么区别 Sentinel哨兵,是为系统提供高可用特性,每一个Redis节点数据是同步的,且每一个Redis节点保存的都是全量数据 Cluster集群是将超大数据集打散到多台Redis服务器,可对存储规模进行水平扩容,每一个Redis节点存储的都是完整数据的子集. Redis集群模式介绍 Cluster模式是Redis3.0开始推出 采用无中心结构,每个节点保存数据和整个集群状态, 每个节点都和其他所有节点连接 官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到高可用 各个节点会互相通信,采用gossip协议交换节点元数据信息 数据分散存储到各个节点上
redis-sentinel
Redis Sentinel为Redis提供了高可用解决方案。实际上这意味着使用Sentinel可以部署一套Redis,在没有人为干预的情况下去应付各种各样的失败事件。 Redis Sentinel同时提供了一些其他的功能,例如:监控、通知、并为client提供配置。 下面是Sentinel的功能列表: 监控(Monitoring):Sentinel不断的去检查你的主从实例是否按照预期在工作。 通知(Notification):Sentinel可以通过一个api来通知系统管理员或者另外的应用程序,被监控的Redis实例有一些问题。 自动故障转移(Automatic failover):如果一个主节点没有按照预期工作,Sentinel会开始故障转移过程,把一个从节点提升为主节点,并重新配置其他的从节点使用新的主节点,使用Redis服务的应用程序在连接的时候也被通知新的地址。 配置提供者(Configuration...