- 博客(36)
- 资源 (1)
- 收藏
- 关注
原创 ElasticSearch 索引的存储机制推演
ElasticSearch 作为开源的搜索引擎,需要依赖的一个重要数据结构就是 inverted index(倒排索引)。inverted index 通常庞大、且建立过程相当耗时,于是,如何存储 inverted index 就变成了一件极为要紧的事情。显然,inverted index 不能简单地被放在 memory 中,它还必须做对应的持久化,让这些已经建立的 inverted index 可以被复用。ElasticSearch 是基于 Lucene 来构建的,在 Lucene 的世界里,inver
2021-04-15 17:19:49
225
原创 mmap 和 disk I/O 在不同情形下的性能分析
更好的文章格式,可参看:https://www.yuque.com/terencexie/geekartt/mmap-disk-io-performance-analysismmap(memory mapped file)从字面意思来看,似乎是在节省每次同 disk 做 I/O 的巨额开销(expensive overhead),通过把 main memory 作为 cache 来提升 disk I/O 的效率。但这样的认知完全是错的,因为 OS(operating system)已经为 disk .
2021-03-29 16:58:20
514
原创 kernel/user mode 的切换细节和设计考量
我们知道,在 OS(operating system)中有一个 kernel mode, user mode 的概念,其用处在于限定 instruction 的执行权限。处于 user mode 的 instruction,不可以直接执行访问 hardware 等敏感操作;而处于 kernel mode 的 instruction 则可以。如果不深究细节,似乎 user/kernel mode 是非常显然的模式,不就类似于调用某个 HTTP API 嘛,没啥了不起。但如果深究细节,问一下 user/ker
2021-01-27 20:59:58
470
原创 简评:并发问题的牛鼻子
Concurrency 的牛鼻子是 shared data,找准了 shared data 基本上就解决了一大半的问题。很多时候,意识不到 concurrency,或者无法利用 concurrency 的加锁性质,就在于无法正确识别 shared data。如果一个 concurrent 的程序,压根儿就没有 shared data,那么恭喜你,这就意味着你完全不必考虑 concurrency conflict,因为没有什么地方会有交集,自然也就不会用冲突。所谓井水不犯河水,哪来的冲突。但是,这同样意味
2021-01-18 21:04:17
97
原创 备忘录:计算机的世界 - 直观/体系
计算机的世界,是人类为自己构建的虚拟世界,是一个货真价实的平行世界。大部分人所理解的计算机的世界,指的是计算世界所构建的世界,而不是计算机的世界。普通人消费的是「计算机世界」这座工厂所生产出来的产品,唯有 programmer 有幸得以窥见其中的蛛丝马迹。遨游于计算机的世界,能够让你跳脱出来更好地审视你自己所生活的真实世界。就像人们常说的,人要出了国才知道怎么爱国。当你重新踏入一个新的世界后,你能够对你当前所处的世界有更为深刻的认识。从我们自己的教育经历来看,物理学、生物学、化学,都被放在了小学之后,从
2021-01-10 22:38:17
309
原创 理解C语言的external变量和static关键词
C语言的external变量总是神奇,像魔法一般的存在。要比较清晰地理解它,可以借助node的require。例如,如果们在node中有如下的代码:let foo = require('./constants.js').foo;我们可以非常清晰地知道,我们从 ./constant.js 中获得了一个被export的、名叫 foo 的变量。来源一清二楚。如果把上述代码转化成C的语法,则是简单的一句: external foo 。初看这句话,我们可能会蹦出一大片的黑人问号,这是神马
2020-12-09 20:57:38
1553
原创 在有限的果壳创造无限的宇宙
初学计算机,往往会给你一个幻觉,就是这样一台神奇的机器,能够做到很多你想象不到的事情。这一想法,本是无法可厚非。但如果将「计算机科学」看得过分神秘,或多或少,你将会将其当做神秘的巫术,而不是脚踏实地、按部就班的技术科学。即便是在该领域摸爬滚打多年的人,有时候还是能够发现自己潜意识中暗藏的对神秘和未知的膜拜。计算机科学的一个神奇之处在于,它能够不知疲倦地24小时连轴工作,能够处理海量的数据、能够永不停歇地做计算。这往往会给人一个幻觉,就是:它能够容纳无限的数据,能够有无限的引擎资源做计算。可事实是,计算机科
2020-11-28 21:13:05
126
原创 当我们追踪源码时,要追踪到什么程度?
源码追踪,是所有开发工程师要迈出的一道门槛。不会源码追踪,或者不习惯于研究出色开源组件的源码,注定会限制自己的成长,也无法广泛借鉴更多的编程技巧和工程思想。不会追踪源码,就像是不会识字的文盲,没办法在海量的知识海洋中遨游与成长。前两天看到一篇知乎热文:《你都有哪些面试时被虐的经历?》,以极其幽默的方式描述了在技术上被蹂躏的过程。究其原因,毫无疑问是基础不牢固。但为什么会基础不牢固?无非就是在研究...
2020-04-16 21:17:13
364
2
原创 为什么需要了解js的Event Loop
js的event loop机制的讲解材料简直汗牛充栋,它同时也是面试中较为高频的考察区域。对于newbie来讲,一个急需解决的问题便是:为什么我需要关心event loop?event loop的机制涉及browser和nodejs的不同实现,涉及引入的各种task queue,涉及不同的phase和phase之间的micro-task。要吸收这样繁多而枯燥的信息,如果没有足够的motivatio...
2020-04-09 15:36:25
180
原创 ElasticSearch/ES超过watermark被锁定
当ElasticSearch的数据超过自己设定的watermark时,ElasticSearch的服务就会被锁定,只允许读数据,而不允许写数据。这往往会让人非常懵逼,不知道发生了什么事情。在你重新规划了数据、让数据使用量低于watermark的前提下,你需要显式地向你的ES所在服务器发送请求来解除锁定:http://<ip_addr>:9200/_all/_settings{...
2020-04-05 16:08:57
1112
原创 zsh找不到Anaconda
在MacBook下使用 zsh 的一大痛点是,zsh 之外的环境变量path无法被添加进来,鸡儿导致诸如找不到Anaconda这些诡异的事情。修复方式很简单,就是将环境变量PATH添加进来:$ vim ~/.zshrc################# Add below into .zshrcexport PATH=/Users/<user_name>/anaconda...
2020-04-05 15:55:38
219
原创 为什么SICP要讨论那么多的初等数学
谈论/教授「软件工程」的一大难点在于它太过抽象,你必须辅之以相应的代码,才能较为清楚的表述某一条软件工程的原则。(抽象不仅导致读者对概念难以把握,更糟糕的是,抽象能够从多个角度被理解。如果不辅之以实际的例子,你的的理解可能会变成误解。这就是为什么教材需要大量实例的原因。而很多大牛的书之所以难读就在于例子太少,导致不得不先消化概念的抽象,再把误解变为正解。)筛选合适的例子可并不是一件容易的事情...
2020-04-04 14:04:16
432
1
原创 Vue精简结构认知入门
Vue的结构前端的开发由三部分构成:HTML(模板template)样式(CSS)逻辑(js)vue 便是按照这样的划分来整个三部分。更精妙的整合,源自于引入 单组件文件 .vue ,它能够在一个component中整合这三部分,进而把它当做一个微小的unit,供其他地方使用。这里涉及了非常微妙的平衡之道:如果 display template、display style、da...
2020-03-25 15:32:16
217
原创 什么是跨域,以及为什么浏览器要做“跨域限制”
为什么大家解释“跨域限制”这个事情都这么费劲?!动不动就给出一堆学术名词,神马“同源策略”“限制加载”blabla… 一上来就用高度抽象的词语来解释,初学者可能只会说一句:请说人话。“跨域”是在browser做的限制,按照 client-server 的模型,就是在client端做了些限制。如果我们先不考虑跨域,那么,假设在页面上对某个按钮的点击,涉及到需要请求第三方(third-party)网...
2020-02-10 14:37:57
1520
1
原创 Mac无法解压错误22
在Mac下使用默认解压工具来解压zip包,有一定的概率遇到如下“错误码为22 ”的解压错误。表面上来看,这似乎是文件损坏或者解压工具使用不对的问题。如果打开命令行,使用 unzip 命令来解压,我们会发现更为准确的错误信息:即无法创建非法编码的文件名。这种情况,很有可能是因为被压缩文件是在Windows系统中按照其编码做的命名,放到Mac中就出问题了。解决方式,可以直接使用App工具 T...
2019-12-10 10:01:09
16234
2
原创 MyBatis的极简使用模块
根据官方文档的介绍:MyBatis是围绕着 SqlSessionFactory 的实例来展开的。实例 SqlSessionFactory 可以由 SqlSessionFactoryBuilder 来创建。而 SqlSessionFactoryBuilder 则可以由一个XML配置文件来创建。(更准确的讲,是由这个XML文件内容构成的InputStream来创建。)假设我们这个XML配...
2019-11-07 23:15:20
163
原创 使用VSCode搭建Markdown写作平台
VSCode已经是声名远扬的代码编辑器,很多的编辑、文本工作,develop们都喜欢在这个平台下完成。高效、实时、更新快、背靠微软这座大山、还免费,基本上是理想中才会有的工具了。唯一值得吐槽的,或许就是它集成了Windows工具集的特点:极其占用内存资源,即便是在MacBook上,也能毫不费力地吃掉大把的内存。但使用VSCode来进行Markdown文本的写作,或许还不是大家所熟悉的。写作领域的...
2019-11-07 20:54:29
513
原创 Spring Bean的注册与发现
作为J2EE核心框架的 Spring,其最基本的一项职能是管理bean,即管理Java对象。在 Spring 的概念中,这个管理所有bean的大管家就是Container。有了Container这个概念,每一个Java类便可以更加独立地存在。创建出来的类A,可以将自己注册进这个container,成为一个bean,供它管理。在此之后,所有用到这个类A的地方,便可以直接向container索取。如此...
2019-09-24 11:09:40
179
原创 Puppeteer安装采坑
如果只是使用 npm i puppeteer 来做安装,应该会一步到位。奈何因为墙的关系,不得不把一个自动化的东西给拆解了,理解其中每一步的细节,具体解决每一个细小的问题。首先安装 nodejs 和 npm ,国内的可以通过安装 cnpm 来加快速度。接下来,按照习惯应该是通过 npm i puppeteer 来安装 puppeteer 。但,坑出现了,你会得到错误提示:或者ERRO...
2019-08-21 09:38:21
1890
原创 LeetCode: 1124
As we need to compare the counts of tiring days and non-tiring days, we can use number 1 to indicate tiring day and -1 to indicate non-tiring day. Then, the sum of interval represented by -1/1 will re...
2019-08-06 09:45:05
336
原创 使用Bin Model来回答Machine Learning机制的合理性
MotivationMachine leanring的核心思想是:通过大量的数据来拟合出模型(hypothesis)的参数,进而使用参数齐全的模型来做出预测。模型的本质是用数学的形式来描述你对数据的一种偏见、看法和主观感受。它以数学的方式阐述了:“你认为”这堆数据是按照什么样的规则被产生的。那么既然是“主观认为”,要将其变成令人信服的相对客观的规律,就需要你使用各种方式来证明你的这种“认为”是...
2019-06-08 15:07:37
581
原创 数据科学和软件工程
无论是否在从事data scientific的工作,数学和CS工程之间存在着需要沟通的部分。在学校时,或许更偏重于理论的推到和一个个独立算法碎片的学习。或者更本质地讲,偏重于算法的学习是imperative的语言范畴,而对于构建大型的模块来讲,这只是一个小的部分。甚至,就算是这么一个小的部分,你如何组织它的结构以形成复用性更高的模块,也是至关重要的。例如perception这个模型,在理论上讲是...
2019-05-09 14:23:58
632
原创 为什么跟随视频写代码让人绝望
记得最开始学习Java和J2EE的时候,最大的困惑无疑是:我怎么知道应该这么去写代码?不这样可不可以?培训中心善用的教材是:写一个坦克大战的GUI游戏,写一个blog或论坛,又或者写一个类似QQ的即时通讯工具。而教学步骤一般都是:嗯,先要有一个界面,来,于是造一个canvas。再来,需要有坦克,我们就写一个坦克的class。再来需要有子弹,于是给出子弹。再来是子弹移动,于是给它坐标。又或者是...
2019-05-07 20:15:37
516
原创 并发、消息队列、缓存
"并发"会引发关于"顺序"的问题,及如何能够在使用高并发提高效率的同时,又在一定程度上能够控制/维持一定的操作顺序。更广泛的,有关并发的"锁"操作,也都会围绕同样的思路来解决问题。没有银弹。想要在维持并发的同时,通过什么魔法来同时维持顺序是不可能的。最基本的核心想法是,将并发的操作变为串行,那么操作也就自然会有了顺序。这是一个看似有些矛盾的解决方案。并发的目的不就是为了提高效率么?!如果将并...
2019-04-25 10:54:08
4442
1
原创 Application无法传递Emoji字符到MySQL的问题
MySQL中无法存储Emoji字符,源自于MySQL 5.5之前utf8编码只支持最大3个字节,而Emoji需要4个字节。从MySQL 5.5开始,其utf8编码开始有了支持4个字节的utf8类型:utf8mb4 .通常,如果你的MySQL版本是5.5+但又无法在某个具体的列存储Emoji字符,就是源自于这个列的类型还停留于过去的utf8类型,没有升级到最新的支持4字节的utf8mb4.解决方...
2019-03-22 16:00:41
104
原创 白话Java I/O模型
I/O的很多操作和使用,其实并不是一个非常直观的概念,特别是打开文件、创建buffer。这对于终端用户来讲是个非常奇葩和奇怪的过程。我只是想要从一个文件里读取内容,从过程上来讲,我只需要知道:读取的source文件写入的目的地那我干嘛要去关心神马打开文件、创建stream和buffer?!所以,要理解I/O这一套东西以及它所涉及的stream、buffer,你必须先理解计算机的底层是如...
2018-12-08 14:42:11
179
原创 互斥锁mutex的简单实现
mutex一般用于为一段代码加锁,以保证这段代码的原子性(atomic)操作,即:要么不执行这段代码,要么将这段代码全部执行完毕。例如,最简单的并发冲突问题就是一个变量自增1:balance = balance + 1;表面看这是一条语句,可是在背后的汇编中我们可以看到,指令集操作过程中会引入中间变量来保存右边的值,进而这个操作至少会被扩充为:int tmp = balance + 1;...
2018-11-22 14:25:22
1870
4
原创 Kaptcha的结构
Kaptcha是Google提供的一个图形验证码插件,可以从官网https://code.google.com/p/kaptcha/了解更多的详情。它的源代码是公开的,在上面的官网提供的download项,可以下载一个zip包,里面包含了jar包和源代码。从源代码中,可以获得Kaptcha这个项目的一些思路结构:生成一个text,使用TextProducer。基于text,把包裹它的图片...
2018-10-29 17:43:42
120
原创 睁眼瞎的时代
这是一个无所不有的时代,这是一个一无所有的时代,这是一个打着灯笼也找不着的睁眼瞎的时代。曾经的认知屏障源于资源、信息的匮乏,而现在的认知屏障在于信息的泛滥。这种泛滥,还不仅是通常意义上所谓的杂音太多的泛滥,如娱乐、八卦、带节奏、标题党的信息泛滥,更有一大堆好的资料、好的数据源都赤裸裸地摆在你面前了,你就是连静下心来正经八百地看一眼的时间都没有。前几天出来的马蜂窝事件又一次刷新了数据分析的热度,...
2018-10-27 01:26:49
137
原创 关于编程语言的一些趣史
回顾历史做仔细的分析与研究,总能给人意想不到的发现和惊叹。从认知的难易程度上来看,编程语言的范式可以按照如下的方式排序:最容易理解的是structured programming,一根线从上往下;再来会稍微费点功夫理解的是object-oriented(OO)programming;更困难的是functional programming,相当抽象,整个就是一数学的抽象思维。自然地,历史的发展都是...
2018-10-23 20:03:48
285
原创 Spring框架的基本作用
作为Spring框架,它最主要的功能就是管理一堆使App(应用)发挥功能的类,这些作为整个App的基石、主干的类,就叫做bean。要管理bean,也即是这堆发挥业务功能的类,就不能直接把它们new出来,这样缺乏统一的调度。所以,Spring使用.xml配置文件作为媒介,以IoC(Inversion of Control 控制反转)作为工具,将这些bean拿给Spring container作统一...
2018-10-23 13:24:14
119
原创 11 Container With Most Water的数学证明 | LeetCode
11. Container with most waterGiven n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at...
2018-10-16 17:36:08
731
原创 探秘JS的异步单线程
对于通常的developer(特别是那些具备并行计算/多线程背景知识的developer)来讲,js的异步处理着实称得上诡异。而这个诡异从结果上讲,是由js的“单线程”这个特性所导致的。我曾尝试用“先定义后展开”的教科书方式去讲解这一块的内容,但发现极其痛苦。因为要理清楚这个东西背后的细节,并将其泛化、以更高的视角来看问题,着实涉及非常多的基础知识。等到我把这些知识讲清楚、讲完,无异于逼迫读者抱...
2018-10-16 17:32:38
194
原创 解决dedeCMS织梦系统不支持的“第三级目录展开”问题
dedeCMS织梦系统的目录展开,只能到第一级和第二级栏目,但其实调用到第三级目录是很常见的。比如你在一个大的主题目录下,想要显示某个子栏目的分栏,这其实就已经是第三级目录了。如下图所示: 而这个对织梦系统来讲并不支持,如下所示:{dede:channelArtlist typeid ='1'}<h3> <a href="{dede:field n...
2018-10-11 09:34:13
755
原创 重构后端模板文件的一种实践
后端的动态模板Java后端通常会使用ftl(freemarker template language)模板文件来动态返回前端页面。这个工作,通常还可以用jsp、php文件来实现。但这些动态模板的实现,通常是在已有的html文件上对特定的、需要做动态处理的部分做改写。这对小项目来讲没什么不对。可如果你的页面数量足够多,维护它们将成为一件异常困难的事情。 Nodejs大前端技术在目前的...
2018-10-07 10:55:27
121
原创 为什么程序员需要知道互联网行业发展史
相关声明:写这篇文章绝不是为了抹黑《极客时间》,相反我相当看好这个产品,并愿意为它的成长贡献一份自己的苦药。在《极客时间》刚一推出时,我便写了文章《「极客时间」带来的社区价值思考》来论述我看好它的原因。《极客时间》的很多专栏我都购买过,如果是纯黑,犯不着花费这么多钱去囤积专栏。《极客时间》上有一款很异样的专栏,叫做《技术与商业案例解读》。放在满是技术干货的专栏中间,这个专栏显得异常刺眼...
2018-10-06 23:37:04
495
An introduction to 4.3 BSD interprocess communication tutorial
2018-12-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人