大数据.多核CPU驱动了函数式编程模式的兴起.因为函数式编程更适合多线程.复杂.安全的大型软件编程.但是,对许多有应用软件开发经验的编程者来说,函数式编程模式是一种全新的.甚至抽象的概念,可能需要很长时间的学习.积累才能完全掌握和适应.对一些不算FP编程专家的人来说,如何用他们习惯的方式来使用现成的函数式软件如Slick,Spark等可能就变得是件很迫切的事情了.设计FunDA的想法就是希望那些惯用ORM(Object Relational Mapper)开发MIS系统的编程人员们能快速轻松地使…
在上一集的讨论里我们介绍并实现了强类型返回结果行.使用强类型主要的目的是当我们把后端数据库SQL批次操作搬到内存里转变成数据流式按行操作时能更方便.准确.高效地选定数据字段.在上集讨论示范里我们用集合的foreach方式模拟了一个最简单的数据流,并把从数据库里批次读取的数据集转换成一串连续的数据行来逐行使用.一般来说完整的流式数据处理流程包括了从数据库中读取数据.根据读取的每行数据状态再对后台数据库进行更新,包括:插入新数据.更新.删除等.那么在上篇中实现的流式操作基础上再添加一种指令行类型就可…
FunDA设计的主要目的是解决FRM(Functional Relation Mapping)如Slick这样的批次型操作工具库数据源行间游动操作的缺失问题.FRM产生的结果集就是一种静态集合,缺乏动态更新操作方式.FunDA提出的解决方案是把FRM产生的静态集合转变成动态流(stream),流内元素代表数据行(data row),一个完整的数据流代表一连串的数据行.用户可以利用数据流和FunDA提供的函数组件在数据流中游动进行数据更新操作.FunDA的数据流只支持单向游动(fda_next),…
上节我们探讨了通过scalaz-stream-fs2来驱动一套数据处理流程,用fs2的Pipe类型来实现对数据流的逐行操作.本篇讨论准备在上节讨论的基础上对数据流的流动和元素操作进行优化完善.如数据流动中增加诸如next.skip.eof功能.内容控制中增加对行元素的append.insert.update.remove等操作方法.但是经过一番对fs2的再次解读,发现这些操作模式并不像我所想象那样的方式,实际上用fs2来实现数据行控制可能会更加简单和直接.这是因为与传统数据库行浏览方式不同的是f…
FunDA的并行数据库读取功能是指在多个线程中同时对多个独立的数据源进行读取.这些独立的数据源可以是在不同服务器上的数据库表,又或者把一个数据库表分成几个独立部分形成的独立数据源.当然,并行读取的最终目的是提高程序的运算效率.在FunDA中具体的实现方式是对多个独立的数据流进行并行读取形成一个统一综合的数据流.我们还是用上次示范所产生的表AQMRPT作为样板数据.在这次示范里我们需要把AQMRPT表中的STATENAME,COUNTYNAME字段抽取出来形成两个独立的表STATE和COUNTY.…
FunDA最重要的设计目标之一就是能够实现数据库操作的并行运算.我们先重温一下fs2是如何实现并行运算的.我们用interleave.merge.either这几种方式来同时处理两个Stream里的元素.interleave保留了固定的交叉排列顺序,而merge和either则会产生不特定顺序,这个现象可以从下面的例子里看到: ) ) //当前元素跟踪显示 def log[A](pre: String): Pipe[Task,A,A] = _.evalMap { row => Task.dela…
上篇我们讨论了静态数据源(Static Source, snapshot).这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不安全的资源使用方式.Slick3.x已经增加了支持Reactive-Streams功能,可以通过Reactive-Streams API来实现有限内存空间内的无限规模数据读取,这正符合了FunDA的设计理念:高效.便捷.安全的后台数据处理工具库.我们在前面几篇讨论里介绍了Iteratee模式,play-iteratees支持Reactive-St…
FunDA是一种函数式的编程工具,它所产生的程序是由许多功能单一的细小函数组合而成,这些函数就是用户自定义操作函数了.我们在前面曾经提过FunDA的运作原理模拟了数据流管道.流元素在管道流动的过程中被使用或者更新.在管道中流动的元素都必须继承FDAROW类型,可以细分成几个大类: 1.数据行(data-row):因为FunDA的数据行必须是强类型的,所以各种case class类型继承了FDAROW(extends FDAROW)之后最为适合 2.动作行(action-row):case cla…
FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必要配合数据处理分部逐步读入,这就是Reactive Stream规范主要目的之一.所以在设计FunDA的数据源(Source)之前必须要考虑实现reacive-data-stream.Slick 3.x版在功能上的突破之一就是实现了对Reactive-Stream API的支持.遗憾的是新版的Sli…
作为一个能安全运行的工具库,为了保证占用资源的安全性,对异常处理(exception handling)和事后处理(final clean-up)的支持是不可或缺的.FunDA的数据流FDAPipeLine一般是通过读取数据库数据形成数据源开始的.为了保证每个数据源都能被安全的使用,FunDA提供了事后处理finalizing程序接口来实现数据流使用完毕后的清理及异常处理(error-handling)程序接口来捕获和处理使用过程中出现的异常情况.首先,事后处理程序(finalizer)保证了在…
FunDA的并行运算施用就是对用户自定义函数的并行运算.原理上就是把一个输入流截分成多个输入流并行地输入到一个自定义函数的多个运行实例.这些函数运行实例同时在各自不同的线程里同步运算直至耗尽所有输入.并行运算的具体函数实例数是用fs2-nondeterminism的算法根据CPU内核数.线程池配置和用户指定的最大运算实例数来决定的.我们在这次示范里可以对比一下同样工作内容的并行运算和串形运算效率.在前面示范里我们获取了一个AQMRPT表.但这个表不够合理化(normalized):state和c…
前面我们提过:FunDA就像一个管道(PipeLine).管道内流动着一串数据(Data)或者运算指令(Action).管道的源头就是能产生纯数据的数据源(Source),跟着在管道的中间会有一些节点(WorkNode),我们可以在这些节点施用(apply)用户提供的功能函数(Task).用户功能函数可以截取并使用管道中流动的数据或者指令,然后利用一种水龙头开关机制(Valve)来影响流动元素:可以截住.直接传送.传送修改版本.插入新数据.作为FunDA的用户,需要掌握用户功能函数编写模式.我们…
我们在前面用了许多章节来讨论如何把数据从后台数据库中搬到内存,然后进行逐行操作运算.我们选定的解决方案是把后台数据转换成内存中的数据流.无论在打开数据库表或从数据库读取数据等环节都涉及到对数据库表这项资源的安全使用:我们最起码要保证在完成使用或者使用中途出现错误异常退出时能释放占用的资源.谈到资源使用安全,不得不想到函数式编程通用的那个bracket函数,fs2同样提供了这个函数: def bracket[F[_],R,A](r: F[R])(use: R => Stream[F,A], rel…
在上节讨论里我们介绍了数据行流式操作的设想,主要目的是把后台数据库的数据载入前端内存再拆分为强类型的数据行,这样我们可以对每行数据进行使用和处理.形象点描述就是对内存里的一个数据流(data-stream)进行逐行操作.我们在上节用foreach模拟了一个流控来示范数据行的操作处理.在这节我们讨论一下用scalaz-stream-fs2作为数据流管理工具来实现FunDA的数据行流动管理功能.fs2的Stream是一种自然的拖动型(pull-model)数据流.而fs2的Pipe类型则像是管道的阀…
MongoDB是一种文件型数据库,对数据格式没有硬性要求,所以可以实现灵活多变的数据存储和读取.MongoDB又是一种分布式数据库,与传统关系数据库不同的是,分布式数据库不支持table-join,所以在设计数据库表结构方面与关系数据库有很大的不同.分布式数据库有一套与传统观念不同的数据模式,在设计库表结构时必须从满足各种数据抽取的需要为主要目的.关系数据库设计要求遵循范式模式(normalization)库表结构,在抽取数据时再通过table-join联结关系表.因为分布式数据库不支持tabl…
Reactive-Stream不只是简单的push-model-stream, 它还带有“拖式”(pull-model)性质.这是因为在Iteratee模式里虽然理论上由Enumerator负责主动推送数据,实现了push-model功能.但实际上Iteratee也会根据自身情况,通过提供callback函数通知Enumerator可以开始推送数据,这从某种程度上也算是一种pull-model.换句话讲Reactive-Streams是通过push-pull-model来实现上下游Enumera…
再有两天就进入2018了,想想还是要准备一下明年的工作方向.回想当初开始学习函数式编程时的主要目的是想设计一套标准API給那些习惯了OOP方式开发商业应用软件的程序员们,使他们能用一种接近传统数据库软件编程的方式来实现多线程,并行运算,分布式的数据处理应用程序,前提是这种编程方式不需要对函数式编程语言.多线程软件编程以及集群环境下的分布式软件编程方式有很高的经验要求.前面试着发布了一个基于scalaz-stream-fs2的数据处理工具开源项目.该项目基本实现了多线程的数据库数据并行处理,能充分…
在上一节我们介绍了Iteratee.它的功能是消耗从一些数据源推送过来的数据元素,不同的数据消耗方式代表了不同功能的Iteratee.所谓的数据源就是我们这节要讨论的Enumerator.Enumerator是一种数据源:它会根据下游数据消耗方(Iteratee)的具体状态主动向下推送数据元素.我们已经讨论过Iteratee的状态Step类型: trait Step[E,+A] case class Done[+A,E](a: A, remain: Input[E]) extends Step[…
在对上两篇讨论中我们介绍了并行运算的两种体现方式:并行构建数据源及并行运算用户自定义函数.我们分别对这两部分进行了示范.本篇我准备示范把这两种情况集成一体的并行运算模式.这次介绍的数据源并行构建方式也与前面描述的有所不同:在前面讨论里我们预知需要从三个独立流来并行构建数据源.但如果我们有一个不知长度的数据流,它的每个元素代表不同的数据流,应该如何处理.我们知道在AQMRPT表里有从1999年到2xxx年的空气质量测量数据,我们可以试着并行把按年份生成的数据流构建成一个数据源.直接使用上期示范中的…
FunDA的特点之一是以数据流方式提供逐行数据操作支持.这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题.为了实现安全高效的数据行操作,我们必须把FRM产生的Query结果集转变成一种强类型的结果集,也就是可以字段名称进行操作的数据行类型结果集.在前面的一篇讨论中我们介绍了通过Shape来改变Slick Query结果行类型.不过这样的转变方式需要编程人员对Slick有较深的了解.更重要的是这种方式太依赖Slick的内部功能了.我们希望FunDA可以支持多种FRM,所以应…
在ESFramework 4.0 进阶(03)-- 驱动力:通信引擎(上)一文中,我们对ESFramework提供的每一个通信引擎的接口都做了详细了说明,这篇文章我们将继续探讨这些接口的实现类 -- 真正工作的通信引擎类.ESFramework提供了具体的5个通信引擎类覆盖了TCP/UDP.客户端/服务端. 二进制协议/文本协议组合的2x2x2=8种模式.有必要把这个图再贴一下,在具体项目中,大家可以根据需要挑选合适的引擎类. 一.TCP引擎 TCP引擎共有三个类:服务端的StreamTcpEn…
<ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家可以将这两个引擎看作是两个壳,内部包装的才是真正的ESFramework的网络引擎, ESFramework支持很多种网络引擎(客户端/服务端.二进制协议/文本协议.TCP/UDP),而RapidServerEngine和RapidPassiveEngine采用的是基于TCP和二进制协议的服务端引擎和客户端引…
(在阅读该文之前,请先阅读 ESFramework 4.0 概述 ,会对本文的理解更有帮助.) ESFramework/ESPlatform 4.0 的终极目标是为百万级的用户同时在线提供支持,因为强大,所以使用也较为复杂,配置也较多.但是如果我们的应用只是一个中小型的通信应用(同时在线5000人以下),直接使用ESPlatform就有点显得杀鸡用牛刀了.ESPlus.Rapid提供了一种快速的方式,来解决类似中小型的通信应用,以最简洁的方式来使用ESFramework. 使用ESPlus.Ra…
通过一段时间的学习和了解以及前面几篇关于Slick的讨论后对Slick这个函数式数据库编程工具有了些具体的了解.回顾我学习Slick的目的,产生了许多想法,觉着应该从实际的工作应用角度把我对Slick目前能够达到的目的以及在现有功能优势和特点下如何进一步改进才能正真符合IT系统对数据库程序编程和运行效率的要求.想通过这篇博客把想法提出来跟大家分享一下,看看是否能够引起大家的共鸣,为我下一步的工作制定一个方向性的框架. 首先谈谈Slick的特点:主体方面Slick为函数式编程模式带来了SQL编程,…
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA 2.0 SPS00 SDA(Smart Data Access)连接Hadoop   前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 这一篇介绍一下SDA,用于大数据Hadoop等平台的 还可以用另一种方式,请参考我的另一篇文章 点击进入:SAP Vora(SAP HANA和Hado…
JPA是什么? JPA全称Java Persistence API,是Sun官方提出的Java持久化规范.是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA主要为了简化现有的Java EE和Java SE应用的对象持久化开发工作和整合ORM技术实现持久化领域的统一.JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点.从目前的开发社区的反应上看,JPA受到了极大的支持和赞…
iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView 时间:2016-01-19 19:13:43      阅读:630      评论:0      收藏:0      [点我收藏+] 标签: 下载链接:github不断更新地址:https://github.com/gsdios/SDCycleScrollView 使用原理:采用UICollectionView的重用机制和循环滚动的方式实现图片的无限轮播,播放非常顺畅,解决了UISCrollView使用时从…
有的Web项目选用Excel作为报表方案,在服务器端生成Excel文件,然后传送到客户端,由客户端进行打印.在国内的环境下,相对PDF方式,Excel的安装率应该比pdf阅读器的安装率要高,同时,微软也为C#操作Excel提供了完备的接口,虽然ZedGraph和其他的商业报表工具生成的统计图也很好,但是人家微软毕竟是大品牌,值得信赖. 本文介绍使用C#调用Excel来生成统计图(Chart)的以及Chart图中各部分控制的一些方法. 在上一篇使用C#和Excel进行报表开发(二)-操作统计图(C…
本人是本文的作者,首发于ifeve(非阻塞同步算法实战(三)-LatestResultsProvider) 前言 阅读本文前,需要读者对happens-before比较熟悉,了解非阻塞同步的一些基本概念.本文主要为happens-before法则的灵活运用,和一些解决问题的小技巧,分析问题的方式. 注:该工具类已分享到https://github.com/trytocatch/concurrent-tools 背景介绍 原始需求为:本人当时在编写一个正则替换工具,里面会动态地显示所有的匹配结果(…
本人是本文的作者,首发于ifeve(非阻塞同步算法实战(二)-BoundlessCyclicBarrier) 前言 相比上一 篇而言,本文不需要太多的准备知识,但技巧性更强一些.因为分析.设计的过程比较复杂繁琐,也限于篇幅,所以,主要展示如何解决这些需求,和讲解代码.另外,所讲的内容也是后一篇实战中需要用到的一个工具类. 注:该工具类已分享到https://github.com/trytocatch/concurrent-tools 需求介绍 我需要编写一个同步工具,它需要提供这样几个方法:aw…