CN102902595A - 注入组合查询的单子评估 - Google Patents
注入组合查询的单子评估 Download PDFInfo
- Publication number
- CN102902595A CN102902595A CN2012104052805A CN201210405280A CN102902595A CN 102902595 A CN102902595 A CN 102902595A CN 2012104052805 A CN2012104052805 A CN 2012104052805A CN 201210405280 A CN201210405280 A CN 201210405280A CN 102902595 A CN102902595 A CN 102902595A
- Authority
- CN
- China
- Prior art keywords
- closure
- operational symbol
- data
- operational
- list
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/02—Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/547—Remote procedure calls [RPC]; Web services
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24553—Query execution of query operations
- G06F16/24558—Binary matching operations
- G06F16/2456—Join operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24564—Applying rules; Deductive queries
- G06F16/24566—Recursive queries
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本申请涉及注入组合查询的单子评估。这里的实施例能在单子内部对注入的查询进行评估。一个或多个带有闭包的运算符将被从第一进程接收。带有闭包的运算符代表的是由第二进程应用的一个或多个函数。第二进程对接收到的带有闭包的运算符进行评估,以便在单子内部应用函数。在评估过程中,第二进程将闭包转换成简单类型的闭包。更进一步,第二进程将经过转换的闭包绑定在单子内部,以便限制函数的运行。在一些实施例中,所述查询(例如一个或多个带有闭包的运算符的序列)是使用来自编码在表述性状态转移(REST)风格的统一资源定位符(URL)中的语言集成查询(LINQ)框架的查询运算符集合组成的。
Description
背景技术
计算机之间的数据交换可以采用客户机-服务器通信、点到点通信、进程到进程通信等形式。一些已有的***尝试通过预先编程一个设备从另一个设备接收的数据查询来预期这些数据查询。然而,此类***需要相当多的资源,并且无法预期每一个可能的数据查询。其他已有的***允许设备创建命令式查询,例如在JAVASCRIPT脚本语言中。然而,对此类***来说,这些查询会因为所述查询所具有的长度及其句法复杂度而难以构成、序列化和解析。更进一步,至少由于命令式查询考虑了执行来自不可信的来源的代码(例如执行不受限制的分配和拷贝),所述命令式查询会暴露出安全漏洞。就此而论,这些现有***无法防止或包含那些已被注入到经由超文本传输协议(HTTP)之类的传输协议发送的通信之中的恶意查询的执行。
发明内容
本公开的实施例允许将操作双向、动态可编程地注入到第一进程与第二进程之间的通信中。第二进程从第一进程接收一个或多个具有闭包的运算符的序列。所述闭包代表的是第二进程在单子(monad)内部应用的一个或多个函数。第二进程对所接收的具有闭包的运算符进行评估,以便执行函数。在评估过程中,所述闭包被转换成简单类型的闭包。更进一步,对具有经过转换的闭包的运算符所进行的评估将被绑定在单子内部,以便限制函数的运行。
本概述是为了以简化形式引入精选概念而被提供的,并且在以下的详细描述中将会进一步描述这些概念。本概述的目的既不是唯一确定所保护主题的关键或决定性要素,也不是帮助确定描述所保护的主题的范围。
附图说明
图1是示出了第一进程与第二进程进行通信来获取具有查询注入的数据的例示框图。
图2是示出了用以评估所接收的具有闭包的运算符的第二进程的操作的例示流程图。
图3示是出了通过与web服务进行通信来获取具有查询注入的数据的客户机设备的例示框图。
图4是示出了对作为统一资源定位符(URL)中具有lambda表达式的运算符嵌入的查询所进行的单子处理的例示流程图。
图5是示出了用于注入查询的单子处理(monadic processing)的计算设备上的计算机可执行组件的例示框图。
在附图中,相应的参考字符指示相应的部分。
具体实施方式
参考附图,本公开的实施例允许评估可动态编程、组成的非命令式(non-imperative)查询。在一些实施例中,使用了查询运算符集合的声明闭包(declarative closure)是在用于web应用和移动应用中的双向查询注入的脚本语言中实施的。
虽然这里的一些示例是参考lambda表达式公开的,但是本公开的各方面并不局限于lambda表达式,而是可以结合任何形式的闭包或其他闭合表达式来操作。例如,这里的实施例是可以与匿名内部类一起操作的。
本公开的方面包括能对可枚举的数据集合(例如其元素在指定时间在存储器中是可用的)或异步数据集合(例如其元素是在不同时间到达的)实施组合查询的查询运算符集合。枚举量(enumerables)代表的是分布在空间域上的数据,而可观测量(observables)代表的则是分布在时间域上的数据。举个例子,枚举量可以跨越包括存储器、本地磁盘存储器、远端数据库等等在内的空间域。利用枚举量,可以将应用编写成好像所有数据在存储器中是同时可用的,即使这些数据在物理上分布于多个设备。在可观测模型中,应用被编写成好像数据是以不可预测的方式分布于时间上的,即使一些或所有数据在特定时间是部分可用的。
由于是可编程的,本公开的方面中的查询允许应用开发人员以不可预测的方式来使用服务器或web应用的数据资源。例如,在这里没有必要使用客户机可能希望的所有可能的查询来对服务器进行预先编程。由于一些不可预测的方式可能是恶意的,因此,本公开的方面设想了沙箱、类型检查、超时、重启及其他手段来防止运行恶意功能。就此而论,本公开的方面能够实现可编程的web服务,例如web服务304。举例来说,组合查询是模块化的,并且很容易在图形用户界面中构造(例如按钮、下拉列表、菜单等等)。这些查询由具有lambda表达式的一个或多个运算符的管道序列(例如查询管道或单子管道)组成。管道序列中的每一个阶段都包括具有至少一个lambda表达式的至少一个运算符。由于这些具有lambda表达式的运算符很短并且是声明式的,因此,具有lambda表达式的运算符是以很低的成本发送、签名、记入日志、解析、处理、分析、改写、编译、沙箱化及归档的,而这至少会使处理得以简化。这些查询可以由服务器使用网络套接字和/或基于事件的输入-输出环境来实现。
在一些实施例中,这些查询被封装到超文本标记语言(HTML)中(例如使用统一资源定位符来编码)和/或在超文本传输协议(HTTP)POST主体中用公钥密码加密***(PKCS)来进行数字签名。此外,这些查询还可以被解析成JAVASCRIPT对象标注(notation),以便与C#之类的编程语言进行互通。
关于具有lambda表达式的运算符的一个示例是“.Select(x => x < 10)”。运算符是“.Select”并且lambda表达式是“x => x < 10”。这个lambda表达式的含义是“返回布尔表达式‘x < 10’的值的x的函数”。Lambda表达式是从一种类型的值到另一种类型的值的函数或其他变换。在本段的这个示例中,x具有数值类型(例如由于小于运算符“<”的存在而推断出),并且返回的函数值具有布尔类型(例如从返回类型“<”推断为“真”或“伪”)。
每一个具有lambda表达式的运算符都具有一个处于点“.”左侧的单子表达式。举例来说,如果M是单子表达式,那么“M.Select(x => x < 10)”是具有lambda表达式的例示运算符。每一个具有lambda表达式的运算符转而产生新的单子表达式。如果将具有lambda表达式的运算符链接在一起,则能够创建单子管道。举例来说,“M.Select(someLambda).Where(someLambda)”是一个单子表达式,其中:
M是一个单子表达式
“.Select(somelambda)”是具有lambda表达式的运算符,
“.Where(somelambda)”是另一个具有lambda表达式的运算符,
“M.Select(somelambda)”是另一个单子表达式,以及
“M.Select(somelambda).Where(somelambda)”是第三个单子表达式。
这些查询可以用来自语言集成查询(LINQ)框架的查询运算符集合来组成,但是其他基于查询的框架也是可以考虑的。具有lambda表达式的查询运算符组合或管道可以依照表述性状态转移(REST)样式而被嵌入在统一资源定位符(URL)中。
所述查询是双向的,而这至少部分是因为所述查询可被从客户机注入到服务器或是从服务器注入到客户机。此外,这些查询还可以被推送-拉取(push-pull),其中推送风格的表达式(例如基于IObservable)和拉取风格的表达式(例如基于IEnumerable)可以使用许多相同的LINQ运算符和lambda来编写。在一些情况中,用于IEnumerable数据集合(例如分布在空间中)的查询管道在句法上与用于IObservable数据集合(例如分布在时间上)的查询管道是相同的。
在使用LINQ的实施例中,所述查询包括下表1的类别中显示的一个或多个查询运算符。在例示运算符中,自变量“someLambda”代表的是任何lambda表达式(例如“x => x < 10”,“(x, y) => x + 7*y + 32 – 4*x*y”等等)。
表1.例示类别和例示运算符。
接下来参考图1,该例示框图示出的是第一进程104与第二进程106进行通信,以便获取具有查询注入的数据。第一进程104和第二进程106可以由经由网络通信的单独的计算设备运行。例如,第一进程104可以由客户机设备302运行,第二进程106可以由web服务304或其他云服务(参见图3)运行。在另一个示例中,第一进程104可以由web服务304运行,并且第二进程106可以由客户机设备302运行。在再一个示例中,第一进程104可以在与运行第二进程106的设备对等的设备上运行。作为替换,第一进程104和第二进程106可以由相同的计算设备102(作为图1的可选显示)运行。例如,第一进程104可以与在计算设备102上运行的一个线程相关联,并且第二进程106可以与在同一计算设备102上运行的另一个线程相关联。
第一进程104希望得到来自第二进程106的数据。所请求的数据可以是至少能被第二进程106访问的任何数据,这其中包括但不局限于由第二进程106运行或评估某个查询所产生的数据。所请求的数据还可以是通过运行一个或多个函数产生的数据。在一些实施例中,该请求是对数据集合应用一个过滤器,以便产生数据子集。例如,第一进程104可以请求满足了该请求中定义的一个或多个判据的电子邮件消息、日历数据、产品信息、地图数据、零售店名称和位置等等。所述请求还可以包括订阅第二进程106可提供的更新的请求。
在一些实施例中,与直接访问所请求的数据不同,第一进程104将会预备或产生至少一个描述预期数据的查询。在一些实施例中,该查询采用的是具有lambda表达式的运算符序列的形式。在运算符排序非常重要或是有意为之的实施例中,所述查询将会采用序列或其他有序集合的形式(允许重复),而不是其他无序集合的形式(不允许重复)。
具有lambda表达式的运算符可被排序,以便由第一进程104运行,或者这些运算符可以在运行或评估之前由第二进程106重新排序。虽然在这里是参考lambda表达式或是其衍生物来进行描述的,但是本公开的方面并不局限于具有lambda表达式的运算符或者单独的lambda表达式,而是可以与其他查询表示一起操作。
第一进程104将所述查询注入到从第一进程104发送至第二进程106的消息中。查询也可以被注入到由第一进程104之外的进程所发送的消息中。第二进程106通过执行该查询来产生所请求的数据,然后将所请求的数据返回给第一进程104以供其消耗。这样一来,第一进程104会将查询处理卸载或委托给第二进程106,由此减小了计算负担、复杂度以及第一进程104的存储器使用。第二进程106可以存储所注入的查询,并且在从第二进程106到第一进程104的将来的数据流上运行该查询。由此,所注入的查询既可以只运行一次,也可以作为“常备查询(standing query)”而被保存,以便重复运行至其被替换或是在经过指定时间之后期限届满。
接下来参考图2,该例示流程图示出的是第二进程106评估所接收的具有闭包的运算符的操作。第二进程106可以接收或以其他方式访问第一进程104产生的具有闭包的一个或多个运算符。在其他实施例中,第二进程106之外的进程接收具有闭包的运算符(例如执行通信的进程)。在这样的实施例中,第二进程106从例如存储器中的某个位置访问所接收的具有闭包的运算符。
在202,如果第二进程106接收到具有闭包的运算符,那么在204,第二进程106将会评估该闭包。举例来说,所述评估包括:评估和/或运行每一个具有闭包的运算符。与第二进程106相关联的调度器504或优化器确定:是否一次一个顺序地评估具有闭包的运算符,是否通过重新排列具有闭包的运算符来优化评估,和/或是否可以在评估具有闭包的其他运算符的同时(举例来说,如果第二进程是多线程的)评估一个或多个具有闭包的运算符。
通过评估所接收的具有闭包的运算符来执行这里定义的函数或查询的处理包括:在206,将每一个闭包转换成简单类型的闭包。简单类型演算与其他形式的表达式形成了鲜明的对比。将闭包转换成简单类型包括但不局限于防止或禁止自应用和/或递归评估闭包。例如,第二进程106将会阻止递归评估以及自应用所述闭包。在另一个示例中,第二进程106将会禁止评估诸如(function(x){x(x);}) (function(x){x(x);})之类的表达式。
在评估过程中,在208,第二进程106会将每一个经过转换的闭包绑定在单子内部,以便限制函数或查询的运行。虽然在这里是参考单子论述的,但是本公开的方面可以与其他运行代理一起操作,以便检测和防止恶意查询的运行,例如步进(stepping)(例如通过每一个闭包来监视存储器访问),签发(endorsement)、伙伴运行(buddy execution)、抽象运行、主机超时、验证等等。
在一些实施例中,将闭包绑定在单子内部包括:将同一函数应用于那些通过运行每一个与闭包相关联的函数而被输出的数据。例如,每个所评估的具有闭包的运算符的输出都可被置入或转换成特定的数据容器结构。在一些实施例中,对单子内部的闭包所进行的评估可被描述成是“沙箱化”所述评估或闭包。作为示例,将运算符绑定在单子内部包括将每一个具有一个或多个闭包的运算符X应用于查询管道中处于X之前的运算符所产生的数据。查询管道中的第一项是单子类型的表达式,并且该链中的每一个后续运算符(具有闭包)的类型将被检查,以确保所有数据全都保留在单子中。附着于运算符闭包将会检测和变换单子内部的单独的值,但是闭包和闭包所附着的运算符不允许将这些单独的值“泄漏”到单子外部(除了具有“第一运算符”或“ElementAt”运算符的情形)。
通过在单子内部执行绑定处理,可以处理源于对每一个具有闭包的运算符所进行的评估的任何副作用。在一些实施例中,在单子内部对具有闭包的运算符进行评估,通过阻止已注入的查询(例如从未经核实的来源接收)访问***资源或***调用以及请求未被解析的引用来增强安全性。例如,单子运行允许查询仅仅调用在指定的函数集合内可用的函数。此外,单子运行还可以禁止以下的一项或多项处理:写入文件***或其他存储器,不受限制的存储器分配,联网,显示,不受控制的库加载,以及访问查询上下文外部的自由变量(例如那些处于函数体中但却不在该函数的参数列表中的变量)。然而,在一些实施例中,第二进程106还可以允许查询评估,以便访问一个或多个只读的全局变量。
在一些实施例中,通过将经过转换的闭包绑定在单子内部,创建了在类别理论中被称为Kleisli组合的结果。
接下来参考图3,该例示框图示出的是客户机设备302通过与web服务304进行通信来获取具有查询注入的数据。客户机设备302代表的是能与web服务304通信的任何设备。在下文中将会参考图5来描述客户机设备302的示例。客户机设备302将查询注入到一个从客户机设备302发送到web服务304的消息中。Web服务304对该查询进行评估,并且将返回的数据提供给客户机设备302。在一些实施例中,客户机设备302将会运行一个浏览器,其将查询嵌入到发送至web服务304的URL 510中。Web服务304(例如网站)则会评估所嵌入的查询,以便产生返回数据。
在一些实施例中,web服务304代表的是揭示枚举符的可枚举数据生成器。客户机302代表的是数据使用者,其对枚举符调用方法以获取数据。更进一步,web服务304可以充当可观测数据生成器,以便接受来自充当观测方的客户机设备302的订阅。所述web服务304会在客户机设备302中调用方法来推送数据。
例如,客户机设备302通过对IEnumerable调用函数GetEnumerator来获取枚举器,其具有以下例示方法:
public interface IEnumerator<T>
{ T Current { get; }
bool MoveNext();
void Reset(); }
客户机设备302通过调用其在以下示例中的函数来从枚举符中拉取数据:
using(var ator = able.GetEnumerator)
while (ator.MoveNext())
Console.WriteLine(ator.Current);
Web服务304使用一个如下所示的函数来揭示IObservable:
public interface IObservable<out T> : IEnumerable
{ IDisposable Subscribe(IObserver<T> observer); }
客户机设备302在IObservable接口中实施回调,并且web服务器304的可观测量会通过调用如下所示的回调处理来将数据推送到客户机设备302:
public interface IObserver<in T>
{ void OnNext(T value);
void OnCompleted();
void OnError(Exception error); }
接下来将参考图4来描述由web服务304评估在URL 510中嵌入的查询的示例。
接下来参考图4,该例示流程图示出的是对URL 510中作为带有lambda表达式的运算符嵌入的查询所进行的单子处理。在402,如果第二进程106或其他进程接收到来自第一进程104的URL 510,那么在404,嵌入在URL 510中且带有lambda表达式的运算符将被提取。例如,URL 510是经由网络接收的且被存储在可被第二进程106访问的存储区域中。在106,所提取的带有lambda表达式的运算符可被优化,以便用于评估或运行。
在408,第二进程106会对带有lambda表达式的运算符进行评估,以便产生第一进程104所请求的数据。在410,所述评估包括将lambda表达式转换成简单类型的lambda表达式。在412,关于每一个简单类型的lambda表达式的评估还包括将带有经过转换的lambda表达式的运算符绑定在单子内部,以便封装从每一个lambda表达式产生的数据。例如,将lambda表达式绑定在单子内部的处理包括:在评估lambda表达式的时候,将至少一个操作应用于从每一个lambda表达式产生的数据。
在414, 所产生的数据将被发送到第一进程104。
接下来参考图5,该例示框图示出的是计算设备102上用于注入查询的单子处理的计算机可执行组件。在图5的示例中,计算设备102与用户相关联,并且代表的是用于以双向推送-拉取的可动态编程方式来将操作注入第一进程104与第二进程106之间的通信的***。在一些实施例中,计算设备102对应的是第二进程106或是用于处理lambda表达式的设备。
计算设备102代表的是任何通过运行指令(例如应用程序、操作***功能或是这二者)来实施与计算设备102相关联的操作和功能的设备。计算设备102可以包括移动计算设备或是其他任何便携设备。在一些实施例中,移动计算设备包括移动电话、膝上型计算机、平板计算机、计算平板、上网本、游戏设备和/或便携式媒体播放器。计算设备102还可以包括便携性较差的设备,例如台式个人计算机、信息亭以及桌面设备。此外,计算设备102可以代表处理单元或其他计算设备群组。
计算设备102具有至少一个处理器504、调度器504以及存储区域。处理器504包括任何数量的处理单元,并且被编程成运行用于实施本公开的各方面的计算机可执行指令。这些指令可以由处理器504或是在计算设备102内部运行的多个处理器执行,或者由计算设备102外部的处理器执行。在一些实施例中,处理器504被编程为运行如图(例如图2和图4)所示的指令。作为替换或补充,本公开的各方面设想了一个能够在定制的硬件或微代码中运行具有lambda表达式的运算符的执行引擎。
调度器504包括用于分析具有lambda表达式的运算符以及确定对于每一个运算符进行评估的顺序和定时的进程。所述调度器504通过运行来优化lambda表达式的评估。
计算设备102还具有一个或多个计算机可读媒体,例如存储区域。存储区域包括与计算设备102相关联或是可供其访问的任何数量的媒体。所述存储区域可以处于计算设备102的内部(如图5所示)、计算设备102的外部(未显示)或是所有这二者(未显示)。
特别地,存储区域存储了一个或多个应用508。在被处理器504运行的时候,所述应用508会操作以在计算设备102执行功能。例示的应用508包括邮件应用程序、web浏览器、日历应用程序、地址薄应用程序、消息传递程序、媒体应用、基于位置的服务、搜索程序、提醒服务等等。应用508可以与配对的应用或服务进行通信,例如经由网络来与web服务304进行通信。例如,应用508可以代表所下载的客户端应用,其与在云中运行的服务器端服务相对应。
接下来描述的是被设计成实施本公开的各方面的应用508的例示结构。该例示应用508是使用诸如.NET框架之类的框架而在具有网络套接字的中间层服务器中实施的。虽然网络套接字保留了用于提供从web服务304到客户机设备302的未经请求的更新的选项,但是本公开的各方面还可以与其他传输机制一起操作,例如超文本传输协议(HTTP)。客户机设备302上的OnNext方法是作为侦听器添加给网络套接字的。所述OnNext方法分析并应用来自客户机设备302的查询,然后将应用所述查询得到的输出数据提供给客户机设备302。
在将带有lambda表达式的运算符嵌入在URL、例如URL 510中的实施例中,存储区域还会存储URL 510。在借助公钥密码加密标准(PKCS)来包含带有lambda表达式的运算符或是将其包含于诸如JAVASCRIPT脚本语言之类的脚本的实施例中,存储区域将会存储PKCS包或JAVASCRIPT对象标注。在一些实施例中,PKCS提供了来源验证(例如谁发送了查询),篡改防护(例如没有中间方修改过查询),不可抵赖性(例如初始发送方不能宣称其没有发送过该查询)和/或隐私性(例如只有预定接收方才可以解密所述查询)。
所述存储区域还会存储一个或多个计算机可执行组件。例示的组件包括通信接口组件512、脚本组件514、类型检查组件516以及封装组件518。通过运行这些组件,可以执行如图2所示的操作。在图5所示的示例中,脚本组件514、类型检查组件516以及封装组件518代表的是第二进程。在其他示例(未显示)中,第二进程106还会提供与通信接口组件512相关联的功能。
在由处理器504运行的时候,通信接口组件512促使处理器504从第一进程104接收其中注入了带有lambda表达式的运算符序列的通信。带有lambda表达式的运算符代表的是由第二进程106执行以产生输出数据的一个或多个函数。在一些实施例中,通信接口组件512包括网络接口卡和/或用于操作网络接口卡的计算机可执行指令(例如驱动器)。
在由处理器504运行的时候,脚本组件514促使处理器504通过第二进程106来静态分析带有lambda表达式的运算符,以便将lambda转换成简单类型的形式,出于优化或其他方面的原因而对带有lambda表达式的运算符序列重新排序,以及通过执行函数来产生输出数据。举个例子,脚本组件514会对代表了以下的一项或多项的单子数据集合执行函数:可枚举数据集合,分布在空间上的数据项的集合,以及代表了分布在时间上的数据集合的可观测流。在这个示例中,带有lambda表达式的运算符代表的是管道化的表达式序列。关于脚本组件514的一些实施例考虑了包含类型检查组件516以及封装组件518。在其他实施例中,类型检查组件516和封装组件518是与脚本组件514分离的,但是仍旧与之通信。
在由处理器504运行的时候,类型检查组件516会促使处理器504将每一个lambda表达式转换成简单类型的lambda表达式。在运行时间,在由处理器504运行的时候,封装组件518会促使处理器504将单子内部的那些带有在静态分析过程中转换的lambda表达式的运算符应用于经过重新排序且带有lambda表达式的运算符管道的每一个在先阶段的结果,以便包含函数的运行。例如,封装组件518会创建一个容器数据结构,以便封装通过评估每一个带有lambda表达式的运算符而输出的数据。创建容器数据结构的处理可以包括:在对带有lambda表达式的运算符进行评估的时候,将至少一种操作应用于每一个带有经过转换的lambda表达式的运算符。相同的操作或操作集合将被应用于带有lambda表达式且经过评估的运算符的管道中的每一个阶段的输出上。
在一些实施例中,封装检查组件(未显示)通过执行静态检查来确认单子管道的每一个阶段都通过具有恰当的单子类型而保持了单子完整性。这样做提供了某种保障来确保封装组件518不会在运行时违反单子完整性。
在脚本组件514评估了带有lambda表达式的运算符之后,通信接口组件512会将所产生的输出数据提供给第一进程104。
附加示例
以下列举的是使用lambda表达式来显示字串“Hello World”的单子沙箱化的函数的示例。
"Hello"
.Return() // Lifts hello into the sandbox (the IO<string> monad)
.SelectMany(str => str.ToUpper().Return()) // transforms the string and lifts result into the monad
.SelectMany(str => (str + ", World!").Return()) // can never get out of the monad
.SelectMany(str => {Console.WriteLine(str); return Unit();}) // Now in the IO<unit> monad
这样做将会产生“Hello, World!”。括号内的类型会改变,但是将会保持在单子内部。在这个示例中,Select方法在该模型中并未得到允许。SelectMany方法在每一次调用中“平化”掉(flatten out)恰好一级单子嵌套,以使sandbox(sandbox(x))在转入管道中的下一个lambda表达式之前变成sandbox(x)。
在一些实施例中,第一进程104嵌入的查询可以对应于一个用于检查数据集合中的项目以产生可能较小的数据集合的过滤器。举个例子,在用于嘈杂的电话和无线电信道上的语言拼写的各种音标字母(例如“alpha”、“bravo”、“charlie”、“delta”等等)的数据库中,第一进程104有可能仅仅关注的是国际民用航空组织(ICAO)采纳的音标字母。以下显示了使用LINQ运算符的lambda表达式组成的例示查询:
phoneticAlphabets
.Where(function(w){return w.Origination == Origination.ICAO;})
.OrderBy(function(w){return w.CodeWord;})
在这个示例中,第一进程104会将这个查询发送给第二进程106,其被编码在如下所示的URL中:
http://.../phoneticAlphabets.Where(function(w)%7breturn+w.Origination%3d%3dOrigination.ICAO%3b%7d).OrderBy(function(w)%7breturn+w.CodeWord%3b%7d)
如果经过验证的用户信道可用,那么第二进程106会将该查询与经过验证的用户信道相关联;否则,所述查询将会借助PKCS包络(例如在HTTP POST动词的主体中,而不是像REST-ful嵌入处理中那样将查询嵌入在URL中)来传递。对于PKCS包络而言,第二进程106将会检查PKCS包络上的签名,以便实施发送方验证、篡改防护以及不可抵赖性。然后,第二进程106会在日志中记录、解释、编译以及评估单子中的查询,由此将结果返回给第一进程104。
在另一个示例中,用户关注的是音标字母中包含了字母“r”的码字。以下显示了由使用LINQ运算符的lambda表达式组成的例示查询:
phoneticAlphabets
.Where(function(w){return w.CodeWord.ToCharArray().Contains('r');})
.Select(function(w){return w.CodeWord;})
.Distinct()
第一进程104将该查询编码到以下所述的URL中,以便将传送到第二进程106。
http://phonetic.alphabets.com/RESTLINQ/phoneticAlphabets.Where(function(w)%7breturn+w.CodeWord.ToEnumerable().Contains('r')%3b%7d).Select(function(w)%7breturn+w.CodeWord%3b%7d).Distinct()
在双向示例中,第二进程106从第一进程104那里订阅了周期性的位置更新流或偶尔的兴趣更新。同样,第一进程104从处于客户机设备302的附近地理位置的公司那里订阅了与特定兴趣相匹配的零星供给。以下显示了第二进程106的例示代码。
clientObservable // proxy to the observable on the client side
.Subscribe(client => RelevantBusinesses = AllBusinesses
.Within(client.Vicinity)
.Where(business => business.IsRelevant(client))
Subscribe方法的自变量是被编写成lambda表达式的观测方函数。Lambda表达式的这种用法与其在查询运算符内部的用法存在差别。在这个示例中,lambda表达式对来自第一进程104的事件做出响应。在查询运算符的上下文中,lambda表达式被应用于单子(例如可枚举单子和/或可观测单子)内部的数据元素。函数参数出现在=>箭头的左侧,并且函数主体出现在右侧。标注x=>…代表的是function(x){return…;}。Subscribe方法确保每次来自第一进程104的更新到达第二进程106的时候就调用观测方函数。观测方函数取回是在当前附近位置内部过滤且与第一进程104相关的可观测事务的集合。所述可观测集合则被指定了属性RelevantBusinesses。
第一进程104以如下所述的方式来订阅属性RelevantBusinesses。
server.RelevantBusinesses // proxy to the server's observable
.SelectMany(business => business.Offers
.Where(offer => this.Interests.Match(offer))
.Merge()
.Subscribe(offer => this.RespondToOffer(offer))
这个以“具有lambda表达式的运算符”的形式撰写的查询借助SelectMany方法合并来自事务的供给,通过更为私有的匹配关注度过滤所合并的供给,然后则会订阅一个供给观测方函数,其中所述函数将会决定如何在每一个供给到达的时候对其做出响应。该示例示出了,在一些实施例中出于隐私方面的原因将一些查询保持在第一进程104的一端。
在一些实施例中,查询是可动态编程的(例如,来自一个进程的查询可以由其他查询改变)。在一个示例中,第二进程106以一个指示“每隔n次观察才进行发送”的指令的形式来将“减慢”(例如流量控制)注入到第一进程104中。以下查询是用带有lambda表达式的运算符的形式撰写的,这些查询示出的是来自第一进程104且被第二进程106注入了另一个lambda表达式的查询。所注入的带有lambda表达式的运算符是.Where(tick=>(tick%2==0))。
clientObservable // proxy to the observable on the client side
.Where(tick => (tick % 2 == 0) // only every other one, please!
.Subscribe(client => RelevantBusinesses = AllBusinesses
.Within(client.Vicinity)
.Where(business => business.IsRelevant(client))
以上查询可以用如下所示的另一形式改写,以便强调作为特定于域的语言(DSL)(例如带有作为指令集的LINQ)的评估器的查询处理器的结构,其中作为选择,所述结构是利用硬件增强和优化处理来实施的。
clientObservable // proxy to the observable on the client side
.LinqEval(LinqInstruction.Where, "tick => (tick % 2 == 0)")
.Subscribe(client => RelevantBusinesses = AllBusinesses
.Within(client.Vicinity)
.Where(business => business.IsRelevant(client))
在另一个示例中,客户机设备302是希望发现附近的披萨餐厅的移动设备。所述客户机设备302将会构成以下查询:
.Where('b => b.Category!==undefined')
.Where('b => /pizza/i.test(b.Category)')
所述查询可以作为HTTP POST中的文本来打包,并且有可能在PKCS包络中受到保护,或者也可以嵌入在如下所示的URL的内部。
http://.../?standingQuery=.Where(function(b)%7Breturn%20b.Category!%3D%3Dundefined%3B%7D)%0B.Where(function(b)%7Breturn%20%2Fpizza%2Fi.test(b.Category)%3B%7D)
图1、图3和图5的不同部件的功能的至少一部分可以由图1、图3和/或图5中的其他部件来执行,或是由图1、图3和/或图5中未显示的实体(例如处理器、web服务、服务器、应用程序、计算设备等等)来执行。
在一些实施例中,图2和图4所示的操作可以作为编码在计算机可读介质上的软件指令来实施,在被编程或设计成执行操作的硬件中实施,或是以这二者实施。例如,本公开的各方面可以作为片上***来实施。
虽然本公开的各方面没有追踪个人可识别信息,但是这些实施例是参考通过监视用户得到和/或从用户那里收集的数据来描述的。在此类实施例中,关于数据收集的通知将被提供给用户(例如借助对话框或是首选项设置),并且给用户机会以同意或拒绝所述监视和/或收集。所述同意可以采用选择同意或选择不同意的形式。
例示的操作环境
例示的计算机可读媒体包括闪存驱动器、数字多用途盘(DVD)、紧凑型盘(CD)、软盘以及盒式磁带。作为示例而不是限制,计算机可读媒体包括计算机存储媒体和通信媒体。计算机存储媒体包括以任何用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的方法或技术实施的易失和非易失、可移除和不可移除媒体。计算机存储媒体排除了传播的数据信号。例示的计算机存储媒体包括硬盘、闪存驱动器以及其他固态存储器。相比之下,通信媒体通常会将计算可读指令、数据结构、程序模块或其他数据包含在载波之类的调制数据信号或其他传输介质中,并且包含了任何信息递送媒体。
虽然在这里是结合例示的计算***环境来描述的,但是本发明的实施例可以与众多其他的通用或专用计算***环境或配置一起操作。关于适合与本发明的各方面一起使用的众所周知的计算***、环境和/或配置的示例包括但不局限于:移动计算设备、个人计算机、服务器计算机、手持或膝上型设备、多处理器***、游戏机、基于微处理器的***、机顶盒、可编程消费类电子设备、移动电话、网络PC、迷你计算机、大型计算机、包含了以上任何***或设备的分布式计算环境等等。
本发明的实施例可以在由一个或多个计算机或其他设备执行的计算机可执行指令的通用上下文中描述,例如程序模块。计算机可执行指令可被组织到一个或多个计算机可执行组件或模块中。通常,程序模块包括但不局限于执行特定任务或实施特定抽象数据类型的例程、程序、对象、组件和数据结构等等。本发明的各方面可以结合任意数量和组织的此类组件或模块来实施。例如,本发明的各方面并不局限于特定的计算机可执行指令或是在附图中示出并在这里描述的特定组件或模块。本发明的其他实施例可以包括具有与这里示出和描述的功能相比具有更多或更少的功能的不同的计算机可执行指令或组件。
本发明的各方面将通用计算机变换成在被配置成执行这里描述的指令时的专用计算设备。
在这里示出和描述的实施例以及没有在这里具体描述但却处于本发明的各方面的范围以内的实施例构成了使用单子来处理在URL 510的脚本语言中嵌入的查询运算符的例示手段,以及通过web服务304之类的web服务来对带有lambda表达式的运算符进行单子评估的例示手段。
除非另有规定,否则,在这里示出和描述的本发明的实施例中的操作的执行或运行顺序并不是必要的。换言之,除非另有规定,否则这些操作可以按照任何顺序执行,并且与这里公开的实施例相比,本发明的实施例可以包括附加的操作或更少的操作。例如,在另一个操作之前、同时或是之后运行或执行特定操作的处理可被认为处于本发明的方面的范围以内。
在介绍本发明的各方面的元素或是其实施例的时候,冠词“一”、“该”以及“所述”指的是存在一个或多个元素。术语“包括”、“包含”和“具有”应该是包含性的,并且指的是可以存在除了所列举的元素之外的附加元素。
虽然在这里详细描述了本发明的各方面,但是很明显,在不脱离附加权利要求定义的本发明的各方面的范围的情况下,修改和变更都是可行的。由于可以在不脱离本发明的各方面的范围的情况下在上述结构、产品和方法中进行不同的改动,因此,包含在以上描述中并在附图中显示的所有主题应该被解释成是说明性而不是限制性的。
Claims (10)
1.一种用于以双向、可动态编程的方式来将操作注入到第一进程(104)与第二进程(106)之间的通信中的***,所述***包括:
与第二进程(106)相关联的存储区域(506),所述存储区域(506)存储统一资源定位符(URL)(510),所述统一资源定位符中嵌入了带有闭包的一个或多个运算符,所述带有闭包的运算符对应于至少一个关于数据的请求;以及
处理器(502),其被编程成:
经由网络从第一进程(104)接收该URL(510),以及将接收到的URL(510)保存在存储区域(506)中;
从存储区域(506)中保存的URL(510)中提取带有闭包的运算符;
由第二进程(106)评估所提取的带有闭包的运算符,以便产生所请求的数据,所述评估包括:
将闭包转换成简单类型的闭包,以及
将带有经过转换的闭包的运算符绑定在单子内部,以便封装从带有经过转换的闭包的运算符中产生的数据;以及
将所产生的数据发送到第一进程(104)。
2.权利要求1的***,其中第一进程是由客户机设备运行的,并且第二进程是由云服务运行的。
3.权利要求1的***,其中第一进程是由云服务运行的,并且第二进程是由客户机设备运行的。
4.权利要求1的***,其中处理器被编程成通过将至少一个操作应用于通过评估每一个带有经过转换的闭包的运算符所产生的数据而将带有经过转换的闭包的运算符绑定在单子内部,其中相同的操作被应用于从管道中带有经过转换的闭包的在先运算符中产生的数据上。
5.权利要求1的***,还包括:
用于利用单子处理以脚本语言嵌入在URL中的查询运算符的装置;以及
用于由web服务来对带有闭包的运算符进行单子评估的装置。
6.一种方法,包括:
从第一进程(104)接收一个或多个带有闭包的运算符,所述带有闭包的运算符代表的是由第二进程(106)执行的一个或多个函数;以及
第二进程(106)对接收到的带有闭包的运算符进行评估,以便通过以下处理来运行函数:
将闭包转换成简单类型的闭包;以及
将带有经过转换的闭包的运算符绑定在单子内部,以便限制所述函数的运行。
7.权利要求6的方法,其中将带有经过转换的闭包的运算符绑定在单子内部包括以下的一项或多项处理:创建Kleisli组合,以及将至少一个操作应用于通过运行每一个函数得到的输出数据上,其中相同的操作被应用于每一个函数。
8.权利要求6的方法,其中计算设备运行第一进程和第二进程,其中接收带有闭包的运算符包括:接收一个或多个编码在脚本语言中和/或打包在超文本标记语言中的查询,以及其中评估带有闭包的运算符包括对从包含下列各项的集合中选择的查询运算符进行评估:扩展、转换、过滤、编组、加入、排序、组合以及累积。
9.权利要求6的方法,其中评估带有闭包的运算符包括以下的一个或多个处理:对带有闭包的运算符进行排序以便进行顺序评估,以及将过滤器应用于数据集合以便产生数据子集,以及其中转换闭包包括以下的一个或多个处理:禁止递归评估所述闭包,以及禁止针对所述闭包的自应用更高阶自变量。
10.权利要求6的方法,其中一个或多个计算机存储媒体包含了计算机可执行组件,所述组件包括:
通信接口组件,其在被运行的时候使至少一个处理器从第一进程接收注入了带有闭包的运算符的序列的通信,所述带有闭包的运算符代表的是由第二进程执行以产生输出数据的函数;以及
脚本组件,其在被运行的时候使至少一个处理器通过第二进程来按顺序静态分析带有闭包的运算符,以便执行函数来产生输出数据,所述脚本组件包括:
类型检查组件,其在被运行的时候使至少一个处理器将每一个闭包转换成简单类型的闭包;以及
封装组件,其在被运行的时候使至少一个处理器在单子内部应用将带有在静态分析期间被类型检查组件转换过的闭包的运算符应用于来自带有闭包的运算符的序列中的在先阶段的输出数据上,以便包含函数的运行,
其中所述通信接口组件将所产生的输出数据提供给第一进程。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US13/279,245 US9075672B2 (en) | 2011-10-21 | 2011-10-21 | Monadic evaluation of injected query compositions |
US13/279245 | 2011-10-21 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102902595A true CN102902595A (zh) | 2013-01-30 |
CN102902595B CN102902595B (zh) | 2015-04-08 |
Family
ID=47574841
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210405280.5A Active CN102902595B (zh) | 2011-10-21 | 2012-10-22 | 注入组合查询的单子评估 |
Country Status (2)
Country | Link |
---|---|
US (2) | US9075672B2 (zh) |
CN (1) | CN102902595B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105302503A (zh) * | 2014-06-13 | 2016-02-03 | 佳能株式会社 | 信息处理装置及其控制方法 |
CN111125440A (zh) * | 2019-12-09 | 2020-05-08 | 重庆邮电大学 | 一种基于Monad的持久层复合条件查询方法与存储介质 |
CN114127681A (zh) * | 2019-09-13 | 2022-03-01 | 华为技术有限公司 | 用于实现数据流ai应用的自主加速的方法和装置 |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8806451B2 (en) * | 2011-06-16 | 2014-08-12 | Microsoft Corporation | Monad based cloud computing |
US20130091197A1 (en) | 2011-10-11 | 2013-04-11 | Microsoft Corporation | Mobile device as a local server |
US20130159969A1 (en) * | 2011-12-16 | 2013-06-20 | Microsoft Corporation | Digital signal processing with language integrated monads |
US9092247B2 (en) | 2012-03-29 | 2015-07-28 | Microsoft Technology Licensing, Llc | Persistent and resilient worker processes |
US9184980B1 (en) * | 2012-07-25 | 2015-11-10 | Google, Inc. | Process for traversing through large rest data graph |
US9600351B2 (en) | 2012-12-14 | 2017-03-21 | Microsoft Technology Licensing, Llc | Inversion-of-control component service models for virtual environments |
US9552221B1 (en) * | 2013-12-23 | 2017-01-24 | Google Inc. | Monitoring application execution using probe and profiling modules to collect timing and dependency information |
EP3120286B1 (en) * | 2014-03-17 | 2019-07-17 | Proofpoint, Inc. | Behavior profiling for malware detection |
US11321394B2 (en) | 2019-06-24 | 2022-05-03 | Thatdot, Inc. | Graph processing system |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070050347A1 (en) * | 2005-08-30 | 2007-03-01 | Microsoft Corporation | Query comprehensions |
CN1989486A (zh) * | 2004-05-20 | 2007-06-27 | Sap股份公司 | 在运行时***中共享对象 |
CN101312457A (zh) * | 2002-03-28 | 2008-11-26 | 普里凯许公司 | 在发行-预订网络中使用的方法、路由器、设备和该网络 |
CN101315600A (zh) * | 2007-06-01 | 2008-12-03 | 国际商业机器公司 | 用于保持数据一致性的方法和*** |
CN102200911A (zh) * | 2010-03-24 | 2011-09-28 | 微软公司 | 变量闭包 |
US20120117644A1 (en) * | 2010-11-04 | 2012-05-10 | Ridgeway Internet Security, Llc | System and Method for Internet Security |
US20120284237A1 (en) * | 2011-05-05 | 2012-11-08 | Mingyan Li | Methods and systems for validating input data |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7779020B2 (en) * | 2002-03-01 | 2010-08-17 | International Business Machines Corporation | Small-footprint applicative query interpreter method, system and program product |
US7774361B1 (en) * | 2005-07-08 | 2010-08-10 | Symantec Corporation | Effective aggregation and presentation of database intrusion incidents |
US20090144229A1 (en) | 2007-11-30 | 2009-06-04 | Microsoft Corporation | Static query optimization for linq |
US9317255B2 (en) | 2008-03-28 | 2016-04-19 | Microsoft Technology Licensing, LCC | Automatic code transformation with state transformer monads |
US8285708B2 (en) | 2008-10-21 | 2012-10-09 | Microsoft Corporation | Query submission pipeline using LINQ |
JP5186443B2 (ja) * | 2009-06-30 | 2013-04-17 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 文字列の妥当性を判定するシステム、方法及びプログラム |
US20110173621A1 (en) | 2010-01-13 | 2011-07-14 | Microsoft Corporation | Push-based operators for processing of push-based notifications |
US20120072442A1 (en) | 2010-09-22 | 2012-03-22 | Microsoft Corporation | Monadic type preservation for query operators |
US8806451B2 (en) | 2011-06-16 | 2014-08-12 | Microsoft Corporation | Monad based cloud computing |
-
2011
- 2011-10-21 US US13/279,245 patent/US9075672B2/en active Active
-
2012
- 2012-10-22 CN CN201210405280.5A patent/CN102902595B/zh active Active
-
2015
- 2015-06-25 US US14/749,780 patent/US9503505B2/en active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101312457A (zh) * | 2002-03-28 | 2008-11-26 | 普里凯许公司 | 在发行-预订网络中使用的方法、路由器、设备和该网络 |
CN1989486A (zh) * | 2004-05-20 | 2007-06-27 | Sap股份公司 | 在运行时***中共享对象 |
US20070050347A1 (en) * | 2005-08-30 | 2007-03-01 | Microsoft Corporation | Query comprehensions |
CN101315600A (zh) * | 2007-06-01 | 2008-12-03 | 国际商业机器公司 | 用于保持数据一致性的方法和*** |
CN102200911A (zh) * | 2010-03-24 | 2011-09-28 | 微软公司 | 变量闭包 |
US20120117644A1 (en) * | 2010-11-04 | 2012-05-10 | Ridgeway Internet Security, Llc | System and Method for Internet Security |
US20120284237A1 (en) * | 2011-05-05 | 2012-11-08 | Mingyan Li | Methods and systems for validating input data |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105302503A (zh) * | 2014-06-13 | 2016-02-03 | 佳能株式会社 | 信息处理装置及其控制方法 |
CN105302503B (zh) * | 2014-06-13 | 2018-05-25 | 佳能株式会社 | 信息处理装置及其控制方法 |
CN114127681A (zh) * | 2019-09-13 | 2022-03-01 | 华为技术有限公司 | 用于实现数据流ai应用的自主加速的方法和装置 |
CN111125440A (zh) * | 2019-12-09 | 2020-05-08 | 重庆邮电大学 | 一种基于Monad的持久层复合条件查询方法与存储介质 |
CN111125440B (zh) * | 2019-12-09 | 2022-08-23 | 重庆邮电大学 | 一种基于Monad的持久层复合条件查询方法与存储介质 |
Also Published As
Publication number | Publication date |
---|---|
US20130103715A1 (en) | 2013-04-25 |
US20150295990A1 (en) | 2015-10-15 |
US9503505B2 (en) | 2016-11-22 |
CN102902595B (zh) | 2015-04-08 |
US9075672B2 (en) | 2015-07-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102902595B (zh) | 注入组合查询的单子评估 | |
Tomlin | Cartographic modeling | |
Washizaki et al. | Landscape of architecture and design patterns for iot systems | |
CN103645951A (zh) | 一种跨平台的移动数据管理***及其方法 | |
CN101902756A (zh) | M2m业务平台及其工作方法 | |
CN102810057A (zh) | 一种记录日志的方法 | |
CN106383701A (zh) | 基于通用多协议数据访问接口技术的数据服务*** | |
Foerster et al. | Geospatial web services for distributed processing: applications and scenarios | |
CN104182228A (zh) | 一种创建网络应用的方法和*** | |
Zander et al. | Context-driven RDF data replication on mobile devices | |
CN101902492A (zh) | Web Service服务器、网站建设方法及信息交互方法 | |
CN105912542A (zh) | 一种烟叶种植大田地理信息数据融合*** | |
Negru et al. | Dependable workflow management system for smart farms | |
Cuomo et al. | Analysis of a data-flow in a financial IoT system | |
Calvo et al. | Designing high performance factory automation applications on top of DDS | |
Pick | Geographical information systems | |
Henderson-Sellers | Towards the Consolidation of a Diagramming Suite for Agent‐Oriented Modelling Languages | |
Nugroho | Context-awareness: connecting computing with its environment | |
Ur Rehman et al. | An approach to model based testing of multiagent systems | |
Dmitry et al. | On m2m software | |
Nabet et al. | BigNFC: Novel Formal model for NFC based context-aware applications | |
Kocman | Evaluation of the Applicability of GraphQL for Integration Layers in Heterogeneous Mi-croservice Architectures | |
Oyedeji et al. | Development of a Web-based System for Matching Losers and Finders of Personal Items | |
Pandit et al. | A model for contextual data sharing in smartphone applications | |
Villido | Semantic Integration Platform for Web Widgets’ Communication |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150706 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TR01 | Transfer of patent right |
Effective date of registration: 20150706 Address after: Washington State Patentee after: Micro soft technique license Co., Ltd Address before: Washington State Patentee before: Microsoft Corp. |