RingBuffer in scala

是什么?

ring_bufferRingBuffer (环形缓冲区),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流(用来实现轮转功能的日志也很合适)。

它亦是一个队列,先进先出(FIFO)。这意味着,入队永远是在环的尾部(tail),出队永远是在环的头部(head)。这个环的容量是一开始就确定的,那么不停变换的,是头尾两个指针:入队驱动tail,出队驱动head,在环上单向轮转。

性能优势

我们可以将RingBuffer实现为一个不停覆盖尾部的版本, 以提供一种高性能的有限无锁队列:

  • 它使用数组,比链表要快,且基于一个可预测的访问模式(数组内元素的内存地址 具有连续性[……]

阅读全文

JS中的一些函数式编程术语

组合 Composition

组合某种类型(含函数)的两个元素,进而生成一个该类型的新元素:

偏函数应用 Partial Application

一个多参函数,如果我们只提供了部分参数,这种应用就是偏函数应用:

柯里化 Currying

把多参数函数处理成 接受一个参数,返回一个接受下一个参数的函数 的形式:

注意:柯里化和偏函数应用是不同的,它只接受单参输入;在Haskell这样[……]

阅读全文

学习RxJS:Cycle.js

是什么

Cycle.js 是一个极简的JavaScript框架(核心部分加上注释125行),提供了一种函数式,响应式的人机交互接口(以下简称HCI):

函数式

Cycle.js 把应用程序抽象成一个纯函数 main(),从外部世界读取副作用(sources),然后产生输出(sinks) 传递到外部世界,在那形成副作用。这些外部世界的副作用,做为Cycle.js的插件存在(drivers),它们负责:处理DOM、提供HTTP访问等。

circuit_flow

响应式

Cycle.js 使用 rx.js 来实现关注分离,这意味着应用程序是基于事件流的,数据流是 Observable 的:

observable_stream

HCI[……]

阅读全文

学习RxJS: 导入

引子

新手们在异步编程里跌倒时,永远会有这么一个经典问题:怎么在一次异步调用里return一个结果啊?

老司机说要用回调函数,然后有条件判断的嵌套回调(回调地狱)问题来了;

老司机推荐用事件,然后异步流程里有顺序依赖;

老司机推荐用Promise,然后有顺序依赖的流程里,居然还想订阅事件;

老司机建议试试协程,谁知对方想要合并两个异步调用;

……

以上,是异步编程里要面对的一些难题,也是ReactiveX API 所致力解决的

是什么

知道有 ReactiveX 这么一回事, 源于一位巨硬铁粉的安利演示:Reactive LINQ 加持的C#,简洁[……]

阅读全文

Node.js项目的持续集成

引子

持续集成 (Continuous Integration,简称CI)是一种软件工程实践:项目需要经常性的集成(每天发生若干次)成员的工作成果。这个集成的动作五花八门,可能涉及但不限于:

  • 运行测试
  • 编译/构建
  • 打包/发布版本

每一次集成都会有一个结果,成或者败:

  • 成 -> 将得到一个可用的成果
  • 败 -> 反映出项目中的问题,解决这个问题将成为项目中优先级最高的任务

CI的价值可谓不言而喻。

Jenkins CI flow

Jenkins CI

Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业[……]

阅读全文

过去的一年

昨天,豆瓣的友邻们纷纷以分享观影报告的方式,来传递辞旧迎新的信号,我也跟风做了一份,被告知:过去的一年,我看过117 部电影,平均 3.1天一部,比2014年少了 14 部。

音书方面:听过专辑155张,读过书的是18本。中规中矩。

此外的收获:

  • 戒烟成功
  • 拿到驾照

也有一些调整:

  • 放弃背单词,每天练习几句听力
  • 搁置细软跑计划(要解决的问题太多,却没有清晰的路径 🙁

年底的时候,送别了要回成都发展的好友蛋总,才察觉到时光的流逝,一声叹息。他告诉我,过去的一年,他只写了一首歌:凯瑟琳

好朋友陈耀

这让我惭愧:我甚至都不怎么弹琴了 🙁

贫[……]

阅读全文

使用node-forge保障Javascript应用的传输安全

引子

半年前的最后一次更新(惭愧  ),提到了对称与非对称的混合加解密系统,点到为止而未涉及实践,今次将就此展开,再续爱丽丝与鲍伯的前缘。

Asymmetric_cryptography_-_step_2.svg

为什么

Javascript应用的安全传输,这事不是有SSL吗,为什么要多此一举呢? 好问题,自己实现TSL是因为:

  • SSL是基于浏览器的,是浏览器负责的安全性,这意味着,非浏览器应用得不到保护,即使你的服务器上安装了证书
  • SSL需要有明确的CA受信端,自颁发证书的对等端应用,显然是使用不能

那么,这样的场景是需要自实现 TSL 的:一台node服务器 和 一个electron桌面应用 之间的安全通信

怎么做

SSL是怎[……]

阅读全文

对称加密、公钥加密和RSA

引子

对于加解密,我一直处于一种知其然不知其所以然的状态,项目核心部分并不倚重加解密算法时,可以勉强对付过去,一旦需要频繁应用诸如 AES/RSA等算法,这种状态就颇令人捉急了。

是时候了解一下原理了,所以找来了这本图解密码技术 给自己补补课:

图解密码技术

在该书深入浅出的指引下 ,补充了一些常识,在此进行一番梳理:

 

对称加密算法(共享密钥)

顾名思义,对称加密就是用相同的密钥进行加密和解密。说到对称加密,异或加密又是一个不得不提的概念:

XOR(异或加密)

明文与密钥进行一次 异或 (记做㊉ ) 运算将成为密文,密文再与密钥进行一次异或运算将还原为明文:[……]

阅读全文

DSL in action

最近看了本有意思的书,受到了一些启发,在此记录一下:

DSLs in action

DSL in Action

DSL是什么

即 domain-specific language ,是指和业务域模型相关的语言,粗糙的说法:行(业黑)话。关于什么是DSL,见仁见智,比如我认为SQL是一种DSL,有人却认为不是。

用途

对于“然并卵”一族来说,世界上大多数事情对他们来说都没什么用,DSL也不例外;于我而言,用DSL的一套理论能实现一个查询JSON对象的库,类SQL的语法,几百行就能搞定,使用起来像是这样的:

dataSource是类似这样的数[……]

阅读全文

使用TypeScript编写Node项目

入 TypeScript 坑有一段时间了,由衷的看好,所以决定在自留地絮叨一番。

是什么

typescriptTypeScript (以下简称TS)是巨硬推出的JavaScript转译语言,这意味着:

  1. 它需要编译
  2. TS代码会被编译成JavaScript代码

TS的特点是提供 模块、类、接口等一系列类型概念,协助开发者在编译时就定位出一些传统JavaScript项目的运行时错误,以实现巨硬所谓的”Robust components”(值得一提的是,TS是大名鼎鼎的 Anders Hejlsberg 主导的项目。

为什么

JavaScript 一般被视为一种动态类型、弱类型的语言,它拥有巨大[……]

阅读全文