这两天 Github 开源界发生了几件大事:
- Clash_for_windows 的作者宣布停更,原因不详;
- Clash 内核作者删库,原因不详;
- 我的账号被封,原因不详;
加油,还来得及!
这两天 Github 开源界发生了几件大事:
睡觉这件事占据了我们人生三分之一的时间,看似无用,却恰恰是最重要的一件事。
厌倦了白天忙碌又快节奏的生活,就可能在夜深人静的时候选择报复性熬夜,享受那份众人皆睡我独醒的自由,仿佛这样就能把白天逝去的时间追回来。
可是熬的每一个夜都是要还的,久而久之会发现,记忆力越来越差,发际线越来越高,甚至某些重要功能都会受到影响......
那么应该正视这个问题,好好理解睡觉这件事!
睡眠细分有 5 个阶段:入睡期
、浅睡期
、深睡期
、熟睡期
、快眼动期
。
在日常生活中,我们可能听说过
软路由
,那么是什么意思呢?有什么作用?怎么使用软路由?
所谓的软路由
就是指,通过软件的方式来路由你的网络访问。例如,你的局域网下有 A、B、C、D 4 台设备,你可以指定某些设备可以访问网络,或者某些网站禁止访问,或者访问某些网站分流访问,或者实现广告屏蔽等等,总之功能非常多。
你可能会问,这路由器不也能行吗?没错,传统路由器确实也可以。软件运行需要硬件作为载体,传统路由器是可以作为这种载体,R2S 也是这种载体。其他的硬件,像是,安卓手机、Windows/linux 系统的电脑、树莓派等等,也都可以作为这种载体,只是不同硬件平台的 CPU 架构不同,需要刷入对应平台编译出来的软件系统。
在开发中分组查询是很常见的,而对组内排序该如何做?组内排序后再取前 N 条又怎么做? 乍一看似乎不难,但一时间也不一定想得出来,故思考过后记录于此。
CREATE TABLE `student_scores` (
`id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
`stu_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生姓名',
`stu_score` float NOT NULL COMMENT '学生分数',
`stu_class` varchar(10) COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生班级',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学生分数';
在体验过 Uniapp 之后,想尝试 Flutter,它可以开发移动端和桌面端。 Flutter 的语法是基于 Dart 的,所以需要先会 Dart 语法。会 Java 的同学上手 Dart 是非常快的,因为 Dart 语法和关键字以及特性有 8 成和 Java 是一模一样的,另外 1 成是有点 Nodejs/Python/Go 的特点,还有 1 成是 Dart 本身的特性。
如果仅仅是使用 Dart 做开发,那么配置 Dart 开发环境就可以了。下载
安装非常简单,将下载好的 zip 压缩文件解压至合适的位置,然后在环境变量的 path 中配置 %DART_HOME\bin
的路径即可。
反射(reflection)是在 Java 出现后迅速流行起来的一种概念,大多数现代的高级语言都以各种形式支持反射功能,但反射是把双刃剑,功能强大代码却不清晰。
各语言对反射的支持:
Go 语言程序的反射系统无法获取到一个可执行文件空间中或者是一个包中的所有类型信息,需要配合使用标准库中对应的词法、语法解析器和抽象语法树(AST)对源码进行扫描后获得这些信息。
Go语言中的反射是由reflect
包提供支持的,反射最重要的两个概念:Type
和Value
。
在 JavaWeb 开发领域,Spring 家族早已是霸主地位,其开创式的提出了 IOC(Inversion of Control, 控制反转) 思想,并使用 DI(Dependency Injection, 依赖注入) 实现。 Spring 作为一框 Web 开发领域的框架,之所以叫做框架,是因为它包含了太多的功能,它可以管理对象的整个生命周期,并且提供了非常多的扩展点,为程序开发提供了极大地便利。 而今天要讲的 Wire 它只能叫做工具,因为它实际上就是一个代码生成工具,只不过它可以分析代码中的依赖关系,从而生成代码。
当前计划将报价数据从 mongodb 转用 clickhouse 存储,插入模拟数据 2.54 亿条(254615855),使用代码分段查询同步数据时,发现查询到百万行的时候,查询效率非常低,猜想其原因可能是查询时未使用到索引。
以下 SQL 语句中进行了脱敏,字段名称、字段类型及表结构均与公司中所用不同,但根据数据特征创建的这个表,是符合本文所描述的。
创建数据库:
CREATE DATABASE IF NOT EXISTS price_data ON CLUSTER ck_cluster ENGINE = Atomic COMMENT '报价数据';
公司中有些业务数据是要求永久存储的,随着运营时间累计越来越久,存储的数据量也越来越多,数据存储的成本也越来越高,单是使用的阿里云 mongodb 数据库,每个月需要花费将近 10W RMB。 虽然后续对 mongodb 做了冷热库拆分,云上只存储近半年的数据,因为近半年的数据查询频繁,半年之前的数据都放在自建机房。这极大降低了运营成本,但还是有计划转换到 clickhouse 存储,因为 clickhouse 存储数据压缩比例非常高,查询速度极快,因此计划将系统中存储在 mongodb 和 elasticsearch 中的数据换到 clickhouse 中。
最近做业务需求有这么一个场景,当某一天的历史净值有对应的分红计划和复权净值调整时,需要算出这一天的净值差和累计净值,将结果追加到这一天的历史净值表中,完成后要将这一天的分红计划和复权净值调整标记为已执行
(在数据库中字段存储值:1 表示已执行;0 表示未执行),也就是说这是一个原子操作,要么都成功,要么都失败。如果失败了,在下一次定时到来将被再次计算。但测试发现偶发情况下,某天的历史净值记录有追加的净值差和累计净值字段,但这天对应的分红计划和复权净值调整记录中,却不是同时被标记了已执行,即分红计划和复权净值调整这两者的标记,可能其中一个是 1 一个是 0。WTF? 当时因为有其他优先级更高的事要处理这个问题暂放,过了一个多小时再回来检查数据发现又正常了,WHAT? 这是什么鬼,什么也没做它自己又好了,但我不能当做什么也没发生,删掉数据重新初始化一遍,果然问题又出现了。这是个问题,必须得找出原因,仔细检查了业务代码逻辑,毫无破绽,那还会是什么原因呢?思来想去,我认为最大的可能性就是程序初始化时,由于同时请求了多个三方接口拿数据,拿到数据后做了不同的业务导致在入库的顺序无法保证,而这些业务又可能会查已入库的数据,查到时和没查到时的业务有些区别,这就很可能会导致数据被覆盖了。也就是说原本是正确的逻辑,正确的数值入库了,但马上又被其他同时在进行的业务覆盖了,结果数据库中看到的就是逻辑不正确的数据。OK,既然有了方向那就改呗,一顿操作后改完更新的开发环境,删掉数据再初始化一遍,然后检查刚刚有问题的数据已经正常了。这条数据是正常了,其他数据是否正常也不知道,那就查一下数据呗。筛选出来的目标数据要符合执行标记一边是 1 一边是 0 的,这个逻辑不正是异或
嘛!问题来了,异或在程序中怎么运算,下面进入正文。