首页 文章 精选 留言 我的

精选列表

搜索[字节级],共10000篇文章
优秀的个人博客,低调大师

企业级开源 IDaas/EIAM 产品重磅发布

TopIAM 数字身份管控平台,简称:EIAM(Employee Identity and Access Management), 用于管理企业内员工账号、权限、身份认证、应用访问,帮助整合部署在本地或云端的内部办公系统、业务系统及三方 SaaS 系统的所有身份,实现一个账号打通所有应用的服务。 产品价值 传统企业 IT 大多采用烟囱式建设方式,各系统独立建设账号体系、权限体系,当企业团队人数达到数十人至数百人时,由于系统数量多,在账户、密码、权限管理上会出现瓶颈。员工入职、离职,转岗都需要进行账号权限分配等此类管理,操作低效、功能重复、价值低,员工需要记录多套系统密码,容易出现安全问题,导致数据外泄。用户身份认证安全存疑,敏感系统缺乏严格的身份认证机制。 EIAM 提供一套集中式账号、权限、认证、应用、审计等,帮助企业打通身份数据孤岛,实现用户全生命周期,实现一个账号打通所有应用的服务,强化企业安全体系,提升组织管理效率,助力企业数字化转型升级。 核心特性 提供统一组织信息管理,多维度建立对应关系,实现在一个平台对企业人员、组织架构、应用信息的高效统一管理。 支持钉钉、飞书、企业微信等身份源集成能力,实现系统和企业OA平台数据联动,以用户为管理基点,结合入职、离职、调岗、兼职等人事事件,关联其相关应用权限变化而变化,保证应用访问权限的安全控制。 支持多因素认证,行为验证码、社交认证,融合认证等机制,保证用户认证安全可靠。 支持微信、微博、QQ等社交认证集成,使企业具有快速纳入互联网化认证能力。 支持 SAML2,OAuth2,OIDC,CAS,表单代填等认证协议及机制,实现单点登录功能,预配置大量 SaaS 应用及传统应用模板,开箱即用。 完善的安全审计,详尽记录每一次用户行为,使每一步操作有据可循,实时记录企业信息安全状况,精准识别企业异常访问和潜在威胁的源头。 提供标准REST和SCIM2.0接口轻松完成机构用户同步,实现企业对于账号生命周期的精细化管理。 开源、安全、自主可控。 页面展示 仅展示部分UI页面 管理端 统计分析 组织与用户 身份源管理 添加应用 门户端 我的应用 在线演示 管理端:https://eiam-console.topiam.cn 用户端:https://eiam-portal.topiam.cn 技术架构 前端技术栈:ES6、React、TypeScript、UmiJS、Axios、Ant Design; 后端技术栈:JDK11、Spring Boot、Spring Data、Spring Security、Elasticsearch、Redis、MySQL; 参与贡献 我们强烈欢迎有兴趣的开发者参与到项目建设中来,同时欢迎大家对项目提出宝贵意见建议和功能需求,项目正在积极开发,欢迎 PR 👏。 License

优秀的个人博客,低调大师

TiOMQ Client 首发,殿堂级 MQTT 客户端

在一群精英工程师的呵护下,TiOMQ Client带着她妙曼的身姿,姗姗来迟,我们先一睹芳颜 TiOMQ Client是什么 TiOMQ Client是MQTT的客户端,它实现完整的MQTT协议,您可以用她测试您的MQTT Broker的功能是否正常 为什么研发TiOMQ Client 在TiOMQ Client出现之前,市面上已经有不少MQTT Client工具,而且一些还是免费的。友商的产品很好,但我们想更好,在此列举一下TiOMQ Client工具的一些亮点 一. 使用简单 以下这些功能和特性让TiOMQ Client的使用体验非常棒 快速导出导入让您:配置一次,到处使用 布局条理清晰,让第一次使用者上手即会 可拖拽的设计,让您很方便地对连接进行分门别类管理 消息数量全量显示在各连接之上,清晰明了,方便测试 一键订阅多个内置主题,省却大量手工敲键盘时间 细节到第一个像素的UI设计 像女友般极其体贴的交互设计 二. 功能齐全 订阅、发布、保留消息、遗嘱消息、QOS等级、即时聊天、多端(Web、Windows、Mac)支持且使用体验一致 下载TiOMQ Client 进入:https://www.tiocloud.com/tiomq-website/product/client.html

优秀的个人博客,低调大师

纳秒级高性能日志系统 · ATC 2018

本文转载自微信公众号「真没什么逻辑」,作者 Draveness 。转载本文请联系真没什么逻辑公众号。 『看看论文』是一系列分析计算机和软件工程领域论文的文章,我们在这个系列的每一篇文章中都会阅读一篇来自 OSDI、SOSP 等顶会中的论文,这里不会事无巨细地介绍所有的细节,而是会筛选论文中的关键内容,如果你对相关的论文非常感兴趣,可以直接点击链接阅读原文。 本文要介绍的是 2018 年 ATC 期刊中的论文 —— NanoLog: A Nanosecond Scale Logging System[^1],该论文实现的 NanoLog 是高性能的日志系统,与 C++ 社区中的其他日志系统,例如:spdlog、glog 和 Boost Log 相比,它的性能可以高出 1 ~ 2 个数量级,我们在这篇文章中来简要分析 NanoLog 的设计与实现原理。 日志是系统可观测性的重要一环,相信很多工程师都有线上出问题临时加日志查问题的经历,作者刚刚又重新经历了这一过程,稍有经验的开发者都会在系统中加入很多日志方便生产环境的问题排查,更有经验的开发者会谨慎地在系统中(尤其是低延迟的实时系统)添加日志,因为打印日志这件看起来简单的事情实际上会带来很大的额外开销。 打印日志是一件简单的事情,几乎所有的工程师在踏上编程之路的第一天起就学会了如何使用 printf 等函数向标准输出打印字符串,在 99% 的程序中使用这种做法都不会带来性能问题,只是在生产环境中我们会使用结构化的、容易解析的格式替代 printf,例如:在日志中加入时间戳、文件名和行数等信息。 图 1 - 常见的日志系统 但是剩下 1% 的程序要求超低延迟的系统,它们对响应时间的要求可能是微秒甚至纳秒级别的。在这种场景下,如果仍然需要日志系统提供可观测性,我们需要深入研究向标准输出或者文件写日志的细节,例如:使用缓冲区、异步写入文件以及减少反射等动态特性的使用,除此之外,我们还要保证日志输出的顺序、避免消息丢失或者截断。 spdlog、glog 和 Boost Log 已经能够满足绝大多数应用程序的需求,但是对于这些延迟机器敏感的应用程序,打印日志需要的几微秒可能会显著地增加请求的处理时间影响程序的性能,而今天分享的 NanoLog 是一个可以在纳秒尺度打印日志的系统。 架构设计 NanoLog 能在毫秒尺度打印日志是因为它能够在编译期间提取静态日志消息并在离线阶段处理日志的格式化等问题。其核心优化都建立在以下两个条件上: 开发者可直接阅读的格式化日志不一定要在应用程序运行时直接生成,我们可以在运行期间记录日志的动态参数并在运行后按需生成; 日志消息中的绝大部分信息都是静态冗余的,只有少数参数会发生变化,我们可以在编译期间获取日志的静态内容并仅在后处理器中打印一次; 正是因为大多数日志都遵循上述特性,所以 NanoLog 可以在它们的基础上实现纳秒尺度的日志打印。NanoLog 的不同设计方式决定了它与传统日志模块会在架构上有很大的差异,它由以下三个组件构成: 图 2 - NanoLog 系统架构 预处理器:在编译期间从源代码提取日志消息、将原始日志语句替换成优化过的代码并为每条日志消息生成压缩、字典辅助函数; 运行时库:在缓冲区中缓存多个线程打印的日志并使用预处理阶段生成的辅助函数输出压缩后的二进制日志; 解码器:利用预处理阶段生成的包含静态信息的字典解码日志,获取可以被人类阅读的日志; 传统的日志系统都仅包含运行时,我们只需要在开发时引入头文件、链接静态库或者动态库并在代码中指定的位置输出日志,日志系统会程序运行期间将日志打印到标准输出或者指定文件。 但是 NanoLog 打破了上述这种传统的设计,为了减少运行时的开销,我们将一部分操作迁移到了编译期间和运行后,这也遵循工作质量守恒定律:工作不会凭空消失,它只会从运行时转移到程序生命周期的其他阶段,NanoLog 就使用了下面的操作降低了日志系统的开销: 在编译时重写了日志语句移除静态信息并将昂贵的格式化操作推迟到代码运行后的阶段,这能够在运行时减少大量的计算和 I/O 带宽需求; 为每个日志消息编译了特定代码,能够高效地处理动态参数,避免在运行时解析日志消息并编码参数类型; 使用轻量级的压缩算法以及不保序的日志减少运行时的 I/O 和处理时间; 使用后处理组合压缩的日志数据和编译时提取的静态信息生成可读的日志; 实现原理 这一节我们将简要分析 NanoLog 系统中三大组件,即预处理、运行时和后处理的具体实现原理。 预处理 NanoLog 使用 Python 来实现预处理器,程序的入口在 processor/parser 中,它会扫描用户的源文件、生成元数据文件和修改后的源代码,接下来会将这些修改后的代码编译到 .so 或者 .a 文件中,而不是编译初始的代码。除此之外,预处理器还会读取生成的所有元数据文件、生成 C++ 源代码并编译到 NanoLog 的运行时库和最后的用户程序中: 图 3 - 预处理器 它会为源代码中的每个 NANO_LOG 生成两条语句,即 record 和 compress,其中前者记录日志中的动态参数,后者压缩记录的数据减少程序的 I/O 时间。下面是预处理器生成的 record 函数: inlinevoid__syang0__fl__E32374s3237424642lf__s46cc__100__(NanoLog::LogLevellevel,constchar*fmtStr,constchar*arg0,intarg1,intarg2,doublearg3){ externconstuint32_t__fmtId__E32374s3237424642lf__s46cc__100__; if(level>NanoLog::getLogLevel()) return; uint64_ttimestamp=PerfUtils::Cycles::rdtsc(); size_tstr0Len=1+strlen(arg0);; size_tallocSize=sizeof(arg1)+sizeof(arg2)+sizeof(arg3)+str0Len+sizeof(NanoLogInternal::Log::UncompressedEntry); NanoLogInternal::Log::UncompressedEntry*re=reinterpret_cast<NanoLogInternal::Log::UncompressedEntry*>(NanoLogInternal::RuntimeLogger::reserveAlloc(allocSize)); re->fmtId=__fmtId__E32374s3237424642lf__s46cc__100__; re->timestamp=timestamp; re->entrySize=static_cast<uint32_t>(allocSize); char*buffer=re->argData; //Recordthenon-stringarguments NanoLogInternal::Log::recordPrimitive(buffer,arg1); NanoLogInternal::Log::recordPrimitive(buffer,arg2); NanoLogInternal::Log::recordPrimitive(buffer,arg3); //Recordthestrings(ifany)attheendoftheentry memcpy(buffer,arg0,str0Len);buffer+=str0Len;*(reinterpret_cast<std::remove_const<typenamestd::remove_pointer<decltype(arg0)>::type>::type*>(buffer)-1)=L'\0'; //Maketheentryvisible NanoLogInternal::RuntimeLogger::finishAlloc(allocSize); } 每个函数都包含特定的 fmtId,日志的压缩和解压也都会用到这里生成的标识符,上述函数还会为参数分配内存空间并按照顺序调用 recordPrimitive 将所有参数记录到缓冲区中。压缩使用的 compress 也遵循类似的逻辑: inlinessize_t compressArgs__E32374s3237424642lf__s46cc__100__(NanoLogInternal::Log::UncompressedEntry*re,char*out){ char*originalOutPtr=out; //Allocatenibbles BufferUtils::TwoNibbles*nib=reinterpret_cast<BufferUtils::TwoNibbles*>(out); out+=2; char*args=re->argData; //Readbackalltheprimitives intarg1;std::memcpy(&arg1,args,sizeof(int));args+=sizeof(int); intarg2;std::memcpy(&arg2,args,sizeof(int));args+=sizeof(int); doublearg3;std::memcpy(&arg3,args,sizeof(double));args+=sizeof(double); //Packalltheprimitives nib[0].first=0x0f&static_cast<uint8_t>(BufferUtils::pack(&out,arg1)); nib[0].second=0x0f&static_cast<uint8_t>(BufferUtils::pack(&out,arg2)); nib[1].first=0x0f&static_cast<uint8_t>(BufferUtils::pack(&out,arg3)); if(true){ //memcpyallthestringswithoutcompression size_tstringBytes=re->entrySize-(sizeof(arg1)+sizeof(arg2)+sizeof(arg3)+0) -sizeof(NanoLogInternal::Log::UncompressedEntry); if(stringBytes>0){ memcpy(out,args,stringBytes); out+=stringBytes; } } returnout-originalOutPtr; } 日志的记录和压缩函数都是 Python 的预处理器分析源代码生成的,工程师在开始时使用的 NANO_LOG 会被预处理器展开成新的代码,该预处理器与 C++ 的预处理器有非常相似的功能,只是这里需要展开的代码过于复杂,我们很难在 C++ 中使用预处理器实现。 运行时 应用程序静态链接的 NanoLog 运行时会通过线程上的缓冲区解耦记录动态参数的低延时 record 操作和磁盘 I/O 等高延迟操作。线程上的缓冲区会存储 record 方法调用的结果,这些数据对后台的压缩线程也是可见的: 图 4 - 运行时 线程上用于暂存数据的缓冲区是程序提升性能的关键,我们要尽可能满足避免锁竞争和缓存一致性带来的额外开销,暂存缓冲区使用环形队列和单生产者的消费者模型降低数据的同步开销。 图 5 - 环形队列 环形队列是一个连续的、使用固定大小缓存的数据结构,它的头尾是相连的,非常适合缓存数据流,Linux 内核就使用这种数据结构作为 Socket 的读写缓冲区[^2],而音视频也会使用环形队列暂存刚刚收到还没有被解码的数据。 struct__kfifo{ unsignedintin; unsignedintout; unsignedintmask; unsignedintesize; void*data; }; 运行时不仅通过无锁环形队列提升性能,还需要解决环形队列中的日志消费问题。为了提高后台线程的处理能力,运行时会将日志的组装推迟到后处理并压缩日志数据减少 I/O 高延迟带来的影响。 后处理 后处理器的实现相对比较简单,因为每条日志都包含特定的标识符,后处理器会根据该标识符在压缩后的日志头中找到编译时生成的相关信息,并根据这些信息展开和解压日志。 需要注意的是,因为在运行期间每个线程都有自己的暂存缓冲区存储日志,所以 NanoLog 最终打印的日志不能严格保证时间顺序,它只能保证日志输出的顺序在大体上是有序的。 总结 NanoLog 是设计非常有趣、值得学习的日志系统,但是它并不适合所有的项目,它将原本运行时需要完成的工作转移到了编译期间和后处理阶段,减轻了程序运行时的负担,但是其输出的二进制日志是无法直接阅读的,这也增加了开发者处理日志的工作量。 虽然论文中提到,日志分析引擎基本都会收集、解析并分析工程师可以直接阅读的日志,而大多数的时间都花费在了日志的读取和解析上,使用二进制的日志不仅能够减少读取和解析的时间,还能减少昂贵的 I/O 和使用的带宽,但是这点在我们的系统中是否是优点就见仁见智了。 日志使用二进制的输出格式确实能够降低多方面的成本,但是它不仅需要日志收集和解析系统的支持,还牺牲了开发者本地调试的体验,而如果没有自动收集并解压日志的模块,手动解压线上日志排查问题是非常糟糕的体验,不过在极端的性能场景下我们可能也没有太多的选择,哪怕牺牲体验可能也要上。

优秀的个人博客,低调大师

谈谈对于企业级系统架构的理解

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 在我们刚开始学习架构的时候,首先会想到分层的概念,分层架构比较经典的是三层架构,那么,什么是三层架构呢?它包括表现层、业务层、数据访问层;而对于一个新手来说,从抽象意义上的三层架构,逻辑上就划分为三个层。 这个是最基本的三层架构模式。 表现层充当系统的界面呈现以及UI逻辑的角色,也就是说,UI(用户界面)属于表现层; 举一个对于asp.net WebForm来说,人们喜欢把对于UI的控制逻辑(服务器控件的读取、设置、事件等等)写在页面的后置隐藏代码中,并且依赖业务逻辑层。当然,服务器控件支持数据绑定的功能,可以通过数据源进行绑定控件。这样就可以节省在后置隐藏中的代码。 因此,我们就可以把表现层分为UI用户界面以及UI逻辑: UI用户界面的职责只是作为数据输入和输出后的展示工作。 UI逻辑的职责是负责业务逻辑层以及UI用户界面之间的数据交互,并且尽可能地让UI逻辑不依赖于UI技术。 其中UI用户界面的实现方式有很多,包括ASP.NET、WinForm、WPF、Silverlight、移动Web、智能设备等等。 将表现层中UI页面和UI逻辑分离的策略中,当前使用最多的两种模式是MVC模式和MVP模式。 MVC模式,即模型-视图-控制器模式,通过视图触发并执行某个操作,调用控制器,通过控制器去操作业务层,最终返回模型,在视图中进行展示。这里的模型可以是一个领域模型(DM),也可以是一个数据迁移对象(DTO)。 MVP模式,即模型-视图-展示器模式,和MVC模式有点像,不同的是MVP中视图和模型是被完全分离出来的,视图中定义一个接口,而展示器通过调用该接口的方法以控制视图。因此,视图和模型是松散的,展示器也充当了一个控制器的角色,同时它也不依赖于UI技术。 另外再介绍一种模式PM(Preentation Model),它可以说是MVP的变体,在PM中,视图不定义接口,这里的模型只是表示视图状态的类,视图中的元素被直接绑定到模型属性上。例如在WPF中,WPF就先天的具有数据双向绑定机制以及事件通知属性机制。 所以它特别适用于WPF,Sliverlight等等。 在开始业务层之前,不得不说一个前提,在一个小型项目中,直接让表现层调用业务层,足以解决所有问题。但是,当项目大到使用多种表现形式,如使用了各种UI技术、ASP.NET、WPF、移动设备等等,就要考虑在你的表现层和业务层之间增加一个层,以至于让表现层和业务层解耦,因为业务层作为一个业务中间件的平台,最好不要暴露于表现层中,这个层就是传说中的服务层。架构图又演化为: 服务层实际上并不执行任何具体的工作,其功能在于组织各个业务对象,服务层将业务层所有的细节对表现层都隐藏起来,服务器将组织业务逻辑层中的组件,并且通过数据迁移对象(DTO)与表现层交互,因此就产生一个DTO模型。 为了实现服务的可重用性,需要使用服务接口,表现层通过规定的接口访问功能。服务的实现继承服务接口,而服务的实现专注于业务层的调用。 对于服务层,常用的方法包括Web服务、.NET Remoting、Rest以及WCF技术。 本人比较建议使用WCF作为服务,因为可以方便地通过配置达到远程调用服务的目的。 服务层消除了两个表现层和业务层之间的耦合,服务层可以实现一个远程接口,达到多UI技术甚至多平台上的通信。 当然增加服务层也有缺点,假如使用WCF服务,会增加系统的调用开销,进而影响性能。 业务层中包含系统所需要业务过程上的实现,并与下层的数据访问层交互。 我们通常也叫做业务层叫做业务逻辑层,但我认为业务逻辑层是属于业务层的一方面,业务逻辑更专注于业务上逻辑算法的实现。因为业务层还可以包括其他的方面。 业务层必须包括对业务实体尽心建模的对象模型,表达了客户的所有策略和需求的业务规则,因此就产生了领域模型。 (PS:如果这里你不使用领域模型,那么需要采用业务规则层进行业务功能上的业务规则的验证和控制) 领域模型包括对实体的属性定义,方法定义以及实体与实体之间的关系。从这个角度上看,UML建模至关重要,通过对UML动态图和静态图的描述,可以映射到领域模型中。 从服务层刚才讲到了DTO模型,这里需要一个机制将DTO转化为领域模型,所以产生了DTO映射层(DTOMapper)。 另外业务层还包括核心中间件技术,包括第三方组件,以及工作流引擎等等。 业务层需要考虑到一些与数据访问层交互的设计模式,模式中包括事物脚本模式、表模块模式、活动记录模式、领域模型模式。 事物脚本模式是通过方法来执行业务流程,它是一个过程式模型,事物脚本的每个方法都有一个特定的事物脚本,它侧重于业务上一系列流程上的顺序操作,它实现起来很简单,但是它有个致命的缺点就是它会造成很多重复的代码。 表模块模式比起事物脚本模式,具有一定的结构,它的思想也很简单,每个数据表都定义一个业务组件(实体类,实体操作类),在.NET中更多的使用DataSet作为表模型的数据交互。但是它也有一个缺点就是它是从数据库驱动它不适合于大量的数据表以及数据表之间的复杂关系。 活动记录模式中的对象中,可以包含数据和方法。它接近于数据表的结构,它的对象中执行方法中可以包含CRUD操作,验证算法,以及其他的计算功能。一般来说,领域模型不是太复杂,活动记录模式是个好选择。当然他也存在问题,同样地,它对于复杂的业务上,维护的成本也很高,并且如果需求变更导致数据库修改,就需要调整记录对象模型中的相关代码。 经典应用:LINQ-TO-SQL以及Castle ActiveRecord。 领域模型模式是从领域驱动设计中衍生来的,它是以业务为核心的设计模式。它对于复杂的业务逻辑,相当适用。前三种方式使用的是以数据驱动方式,数据驱动方式特点简单,但是当系统到了一定的规模后,就会到难以维护的程度。 数据访问层的目的很明确,主要作为提供数据持久化的功能,包括数据的读取和写入,另外还必须包括事务处理,并发控制等等。 操作数据库的方法可以有两种方式:ORM方式、ADO.NET方式。 ORM可以采用一些第三方的ORM框架来实现,ADO.NET采用ASP.NET自带的数据库操作来实现。 不同的数据库具有不同的持久化实现,因此这里添加一个存储仓库接口层,来适应不同的数据库实现,这里你可以使用IOC依赖注入方式进行数据库选型,可以利用Unity、Spring.NET、Castle的IOC容器等等。 最后各个层中都可以依赖于公共基础设施层。 公共基础设施层可以包括Common通用模块、Logging日志模块、Exception异常模块、Configuration配置模块、DI依赖注入模块、单元测试模块以及第三方组件(例如NHibernate、Sprint.NET、Castle、Quartz计划任务等等) 最终图: 总结:项目类型、项目规模以及业务上的需求,都影响着系统架构的设计,系统架构并不是一层不变的,没有最好的架构,只有更好的架构,并且从项目中多思考系统的扩展性。 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/live 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-07-31本文作者:CRM咨询本文来自:“51CTO”,了解相关信息可以关注“51CTO”

优秀的个人博客,低调大师

疫情推动大数据三级跳

这个春节,新冠肺炎的疫情让很多产业按下了暂停键;然而在信息技术领域,却出现了不少新的应用场景,促成了IT技术的发展。这当中有显性化的,主要是面向个人客户的各种移动互联网应用;也有不易被人察觉的,比如今天说的大数据产业。 疫情之前的大数据 大数据在中国的兴起不是最近的事儿。记得最初是说某位美国总统的当选,大数据功不可没,后来某位人士写了本《大数据》受到中国政商的推崇。一时间,以互联网公司为首的高新科技企业对大数据青睐有加,最积极的大数据支持者阿里巴巴公司创立了Datatechnology(简称DT)这个词,马云曾公开表示:"人类正从IT时代走向DT时代。" 可以看到,在过去几年中,无论是企业政府还是产业投资,虽然诉求不同,但行动上都在积极推动大数据发展。众人拾柴火焰高,大数据成为瞩目的产业热点。 那么大数据是不是一飞冲天了呢?好像还没有。 大数据的投入非常大,需要购买大量的硬件基础设施,需要专业化的工具软件以及掌握这些高新技术的专业人士,需要具备海量数据的获取能力,需要熟悉算法有能力进行模型设计和优化的数学人才等等。无论是系统建设成本还是运营成本,都需要巨大的资金投入。 那么大数据的产出呢?能直接变现的应用中,看得到的是客户画像加上精准营销,看不到的是宏观分析和决策支持,经济效益的增量不大;衍生出来的人工智能、区块链等,也是雷声大雨点小不赚钱的生意。 尤其最近两年,信息安全和个人隐私保护的问题越来越引起关注,在一定程度上影响了大数据产业的发展速度。一些从事大数据产业的企业被调查,又给本来就不大赚钱的产业增加了不少风险因素,看衰大数据的声音此起彼伏。 从技术角度看,在疫情之前大数据产业的基本形态是这样的: 互联网企业对大数据最为热衷,一方面是因为资本市场关注大数据,另一方面也确实利用大数据分析,改善自身产品体验,辅助开展营销和服务。 传统企业的大数据处于"自产自销"状态,自建的大数据系统主要利用自己IT系统产生的数据进行分析,决策支持为主,支撑业务为辅。 政府部门积极推进大数据产业发展,同时也在提升自身的大数据能力建设。 出现了专业从事大数据产业的创新企业。这些企业通过多种渠道获取数据,通过为企业提供数据和分析服务获利,目标客户主要是对大数据的使用有需求,但没有建设和运营大数据系统能力的中小企业。 众多的大数据系统各自独立,缺乏数据的交换共享机制和技术标准,孤岛模式下大数据的威力发挥不够充分。 物联网让物与物的连接实现数字化,越来越多的实体企业希望通过发展大数据来提升企业的竞争力,实现数字化转型。 总的来说,在疫情来临之前,相对于刚刚起步的企业大数据,中国在个人大数据领域已经发展了一段时间,在数据的获取和积累方面有了非常不错的基础;但在数据共享以及大数据的应用方面发展还不充分。 大数据的第一跳 随着疫情的出现和发展,数据和分析的价值引起广泛关注。 前段时间一个流行病学的名词火了,叫Basic reproduction number(基本传染数),是指在没有外力介入,同时所有人都没有免疫力的情况下,一个感染到某种传染病的人,会把疾病传染给其他多少个人的平均数,通常被写成为R0。 对于一种新的传染病,在疫情刚刚开始的时候,一些专业人士依据流行病学原理,根据病人数量、传染情况等信息设计数学模型,再基于人口数量和流动性等要素推测可能的感染人数以及病情传染趋势等,为决策提供数据支撑。但样本不足的情况下,难以判断哪个模型和结论更符合实际情况,只能寄希望专家基于经验的判断是准确的。 虽然不能对病情的扩散程度和感染者数量进行准确判断,但面对疫情必须当机立断,做出决策。可以想象,当时决策者们是多么希望拥有完整而真实的数据,以及对未来发展的准确预测啊,可惜他们只能在信息不完备的情况下设定防控手段的等级。 这里要多说一句,虽然现在我们有了非常多的实际数据,但武汉等地封城之后,实际上传播已经受到了外力影响,对建模和预测的参考价值降低了,所以不能拿国内的情况简单地套用到海外,和有没有瞒报没关系。 除了外部可见的信息和报道,影响决策的还有很多数据和分析,运营商就在其中扮演重要的角色。 运营商都拥有自己的大数据平台以及数据分析系统,而且中国的移动电话普及率超高,还全面推行了实名制管理,因此从运营商那里可以获取到本地与湖北的漫游情况,多少用户来自于湖北,自己的客户有多少人去过湖北,这些人分布在哪个地市哪个县,这些都是疫情防控需要的基本信息。 在1月底的时候,网络上流传出一些运营商提供给政府决策部门的汇报材料。随着信息安全管理的强化,这些内容不再为外人所知。随着疫情的发展、对新冠病毒认知程度的提升,相关部门不断需要运营商提供新的数据和分析报告,据我了解,甚至在春节期间,运营商负责数据分析的人员都没有休息,一直在加班加点提供数据支撑。 运营商对大数据的使用场景很多都是决策支持,与这次疫情前期对数据的需求场景非常相似,虽然我们无法了解到决策的具体场景和案例,但运营商为全国和省甚至地市级单位提供的宏观数据支持,为实际情况的判断以及相关措施的出台做出了贡献。 大数据的第二跳 随着封城、隔离等强制性举措的出台,中国应对疫情的手段已经清晰:将重灾区湖北与全国其他地区进行隔离,然后以省甚至以地市为单位,各自采取措施切断传播途径,对确诊患者、疑似病例以及密切接触者进行不同程度的隔离,控制疫情的传播。 这个时候,大数据不再主要关注宏观决策,更多的是对个体用户行为的信息查询和分析。这种方式以往大数据分析用得并不多,最多就是做一些客户的精准营销推送,或者针对性地改善客户体验,覆盖率非常有限。而这一次疫情防治不再考虑更多的成本因素,针对个体的数据分析成为疫情中期的主流场景。 从公开报道中可以看到,每发现一例新的确诊病例,都要像破案一样,最终溯源到这个患者是如何被感染的,从被感染到入院期间的行动轨迹如何;然后根据这些信息分析和寻找哪些人可能成为密切接触者,再对密切接触者进行隔离。这些信息的获取一部分是问询查证,还有一部分就是从患者的数据行为信息中分析出来的。 在网上流传着这样一则视频,一位社区工作人员敲开了一户人家的门,在确认了身份之后说: "您的情况属于大数据密切接触者,大数据显示您和新冠肺炎患者有密切接触的可能,现在对您实行为期14天的隔离。" 在对方的追问下,社区人员解释说:"您是有与患者密切接触的可能,比如乘坐同一交通工具之类的,具体是什么情况我们也不了解,只是根据上级单位派发下来的名单来通知。" 社区执行人员只是拿到了大数据分析结果,也就是需要隔离的人员名单,而具体的原因不得而知,因为这是系统提供出来的。此外还有根据用户的行为轨迹(如与确诊病例同时在一个封闭场所)、消费记录(移动支付的记录)等进行密切接触识别的。可以看出,为了对付疫情,多个企业和运营体系(包括交通、运营商、互联网企业)参与了对客户精准识别的工作,不同系统的大数据在共享和联动。 几年来推不动的事情,如今搞定了。 大数据的第三跳 如今,全国绝大部分地区在按照"疫情防控与经济发展两不误"的基调来开展工作。虽然疫情的蔓延得到了一定的控制,但并没有结束,在这种情况下复工,如何降低疫情扩散的风险? 随着时间的推移和案例的增加,我们越来越了解新冠肺炎。从目前来看,连续14天没有出现发热咳嗽等症状,基本可以认定为健康的,可以正常工作。那么如何识别这些人? 阿里巴巴在支付宝里推出了"健康码",由用户自行申请,如果是绿码就代表没问题,如果是黄码就属于7天隔离人群,如果是红码就属于14天隔离人群。 那么这个健康码从何而来?应该是基于阿里巴巴自有或者合作的数据进行分析的。有人反映因为当天上午骑过一辆共享单车,结果自己的绿码变红码,这一方面说明健康码的生成使用了共享单车的相关数据信息,还说明健康码可以实时查询、及时变更。 健康码虽然方便,但要全国推广还要解决很多问题,比如安徽推行的健康码虽然也是绿、黄、红三种,但是定义就与杭州不同,相应的数据/算法也不一样。 相比之下,运营商提供的漫游地实时查询服务成为普及程度最高的复工助手。因为运营商本身就是属地化运作模式,可以按照各省的管控要求量身定制。比如北京的最低要求是在本地隔离14天,于是北京的用户发送短信或者扫码查询,收到的反馈信息就是该用户在30天内待过的地方,以及15天内待过的地方。 可能有人会问,这不就是一个实时查询么,为什么说这种应用是大数据的重要一跳呢? 以往的大数据应用往往是两种模式:一种是离线的分析,主要用于数据统计和决策支持,由于对时效性的要求不高,因此可以充分地进行数据以及算法模型的选择,甚至可以同时进行多个模型的测算;另一种模式是在线的操作,比如精准营销或者推送,虽然实时强,但是数据分析与业务的相关性也很强,换一个业务或者场景就需要做很多调整,成本高,所以应用的范围也很难推广。 而这次的实时查询以及对内容的及时更新,是直接面向最终客户推出了大数据查询服务,是新的大数据应用模式。如果这种模式形成规模,就可能会对传统的运营体系产生冲击,让大数据从后台走向前台,从辅助走向主导,大数据系统也会从成本中心变为利润中心,改头换面重新出现在世人面前。 疫情之后的大数据展望 在与疫情战斗的过程中,在各种突发应用的推动下,在短短的两个月的时间里,不仅各方对数据价值的认可度有了大幅提升,而且跨域数据的共享与协作、面向个人的数据服务、大数据的实时性等,大数据产业在几个领域实现了质的突破。那么疫情结束之后,大数据目前的良好发展势头还会延续么?展望未来,大数据产业会面临什么样的发展机遇? 在极端情况下,大家对隐私保护和信息安全的容忍度降低;待疫情结束之后,你会把手机里已经打开的位置服务功能关闭么? 目前开发上线的涉及个人隐私的服务,会下线关闭么? 跨域数据共享和分析应用创新带来好处,但同时给信息安全和隐私保护带来新的威胁和挑战,如何平衡两方面的关系? 企业之间的大数据合作,是"协同"模式还是"集中"模式?企业会把自己的数据交出去么? 尝到了甜头之后,政府会推行什么样的产业政策发展大数据? 人工智能、区块链等与大数据相关的产业,能否顺势发展? 对这些问题我并没有答案,只是想抛出来与大家共同探讨。大数据产业的话题很多,这种热度今后也会长期存在,作为产业从业者,我们看到的是商机;而作为个人,面对一个可能比我还了解自己的IT体系,我是挺害怕的。

优秀的个人博客,低调大师

Nim 1.0.2 版本发布,系统级编译型语言

包含了bug 修复、文档更新 等内容 Nim 团队很高兴公布 v1.0.2 版本, 这是在 1.0.0 之后我们首次发布补丁。 想要了解更多关于 v1.0.0 的内容, 看一看我们一个月前发的发布说明。 尽管距离上个版本只有一个月, 这个版本也已经经历了超过60次新的提交, 修复了超过40个错误报告, 让我们的 1.0.0 能够更加健壮。 安装 1.0.2 如果你已经用choosenim安装了之前版本, 获取 Nim 1.0.2 版本会非常容易: $ choosenim update stable 如果你还没有,你可以通过这里的介绍来获取choosenim, 当然你也可以通过我们的安装页面直接安装。 更新日志 查阅此版本的变更日志以及 Nim 的其余源代码,可访问我们的 GitHub 仓库。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册