《Scala实用指南》读书笔记三:集合
1. 集合
Scala标准库包含了一组丰富的集合类,以及用于组合、遍历和提取元素的强大操作。在创建Scala应用程序时,会经常用到这些集合。如果想要在使用Scala时更加具有生产力,彻底地学习这些集合是很有必要的。
在scala 30分钟极简入门
也简单介绍过集合。
例如:
val colors = Set("Bule", "Green", "Red") //> colors : scala.collection.immutable.Set[String] = Set(Bule, Green, Red)
colors.getClass //> res0: Class[?0] = ...
《Scala实用指南》读书笔记二:函数值和闭包与特质
1. 函数值与闭包
在函数式编程中,函数是一等公民。函数可以作为参数值传入其他函数中,函数的返回值可以是函数,函数甚至可以嵌套函数。这些高阶函数在Scala中被称为函数值(function value)。闭包(closure)是函数值的特殊形式,会捕获或者绑定到在另一个作用域或上下文中定义的变量。
1.1. 函数
函数式编程来实现求解数组最大值/和的例子:
val array = Array(2, 3, 5, 1, 6, 4) //> array : Array[Int] = Array(2, 3, 5, 1, 6, 4)
array.foldLeft(0){ (sum, elem) => sum + elem }
...
《Scala实用指南》读书笔记一:处理对象与善用类型
1. 处理对象
1.1. 单例
可以选择将一个单例关联到一个类。这样的单例,其名字和对应类的名字一致,一次你被称为伴生对象(companion object)。相应的类被称为伴生类:
object singleton extends App {
import scala.collection._
class Marker private (val color: String) {
println(s"Creating ${this}")
override def toString = s"markier color $color"
}
object Marker {
private val markers = mutable.Map(...
protobuf 之 Custom Options
1. 问题
protobuf 默认支持的数据类型有 double float int32 int64 string bytes bool 等几种类型。在有的生产场景中,我们可能需要更多的类型,比如把 protobuf 转换为 mcpack(厂内某个很古老的数据格式),对于一段字符串,protobuf 统一认为是 string/bytes,而 mcpack 则把字符串区分为 raw/string 两种类型,此时就需要我们在 proto 能够标记以区分这两种类型。在 brpc 的 mcpack2pb里也是类似的问题。
或者是数据存储/分发的场景,对于接收的 message,我们希望有的字段能够覆盖写、有的删除、有的建索引,如果在定义 message 的时候就能够提前约定,策略同学在新增...
我是一个 op 之 supervisor
1. 简介
平时在开发机上,有一些进程比较稳定,基本不用考虑退出的场景,例如python -m SimpleHTTPServer,我习惯直接使用 nohup 放到后台执行。nohup 使用简单,但是如果进程需要从 stdin 读取输入,例如agedu -w(显示磁盘使用容量),无法使用 nohup 放到后台执行。
后台服务进程需要保证 7*24,因此对稳定性要求较高。进程无论是主动还是意外退出时,都需要一个自动拉起的机制,保证服务可用。supervisor 就是这样一个工具。
更进一步,supervisor 提供了非常方便的管理进程的能力,使得我们可以专注于实现后台服务功能本身,而不用关心如何管理服务进程。
2. 安装及配置
supervisor 是用 python 写的,可...
leveldb笔记之24:leveldb笔记总结
从去年突然想写几篇关于 leveldb 的笔记开始,不知不觉已经过去五个月了,原定的几篇也不小心写成了二十多篇。
这篇笔记作为一个总结篇,整体介绍下。
1. 整体架构
我尝试把所有笔记画成了一张图,包含了重要的结构及流程。从最开始的 leveldb 读写流程逐渐放大,包含 memtable sstable 等的结构,以及更细节的部分。
其实可以画的更细,不过因为太复杂放弃了,感兴趣的话可以直接看下笔记.
简单来讲,文件结构上跟BigTable里 Tablet Representation 部分很像:
2. LSM
提起 leveldb,就不得不说 LSM. leveldb 是 LSM 的一个典型实现。
The Log-Structured Merge-Tree ...
leveldb笔记之23:谈谈leveldb的一些魔数
代码里经常会有一些奇怪的数字设置,我们称之为魔数(magic number)。这些数字有的没有意义,有的则包含了线上实际经验。很多时候想清楚这些数字设置的原则,对于充分理解一个模块,以及线上优化,都有重要的作用。
这篇笔记,聊聊 leveldb 里的那些数字。
经验不足,有些只是纯粹靠着代码臆测,不对之处还请指正。
1. memtable 的最大大小
option.write_buffer_size表示一个 memtable 的最大大小,默认为 4M.
2. level 0 的文件大小及个数
level 0 的文件是无序的,每次查找 level 0都需要查找所有文件,因此需要严格控制个数。
当文件数目 >= config::kL0_SlowdownWritesTri...
扯扯 cpu idle 与 load average
最近值周遇到一个系统负载的问题,回溯了下问题大概已经持续了两个多月,这篇笔记记录下对于系统 CPU 负载的理解,不定期根据线上经历更新。
1. idle 与 load
idle 表示 cpu 的闲置程度,数值越大表示 cpu 负载越低。对应的,load average 表示 CPU 的利用率,系统记录了过去 1min/5min/15min 的记录。
通过 top 可以看到这两个数值:
更细的,可以看到每个 cpu 的 idle:
严格来讲,load average 是指运行队列的平均长度,也就是等待 cpu 的进程数。这些进程是系统中的活动进程,也就是处于 TASK_RUNNING or TASK_UNINTERRUPTIBLE 的进程数。
系统的进程状态有这么几种...
235 post articles, 30 pages.