1.Intellij IDEA使用Maven构建Scala开发环境
2.Sparkä¸cacheåpersistçåºå«
3.Scala中的码跳WrappedArray源码详解
4.scala manifeståclassmanifestçåºå«
5.idea实用系列4使用Maven构建Scala项目
6.理解计算机系统:计算机的组成
Intellij IDEA使用Maven构建Scala开发环境
在开发Scala项目时,选择合适的码跳IDE与构建工具至关重要。根据Scala官方指南,码跳建议使用Intellij IDEA与sbt作为开发与构建工具。码跳然而,码跳sbt默认依赖国外Maven仓库,码跳木皆支付源码导致国内用户下载速度缓慢。码跳为了解决这一问题,码跳推荐采用Intellij IDEA配合Scala插件与Maven构建Scala开发环境。码跳
一、码跳背景:考虑到国内用户面临的码跳下载延迟问题,使用Intellij IDEA、码跳Scala插件和Maven构建Scala项目,码跳是码跳更为高效且便捷的解决方案。Maven作为构建工具,码跳能够帮助开发者管理依赖、编译代码和执行测试,而Intellij IDEA与Scala插件则提供了友好的开发环境。
二、软件安装:首先,确保已安装最新版本的Intellij IDEA,通过官网下载并按照指示完成安装。对于Scala插件,同样在Intellij IDEA中通过Marketplace安装,搜索并下载“Scala”插件以增强IDEA的Scala开发功能。
三、配置:配置关键在于引入Scala编译插件和SDK。
说明1:安装scala-maven-plugin是构建Scala项目的关键步骤。此插件允许Maven编译Scala源代码,确保构建流程顺利进行。
说明2:安装scala-library组件,目的是让IDEA的Scala插件自动添加Scala SDK。这样,开发者无需手动指定SDK路径,简化了配置过程,提高开发效率。
通过以上步骤,构建了一个针对国内用户优化的收安卓源码Scala开发环境。使用Intellij IDEA、Scala插件与Maven的组合,不仅解决了国外Maven仓库下载延迟的问题,还为开发者提供了高效、便捷的开发体验。这一配置不仅适用于初学者,也能满足有经验开发者的需求,为Scala项目开发提供强大的支持。
Sparkä¸cacheåpersistçåºå«
cache
ããé»è®¤æ¯å°æ°æ®åæ¾å°å åä¸ï¼ææ§è¡
ããdef cache(): this.type = persist()
ããpersist
ããå¯ä»¥æå®æä¹ åç级å«ã
ããæ常ç¨çæ¯MEMORY_ONLYåMEMORY_AND_DISKã
ããâ_2â表示æå¯æ¬æ°ãå°½éé¿å 使ç¨_2åDISK_ONLY级å«
ããcacheåpersistç注æç¹
ãã1.é½æ¯ææ§è¡(æçå«å»¶è¿æ§è¡)ï¼éè¦action触åæ§è¡ï¼æå°åä½æ¯partition
ãã2.对ä¸ä¸ªRDDè¿è¡cacheæè persistä¹åï¼ä¸æ¬¡ç´æ¥ä½¿ç¨è¿ä¸ªåéï¼å°±æ¯ä½¿ç¨æä¹ åçæ°æ®
ãã3.å¦æ使ç¨ç¬¬äºç§æ¹å¼ï¼ä¸è½ç´§è·actionç®å
Scala中的WrappedArray源码详解
WrappedArray是Scala中的一个类,用于表示Array[T]。它的设计旨在方便地使用Java数组,并为Scala数组添加额外方法和功能。WrappedArray实现多个特质,如AbstractSeq、IndexedSeq、ArrayLike和CustomParallelizable,使其在多种上下文中与Scala集合类型一样使用。
WrappedArray的主要用法包括获取数组长度、访问数组元素、使用foreach遍历数组、将WrappedArray转换为Array、使用zipWithIndex获取元素及其索引、使用reduce求和、使用distinct去除重复元素、使用exists判断是否存在满足条件的元素以及使用toArray方法指定类型转换。
这段代码定义了`WrappedArray`抽象类,用于表示`Array[T]`类型的包装数组。它继承了多个特质以提供序列、索引访问、数组操作和并行操作支持。重要成员包括元素类型标签、数组长度、获取和更新元素的方法、底层数组、克隆对象、构建器创建新集合等。
这段代码的慢速攻击源码伴生对象包含辅助方法和具体实现类。它提供了创建空的`WrappedArray`实例、根据给定值创建实例、为隐式转换提供支持以在构建集合时生成`WrappedArray`实例、返回构建器用于构建`IndexedSeq`类型集合等功能。此外,还有针对引用类型和其他基本数据类型的实现类,提供相应的方法和属性。
通过使用`WrappedArray`伴生对象,可以创建和操作不同类型的包装数组。利用`WrappedArray`类,可以对数组进行封装,并进行序列、数组和并行操作。
scala manifeståclassmanifestçåºå«
Manifestæ¯scala2.8å¼å ¥çä¸ä¸ªç¹è´¨ï¼ç¨äºç¼è¯å¨å¨è¿è¡æ¶ä¹è½è·åæ³åç±»åçä¿¡æ¯ãå¨JVMä¸ï¼æ³ååæ°ç±»åTå¨è¿è¡æ¶æ¯è¢«âæ¦æâæçï¼ç¼è¯å¨æTå½ä½Objectæ¥å¯¹å¾ ï¼æ以Tçå ·ä½ä¿¡æ¯æ¯æ æ³å¾å°çï¼ä¸ºäºä½¿å¾å¨è¿è¡æ¶å¾å°Tçä¿¡æ¯ï¼scalaéè¦é¢å¤éè¿Manifestæ¥åå¨Tçä¿¡æ¯ï¼å¹¶ä½ä¸ºåæ°ç¨å¨æ¹æ³çè¿è¡æ¶ä¸ä¸æã
def test[T] (x:T, m:Manifest[T]) { ... }
æäºManifest[T]è¿ä¸ªè®°å½Tç±»åä¿¡æ¯çåæ°mï¼å¨è¿è¡æ¶å°±å¯ä»¥æ ¹æ®mæ¥æ´åç¡®çå¤æTäºãä½å¦ææ¯ä¸ªæ¹æ³é½è¿ä¹åï¼è®©æ¹æ³çè°ç¨è è¦é¢å¤ä¼ å ¥måæ°ï¼é常ä¸å好ï¼ä¸å¯¹æ¹æ³ç设计æ¯ä¸é伤ç¤ã好å¨scalaä¸æéå¼è½¬æ¢ãéå¼åæ°çåè½ï¼å¨è¿ä¸ªå°æ¹å¯ä»¥ç¨éå¼åæ°æ¥åè½»è°ç¨è ç麻ç¦ã
è·åclass manifestsç两ç§åºæ¬æ¹å¼:
1 def classOf[T <: Any](implicit m: scala.reflect.Manifest[T]): Class[T] = m.erasure.asInstanceOf[Class[Tï¼½
éè¿implicit m: scala.reflect.Manifest[T]声æä¸ä¸ªéå¼åæ°ï¼è¿æ ·scalaç¼è¯å¨è½å¨ç¼è¯æ¶æä¾Tçç±»åä¿¡æ¯äº
2 def classOf[T <: Any : Manifest] : Class[T] = manifest[T].erasure.asInstanceOf[Class[Tï¼½
å ¶ä¸ T <: Any : Manifestï¼æåæ两é¨åæ¥ç
T <: Any
T æ¯Anyçåç±»åï¼å³å¯ä»¥æ¯ä»»æåºæ¬ç±»åscala.AnyVal åå¼ç¨ç±»å scala.AnyRef)
T : Manifest ç¸å½äºå¯¹classOf æ¹æ³currying
éå¼å¢å åæ°å表å¦ä¸ï¼(implicit evidence$1: Manifest[T])ï¼
éè¿manifest[T] æ¹æ³å³å¯è·åManifestå®ä¾
å¯è§å½¢å¼1 åå½¢å¼2å®è´¨æ¯ä¸æ ·çã
åºç¨ï¼
1æ常è§çæ¯è·åç±»ååæ°çClassï¼å½¢å¦someMethod[Type]
å¦akkaä¸æºç ï¼ def actorOf[T <: Actor : Manifest]: ActorRef = actorOf(manifest[T].erasure.asInstanceOf[Class[_ <: Actorï¼½)
class Worker extends Actor {
def receive = {
case Work(start, nrOfElements) =>
self reply Result(calculatePiFor(start, nrOfElements)) // perform the work
}
}
å°±å¯ä»¥å¦æ¤ä½¿ç¨äºï¼ val workerActorRef = actorOf[Worker]
2 ç¼ç¨æ¹å¼å建èåæ°ç»
def evenElems[T: ClassManifest](xs: Vector[T]): Array[T] = {
val arr = new Array[T]((xs.length + 1) / 2)
for (i <- 0 until xs.length by 2)
arr(i / 2) = xs(i)
arr
}
scala> evenElems(Vector("a","b","c"))
res: Array[java.lang.String] = Array(a, c)
idea实用系列4使用Maven构建Scala项目
借助Maven构建Scala项目可简化整个流程,因为它倾向于使用约定而非繁杂配置。Maven通过分析pom.xml文件,使得开发者能快速理解项目的结构和配置。
要构建Scala项目,通常采用Scala Maven插件。它作为最流行的Scala项目构建工具,自动从中央仓库下载Scala和其他依赖项,无需额外安装。
在Linux(如Debian)系统中,利用apt-get命令即可轻松安装Maven。通过下载并解压Maven文件,然后配置到环境变量中,Windows和Red Hat Linux用户也能简便安装Maven。
为创建Scala项目,Maven提供了一个便于使用的archetype。运行archetype插件时,Maven会下载核心依赖。随后,用户只需提供一些基础信息,如groupId、artifactId和package,就能生成包含Scala和测试框架(JUnit、ScalaTest和Specs2)的博客c 源码下载初始项目结构。
项目创建后,会在当前目录下生成一个新文件夹,用于存放项目代码和测试文件。Maven管理依赖,确保项目运行所需的所有库都已正确下载。在编写代码之前,项目目录将包含一个pom.xml文件,明确项目依赖关系和构建目标。
项目结构包括src(存放源代码)和test(存放测试代码)文件夹,以及一个用于存放构建产物的target文件夹。在src文件夹内,进一步组织代码结构,通常包括主代码和测试代码。构建文件通过mvn package命令生成。
若需创建包含附加属性的Jar文件,添加Maven Assembly插件能实现这一目标,简化构建过程。
常用Maven命令,如mvn dependency:copy-dependencies, mvn clean, mvn package等,使得项目管理更加高效。添加依赖项时,根据项目需求在pom.xml中输入相应的Maven坐标。
其他有关Maven的深入阅读和资源可通过访问其官方文档和相关社区获得,提供全面指导与案例解析。
理解计算机系统:计算机的组成
组成原理学习方法(来自大学老师的总结):
一.计算机系统简介
1.1 计算机系统的组成
计算机系统由软件和硬件构成,图1-1为计算机系统的基本组成。
1.2 计算机系统层次结构
操作系统是一种系统软件,它是与计算机硬件直接打交道的人。我们通常说的操作系统工程师就会接触到底层硬件的驱动开发,就是让操作系统更好的控制各种硬件。
图1-2展示了计算机系统的基本层次结构,从这个图当中我们也可以看出一个程序是如何编译运行的。
以C/C++程序为例子:
一个程序的核心执行流程为编译和汇编,编译就是将特殊的语言例如C++编译为汇编器可以进行翻译的语言(test.s),而汇编器将这种语言汇编为机器语言(test.o)。
机器语言是计算机可以直接执行的代码和语言,主要成分为0和1。免费暗雷源码
编译笼统上来说是产生目标程序的过程(包括预处理、编译、汇编这些细节过程),也就是从test.c到test.o就是广义的、非正式的编译过程。
1.3 语言分类
1.3.1 语言分级(笼统概念)
目前随着计算机科学水平不断提高,计算机语言已经发展出第四代、第五代甚至更高级的语言。
1.3.2 解释型/编译型语言
举LZ最喜欢的三种语言为栗子。
Scala语言的运行过程:
Scala语言是编译型语言,它的执行需要经过编译,但它是基于JVM平台逐条执行的。也就是每执行一条源码指令就编译成字节码程序在JVM平台上运行。
Python语言的运行过程:
Python语言是解释型语言,需要带着一个解释器。例如:a=1 先翻译成中间代码,解释器解读并执行。因为我们说源程序到产出机器码的过程才笼统叫做编译,因此这种源程序到中间代码的过程只能描述为“翻译”。
Java语言的运行过程:
Java也是一门编译型的语言。源程序文件经过编译之后形成字节码文件(.class),这种字节码文件还不能在操作系统上直接运行,还需要在JVM(Java Virtual Mechine)平台上运行。
二.计算机的基本组成
冯诺依曼冯大佬,被誉为“计算机之父”,世纪最重要的数学家之一。兴趣爱好为博弈论、计算机、生化武器、原子弹等。
该冯姓男子创建了一个广为流传、并被“取其精华、弃其糟粕”的计算机结构-----冯诺依曼计算机。
取其精华:
1/采用存储程序的思路进行工作:将程序按照地址顺序放在内存储器中,运行时,按地址顺序取出存放在内存储器中的指令,并分析执行,当遇到跳转指令时,跳转(cs:ip)到指定地址,再按次序执行。
优点:计算任务能够按序列批量执行。
2/指令和数据都使用二进制表示:物理信号的逻辑就是基于0、1进行传输的。别看我们现在看它很容易,但是把你放到过去,你未必能想到。
3/指令和数据以同等地位存储于存储器,可按地址寻访,其中指令由操作码和地址码组成。
弃其糟粕:
1.使用运算器为中心:什么都要走运算器的流程?我就打印一个Pi运算器都要走半天?那我核心的计算任务就不用干了。
冯诺依曼计算机提出了计算机在硬件组成上的五大部件:运算器、控制器、存储器、输入设备、输出设备。
三.从计算机处理问题的过程看五大部件
STEP1: 取指令
机器启动后,将PC中存储的下一条指令的地址送入MAR,并命令存储器做读操作,存储器读出对应的指令并存入MDR。然后送入IR。
[1] PC -> MAR [2] [MAR] -> MDR [3] MDR -> IR
STEP2:分析指令
IR中的指令送入CU进行分析。
[4] OP(IR) -> CU
STEP3:执行指令
例如中分析出是取数指令,于是将送入MDR进行一个取数流程(将数据的地址送入MAR,并命令存储器读数据,将数据存储到MDR)。最后将数取到运算器的ACC中进行下一步操作,PC寄存器加一。
[5] Ad(IR) -> MAR [6] [MAR] -> MDR [7] MDR -> ACC [8] (PC) + 1 -> PC
3.1 主存储器的构成
主存的工作方式就是按存储单元的地址号存取存储字。这个流程称为地址访问存储器简称访存。为了能够实现访存,主存中还必须配置两个寄存器MAR、MDR:
早期的计算机,存储字长=指令字长=数据字长,一次访存可以取出一条数据或者指令。
如今计算机需要适应高精度高内存利用效率的存储,存储字长、指令字长、数据字长可以各不相同。但它们都是字节的整数倍。
3.2 运算器运算流程
以乘法为例子: 我们要将乘数和被乘数分别放到MQ和X寄存器当中,最终计算结果是乘积高位保存到ACC,低位保存到MQ。
假设计算机读到了指令乘 M,其详细步骤为:
3.3 控制器的基本组成
控制器是计算机的神经中枢,由它指挥各部件自动、协调地工作。
3.4 I/O设备
CPU和主存构成了主机,除主机外的大部分硬件设备都可以称为I/O设备或者外设。
详细的外设知识点可以参照:
四.硬件主要技术指标
4.1 机器字长
机器字长越长,计算机计算精度越高,针对高精度计算的运算次数越少,运算速度就越快。
常见的机器字长有位、位的。
4.2 运算速度
运算速度一般使用主频和MIPS来衡量。
1)MIPS - Million of Instruction Per Second 每秒执行多少百万条指令
2)主频。
主频:CPU在单位时间内发出的脉冲数。单位为MHz。 CPI(Cycle Per Instruction): 执行一条指令所需的时钟周期,也就是机器主频的倒数。
3)Flops
一般超算使用的是Flop/s也就是每秒执行多少次浮点数计算。
IBM的Summit尖峰的最大运算速度为每秒完成万亿次浮点运算(TFlops)。我国的“神威•太湖之光”峰值运算速度为每秒.9万亿次浮点运算(TFlops)。
4.3 存储容量
存储容量 = 存储单元个数 x 存储字长
假设MAR为位,MDR为位。则存储单元的个数是2^也就是个存储单元,存储字长为位,总的存储容量也就是2^ x = 2M 位。
参考
[1] 系统架构师教程.第四版 P-
[2] 计算机组成原理 唐朔飞 第二版 高教社
Scala3 浅尝
自从Scala3于年5月日正式发布以来,已经更新了多个小版本,预计很快将迎来3.2.0版本。我过去有较多的Scala2./2.使用经验,但最近没有实际项目可用,因此没有机会实际体验Scala3。最近有空闲时间,将一些库迁移到Scala3,记录一些体会。
在学习新的编程语言时,一个好的IDE支持能极大提高效率。我之前在IDEA中编写Scala2代码。目前IDEA对Scala3的支持还处于可用阶段,但还有不少不足,期待在未来的版本中得到优化。当前IDE水平对Scala3推广仍然存在阻碍,因为IDE的依赖度非常高。
在迁移过程中,发现大多数Scala2代码可以简单迁移至Scala3,甚至直接复制源代码。官方提供了良好的迁移指南。但在迁移Scala-sql和编写新wsql库时,我选择放弃Scala2兼容语法,以亲身体验Scala3的新风格。虽然Macros迁移较为困难,Scala3的Macros实现与Scala2不兼容,API概念虽相似但API完全不同。我花了大约两个周末完成第一个Macro迁移,随后速度加快,逐渐掌握了窍门,并整理了文档,准备进一步分享。
调试Macros时,善用IDE的调试器,了解各个数据结构至关重要。在IDEA中开启远程调试,可以将sbt命令执行时的宏代码调试起来。结合Macro和inline是有趣实践,Scala-sql在2.0.X版本中生成的ResultSetMapper存在开销,但在Scala3中尝试结合Macro和inline,实现了“zero-cost”的ResultSetMapper。Java框架往往忽视开销,Scala-sql生成的代码质量更优,享受编译时期静态类型检查带来的好处。
在开发新接口自动化测试平台时,考虑使用Scala DSL来提供简单易用的用户界面。Scala3的Context Function简化了DSL编写,具体案例完成后将提供演示。此外,Scala3的Null Safe特性尚在实验阶段,我对其非常感兴趣。在Java中,null和NPE是普遍的错误使用模式,Kotlin/Dart等语言拥抱了Null Safe特性。利用这个新特性,发现了一些Scala-sql中没有妥善处理null的问题,当前将其放入scala3-nullsafe分支,待稳定后合并到master分支。
Gradle jvm插件系列4 scala插件权威详解
Scala插件是Gradle JVM插件的重要扩展,它专为Scala项目设计,支持混合编译Java和Scala代码。通过双向依赖关系,你可以自由选择使用哪种语言编写,根据需要转换代码。此外,它还允许你利用API/实现分离,利用java-library插件为Scala项目提供额外功能。
使用Scala插件非常简单,只需在构建脚本中包含相关配置。例如,你可以在示例1中找到如何引入和配置插件的基本步骤。它为项目添加了ScalaCompile和ScalaDoc任务,并对Java编译任务的依赖进行了调整。
项目布局方面,Scala插件假设存在可包含Scala和Java源代码的目录,但并不强制。自定义布局支持,如示例2所示。依赖管理上,生产代码需要声明scala-library或scala3-library_3,测试代码则分别添加到相应的配置。
配置Zinc编译器是关键步骤,Scala插件会自动推断或根据需要配置scalaClasspath,以确保编译器和工具的正确版本。对于不同版本的Gradle和Scala,兼容性表如表2提供了参考。
除了基本配置,Scala插件还允许添加编译器插件,扩展源集属性,并处理目标字节码级别和Java API版本,确保编译时的兼容性和效率。例如,表3列出了源集属性的更改,表4则解释了Scala编译器参数的计算规则。
在外部进程中编译和增量编译也是重要特性,它们能大幅减少编译时间。默认情况下,Scala插件启用增量编译,但可通过设置force属性强制重新编译所有代码。关于联合编译和依赖分析的细节,你可以在相关部分找到。
最后,Eclipse和IntelliJ IDEA集成则提供了与各自IDE的无缝集成,如添加Scala nature和Scala SDK,以支持Scala项目在这些开发环境中的顺畅工作。