Home

《Scala谜题》读书笔记

有些问题还没有完全搞懂,不过先记录下来。 先放一张 scala 的类图: 笔记按照题目顺序整理。 //scalaVersion:2.12 package numericOps import scala.collection.mutable object ScalaPuzzlers extends App { /* // 1. 占位符 // Hi // Hi // List(2, 3) // 常规匿名函数是从 => 一直到代码块结束的所有代码 println(List(1, 2).map{i => println("Hi"); i + 1}) // Hi // List(2, 3) // 占位符_语法定义的匿名函数,只包括含有_的表达式 ...

Read more

度厂回忆录

W 说,“当你不能够再拥有的时候,你唯一可以做的,就是令自己不要忘记。” 我想起来成才从 A 大队走的时候,他问许三多,“咱们当兵三年了,你能想起其中的每一天吗?我想念七连,又臭又硬的钢七连,我使劲想,可我想不起一件事,一个人……” 不久后的某天,我也会离开百度,就像成才当年对 A 大队的向往,我也曾经那么向往在百度工作。不同的是,当离开的时候,我开始怀念在这里的每一天。我突然想要记录这里的每一件事情,这种感觉在我提了离职之后愈加强烈,以至于那么一瞬间有后悔的冲动。 当说出了告别,才意识到有多么不舍。当意识到不能够再拥有的时候,我告诉自己,记录下来不要忘记,这就是我的度厂回忆录。 1. 新兵报到 工位最底层的抽屉里,至今保留着一张纸,上面是入职的流程。工位来回搬了几次,这张纸...

Read more

《Functional Programming Principles in Scala》

最近借着几个周末在 Coursera 上完成了 《Functional Programming Principles in Scala 》,算是终于把之前立的上一门 Coursera 课程的 flag 给做到了。 1. 课程之外 这门课是 Scala 的作者 Martin Odersky, Professor 开的,相比看书,从中能看到更多原汁原味的设计思想,例如为什么会有 Call-By-Name 和 Call-By-Value、Curring 函数等。 学习这门课的时候我脑海里不断的浮现出这条曲线 感觉自己刚看了一个月 scala,就敢写《scala 30分钟极简入门》也是自信心爆棚了。 严格来讲,这门课程不算难,看过《Scala 编程》这本书的话,估计会觉得更轻松一...

Read more

《Scala实用指南》读书笔记八:创建应用程序

1. XML作为一等公民 Scala提供了一种类似于XPath的查询能力,它和XPath只有一点细微的差别。Scala不使用熟悉的XPath正斜杠(/或者//)来查询,而是使用反斜杠(\和\\)来作为分析和提取内容的方法。这种差别是必要的,因为Scala遵循Java的传统,使用两个正斜杠来进行注释,而单个正斜杠则是除法操作符。 val xmlFragment = <symbols> <symbol ticker="AAPL"><units>200</units></symbol> <symbol ticker="IBM"><units>215</unit...

Read more

《Scala实用指南》读书笔记七:使用Actor编程

在编写复杂、耗时的应用程序时,我们经常会使用多线程以及并发来降低响应时间或者提高性能。可惜,传统的并发解决方案导致了一些问题,如线程安全、竞态条件、死锁、活锁以及不容易理解的、容易出错的代码。共享的可变性是罪魁祸首。 避免共享的可变性,便已经规避了许多问题。但是如何避免呢?这就是Actor模型发挥作用的地方。Actor帮助我们将共享的可变性转换为隔离的可变性(isolated mutability)。Actor是保证互斥访问的活动对象。没有两个线程会同时处理同一个Actor。由于这种天然的互斥行为,所有存储在Actor中的数据都自动是线程安全的——不需要任何显式的同步。 如果能将一个任务有意义地分解为几个子任务,即分而治之,就可以使用Actor模型来解决这个问题,设计良好又清晰,并且...

Read more

《Scala实用指南》读书笔记六:并行集合

如果惰性是提高效率之道路,那么并行性则可以被认为是提高效率之航线。如果两个或者多个任务可以按任意顺序序列执行,而又不会对结果的正确性产生任何影响,那么这些任务就可以并行执行。Scala为此提供了多种方式,其中最简单的方式是并行地处理集合中的元素。 这篇笔记是书中一个例子:给定一些城市的名字,从 web 获取对应的天气状况(xml格式),按照城市名字排序展示。因此会用到 url/xml 操作,不过重点我们看下,如何释放一个集合的并行能力。 1. 顺序集合 首先定义一个方法,参数为城市名,返回这个城市的天气状况: import scala.io.Source import scala.xml._ def getWeatherData(city: String) =...

Read more

《Scala实用指南》读书笔记五:递归和惰性求值

1. 递归 使用解决子问题的方案解决一个问题,也就是递归,这种想法十分诱人。许多算法和问题本质上都是递归的。一旦我们找到窍门,使用递归来设计解决方案就变得极富表现力且直观。 一般来说,递归最大的问题是大规模的输入值会造成栈溢出。但幸运的是,在Scala中可以使用特殊构造的递归来规避这个问题。在本章中,我们将分别探讨强大的尾调用优化(tail call optimization)技术以及Scala标准库中的相关支持类。使用这些易于访问的工具,就可以在高度递归的算法实现中既可以处理大规模的输入值又能同时规避栈溢出(即触发StackOverflowError)的风险。 1.1. factorial //factorial def factorial(number: Int):...

Read more

《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...") ...

Read more

《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] = ...

Read more

《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 } ...

Read more

《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(...

Read more

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 的时候就能够提前约定,策略同学在新增...

Read more