摘要:

接上一篇继续,今天来学习下如何用axum实现websocket,代码如下: Cargo.toml添加依赖项 [package] name = "websocket" version = "0.1.0" edition = "2021" # See more keys and their defini
阅读全文
posted @ 2022-01-24 22:25
菩提树下的杨过
阅读(3027)
推荐(0)
摘要:

接上一篇继续,SSE也就是服务端推送技术,自html5推出以来基本上各大浏览器都已支持,axum自然也支持,参考下面的代码: async fn sse_handler( TypedHeader(user_agent): TypedHeader<headers::UserAgent>, ) -> Ss
阅读全文
posted @ 2022-01-23 23:01
菩提树下的杨过
阅读(1784)
推荐(0)
摘要:

接上一篇继续,静态资源比如css/js/jpg等,一般不需要服务端做额外的业务处理,直接透传给浏览器就行,axum可以指定将某个目录指定为静态资源,参考下面的代码: let app = Router::new() .nest( "/static", get_service(ServeDir::new
阅读全文
posted @ 2022-01-23 22:38
菩提树下的杨过
阅读(2247)
推荐(0)
摘要:

接上一篇继续,上传文件是 web开发中的常用功能,本文将演示axum如何实现图片上传(注:其它类型的文件原理相同),一般来说要考虑以下几个因素: 1. 文件上传的大小限制 2. 文件上传的类型限制(仅限指定类型:比如图片) 3. 防止伪装mimetype进行攻击(比如:把.js文件改后缀变成.jpg
阅读全文
posted @ 2022-01-23 12:08
菩提树下的杨过
阅读(2530)
推荐(1)
摘要:

接上一篇继续,今天学习如何从Request请求中提取想要的内容,用axum里的概念叫Extract。 预备知识:json序列化/反序列化 鉴于现在web开发中,json格式被广泛使用,先熟悉下rust中如何进行json序列化/反序列化。 [dependencies] serde_json = "1"
阅读全文
posted @ 2022-01-01 23:03
菩提树下的杨过
阅读(3374)
推荐(0)
摘要:

上一篇的hello world里,示例过于简单,仅仅只是返回了一个字符串,实际上axum的response能返回各种格式,包括: plain_texthtmljsonhttp StatusCode...web开发中需要的各种格式,都能返回。talk is cheap ,show me the cod
阅读全文
posted @ 2021-12-26 22:52
菩提树下的杨过
阅读(3348)
推荐(0)
摘要:

axum是Rust生态的web框架新秀,虽然项目成立不久,但github上的star数已超2.8k,其底层依赖的是高性能的Tokio,Tokio这货就不多说了,借用知乎《深入浅出Rust异步编程之Tokio》上的一张图: Rust中的Tokio几乎是同类框架的性能天花板了,而axum在Tokio基础
阅读全文
posted @ 2021-12-26 21:05
菩提树下的杨过
阅读(5116)
推荐(0)
摘要:

最基本的Hello World示例: TcpServer端: use std::{net::TcpListener, io::{Read, Write}}; fn main() { //绑定本机3000端口 let listener = TcpListener::bind("127.0.0.1:30
阅读全文
posted @ 2021-12-26 20:14
菩提树下的杨过
阅读(852)
推荐(0)
摘要:

接上篇继续,贪吃蛇游戏中食物是不能缺少的,先来解决这个问题: 一、随机位置生成食物 use rand::prelude::random; ... struct Food; //随机位置生成食物 fn food_spawner( //<-- mut commands: Commands, materi
阅读全文
posted @ 2021-12-19 11:46
菩提树下的杨过
阅读(581)
推荐(0)
摘要:

bevy社区有一篇不错的入门教程:Creating a Snake Clone in Rust, with Bevy,详细讲解了贪吃蛇的开发过程,我加了一些个人理解,记录于此: 一、先搭一个"空"架子 1.1 Cargo.toml依赖项 [dependencies] bevy = { version
阅读全文
posted @ 2021-12-18 17:07
菩提树下的杨过
阅读(935)
推荐(0)
摘要:

bevy自带的画图功能有点弱,得先引入bevy_prototype_lyon, Cargo.toml依赖部分如下: [dependencies] bevy = { version = "0.5.0", features = ["dynamic"] } bevy_prototype_lyon = "0
阅读全文
posted @ 2021-12-14 09:42
菩提树下的杨过
阅读(932)
推荐(0)
摘要:

bevy是一个rust语言的跨平台游戏引擎,但是在windows10环境编译时,遇到问题无数,幸尽数解决,记录于此,供遇到同类问题的朋友参考: 环境:windows 10 + bevy 0.5.0 + rustup nightly版本 一、设置crates国内镜像 crates.io官网国内访问实在
阅读全文
posted @ 2021-12-11 15:01
菩提树下的杨过
阅读(921)
推荐(0)
摘要:

Result枚举在Rust中是使用频率极高的一个类型,常用于函数的返回值定义,其源码如下: #[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] #[must_use = "this `Result` may be an `Err`
阅读全文
posted @ 2021-11-28 15:48
菩提树下的杨过
阅读(1039)
推荐(0)
摘要:

一、let模式匹配 在其它一些语言中,let x = 5 之类的语句,仅仅只是赋值语句。但是在rust中,可以换个角度理解,认为5这个值匹配到了x变量。如果觉得有些牵强,可以再来一个示例: let (a,b)=(1,3); println!("{},{}",a,b); 上面的示例,表示(1,3)这个
阅读全文
posted @ 2021-11-28 14:20
菩提树下的杨过
阅读(558)
推荐(0)
摘要:

一、匿名函数 语法:“|参数名| 语句” 参考下面的这个示例: fn add(a: i32, b: i32) -> i32 { a + b } fn main() { let x = add(1, 2); println!("{}+{}={}", 1, 2, x); //匿名函数 let add =
阅读全文
posted @ 2021-11-21 23:04
菩提树下的杨过
阅读(1279)
推荐(0)
摘要:

java项目中用maven管理代码时,如果遇到大型工程,一般会拆分成不同的模块,比如spring-mvc中,通常会按model, view, controller建3个模块,然后根据一定的依赖关系进行引用。这个概念在Rust中是通用的,只不过maven换成了cargo,而模块变成了crate,看下面
阅读全文
posted @ 2021-11-21 21:56
菩提树下的杨过
阅读(602)
推荐(1)
摘要:

如上图,先初始化1个图,每条边上的红色数字为路径权重:(Node,Edge的定义参见算法练习(17)-图的广度优先遍历/深度优先遍历) Graph init() { List<Node> nodes = new ArrayList<>(); List<Edge> edges = new ArrayL
阅读全文
posted @ 2021-11-14 19:24
菩提树下的杨过
阅读(286)
推荐(0)
摘要:

一个示例就能看明白,关键处皆有注释,大致要点:impl 一个struct时,1.如果方法参数为&self,则为方法 ,可以用"对象实例.方法"来调用2.如果方法参数不是&self,则为函数,只能用"struct名::函数名"来调用 //类似java里的pojo类 struct Pet{ name:S
阅读全文
posted @ 2021-11-09 20:54
菩提树下的杨过
阅读(239)
推荐(0)
摘要:

如上图,假设有一个大型代码工程,里面有5个模块: 模块1依赖模块2 模块2依赖模块3和模块5 模块3依赖模块4和模块5 那么,项目在编译时,应该按怎样的的顺序编译? 这就是所谓的拓扑排序问题 就这个示例而言,显然正确的编译顺序是:5->4->3->2->1 或 4->5->3->2->1 (注:4与
阅读全文
posted @ 2021-11-07 19:07
菩提树下的杨过
阅读(314)
推荐(0)
摘要:

一、图的数据结构及表示法 如上图,由一堆"点"与一堆"边"构成的数据结构 ,就称为图,其中边上可以有方向(称为有向图),也可以无方向(称为无向图)。边上还可以有所谓的权重值。 算法书上,图的表示方法一般有“邻接矩阵”等,这里我们用左程云介绍的一种相对更容易理解的表示法: 图: import java
阅读全文
posted @ 2021-11-07 16:50
菩提树下的杨过
阅读(1725)
推荐(0)
摘要:

刚接触Rust遇到一堆新概念,特别是package, crate, mod 这些,特别迷糊,记录一下 一、pakcage与crate 当我们用cargo 创建一个新项目时,默认就创建了一个package,参考下面的截图: 这样就生成了一个名为demo_1的package,另外也创建1个所谓的bina
阅读全文
posted @ 2021-11-06 16:41
菩提树下的杨过
阅读(2063)
推荐(1)
摘要:

思路:依旧还是层次遍历, 按层入队, 然后出队时, 交换左右节点
阅读全文
posted @ 2021-11-03 12:07
菩提树下的杨过
阅读(114)
推荐(0)
摘要:

思路: 二叉树的各种顺序中,随便挑1种,遍历每个节点, 拼装出1个字符串即可实现序列化。要注意的是, 空节点也需要, 可以找一个特殊符号比如#表示。 反序列化则是相反的过程,解析该字符串即可。 这里用层序遍历来实现一把: 序列化代码: public static String serial(Tree
阅读全文
posted @ 2021-11-02 23:23
菩提树下的杨过
阅读(104)
推荐(0)
摘要:

比如这颗树,给定2个节点: 4、5 ,它们的最近公共祖先节点为2。类似的,如果是3、5,它们的最近公共祖先节点为1。 一种比较容易想到的思路,如果知道每个节点到root的全路径, 比如 3到root节点的全路径为: 3->1 5到root节点的全路径为: 5->2->1 这样,只要遍历对比下全路径,
阅读全文
posted @ 2021-10-31 22:37
菩提树下的杨过
阅读(131)
推荐(0)
摘要:

从左神视频上看到一个有趣的题目,据说是微软的算法面试题:一个长纸条,对折后再展开,中间会有一个凹痕,然后同样的方式,再继续对折, 又会多出2条折痕(不过新折痕会有凸有凹),如此反复对折,纸条上就会留下一系列的折痕,见下图: 要求:输入1个数字(n),表示对折的次数, 从上而下, 打印每1条拆痕的类型
阅读全文
posted @ 2021-10-31 12:58
菩提树下的杨过
阅读(317)
推荐(0)
摘要:

如果二叉树的问题,可以分解为 先处理左树, 再处理右侧, 这种就可以用所谓"递归套路"解法
阅读全文
posted @ 2021-10-31 12:37
菩提树下的杨过
阅读(162)
推荐(0)
摘要:

二叉树的节点结构如下: public class TreeNode { public TreeNode left; public TreeNode right; public int val; public TreeNode(int val) { this.val = val; } public T
阅读全文
posted @ 2021-10-27 22:33
菩提树下的杨过
阅读(370)
推荐(0)
摘要:

这个问题可以看做是 算法练习(7)-判断单链表是否有环,以及求环的长度 的升级版
阅读全文
posted @ 2021-10-23 17:05
菩提树下的杨过
阅读(75)
推荐(0)
摘要:

所谓带随机指针的链表,结构如下: class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; } } 除next外
阅读全文
posted @ 2021-10-23 16:27
菩提树下的杨过
阅读(98)
推荐(0)
摘要:

mac升级到11.4后,安全性增强导致很多非appstore下载的第3方软件无法打开,比如:从mysql官网下载精减版,手动解压安装时, 就出现下面这样: 有一些网友,也给出了解决方法,比如终端下输入命令 sudo xattr -d com.apple.quarantine 被拦截的执行文件 但是这
阅读全文
posted @ 2021-10-23 15:48
菩提树下的杨过
阅读(8857)
推荐(1)
摘要:

在一些文学作品中,大家想必接触过回文诗,比如:“雾窗寒对遥天暮,暮天遥对寒窗雾”或“垂帘画阁画帘垂”,即:正着念反着念完全一样。回文单链表跟这个类似,比如: 0-1-2-1-0或0-1-1-0,很容易发现规律:可以找到一个对称轴,将链表分为前后二段,并且前后对折起来,完全重合。 为了方便,先定义单链
阅读全文
posted @ 2021-10-17 21:23
菩提树下的杨过
阅读(300)
推荐(0)
摘要:

本文讲述了如何使用开源项目pkts-sip对SIP进行解析,以及如何扩展
阅读全文
posted @ 2021-09-28 10:29
菩提树下的杨过
阅读(2570)
推荐(2)
摘要:

本文介绍了freeswitch/opensip话机注册过程中的认证算法
阅读全文
posted @ 2021-09-19 13:50
菩提树下的杨过
阅读(2651)
推荐(0)
摘要:

本文主要探讨了snowflake(雪花算法)使用中,如何合理设置workerId的问题
阅读全文
posted @ 2021-09-19 13:21
菩提树下的杨过
阅读(3188)
推荐(0)
摘要:

先准备几个类,方便后面讲解: public final class FinalSampleUtils { public static String foo() { return "aaa"; } public static String bar(String a) { return "bar:" +
阅读全文
posted @ 2021-09-12 12:26
菩提树下的杨过
阅读(2572)
推荐(1)
摘要:

在实时数据处理的场景中,数据的到达延时或乱序是经常遇到的问题,比如: * 按时间顺序发生的数据1 -> 2,本来应该是1先发送,1先到达,但是在1发送过程中,因为网络延时之类的原因,导致1反而到达晚了,变成2先到达,也就造成所谓的接收乱序; * 发送方本身就延时了,比如:事实上按1 -> 2产生的数
阅读全文
posted @ 2021-09-05 17:28
菩提树下的杨过
阅读(1269)
推荐(0)
摘要:

很多时候我们打电话到公司前台,会听到类似“欢迎致电XXX,办公电话请直拨分机,咨询XX请按1,咨询YY请按2”这样的语音提示。在一些特定流程中,系统自动发起呼叫打到前台,希望实现自动按键(即:不用人手动按键),FreeSwitch提供了2个基本命令: send_dtmf及uuid_send_dtmf
阅读全文
posted @ 2021-08-29 16:44
菩提树下的杨过
阅读(1788)
推荐(0)
摘要:

outbound外联模式下,可以参考我先前写的文章:freeswitch: ESL中如何自定义事件及自定义事件的监听,使用export导出变量。但是inbound模式下,ESL client并未封装export命令,如果要给某条腿附加一个变量值,可以借助uuid_setvar命令。 一、命令行验证
阅读全文
posted @ 2021-06-26 16:20
菩提树下的杨过
阅读(973)
推荐(0)
摘要:

CompletableFuture是java8引入的一个很实用的特性,可以视为Future的升级版本,以下几个示例可以说明其主要用法(注:示例来自《java8实战》一书第11章) 一、引子:化同步为异步 为了方便描述,假设"查询电商报价"的场景:有一个商家Shop类,对外提供价格查询的服务getPr
阅读全文
posted @ 2021-06-06 23:08
菩提树下的杨过
阅读(373)
推荐(1)
摘要:

众所周知:java中Integer有一个常量池范围-128~127 Integer a = 500, b = 500; System.out.println(a == b);//false a = 100; b = 100; System.out.println(a == b);//true 相信也
阅读全文
posted @ 2021-05-30 22:40
菩提树下的杨过
阅读(610)
推荐(2)