079__微软:办公软件战场的螳螂
中国有句话说得好,“螳螂捕蝉,黄雀在后”。奔走在办公软件帝国之路上的微软,就曾经一次次地成为了这样一只螳螂。
今天让我们一起回顾微软早年如何进入办公软件领域的战场,看它是如何一次又一次向对手发起进攻,却被第三者掀翻的。
中国有句话说得好,“螳螂捕蝉,黄雀在后”。奔走在办公软件帝国之路上的微软,就曾经一次次地成为了这样一只螳螂。
今天让我们一起回顾微软早年如何进入办公软件领域的战场,看它是如何一次又一次向对手发起进攻,却被第三者掀翻的。
112 | 阿里巴巴的广告点击率预估模型
今天,我们继续来进行点击率预估的案例分析,结合三篇核心论文,来看一看阿里巴巴的广告预估又有哪些值得我们学习的地方。
上一讲,我系统地为你介绍了 Reactor 框架中创建 Flux 和 Mono 这两种数据流的各种方法。一旦我们得到了一个数据流,就可以使用它来完成某个特定的需求。
和其他主流的响应式编程框架一样,Reactor 框架的设计目标也是为了简化响应式流的使用方法。为此,Reactor 框架为我们提供了大量操作符,用于操作 Flux 和 Mono 对象。本讲和下一讲,我们将对常用的操作符展开讨论。
在上一课时,我们介绍了“缓冲”,这一课时我将介绍“缓冲”的孪生兄弟“缓存”。
并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。通常会用到两种操作。
Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。
经过第一个模块的学习,相信你已经知道了什么是分布式数据库,对分布式数据库的核心知识有了比较全面和深入的了解了。
这一讲是第二模块存储引擎的概要,主要目的是为你解释什么是存储引擎,以及它在分布式数据库中起到什么样的作用。
软件架构师必须站在一个很高的高度去审视自己软件的架构,去理解自己的工作在更宏大的背景中的位置和作用,才能构建出一个经得起时间考验的软件系统。这个高度既包括技术的高度和深度,也包括对软件编程这件事认知的程度,比如对软件编程的历史和未来的理解,以及对自己工作的价值和使命感的理解。
既然是网络编程,自然离不开通信协议,应用层之间通信需要实现各种各样的网络协议。在项目开发的过程中,我们就需要去构建满足自己业务场景的应用层协议。在上节课中我们介绍了如何使用网络协议解决 TCP 拆包/粘包的底层问题,本节课我们将在此基础上继续讨论如何设计一个高效、可扩展、易维护的自定义通信协议,以及如何使用 Netty 实现自定义通信协议。
我们都知道计算机的核心为 CPU,它是计算机的运算和控制核心,承载了所有的计算任务。最近半个世纪以来,由于半导体技术的高速发展,集成电路中晶体管的数量也在大幅度增长,这大大提升了 CPU 的性能。著名的摩尔定律——“集成电路芯片上所集成的电路的数目,每隔18个月就翻一番”,描述的就是该种情形。
数据源是持久层框架中最核心的组件之一,在实际工作中比较常见的数据源有 C3P0、Apache Common DBCP、Proxool 等。作为一款成熟的持久化框架,MyBatis 不仅自己提供了一套数据源实现,而且还能够方便地集成第三方数据源。