[翻译]单线程共享可变性的问题

原文链接: https://manishearth.github.io/blog/2015/05/17/the-problem-with-shared-mutability/
作者: Manish Goregaokar
翻译 by abaabaqua

: 这篇文章写的比较早,早期的Rust编译器有很多不友善的地方,代码示例中部分当时无法编译的现在已经可以了,译者会增改一些代码导致和原文不同.


Edit(2017年1月):我重新发现了Niko的文章,文章也提到了这一点并达到了同样的认识.我怀疑我下意识地从这篇文章中得到了这个想法,至少是部分的想法.

这是我一直想写的一篇文章;Rust 1.0的发布给了我继续接下去的完美动力.

虽然这篇文章是讨论Rust设计中的一个选择,并且例子都是用Rust写的,但这里讨论的原则在很大程度上适用于其它语言.我还将尝试让那些没有Rust背景的人更容易理解这篇文章;如果需要解释一些代码或术语,请告诉我.

我将在这里讨论的是Rust做的一个选择,不允许同一数据有多个可变别名(或者当有active的不可变别名时只能有一个可变别名) ,即使是在同一个线程.本质上讲,它不允许做这样的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let mut x = Vec::new();
{
let ptr = &mut x; // 获取队`x`的可变引用
ptr.push(1); // 允许
let y = x[0]; // 不允许 (无法编译): 只要`ptr`是active的,
// x不能读取 ...
x.push(1); // .. 也不能写入
println!("{:?}", ptr); // 这段是译者新加 现在的编译器限制判断是否active更加智能 不是看整个作用域了
}

// 另外一种,

let mut x = Vec::new();
x.push(1); // 允许
{
let ptr = &x; // 创建一个不可变引用
let y = ptr[0]; // 允许, 不改变值
let y = x[0]; // 同样允许
x.push(1); // 不允许 (无法编译): 只要`ptr`是active,
// `x`被冻结了可变性
println!("{:?}", ptr); // 译者新加 原因一样
}

Read More

flink kafka source的avro反序列化问题

对接了一个kafka,里面的topic使用avro编码,且每个topic的schema都不相同使用schema registry管理。
现在要反序列化keymessage,查看了现有的:

1
2
<groupId>org.apache.flink</groupId>
<artifactId>flink-avro-confluent-registry</artifactId>

内的ConfluentRegistryAvroDeserializationSchema.
发现无论是forSpecific返回一个特定的类,还是forGeneric返回GenericRecord都需要指定read schame,而registry仅作为write schema使用, 也就是虽然返回的是GenericRecord, 但实际上都是同一个Schema反序列化的, 每个record的格式是一致的.

Read More

spring boot应用 从mysql迁移h2

此前有个应用用了mysql做数据存储,但实际存储的数据很少就几张表加起来一共几千行,并且一直没有修改的需求,应用内也只是进行查询。
实际上是静态的数据。

因为使用的是云服务商的产品,想着之后就不续费了需要将数据迁移。

有几个选项:

  1. 改用文件存储,读取到内存后处理;
  2. 换成嵌入式数据库。

    Read More

[翻译]async: 什么是blocking

原文来自:https://ryhl.io/blog/async-what-is-blocking/
作者:Alice Ryhl
翻译 by abaabaqua

Rustasync/await特性是通过一种称为协作式调度(cooperative scheduling)的机制来实现的,这对于编写异步Rust代码的人来说有一些重要的影响。

这篇博文的目标读者是异步Rust的新用户。我将使用Tokio运行时作为示例,但这里提出的观点适用于任何异步运行时。

如果你只从这篇文章中记住一件事,那应该是:
异步代码不应该长时间不到达.await。(注:指的是运行中)

Read More

理一理Edge-triggered和Level-triggered

最近群里又在讨论java的NIO,提到了NIO使用的lt而netty使用JNI在linux和MacOS/BSD中封装了et.
之前对这两个概念笼统了解了下,并没有去查阅额外资料,仅限知道lt在缓冲区还有数据的情况下就会被poll出来,而et则需要有新的请求/事件发生.
这次查阅了点资料,汇总一些数据来简单(毕竟也没有那么深入..)谈谈这两个概念.

Read More

rust学习感想

最近刚把The book看完了,手有些生,断断续续写点小东西,这边写一下这个歌阶段的一些学习感想,感受.
文章很水,没有语言上的指导只有自己的一些见解,部分内容还可能是完全错误的,欢迎指正~~.

学习目的主要是想开阔一下视野.
之前就偶尔会听到别人说rust在设计上有一些特别的地方,并且又由于是一门可以进行系统编程的语言,学习的收获也会比学其他的来得多,就这样开始了.

Read More