《Scala实用指南》读书笔记六:并行集合
如果惰性是提高效率之道路,那么并行性则可以被认为是提高效率之航线。如果两个或者多个任务可以按任意顺序序列执行,而又不会对结果的正确性产生任何影响,那么这些任务就可以并行执行。Scala为此提供了多种方式,其中最简单的方式是并行地处理集合中的元素。
这篇笔记是书中一个例子:给定一些城市的名字,从 web 获取对应的天气状况(xml格式),按照城市名字排序展示。因此会用到 url/xml 操作,不过重点我们看下,如何释放一个集合的并行能力。
1. 顺序集合
首先定义一个方法,参数为城市名,返回这个城市的天气状况:
import scala.io.Source
import scala.xml._
def getWeatherData(city: String) =...
《Scala实用指南》读书笔记五:递归和惰性求值
1. 递归
使用解决子问题的方案解决一个问题,也就是递归,这种想法十分诱人。许多算法和问题本质上都是递归的。一旦我们找到窍门,使用递归来设计解决方案就变得极富表现力且直观。
一般来说,递归最大的问题是大规模的输入值会造成栈溢出。但幸运的是,在Scala中可以使用特殊构造的递归来规避这个问题。在本章中,我们将分别探讨强大的尾调用优化(tail call optimization)技术以及Scala标准库中的相关支持类。使用这些易于访问的工具,就可以在高度递归的算法实现中既可以处理大规模的输入值又能同时规避栈溢出(即触发StackOverflowError)的风险。
1.1. factorial
//factorial
def factorial(number: Int):...
《Scala实用指南》读书笔记四:模式匹配和正则表达式
1. 模式匹配
Scala的模式匹配非常灵活,可以匹配字面量和常量,以及使用通配符匹配任意的值、元组和列表,甚至还可以根据类型以及判定守卫来进行匹配。接下来我们就来逐个探索一下这些应用方式。
// 匹配字面量和常量
def activity(day: String): Unit = {
day match {
case "Sunday" => print("Eat, sleep, repeat... ")
case "Saturday" => print("Hang out with friends... ")
case "Monday" => print("...code for fun...")
...
《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 写的,可...
238 post articles, 30 pages.