自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

齐梦星空

专注大数据只是分享

  • 博客(139)
  • 资源 (2)
  • 收藏
  • 关注

原创 scala with cats 之 Contravariant Functors and Invariant Functors

概述Functor的意思是,如果有个F[A]和函数A=>B,那么就能得到一个F[B]。而Contravariant Functors的意思是,如果有个F[B],然后有个函数A => B,那我们就能得到一个F[A]。用途假如我们有个类型类,比如说trait Semigroup[A]{ def combine(x:A,y:A):A}我们经常要定义各种实例,比如Semigroup[Int],Semigroup[String],比如Semigroup[Boolean]。这些都是cats

2021-07-24 16:56:58 245

原创 Revisiting Tagless Final Interpreters

Revisiting Tagless Final InterpretersTageless Final interpreters are an alternative to the traditional Algebraic Data Type (and generalized ADT) based implementation of the interpreter pattern. This document presents the Tageless Final approach with Scala

2021-02-08 11:08:45 299 1

原创 3.6 总结

3.6 总结本章简要概述了ZIOTest。关于ZIO测试以及如何处理更复杂的场景,还有很多要学习的知识,但这应该为您提供开始编写自己的ZIO程序测试所需的工具。在继续阅读本书时,我们建议您为编写的代码以及所展示的示例和我们声称ZIO数据类型创建测试。当我们说一个数据结构对于并发访问是安全的时,请尝试从多根光纤进行更新,并确保获得正确的结果。当我们说即使效果被中断,终结器也将始终运行,请尝试中断它并验证终结器是否已运行。通过这样做,您不仅可以建立编写ZIO效果测试的技能,还可以加深您对所学内容的理解

2021-02-03 10:32:24 193 2

原创 3.5 基本属性测试

3.5 基本属性测试开始编写测试时要注意的另一个重要功能是ZIO Test支持开箱即用的基于属性的测试。在基于属性的测试中,测试框架不是您手动生成输入并验证期望的输出,而是从您指定的潜在输入分布中生成输入的整个集合,并验证所有输入的期望是否成立。基于属性的测试可以极大地提高开发人员编写测试的效率,并捕获直到生产才发现的错误,因为它可以使测试框架立即生成大量测试用例,其中包括开发人员最初可能没有考虑过的用例。但是,必须小心进行属性测试,以确保使用正确的生成值分布,包括足够数量的“拐角案例”(例如,空集

2021-02-03 10:31:53 1307

原创 3.4 常用的测试

3.4 常用的测试ZIO测试的另一个不错的特性是test aspects。 testaspects修改了测试执行方式的某些方面。 例如,testaspects可以在指定的持续时间之后使测试超时,或者运行指定次数的测试以确保它不易碎。我们通过使用spec @@ Aspect语法来应用测试aspects,如下所示: import zio.test.TestAspect._ object ExampleSpec extends DefaultRunnableSpec { def spec

2021-02-03 10:31:15 90

原创 3.3 测试实现标准的ZIO服务

3.3 测试实现标准的ZIO服务我们测试ZIO程序时,我们遇到的常见问题之一就是使用ZIO的标准服务来测试effect。例如,考虑这个简单的控制台程序。 import zio.console._ val greet: ZIO[Console, Nothing, Unit] = for { name <- getStrLn.orDie _ <- putStrLn(s"Hello, $name!") } yield () // greet: ZIO[Console

2021-02-03 10:30:39 145

原创 3.2 使用断言

3.2 使用断言在上面的示例中,我们使用了equalTo断言,这是最基本的断言之一。仅使用equalTo断言可以使您走得很远,但是在某些情况下,还有许多其他断言会派上用场。认为Assertion [A]的是一个非常好的理解断言的方法,该函数传入一个A值并返回一个布尔值,该布尔值表示该值满足断言,否则返回false。 type Assertion[-A] = A => Boolean def equalTo[A](expected: A): Assertion[A] = actual =&

2021-02-03 10:29:38 360

原创 3.1 使用ZIO测试,写一些简单的程序

3.1 使用ZIO测试,写一些简单的程序解决方案是ZIO Test,它是一个将effect视为第一类值并利用ZIO的全部功能的测试库。要开始使用ZIO测试,请首先将其添加为依赖项。libraryDependencies ++= Seq( "dev.zio" %% "zio-test" % zioVerzion "dev.zio" %% "zio-test-sbt" % zioVersion,)在这里,我们可以通过扩展DefaultRunnableSpec并实现其spec方法。

2021-02-03 10:28:59 220

原创 3.0 ZIO测试

3.0 测试ZIO程序除了编写表达我们期望的逻辑的程序外,测试这些程序以确保其行为符合我们的期望也很重要。这对于ZIO及其生态系统中的库尤其重要,因为ZIO的主要重点是可组合性,这意味着我们可以从少量构件和操作中组合出针对更复杂问题的解决方案,以将它们组合在一起。仅当每个构造块和操作员都对预期行为的保证表示担保时,才可以执行此操作。因此我们需要保证:方案提供的是我们想要的 例如,考虑这个简单的程序。 import zio.ZIO def safeDivision(x: Int, y: Int

2021-02-03 10:28:18 159

原创 2.10 zio入门——总结

2.10 总结函数式作用是并发工作流的蓝图,不可变的值提供了多种运算符,用于转换和组合effect以解决更复杂的问题。ZIO类型参数使我们可以对需要上下文提供环境才能执行的作用进行建模;它们使我们能够对故障模式进行建模(或缺乏故障模式);它们使我们能够描述最终由作用成功计算的结果。ZIO提供了多种方法来从同步代码,异步代码,纯计算和不纯计算中创建功能效果。此外,可以从Scala标准库中内置的其他数据类型创建ZIO效果。ZIO使用环境类型参数使编写与接口交互的可测试代码变得容易,而无需在整个应用程序中

2021-02-03 10:25:06 340

原创 2.9 zio入门——递归和ZIO

2.9 递归和ZIO我们在本章前面谈到了使用flatMap和相关的运算符来顺序合成effect。通常,如果调用递归函数,并且递归深度很大,则运行计算的线程可能会耗尽堆栈空间,这将导致您的程序引发堆栈溢出异常。ZIO的功能之一是ZIO效果对于任意递归效果都是堆栈安全的。 因此,我们可以编写ZIO函数来调用自己,以使用ZIO实现任何类型的递归逻辑。例如,假设我们要实现一个简单的控制台程序,该程序将从用户那里获取两个整数并将它们相乘。我们可以从实现一个运算符开始,以从用户那里获取一个整数,如以下代码片段

2021-02-03 10:24:34 234

原创 2.8 zio入门——标准ZIO服务

2.8 标准ZIO服务在本章的前面,我们讨论了ZIO环境类型,但是我们还没有使用它来编写任何程序。 在本书的后面,我们将深入介绍环境,并说明该环境如何为依赖项注入问题提供全面的解决方案。现在,我们将讨论ZIO为每个应用程序提供的基本服务以及如何使用它们。服务提供了定义明确的接口,可以在测试环境和生产环境中以不同的方式实现这些接口。ZIO根据平台为所有应用程序提供四到五个不同的默认服务:1.Clock。 提供与时间和计划有关的功能。 如果您正在访问当前时间或计划在将来某个时间进行计算,则使用此时间。

2021-02-03 10:24:07 338

原创 2.7 zio入门——更多的Effect构造函数

2.7 更多的Effect构造函数在本章的前面,我们了解了如何使用ZIO.effect构造函数将过程代码转换为ZIO效果。ZIO.effect构造函数是一种有用且通用的效果构造函数,但并不适合所有情况:易犯错误。 ZIO.effect构造函数返回的效果可能因任何Throwable类型(ZIO [Any,Throwable,A])而失败。 当您将遗留代码转换为ZIO并且不知道它是否会引发异常时,这是正确的选择,但是有时候,我们知道某些代码不会引发异常(例如检索系统时间)。同步。 ZIO.effect构

2021-02-03 10:23:32 248

原创 2.6 zio入门——对比Future

2.6 对比Future本小节,我们可以通过比较Scala标准库中的ZIO和Future来阐明到目前为止所学的知识。在本书后面讨论并发性时,我们将讨论ZIO和Future之间的其他差异,但目前要记住三个主要差异。2.6.1 一个 Future 就是一个正在运行的 effect与ZIO之类的函数式作用不同,Future是对运行时的作用进行建模。 回到先前的一个示例,请考虑以下代码段: import scala.concurrent.Future import scala.concurrent.

2021-02-03 10:22:57 352

原创 2.5 zio入门——ZIO类型别名

2.5 ZIO类型别名ZIO的三个类型参数,功能极为强大。我们可以使用环境类型参数进行参数注入(数据库,连接池,配置等),并且可以使用错误和成功类型参数返回结果。在最常见的情况下,程序需要向下传播依赖关系,并向上返回结果,而ZIO将所有这些都提供给类型安全的程序包。但是有时候,我们可能不需要所有这些功能。我们可能知道应用程序不需要外部环境,或者只能因某种类型的错误而失败,或者根本不会失败。为了简化这些情况,ZIO附带了许多有用的类型别名。如果您不想,则不必使用这些类型别名。您始终可以只使用完整的ZI

2021-02-03 10:22:26 410

原创 2.4 zio入门——ZIO类型参数

2.4 ZIO类型参数我们之前说过,类型 ZIO [R,E,A]的值是一种 functional effect,需要环境R,并且可能因E失败或成功返回A。现在,我们也了解了ZIO effect 成为并发工作流程的蓝图意味着什么,以及如何组合效果,下面让我们详细讨论每个ZIO类型参数:R是 effect 要执行效果所需的环境。一般指的是 effect 需要的一些依赖关系,例如访问数据库或日志记录服务,或者效果可能不需要任何环境,在这种情况下,类型参数将为Any。E是效果可能失效的值的类型。这可能是T

2021-01-29 11:05:33 599

原创 2.3 zio入门——一些常见的zio操作符

2.3 其他的一些顺序操作符按顺序组合是functional effect 最基本的操作,ZIO提供了各种相关的运算符来满足通用需求。zipWith最基本的是zipWith,它将顺序地合并两个effect,并且可以让用户指定函数来作为回调函数处理两个结果。例如,如果我们有两个effect提示用户的名字和姓氏,那么我们可以使用zipWith将这些effect按顺序组合在一起,将其结果合并为一个字符串:val firstName = ZIO.effect(StdIn.readLine("What is

2021-01-29 11:04:23 467

原创 第二章 zio 入门

首先祝贺你开始正式步入研究zio的旅程!ZIO将帮助您构建并发,有弹性,高效且易于理解和测试的现代应用程序。 但是学习ZIO要求以一种全新的角度来思考软件-从函数式编程的角度。这一章会教会你一些理解和编写ZIO程序的关键理论。我们会从介绍ZIO的核心数据类型(也叫 functional effect type)开始,然后将 functional effect type定义为并发工作流的蓝图。 我们将学习如何顺序地组合 effect ,并了解这如何将遗留代码重构为ZIO。我们会讨论每一种ZIO核心数据类

2021-01-29 11:02:37 536 1

原创 最详细G1垃圾回收器日志解读

首先,开启gc日志。-XX:+PrintGCDetails疏散阶段疏散阶段,主要是将内存中的数据从一些分区复制到其他分区0.522: [GC pause (young), 0.15877971 secs] # 这次疏散只涉及年轻代,总耗时 0.15877971.如果是混合gc则可能是 [GC pause (mixed), 0.32714353 secs] [Parallel Time: 157.1 ms] # 并行疏散,总耗时 157.1 ms [GC Worker Start (m

2021-01-28 18:36:57 1341

原创 2.2 zio入门——按顺序组合ZIO

2.2 按顺序组合ZIO正如上小节所述,ZIO效果是描述并发工作流的蓝图,并且我们通过转换和组合更小,更简单的效果来构建更复杂的效果,从而解决业务问题。我们看到了如何使用 ZIO 的 delay 运算符将一个效果转换为另一种效果,并将其执行延迟到将来。 除了延迟之外,ZIO还拥有数十种其他强大的运算符,它们可以转换并组合效果以解决现代应用程序开发中的常见问题。我们将在随后的章节中学习大多数这些运算符,但是我们需要介绍的最重要的运算符之一就是flatMap。ZIO效果的flatMap方法表示两个效果的

2021-01-27 20:40:35 322

原创 2.1 zio入门——把函数作用作为工作蓝图

ZIO标准库的核心数据类型是ZIO[R, E, A],这种类型的值被称为函数式作用函数式作用是并发工作流的一种蓝图,如图1所示。该蓝图本质上是纯描述性的,必须执行才能观察到任何副作用,例如与数据库的交互,日志记录,流传输 网络中的数据,或接受请求。ZIO [R,E,A]类型的函数式作用要求您在运行的时候提供R类型的值,并且在执行效果时,它可能会执行失败返回类型为E(错误类型),或者执行成功返回类型为A(成功类型)。稍后我们将详细讨论这些类型参数。但是首先,我们需要了解将效果变为蓝图意味着什么。在传统

2021-01-27 20:16:41 483 2

原创 scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下

traittrait不能有构造函数trait people(name:String) // errortrait people(val name:String) // errortrait people(var name:String) // errortrait people{name:String} // errortrait people{val name:String} // righttrait people{var name:String} // righttrait的继

2021-01-11 11:14:32 270

原创 scala项目的全局配置实践

定义一个 object 放一些常量名,相当于各种属性的key值object MktEnvironmentContants { // 系统环境变量 val KEY_UAP_ZK_SERVER = "uap.zk.server" val KEY_UAP_SERVICE_CONSOLE_PORT = "uap.service.console.port" val KEY_UAP_SERVICE_ANALYZE_PORT = "uap.service.analyze.port" val KE.

2021-01-08 14:32:43 293

原创 jvm 性能调优之 jmap

概述Java Memory Map,打印出某个java进程内存中所有‘对象’的情况(如:产生那些对象,及其数量),可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file

2020-10-09 22:18:18 453 1

原创 G1垃圾回收日志分析

标准 gc 日志使用G1垃圾回收器最难的地方是读懂回收日志。G1回收虽然也是分代的,但是打印出来的日志却不像其他回收器那样明显。所以需要好好配置JVM参数才行。先看下面一段日志,这段日志是通过配置好的JVM参数输出的,分隔明确,很容易分辨出每次回收过程。 # 每次回收以 花括号开始 # invocations=2302 代表第2302次回收{Heap before GC invocations=2302 (full 0): garbage-first heap total 32768K, u

2020-10-09 21:47:23 1184

原创 scala 上界 <:, 下界>:, 视界 <%, 边界 :, 协变 +T, 逆变-T

概述上界 (<:) 下界(>:) 是类型约束范畴,用来约束对象的子类是谁,父类是谁协变 (+T) 逆变(-T)是泛型范畴,主要用于集合类型变量赋值。视界 (<%) 边界( :)是隐式调用的简写。上界 (<:) 下界(>:)上界:要求对象必须是某一个对象的子类,因为子类会继承父类的属性和方法,所以父类的方法和属性这路都可以用。 trait A { def func() } class B extends A { override def fu

2020-08-29 18:28:44 513

原创 scala反射详解

概述Scala 的反射分为两个范畴:运行时反射:通常意义上的反射编译时反射:宏,或者元编程这两者之间的区别在于Environment, 而Environment又是由universe决定的. 反射的另一个重要的部分就是一个实体集合,而这个实体集合被称为mirror,有了这个实体集合我们就可以实现对需要反射的类进行对应的操作,如属性的获取,属性值得设置,以及对反射类方法的调用(其实就是成员函数的入口地址, 但请注意, 这只是个地址)!可能有点绕, 说的直白点就是要操作类方法或者属性就需要获得指定的

2020-08-29 11:22:34 2542

原创 scala trait,class 和 object在内存中的状态

traittrait的变量并不能直接访问,说明不是静态的.trait既能被class继承也能被object继承每一个继承trait的类生成实例的时候(无论是class还是object)都换先生成一个trait实例(或者说对象)java的属性是static final的,全局唯一。而trait的属性实际上是方法调用而已。class Son()trait Father { println("i am trait") val son = new Son() var b = new So

2020-06-29 16:40:36 230

原创 事实也许和你想的不一样:volatile,原子类,synchronized在scala的Thread,线程池,Future中使用对比

在scala和java中通常用于数据同步的材料有volatile关键字,原子类,synchronized关键字。但是在不同的多线程环境下,产生的效果却并不相同。实验在独立线程环境下使用volatile关键字,原子类,synchronized关键字构造1000个独立的Thread实例同时启动 // 不使用任何同步机制 var i: Int = 0 (0 to 10000) foreach (_ => new Thread() { i = i + 1 }.

2020-06-21 11:19:11 793 2

原创 scala的代码块 和 无参代码的区别

前言最近在创建线程的时候写了如下代码,然后发现线程内的 run 方法总是无法执行:object MyThread { def thread(body: => Unit): Thread = { val thread = new Thread { override def run(): Unit = body } thread.start() thread } def main(args: Array[String]): Unit =

2020-05-26 11:49:09 220

原创 mysql8.0下载,安装,更改密码

文章目录资源下载将mysql解压到`/usr/local/mysql`更改`/etc/my.cnf`创建数据存放路径用户组配置配置mysql用户的执行权限数据初始化启动服务环境变量配置修改初始密码防火墙管理,开启3306端口远程访问资源下载链接:https://pan.baidu.com/s/1ozfedVlRDsB8dqfJtol4mw 密码:tzi1将mysql解压到/usr/loc...

2020-05-04 19:07:39 267

原创 scala类型判断关键字:isInstanceOf和asInstanceOf,getClass和classOf

isInstanceOf和asInstanceOfisInstanceOf:isInstanceOf用于判断对象是否是某类或者某类子类的实例asInstanceOf:相当于java的强制类型转换class Person { var name: String = "" var age: Int = 0 def this(name: String, age: I...

2020-04-27 16:46:51 467

原创 sbt 离线安装依赖包

在mvn中离线安装依赖包去网上搜索依赖包所在的位置https://mvnrepository.com/,以 spark-corea为例。选择仓库和版本,并离线下载到指定文件夹。这里可以把url拷贝到迅雷等下载工具下载,加快下载速度。使用命令行进行安装cd path // 进入到jar包所在文件夹mvn install:install-file -Dfile=spark-co...

2020-04-24 12:42:00 1192

原创 在idea上搭建hadoop2.2.0源码阅读环境

获取解压源码,并建立idea项目修改hadoop-annotations子项目的jdk依赖版本。先简单编译一下,发现产生如下错误:原因是hadoop-annotations项目的jdk版本和本机不匹配.结局方法如下:解决org.apache.hadoop:hadoop-maven-plugins插件编译问题将上一步修改后的文件再编译一次,出现如下提示:解决方案:先通过mvn...

2020-04-17 10:56:16 337

原创 spark的excutor调优思路

spark的excutor调优主要考虑两种资源:内存和cpu核心数优先保证程序可运行的情况下增加excutor数量在spark中,一个excutor是一个进程,是内存资源分配的基本单位。理论上excutor的数量可以非常大,但是yarn有资源管理的功能,如果excutor占用的资源超过了集群拥有的资源,多余的进程会被挂起。所以第一原则是单个excutor分配的资源要满足程序运行要求的情况下尽量...

2020-03-30 18:26:12 424

原创 scala的Future和Promise

前言使用scala的Future和Promise就不得不提一下异步编程和多线程编程的区别。共同点:异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性不同点:线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。多线程在单个线程中的处理程序依然是顺序执行,符合普通人的思维习...

2020-03-30 16:39:06 746

原创 scala有什么优点?

面试腾讯的时候突然问我这个问题,闲来无事总结一下。写scala的代码更容易表达思路。也就是你脑子想到那你就可以写到哪,但是这个是优点也是缺点,这种方式编写的代码易写难懂,拓展性差。当然这种优点只是个人感觉,因为scala的是一个多范式语言,他也能像java那样编写出架构精巧,扩展性强的代码。scala具有优秀的类型推断功能。比如定义:val s = "name".这样的代码,不需要显示声明,...

2020-03-29 22:27:33 2396

原创 leetcode的背包问题

01 背包题目有N件物品和一个容量为V的背包。第i件物品的费用是w[i],价值是v[i],求将哪些物品装入背包可使价值总和最大。题解定义数组dp[i][j] # 代表前i个商品,放入一个容量为j的背包,所获得的最大价值初始化# 如果要求恰好放满背包,则数组初始化为 -infdp = [[-inf] * (amount + 1) for _ in range(n)]# 如...

2020-03-28 23:46:57 625

原创 HashMap和CHM的四种遍历方式

方法一:在for-each循环中使用entries来遍历for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}方法二:在for-each循环中遍历ke...

2020-03-27 15:01:46 288

原创 串一串java的voliate,cas,原子类

cpu是如何使用内存的在将下面的voliate之前就不得不谈一谈cpu和们的主存之间的关系。CPU的运算处理速度与内存读写速度的差异非常巨大,为了解决这种差异充分利用CPU的使用效率,就开始在CPU处理器和内存之间加了一层缓冲区。注意:所以所谓的本地内存,主内存都是抽象概念,并不一定就真实的对应cpu缓存和物理内存。当然如果是出于理解的目的,这样对应起来也无不可。但是高速缓存在解决cpu的...

2020-03-27 11:57:12 479

python离线安装所需所有资源(python3.6,pip,gcc)

gcc.tar get-pip.py Python-3.6.5.tgz Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。

2020-01-08

gcc.tar(gcc-4.8.5-39.el7.x86_64.rpm)

gcc-4.8.5-39.el7.x86_64.rpm cpp-4.8.5-39.el7.x86_64.rpm gcc-c++-4.8.5-39.el7.x86_64.rpm gcc-gfortran-4.8.5-39.el7.x86_64.rpm libgcc-4.8.5-39.el7.x86_64.rpm libgfortran-4.8.5-39.el7.x86_64.rpm libgomp-4.8.5-39.el7.x86_64.rpm libquadmath-4.8.5-39.el7.x86_64.rpm libquadmath-devel-4.8.5-39.el7.x86_64.rpm libstdc++-4.8.5-39.el7.x86_64.rpm libstdc++-devel-4.8.5-39.el7.x86_64.rpm

2020-01-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除