Decorative image frame

Flutter性能优化实践

我的加密软件有一个登录页面,需要用户输入主密码然后验证密码之后才能进入。因为密码转换(Key transform)过程中用到了Argon2算法,而这个算法没有原生的dart实现,所以必须要通过插件的形式来完成,为此我还专门做了一个插件encryptions。调用插件得到秘钥这个过程大概要花个1~4秒钟,最近在安卓真机上测试发现,这个过程中我的进度条竟然出现了卡顿,也就是说本来应该转圈圈的,结果一开始就卡住不动了,那我还需要这个加载动画干嘛呢?为此研究了一番,如何来解决这个问题。 Read More...

Rust(2) Ownership

传统的C语言需要开发人员手动管理内存,而像Java、Go这样的语言是通过垃圾回收机制自动进行内存管理。但通常垃圾回收机制本身较为复杂且需要不定期的进行(也就是说实际当内存不在需要的时候并不一定能得到及时的释放)。而rust语言采取的所有权机制(Ownership)是它区别于其他语言的一个重要特征,它被用来进行高效安全的内存管理。

Read More...

Java中的时间

你如果以为,Java中谈到时间仅仅就意味着java.util.Date那就大错特错了,Java中的时间其实可以说五花八门,Java8发布后又增加了一些新的用来表示日期和时间的类,那么我们在构建应用程序的时候到底应该用哪个类来呢?彼此之间又有什么区别?

Read More...

理解Java并发(1):基本机制

线程是操作系统中进行运算调度的最小单位,它是一个单一顺序的控制流,不论是对于单核还是多核的CPU,都能比较有效的提高程序的吞吐率。在Java中,创建一个线程的唯一方法是创建一个Thread类的实例,并调用start()方法以启动该线程。然而当多个线程同时执行时,如何保证线程之间是按照我们期待的方式在运行呢?Java提供了多种机制来保证多个线程之间的交互。 Read More...

IEEE 754浮点数转换

一个小数的二进制是怎么样的呢?我们先看看一个二进制的小数怎么转换成十进制: \[ \begin{aligned} 11101.01011_{10} &= 1 \times 2^{4} + 1 \times 2^{3} + 1 \times 2^{2} + 0 \times 2^{1} + 1 \times 2^{0} + 0 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3} + 1 \times 2^{-4} + 1 \times 2^{-5} \\ &= 16 + 8 + 4 + 0 + 1 + 0 + \frac{1}{2} + 0 + \frac{1}{16} + \frac{1}{32} \\ &= 29.34375 \end{aligned} \] Read More...

浅谈CDC在微服务中的应用

CDC(Change Data Capture)是一种通过监测数据变更(变更包括新增、修改、删除等)而对变更的数据进行进一步处理的一种设计模式,通常应用在数据仓库以及和数据库密切相关的一些应用上,比如数据同步、备份、审计、ETL等。实际上,早在二十多年前,CDC就已经用来将应用系统的数据变更实时发送到数据仓库,进一步转换后传递到数据分析系统1,这样能够在极小地影响生产的情况下,有效而及时地将数据传递到消费方。而在微服务架构逐渐流行的今天,这种古老的技术是否能够焕发新的生机?

CDC Flow in SQL Server Read More...