阅读这篇文章可能需要 20 分钟,文章内容遵循由浅到深的顺序。
1. WebSocket 原理
WebSocket 是基于 TCP 的通信协议,它与 HTTP 唯一的关联在于,最开始的连接建立过程是借助 HTTP 完成的,连接建立后,即切换到 WebSocket 协议。(RFC 6455 # R[......]
阅读这篇文章可能需要 20 分钟,文章内容遵循由浅到深的顺序。
WebSocket 是基于 TCP 的通信协议,它与 HTTP 唯一的关联在于,最开始的连接建立过程是借助 HTTP 完成的,连接建立后,即切换到 WebSocket 协议。(RFC 6455 # R[......]
今天通过 SSH 连接到服务器的 Shell 时,执行了一个 Python 脚本,并通过 CTRL+Z
和 bg
将其放到了后台运行。
之后我退出了该 shell,但出乎意料的是,当我再次登录 shell 时该脚本仍然在运行,而正常来说,该脚本应该在 shell 退出时被终止。
于是我查阅了相关[......]
阅读这篇文章大约需要十分钟时间。
Builder 模式是一种创建型的设计模式,即解决对象的创建问题。
在 Java、C++ 这类语言中,如果一个类在创建时存在可选参数,那么可以通过函数重载来实现,但是如果可选参数非常多的话,构造函数的数量也会变得非常多,并且可能因为不同可选参数类型相同而没法重载[......]
今天借着观察到的一个现象,表达一下自己的感想。
早上洗漱的时候,发现有一只蜘蛛在水盆边缘上爬行。
这是一只细胳膊细腿的蜘蛛,感觉有点像蚊子。
我没太注意,接着洗漱,但是过了一会儿,有趣的现象发生了:这只找不到出口的蜘蛛先是沿着水盆边缘顺时针爬了一圈,好像意识到了什么,停顿了几秒,然后逆时针继续[......]
应用并发的场景有很多,下载文件就是一个很常见的并发场景。
为什么会想写多线程下载器呢?不知道你用过 IDM(Internet Download Manager)没,我刚使用 IDM 时,就被它的下载方式吸引了。
用 IDM 下载文件时,能够直观地看到它的下载过程:固定用 N 个线程下载文件,一开[......]
我们知道,磁盘的读写效率是比较低的,以传统机械硬盘为例,读写时涉及到读写头的寻道和定位,这部分时间开销可能比实际读写数据时所花的时间还要长。即使是固态硬盘,由于数据的存储可能是散落在各个磁盘块中,通过指针连接起来,因此访问数据时需要对磁盘进行多次读写,同样会带来效率上的问题。[......]
二分查找是用于有序序列的高效查找算法,平均时间复杂度为 lg(n)。
有序序列可分为单调不减,例如 1, 2, 3, 3, 3, 5;以及单调不增序列,例如 5, 3, 3, 3, 2, 1。
也就是说,序列中可以出现重复的值,但是值的大小只能往一个方向变化。
序列中可能存在多个目标值,查找方[......]
在启动程序时指定配置文件
java -Djava.util.logging.config.file=configFile MainClass
日志管理器(LogManager)是在 VM 启动时,main 执行前初始化的,因此在 main 中重新设置系统属性之后,需要重新[......]
视图是从基本表中导出的虚拟的表,基本表需要存储数据,而视图不存储数据,只存放从基本表导出视图所需要的公式。
视图的数据是在数据库运行过程中动态产生和维护的,对基本表的修改会反映在视图的查询结果上,而对视图的修改也会作用到基本表上。
create view view_n[......]
数据库中的连接运算,指的是将多个表的记录按照某种规则连接到一起。
连接运算可分为三种,分别是内连接、外连接和交叉连接(笛卡尔积),它们之间的区别,我们稍后会展开分析。
θ 表示的是待连接的两个表属性之间要满足的条件,比如 table1.field_a > t[......]