使用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 做编译时检查,非常轻便;它可以从数据库中直接查询出来一行数据,也可以通过派生宏自动把行数据转换成对应的结构。Rust以其卓越的内存安全性和高效的性能在编程社区中备受瞩目。结合ORM和成熟Web框架,我们可以快速开发出既安全又高效的Web服务。本案例将使用Actix-web和sea-orm进 ...
工作笔记
9c5c24a24c7d2f2fc9b360faca58e497eafe9809933095aae36210ea809f02ca537dfcf65c8b00cc4e3f5e2024f9eb8d0dabdf7eab856f00249f558afefa3ae86b303b1d097bffadb51cddc855b871d6ffebd7f47d35d15b760c94fc3c97edecf50ace082162d4419163616863f3ae7958e78fe7c2155c93c5768a87fe8f9c6da5defafbd420d19696f60ee38a1e215794fca40bf7efe18a3c510753f7401184e57bc2e6b1b753998354d1586f43741cf787eb945b733f9c1eb7f514c1986d2a7220216e9d656d9da6b4b2c1f67447bd729291def9e85670339201dd4e0da49131b68ed06b75d2c3fe3c0617b6137e342c60a57d90a5a78a7 ...
新冠疫情史记
2020年
1月2日
央视:查处8名造谣者
1月3日
李文亮被训诫
1月5日
卫健委:未发现人传人
1月12日
李文亮住院。卫健委:可防可控
1月18日
武汉百举办万人宴
1月20日
钟南山:资料显示人传人
1月21日
湖北黄冈翁某患肺炎12天后死亡
1月23日
武汉封城,大量市民连夜逃离
1月29日
湖北省黄冈市一家人被隔离,17岁脑瘫儿独自在家饿死
2月3日
武汉开始修建开方舱医院
2月5日
77岁老人刘立女儿去世、外孙染病得不到救治,用微博求救
2月7日
李文亮去世,深圳健康码推出,各省市陆续推出。
2月8日
李丽娜因母亲染病、在阳台敲锣呼救
2月11日
肖贤友遗书:遗体捐出,我老婆呢
2月24日
湖北十堰一名老人死在家中,六岁孩子伴尸三天
2月26日
葛仙庄镇持证种田
2月29日
河南邓州张村镇上营村一名初中女生因没有手机上网课,服药轻生
3月
日本捐赠上写:山川异域,风月同天
3月17日
意大利留学生小杨回国千里投毒
3月19日
一位高中生写信质疑方方
3月23日
武汉,武昌殡仪馆排满领骨灰的人
4月08日
武汉解封
4月
英国留学生周子潇花费40余万元,买7次回国机票,全被 ...
如何使用缓存优化系统性能?
本地缓存平时使用拦截器(例如 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> <version>3.0.1</version></dependency>
在合并时可能出现音频格式不一致,由于jaudiotagger没有发现针对mp3音频格式控制的接口暴露,所以采用了FFmpeg,使用javaac集成包添加pom依赖 ...
完美复刻电视剧《三分野》中的心形代码
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 先画个心形1234567891011121314151617181920212 ...
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的新特性。
org.mapstruct:mapstruct-processor:注解处理器,根据注解自动生成 ...
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 "std_msgs/String.h&quo ...
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 provider):Sentinel给客户端的服务发现提供来源:对于一个给定的服务,客户端连接到Sentinels来寻找当前主节点的地址。当故障转移发生的时候,Sentine ...