首页 文章 精选 留言 我的

精选列表

搜索[创意玩法],共3059篇文章
优秀的个人博客,低调大师

Pivotal大数据新玩法

目前大数据市场正处于快速成长阶段。根据IDC的预测,中国大数据技术与服务市场将会从2011年的7760万美元快速增长到2016年的6.16亿美元。尽管市场才起步,但市场竞争已经悄然展开,众多厂商推出了自己的大数据产品。 日前,Pivotal宣布推出了自己的大数据套件,该套件由Greenplum数据库、GemFire、 SQLFire、GemFire XD、HAWQ和HD共同组成。这是一个全面的数据管理解决方案,既包括面向传统结构化数据处理的数据仓库软件Greenplum,也包括面向实时数据处理领域的内存计算软件GemFire和SQLFire,还包括面向大数据的HD(Pivotal版本的Hadoop)。另外,还为混合数据类型的应用场景提供了一套连接和查询工具HAWQ。 应该说,这是Pivotal公司自去年4月成立以来的一个重要里程碑,不仅实现了将原来分别属于VMware和EMC两家公司产品的全面整合,还采用了创新的定价模式(订阅服务),其定价极富竞争力,订购价格以两年或三年为期限,视内核数量不同而不同。 “这几个产品组合在一起,满足了企业从MPP、Hadoop、NoSQL、内存计算等有关数据处理的全面需求。这几个产品是互相联通的,可以帮助客户构建一个统一的数据处理平台,全面满足企业的数据处理需求,而定价模式也非常新颖。”Pivotal大中华区总经理刘伟光表示。 Pivotal大中华区总经理刘伟光 据刘伟光介绍,相对市场上同类产品,Pivotal的大数据套件有自己独特的优势。首先是采用了统一的定价模型,按内核报价。刘伟光介绍说,目前数据库、数据仓库以及Hadoop等不同产品在不同公司报价方式是不一样的,有的按照CPU、有的按用户数、有的按容量,甚至对Pivotal而言,大数据套件中的不同产品报价方式也不同。现在统一按照内核来报价,在一定程度上简化了的用户选择。 第二个特点是其独特的许可证模型,可以保证投资和灵活部署,从容应对未知的需求。传统的软件套件许可是针对特定产品的,无论是按用户还是按CPU或者是按内核收费,都是如此,而在Pivotal的大数据套件中,不同产品之间的许可可以共享。比如,企业订阅了80个内核2年大数据套件的使用,它可以将80个内核的授权全部用于搭建基于Greenplum的数据仓库平台,同样也可以将这个80个内核的许可全部用于Gemfire来满足实时数据的处理需求,当然,用户也可以在各个产品中自由分配这80个内核的许可。而且,为了支持Hadoop的使用,Pivotal的Hadoop版本HD其使用不受许可的限制,也就是说只是订阅了大数据套件就可以无限制地使用Pivotal HD。 第三个特点是Pivotal大数据套件中各个产品的技术先进性和高度成熟度。比如,Greenplum在中国已经有非常庞大的用户基础,其用户遍布在电信、银行、零售、制造等多个领域。而Gemfire也成功地应用在12306网站,帮助12306的铁路购买系统应对全世界单点高并发量最高的春节期间购票点击。 “Pivotal的业务是专注于大数据和PaaS。其发展方向是建立一个在云平台上基于IaaS和PaaS的数据解决方案,来简化用户的应用程序管理、应用程序开发、维护的平台。这是未来Pivotal的使命。”刘伟光总结说。 本文作者:佚名 来源:51CTO

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

javascript史上最拽的玩法

摘要:在JavaScript世界中,有些操作会让你无法理解,但是却无比优雅,如果你真正了解这些,BAT公司任你选。(文章后面有惊喜) 一、5种方式实现值交换 1. var temp = a; a = b; b = temp; (传统,但需要借助临时变量)2. a ^= b; b ^= a; a ^= b; (需要两个整数)3. b = [a, a = b][0] (借助数组)4. [a, b] = [b, a]; (ES6,解构赋值)5. a = a + b; b = a - b; a = a - b; (小学奥赛题) 二、去掉小数部分 parseInt(num)~~numnum >> 0num | 0 三、判断 x 是否是整数 function isInt(x) { return (x ^ 0) === x}// return Math.round(x) === x// return (typeof x === 'number') && (x % 1 === 0)// ES6 -> Number.isInteger() 四、递归求阶乘 function factorial(n) { return (n > 1) ? n * f(n - 1) : n} 五、判断符号是否相同 function sameSign(a, b) { return (a ^ b) >= 0} 六、克隆数组 arr.slice(0) 七、数组去重 // ES6Array.from(new Set(arr))// ES5arr.filter(function(ele, index, array){ return index===array.indexOf(ele)}) 八、数组最大值 function maxArr(arr) { return Math.max.apply(null, arr)} 九、数组最小值 function minArr(arr) { return Math.min.apply(null, arr)} 十、随机获取数组的一个成员 function randomOne(arr) { return arr[Math.floor(Math.random() * arr.length)]} 十一、产生随机颜色 function getRandomColor() { return `#${Math.random().toString(16).substr(2, 6)}`} 十二、随机生成指定长度的字符串 function randomStr(n) { let standard = 'abcdefghijklmnopqrstuvwxyz9876543210' let len = standard.length let result = '' for (let i = 0; i < n; i++) { result += standard.charAt(Math.floor(Math.random() * len)) } return result} 十三、深拷贝 JSON.parse(JSON.stringify(obj)) 十四、打印出来看看 console.log(([][[]] + [])[+!![]] + ([] + {})[!+[] + !![]])console.log((!(~+[]) + {})[--[~+''][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]]) 十五、美化console console.info("%c哈哈", "color: #3190e8; font-size: 30px; font-family: sans-serif"); 原文发布时间:2018年01月23日 作者:技术金三胖 本文来源:开源中国如需转载请联系原作者

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

Kubernetes 新玩法:在 yaml 中编程

引子 性能测试在日常的开发工作中是常规需求,用来摸底服务的性能。 那么如何做性能测试?要么是通过编码的方式完成,写一堆脚本,用完即弃;要么是基于平台,在平台定义的流程中进行。对于后者,通常由于目标场景的复杂性,如部署特定的 workload、观测特定的性能项、网络访问问题等,往往导致性能测试平台要以高成本才能满足不断变化的开发场景的需求。 在云原生的背景下,是否可以更好解决这种问题? 先看两个 yaml 文件: performance-test.yaml 描述了在 K8s 中的操作流程: 创建测试用的 Namespace 启动针对 Deployment 创建效率和创建成功率的监控 下述动作重复 N 次:① 使用 workload 模板创建 Deployment;② 等待 Deployment 变为 Ready 删除测试用的 Namespace basic-1-pod-deployment.yaml 描述使用的 workload 模板 performance-test.yaml : apiVersion: aliyun.com/v1alpha1 kind: Beidou metadata: name: performance namespace: beidou spec: steps: - name: "Create Namespace If Not Exits" operations: - name: "create namespace" type: Task op: CreateNamespace args: - name: NS value: beidou - name: "Monitor Deployment Creation Efficiency" operations: - name: "Begin To Monitor Deployment Creation Efficiency" type: Task op: DeploymentCreationEfficiency args: - name: NS value: beidou - name: "Repeat 1 Times" type: Task op: RepeatNTimes args: - name: TIMES value: "1" - name: ACTION reference: id: deployment-operation - name: "Delete namespace" operations: - name: "delete namespace" type: Task op: DeleteNamespace args: - name: NS value: beidou - name: FORCE value: "false" references: - id: deployment-operation steps: - name: "Prepare Deployment" operations: - name: "Prepare Deployment" type: Task op: PrepareBatchDeployments args: - name: NS value: beidou - name: NODE_TYPE value: ebm - name: BATCH_NUM value: "1" - name: TEMPLATE value: "./templates/basic-1-pod-deployment.yaml" - name: DEPLOYMENT_REPLICAS value: "1" - name: DEPLOYMENT_PREFIX value: "ebm" - name: "Wait For Deployments To Be Ready" type: Task op: WaitForBatchDeploymentsReady args: - name: NS value: beidou - name: TIMEOUT value: "3m" - name: CHECK_INTERVAL value: "2s" basic-1-pod-deployment.yaml: apiVersion: apps/v1 kind: Deployment metadata: labels: app: basic-1-pod spec: selector: matchLabels: app: basic-1-pod template: metadata: labels: app: basic-1-pod spec: containers: - name: nginx image: registry-vpc.cn-hangzhou.aliyuncs.com/xxx/nginx:1.17.9 imagePullPolicy: Always resources: limits: cpu: 2 memory: 4Gi 然后通过一个命令行工具执行 performance-test.yaml: $ beidou server -c ~/.kube/config services/performance-test.yaml 执行效果如下 (每个 Deployment 创建耗时,所有 Deployment 创建耗时的 TP95 值,每个 Deployment 是否创建成功): 这些 metrics 是按照 Prometheus 标准输出,可以被 Prometheus server 收集走,再结合 Grafana 可以可视化展示性能测试数据。 通过在 yaml 中表达想法,编排对 K8s 资源的操作、监控,再也不用为性能测试的实现头疼了 :D 为什么要在yaml 中编程? 性能测试、回归测试等对于服务质量保障有很大帮助,需要做,但常规的实现方法在初期需要投入较多的时间和精力,新增变更后维护成本比较高。 通常这个过程是以代码的方式实现原子操作,如创建 Deployment、检测 Pod 配置等,然后再组合原子操作来满足需求,如 创建 Deployment -> 等待 Deployment ready -> 检测 Pod 配置等。 有没有办法在实现的过程中既可以尽量低成本实现,又可以复用已有的经验? 可以将原子操作封装为原语,如 CreateDeployment、CheckPod,再通过 yaml 的结构表达流程,那么就可以通过 yaml 而非代码的方式描述想法,又可以复用他人已经写好的 yaml 文件来解决某类场景的需求。 即在 yaml 中编程,减少重复性代码工作,通过声明式的方式描述逻辑,并以 yaml 文件来满足场景级别的复用。 业界有很多种类型的声明式操作服务,如运维领域中的Ansible、SaltStack,Kubernetes 中的Argo Workflow、clusterloader2。它们的思想整体比较类似,将高频使用的操作封装为原语,使用者通过原语来表述操作逻辑。 通过声明式的方法,将面向 K8s 的操作抽象成 yaml 中的关键词,在 yaml 中提供串行、并行等控制逻辑,那么就可以通过 yaml 文件完整描述想要进行的工作。 这种思想和Argo Workflow比较像,但粒度比 Argo 更细,关注在操作函数上: 下面简单描述该服务的设计和实现。 设计和实现 1. 服务形态 使用者在 yaml 中,通过声明式的方式描述操作逻辑; 以 all-in-one 的二进制工具或 Operator 的方式交付; 服务内置常见原语的实现,以关键字的方式在 yaml 中提供; 支持配置原生 K8s 资源。 2. 设计 该方案的核心在于配置管理的设计,将操作流程配置化,自上而下有如下概念: Service:Modules 或 Tasks 的编排; Module:一种任务场景,是操作单元的集合(其中包含 templates/ 目录,表征模板文件的集合,可用来配置 K8s 原生资源); Task:操作单元,使用 plugin 及参数执行操作; Plugin:操作指令,类似开发语言中的函数。 抽象目标场景中的通用操作,这些通用操作即为可在 yaml 中使用的原语,对应上述 Plugin: K8s 相关 CreateNamespace DeleteNamespace PrepareSecret PrepareConfigMap PrepareBatchDeployments WaitForBatchDeploymentsReady etc. 观测性相关 DeploymentCreationEfficiency PodCreationEfficiency etc. 检测项相关 CheckPodAnnotations CheckPodObjectInfo CheckPodInnerStates etc. 控制语句相关 RepeatNTimes etc. 上述 4 个概念的关系如下: 示例可参见文章开头的 yaml 文件,对应形式二。 3. 核心实现 CRD 设计: package v1alpha1 import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // BeidouType is the type related to Beidou execution. type BeidouType string const ( // BeidouTask represents the Task execution type. BeidouTask BeidouType = "Task" ) // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Beidou represents a crd used to describe serices. type Beidou struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` Spec BeidouSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` Status BeidouStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } // BeidouSpec is the spec of a Beidou. type BeidouSpec struct { Steps []BeidouStep `json:"steps" protobuf:"bytes,1,opt,name=steps"` References []BeidouReference `json:"references" protobuf:"bytes,2,opt,name=references"` } // BeidouStep is the spec of step. type BeidouStep struct { Name string `json:"name" protobuf:"bytes,1,opt,name=name"` Operations []BeidouOperation `json:"operations" protobuf:"bytes,2,opt,name=operations"` } // BeidouOperation is the spec of operation. type BeidouOperation struct { Name string `json:"name" protobuf:"bytes,1,opt,name=name"` Type BeidouType `json:"type" protobuf:"bytes,2,opt,name=type"` Op string `json:"op" protobuf:"bytes,3,opt,name=op"` Args []BeidouArg `json:"args" protobuf:"bytes,4,opt,name=args"` } // BeidouArg is the spec of arg. type BeidouArg struct { Name string `json:"name" protobuf:"bytes,1,opt,name=name"` Value string `json:"value,omitempty" protobuf:"bytes,2,opt,name=value"` Reference BeidouOperationReference `json:"reference,omitempty" protobuf:"bytes,3,opt,name=reference"` Tolerations []corev1.Toleration `json:"tolerations,omitempty" protobuf:"bytes,4,opt,name=tolerations"` Checking []string `json:"checking,omitempty" protobuf:"bytes,5,opt,name=checking"` } // BeidouOperationReference is the spec of operation reference. type BeidouOperationReference struct { ID string `json:"id" protobuf:"bytes,1,opt,name=id"` } // BeidouReference is the spec of reference. type BeidouReference struct { ID string `json:"id" protobuf:"bytes,1,opt,name=id"` Steps []BeidouStep `json:"steps" protobuf:"bytes,2,opt,name=steps"` } // BeidouStatus represents the current state of a Beidou. type BeidouStatus struct { Message string `json:"message" protobuf:"bytes,1,opt,name=message"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // BeidouList is a collection of Beidou. type BeidouList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` Items []Beidou `json:"items" protobuf:"bytes,2,opt,name=items"` } 核心流程: // ExecSteps executes steps. func ExecSteps(ctx context.Context, steps []v1alpha1.BeidouStep, references []v1alpha1.BeidouReference) error { logger, _ := ctx.Value(CtxLogger).(*log.Entry) var hasMonitored bool for i, step := range steps { for j, op := range step.Operations { switch op.Op { case "DeploymentCreationEfficiency": if !hasMonitored { defer func() { err := monitor.Output() if err != nil { logger.Errorf("Failed to output: %s", err) } }() } hasMonitored = true } err := ExecOperation(ctx, op, references) if err != nil { return fmt.Errorf("failed to run operation %s: %s", op.Name, err) } } } return nil } // ExecOperation executes operation. func ExecOperation(ctx context.Context, op v1alpha1.BeidouOperation, references []v1alpha1.BeidouReference) error { switch op.Type { case v1alpha1.BeidouTask: if !tasks.IsRegistered(op.Op) { return ErrNotRegistered } if !tasks.DoesSupportReference(op.Op) { return ExecTask(ctx, op.Op, op.Args) } return ExecTaskWithRefer(ctx, op.Op, op.Args, references) } return nil } // ExecTask executes a task. func ExecTask(ctx context.Context, opname string, args []v1alpha1.BeidouArg) error { switch opname { case tasks.CreateNamespace: var ns string for _, arg := range args { switch arg.Name { case "NS": ns = arg.Value } } return op.CreateNamespace(ctx, ns) // ... } // ... } // ExecTaskWithRefer executes a task with reference. func ExecTaskWithRefer(ctx context.Context, opname string, args []v1alpha1.BeidouArg, references []v1alpha1.BeidouReference) error { switch opname { case tasks.RepeatNTimes: var times int var steps []v1alpha1.BeidouStep var err error for _, arg := range args { switch arg.Name { case "TIMES": times, err = strconv.Atoi(arg.Value) if err != nil { return ErrParseArgs } case "ACTION": for _, refer := range references { if refer.ID == arg.Reference.ID { steps = refer.Steps break } } } } return RepeatNTimes(ctx, times, steps) } return ErrNotImplemented } 操作原语的实现示例: // PodAnnotations is an operation used to check whether annotations of Pod are expected. func PodAnnotations(ctx context.Context, data PodAnnotationsData) error { kclient, ok := ctx.Value(tasks.KubernetesClient).(kubernetes.Interface) if !ok { return tasks.ErrNoKubernetesClient } pods, err := kclient.CoreV1().Pods(data.Namespace).List(metav1.ListOptions{}) if err != nil { return fmt.Errorf("failed to list pods in ns %s: %s", data.Namespace, err) } for _, pod := range pods.Items { if pod.Annotations == nil { return fmt.Errorf("pod %s in ns %s has no annotations", pod.Name, data.Namespace) } for _, annotation := range data.Exists { if _, exists := pod.Annotations[annotation]; !exists { return fmt.Errorf("annotation %s does not exist in pod %s in ns %s", annotation, pod.Name, data.Namespace) } } for k, v := range data.Equal { if pod.Annotations[k] != v { return fmt.Errorf("value of annotation %s is not %s in pod %s in ns %s", k, v, pod.Name, data.Namespace) } } } return nil } 后续 目前阿里云容器服务团队内部已经实现了初版,已用于部分云产品的内部性能测试以及常规的回归测试,很大程度上提升了我们的工作效率。 在 yaml 中编程,是对云原生场景下声明式操作的体现,也是对声明式服务的一种实践。对于常规工作场景中重复编码或重复操作,可考虑类似的方式进行满足。 欢迎大家对这样的服务形态和项目进行讨论,探索这种模式的价值。 作者 |悟鹏 原文链接 本文为阿里云原创内容,未经允许不得转载。

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

CVPR 2018 最具创意论文 TOP10

每年计算机视觉与模式识别会议 (CVPR) 都会带来杰出而有趣的研究,今年在美国盐湖城举办的CVPR 2018也不例外。CVPR 2018上许多论文提出了全新的深度神经网络在视觉上的应用,它们可能不是最根本的、具有突破性的工作,但它们非常有趣,从新的角度为人们提供了创造性和启发性的想法,而且有些想法很酷!下面是笔者认为的CVPR 2018中最酷的10篇论文,让我们来看看吧! Super SloMo:视频插值中多幅中间帧的高质量估计 论文地址: https://arxiv.org/abs/1712.00080 你有想过用超级慢动作拍摄一些超级酷的东西吗? 不妨看看英伟达(Nvdia)的 Super SloMo 吧!他们的卷积神经网络估计出视频中间帧,并且能够将标准的 30fps 的视频转换为看上去惊人的 240fps 下的慢动作!模型估计帧间光流,使用该模型还可以不影响画质地插入视频帧,从而慢镜头看上去也是清晰的。 WISPE:数码相机弱监督照片增强器 论文地址: http://www.vision.ee.ethz.ch/~ihnatova/wespe.html 真是机智啊!他们训练生成对抗网络 (GAN) 来自动美化照片。最酷的部分是它是弱监督的,你不需要输入-输出图像对!你训练的网络需要的是一组“好看”的图像(对于输出的标注图像)和一组你想要增强的“难看”的图像(对于输入图像)。然后,对 GAN 进行训练以产生输入图像的美化后的版本,通常极大地增强图像的颜色和对比度。 它是快速并且容易使用的,因为你不需要精确的图像对,最后你会得到一个“通用”的图像增强器。我也喜欢这种弱监督的方法。无监督的学习似乎相当遥远。但是对于计算机视觉中的许多子领域来说,弱监督似乎是一个有前途、有利可图的方向。 谁在控制狗? 根据视觉数据对狗的行为建模 论文地址: https://arxiv.org/abs/1803.10827 这可能是有史以来最酷的研究论文名字!它的思路是尝试并建模狗的所行所想。作者在狗的四肢安装了大量的传感器来收集它的运动数据,也在其头部安装照相机来获取狗看世界的第一视角。使用了一组卷积神经网络特征提取器来提取从视频帧中得到的图像中的特征,然后这些特征就和传感器数据一起传到一组长短期记忆网络,来学习和预测狗的行为。这是一个很新颖且具有创造力的应用。这个任务独特的框架和实现,都让这篇文章值得一读!希望这篇文章可以给未来的研究激发创造力,不管是对我们采集数据的方式还是深度学习技术的应用。 在笔记本上亲临球赛 论文地址: https://arxiv.org/abs/1806.00890 在世界杯进行之际,这篇论文的发布可以获得最佳时机奖了!这真的是 CVPR 计算机视觉里比较酷的应用之一。简单地说,给定一个足球比赛视频能够输出比赛的三维动态重建,从而训练模型。这就意味着你可以使用增强现实技术在任何地方观看这场比赛! 模型比较机智的地方在于不同类型信息的结合使用。使用视频比赛数据训练网络,根据这些数据可以非常轻易地提取三维网格。测试时,运动员的边界框、姿态和轨迹(在多帧之间)被提取来对其进行分割。 这些三维分割可以简单地投影到任意空间(这样你就可以任意制作虚拟球场)实现增强现实的足球比赛观看!在我看来,使用合成数据来训练时很聪明的做法,同样也是很有趣的应用! LayoutNet:从单幅彩色图像实现房间布局的三维建模 论文地址: https://arxiv.org/abs/1803.08999 我们中大多数有都有过这样的想法:给某个东西拍张照片,然后在数字三维对其进行重建 。这篇论文就是一个计算机视觉的应用,也正好是来实现这个想法的,尤其是对房间的三维重建。他们将全景图像作为输入来获得房间的整个视野,输出就是一个非常精确的三维重建的房间布局!这个模型有足够的能力来生成不同形状的房间,房间中可以包含许多不同的家居摆设。这个应用非常有趣,不用看大量计算机视觉研究员的工作,可以很好地阅读。 Polygon-RNN++ 分割数据集的高效交互标注 论文地址: https://arxiv.org/abs/1803.09693 深度网络工作得如此好的一个主要原因是有大量和完全注释的数据集可供使用。然而,对于许多计算机视觉任务来说,这样的数据既耗时又昂贵。特别是分割数据需要图像中的每个像素的类标记。正如你所想象的…对于大数据集来说,这个过程可能永远持续下去! Polygon-RNN++ 允许用户在图片中每个目标周围设置粗略的多边形,然后神经网络会自动生成分割标记。这篇论文很好地论述了这种方法,这种方法也可以在分割任务中创建快速、简单的标记。 在时尚大片中创造胶囊衣柜 论文地址: https://arxiv.org/abs/1712.02662 我今天应该穿什么呢? 如果每天早上都有人或东西来回答这个问题而不需要你去想,那该有多好啊。如果想拥有这样的东西,来认识一下胶囊衣柜 (Capsule Wardrobes) 吧。 这篇论文作者设计了一个模型,给定一个待选服装和饰品的清单,胶囊用最少的物品组成物品集,而这个集合可以提供最多的混搭配备。模型使用目标函数进行基本的训练,而目标函数的设计是用来获取视觉兼容性、多功能性和用户特定喜好的关键因素。使用胶囊衣柜,可以轻松地从你的衣橱里找到符合你品位的最佳搭配。 利用综合数据训练深度网络:通过域随机化来弥补现实差距 论文地址: https://arxiv.org/abs/1804.06516 这篇论文来自英伟达 ( NVIDIA )。它在使用合成数据来训练卷积神经网络 (CNNs) 上获得长足进步。它为 Unreal Engine 创建了一个插件,用于生成合成的训练数据。真正的关键是它们将训练数据的变量随机化,包括: 对象的数量和类型 干扰项的数量、类型、颜色和尺度 感兴趣物体的纹理和背景照片 虚拟摄影机相对于场景的位置 摄像机相对于场景的角度 点光源的数量和位置 他们展示了一些大有前途的结果,证明了用合成数据进行预训练的有效性。这个结果是以前没有达到。如果你缺少一些重要资源,它可能会对如何生成和使用合成数据有所帮助。 学习分割一切 论文地址: https://arxiv.org/abs/1711.10370 最近几年,何凯明团队(早先在微软亚洲研究院,现在在 Facebook 人工智能研究实验室)进行了大量的计算机视觉研究。他们文章的厉害之处就在于将创新性与简洁性有效结合。 ResNets 和 Mask R-CNN 都不是最疯狂、最复杂的研究思路。它们都非常简单、易于实现,在实践中也非常有效。这一篇也是一样。 学习分割一切是 Mask R-CNN 的扩展,使得神经网络在训练过程中不看见类也能进行分割! 这对快速、低成本获取数据集标记十分有效。它可以获得不可见目标类强大的基准库分割,这对在野外部署分割神经网络是十分重要的,因为在那样的环境中,存在着大量的不可见目标类。整体看来,这是我们朝着如何思考最大限度利用深度神经网络模型正确方向走了一步。 学习转换架构实现可扩展图像识别 论文地址: https://arxiv.org/abs/1707.07012 最后但也重要的就是关于深度学习的未来的思考:神经架构搜索 (NAS)。 NAS 背后的基本思想是取代手动设计网络架构,我们可以采用另外的神经网络来 “搜索”最好的模型结构。这个搜索基于回报函数,是很聪明的。回报函数对那些在验证数据集上表现良好的模型进行奖励。作者在文中展示了一个比手动设计更加精确的架构。这在未来是有很大发展空间的,尤其是特定应用的设计。因为我们只需要将全部精力放在设计好手动设计 NAS 算法,而不是为我们特定的应用设计特定的网络。一个良好设计大的 NAS 算法是足够灵活的,可以为任意特定任务找到好的网络。 原文发布时间为:2018-07-18本文来自云栖社区合作伙伴“计算机视觉life”,了解相关信息可以关注“计算机视觉life”

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

超强辅助 Bolt.diy ⼀步搞定创意建站

前⾔ 最近发现了⼀款可以部署在阿⾥云上的 AI 产品 ——Bolt.diy。它是⼀个非常好用的AI⼯具,通过提示词就可以帮助我们快速完成数据分析、网站搭建、原型设计等工作。 Bolt.diy是Bolt.new的⼀个开源版本,它提供了更⾼的灵活性和可定制性,通过⾃然语⾔交互简化开发流程,并提供全栈开发⽀持,同时允许⽤户⼆次开发。阿里云提供的方案是基于函数计算FC搭建,集成了阿⾥云百炼模型服务,新用户可以领取免费资源,搭上 AI 的快车道,资源指路:https://www.aliyun.com/solution/tech-solution/fc-bolt-diy?utm_content=g_1000403491 那么,接下来就和我一起看下 Bolt.diy 的表现吧。 价值体现 Bolt.diy的核⼼价值点从这⼏⽅⾯开始展开说⼀下。 多模型灵活匹配 多模型灵活适配这块,就是能⽀持好多种厉害的⼤语⾔模型,像国外的OpenAI,还有DeepSeek、Gemini,以及HuggingFace这些。咱⽤户呢,能根据不同的实际情况和需求,给不同的任务专⻔挑⼀个最合适的模型,这样任务完成起来就更顺⼿、更匹配了。 可扩展性与⾼度定制化 可扩展性与⾼度定制化也超棒。它⽤的是模块化的架构,咱不仅能⾃⼰定义Docker服务,还能把⼀些第三⽅的⼯具整合进来,⽤起来特别灵活。要是功能不够⽤,还能通过插件来扩展,甚⾄可以把⾃⼰本地私有的模型,⽐如⾃⼰训练出来的LLM模型也集成进去。 全栈开发全流程覆盖 全栈开发全流程覆盖这块,更⽜了。只要⽤⾃然语⾔和它交流,就能⽣成前端和后端的代码,像React前端代码、Node.js服务端代码这些都能⽣成。⽽且还⽀持实时调试,版本管理也⽅便,点⼀下就能部署。另外,⾥⾯还⾃带了可视化的⼯具,管理SQL或者NoSQL数据库都很轻松,数据模型和API接⼝都能⾃动⽣成。 智能化辅助⼯具 智能化辅助⼯具也很贴⼼。AI能实时检查代码,发现错误⻢上给出修复的建议,这样就不⽤花⽼多时间⼿动去调试代码了。⽽且它还能把代码的结构图谱和依赖关系⽤可视化的⽅式展示出来,碰到复杂的项⽬,⼀下⼦就能看明⽩是咋回事了。 ⾼效、⼴泛、专业这些形容词都是当之⽆愧,可以在后⾯的测试过程看到各类的效果,我们在使⽤过程中产⽣的各类原型图效果都是不错的,特别是五彩斑斓的⿊,给的是过渡效果,可以⾃⼰去做⼀个看看,我⽣成过⼏次,每次的效果都不同,都挺好的。 这是⼀个部署操作的⽤时,可以校验⼀下,整个部署时间仅仅使⽤了12秒,这才是⾼效的代表。 免费试用 阿⾥云给了3个⽉免费试⽤哦,我这⾥已经申请过了,还在观望的先过来看看,试⽤⼀下,有了具体的效果再去具体的评价还是对⼀个产品的真正认知。 技术⽅案的⼴泛应⽤场景 原型设计 模型语句 五彩斑斕的⿊ 提示词:⽣成⼀个中⽂的五彩斑斓的⿊为主体的颜⾊产品着陆⻚,除了五彩斑斓的⿊还要有⼀些⾮常⾼贵的颜⾊,例如:提夫尼蓝或太师⻘等颜⾊,给出颜⾊的⾊值以及对应的名称,如果是过渡渐变⾊,需要给出具体的过渡⽅式,⻛格要有现代科技感。 PC端和移动端的效果,都是直接就出来了,⾮常的效率呢,如果出现异常也是直接点击⼀下询问Bolt就⾏了。 ⽣肖产品 提示词:创建⼀个中⽂⽣肖产品的着陆⻚,包含所有星座介绍、星座运势,星座Emoji图案等,⻛格要⼩清新的感觉。 两个主题⻚的效果还都是不错的呢。 Bolt.diy⽀持操作 ⽀持图⽚原型上传,⽀持语⾳输⼊,可以下载代码结果, 可供选择的平台 可选的平台还是⾮常多的,默认的是openAILike,也就是百炼⼤模型的选项,还有很多国内外知名的平台,很全⾯,Deepseek的也是可以直接输⼊APIKey直接进⾏访问的。 可供选择的各类模型 OpenAILike也的将各类版本都上来了,从deepseek系列到qwen系列的各类模型都是可供选择的,从下拉条上就能看的出来他的模型量有多庞⼤。 我们看完他的强⼤,接下来我们来进⾏⼀下实操。 实战详情 阿里云提供了非常详细的实践手册,可以前往方案页面跟着一步一步进行操作:https://www.aliyun.com/solution/tech-solution/fc-bolt-diy?utm_content=g_1000403491 环境准备 这⾥环境主要是百炼⼤模型以及⽇志服务,但是⽇志服务会⾃动同步开通,那么剩下的就是需要独⽴的开通⼀下百炼⼤模型即可。 实验过程 我们需要先进⼊到实验中兵=并开启实操,这个实操没有具体的初始环境,所以是⽐较快的,我们直接按照左侧的操作⼿册来完成步骤内容即可。 ⽅案架构 这⾥⾯有个架构说明:按照本⽅案提供的配置完成部署后,会在阿⾥云上搭建⼀个如下图所示的运⾏环境。实际部署时,您可根据具体的资源规划调整部分配置,但最终的运⾏环境将与下图展示的架构相似。 也好理解,就是通过百炼模型服务提供的deepseek-v3的模型来返回对应的⽂本代码,通过云原⽣应⽤开发平台CAP进⾏解析,将对应⽂件的代码写⼊到对应⽂件中,最后使⽤npm进⾏启动并访问⻚⾯,流程还是很直接的。 开通百炼⼤模型 这⾥能直接跳转到百炼⼤模型,如果是第⼀次访问,那么右上⻆会有⼀个开通并领取百万Token的提示按钮,开通后就可以去创建我们需要的APIKey了。 获取APIKey操作 在下⽅能看到打开百炼⼤模型后的⻚⾯效果,我们这⾥直接点击应⽤,再点击左下⻆的APIKey即可。 进⼊到应⽤后左侧就能看到了,看好,是左下⻆。 有复制按钮,直接点击即可复制。 部署Bolt-diy 不是的时候由于只是⼀个服务,并没有对应的模型故⽽是很快的,我测试过⼗来次,基本时间范围是在12~22秒之间。 启动成功的效果,最后能看到completed就代表成功了呢,在右上⻆能看到有访问地址,直接点击即可访问。 访问后的效果,这⾥需要点击【忽略警告,继续访问】,但是要分浏览器,我这⾥的提示是360的浏览器,如果使⽤⾕歌等其它浏览器需要点击⼀下【⾼级->继续访问】才可以正常的访问,因为默认给的是https服务,⼤家都知道https是有验证的,咱们⾃⼰⼀般使⽤的是http访问这个验证就简单了,所以这⾥需要点击忽略。 成功进⼊Bolt-diy的⻚⾯。 配置API KEY 我们已经在上⾯的【获取APIKey】的操作时已经成功获取了APIKey,那么这时候就可以在OpenAILikeAPIKey中点击修改符号并输⼊获取的APIKey。 输⼊后点击勾选确认,效果图下图: 提示词与效果 提示词这个很有讲究,在上图中能看到给我了⼀个标准⾯板,这个要当做标准⾯板来看,并且例如【着陆⻚】这三个字就是最最最根本的⼀条重要提示词,没有加上这个词则会出现各类不符合的情况出现。 仿照写法: 创建⼀个⽔果产品的着陆⻚,包含各类的⽔果介绍,⽔果价格,⽔果营养,⽔果Emoji图案等,⻛格要⼩清新的。 ⽣成过程: 在完成编码后进⾏运⾏,但是运⾏的时候需要对环境进⾏初始化操作,补充⼀些环境内容,这⾥就可以看到,需要先进⾏vite安装操作。 npm install vite 安装过程需要稍等⼀会。 运⾏dev 页⾯效果 最后会⾃动打开Previrw⻚⾯来看看⻚⾯的效果,还是⾮常的不错的呢,不过我们的提示词中没有添加中⽂,故⽽体现的状态都是英⽂的,可以在提示词中加上⽣成中⽂的着陆⻚,这样产⽣的⻚⾯就是纯中⽂的了。 ⼆次提示词 改成中⽂的内容。 修改完成后会⾃动启动,效果还是很棒的,这⾥给开发的⼈员点个赞。 测试评价 整个操作过程快得很,快的话5分钟就能搞定,⽽且要是条件合适,甚⾄可以说⼀分钱不花就能⽤上DeepSeek-V3的模型,把它的强⼤功能为⼰所⽤,且快速⽣成的内容最起码⽤来交作业是没什么问题的,哈哈,这就很舒服了,对于⼤⼀⼤⼆的同学很有吸引⼒的。 整体操作过程 上下操作过程步骤很少,等待时间也不⻓,第⼀步骤等待时间也就10多秒,也就是在访问第⼀次的时候需要多等⼀会,点⼀下继续访问就好。 总结 整体测试下来,Bolt-diy⽆论是架设还是使⽤的整个使⽤过程中都可以说表现挺不错的,值得再次赞扬⼀下,如果能多给⼀些⽐较官⽅的提示词会更好,毕竟如果想针对提示词做⼀个全套的学习成本还是⾮常⾼的,希望这个建议能被官⽅看到并落实。 祝⼤家都能⽣成⾃⼰喜欢的⻚⾯。

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

MySQL 8.1 和 8.2 中 EXPLAIN 的新玩法

从 MySQL 8.1 开始 EXPLAIN 引入了 INTO 子句,它允许将 EXPLAIN 查询的输出存储在用户变量中,而不是将其返回给客户端。目前仅支持 JSON 格式,但这对于大多数用例来说应该足够了。 作者:Magnus Brevik 原文地址:https://dev.mysql.com/blog-archive/explain-into-and-explain-for-schema-in-mysql-81-and-82/ EXPLAIN INTO 从 MySQL 8.1 开始 EXPLAIN 引入了 INTO 子句,它允许将 EXPLAIN 查询的输出存储在用户变量中,而不是将其返回给客户端。目前仅支持 JSON 格式,但这对于大多数用例来说应该足够了。 EXPLAIN 的输出存储在用户变量之后,就可以将它当成 JSON 对象操作。这使您能够以编程方式直接从 EXPLAIN中提取、操作和存储数据到数据库中。 举个例子: mysql> SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id; +-------------+----------+ | name | quantity | +-------------+----------+ | Screwdriver | 23 | | Screwdriver | 1 | | Locket | 17 | | Armoire | 42 | | Armoire | 16 | +-------------+----------+ 如果只对此次查询的开销成本感兴趣,可以先将查询定义为为 @explain_output。 mysql> EXPLAIN FORMAT=JSON INTO @explain_output SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id; Query OK, 0 rows affected (0,00 sec) 现在,从这个 EXPLAIN 中得到的唯一输出是“Query OK”。如果我们想查看完整的 EXPLAIN 输出,我们可以选择 @explain_output,但是完整的 JSON 输出会占用很大的空间,而且我只对开销(cost )感兴趣。为了从 JSON 对象中提取,只需使用 MySQL 的 JSON 函数对指定的 JSON 对象处理即可。 mysql> SELECT JSON_EXTRACT(@explain_output, "$.query_block.cost_info.query_cost") AS query_cost; +------------+ | query_cost | +------------+ | "1.60" | +------------+ EXPLAIN SCHEMA 从 MySQL 8.2 开始 EXPLAIN 引入了 FOR SCHEMA 子句。它允许在当前 SCHEMA 之外的其他 SCHEMA 中执行 EXPLAIN 查询。这使得创建一个存储过程 PROCEDURE 来解释每个 SCHEMA 中最常运行的查询并收集有关它们的统计信息成为可能。 如果当前的 SCHEMA 与我们要查询的表所在的 SCHEMA 不同,我们可以 mysql> USE statistics; mysql> EXPLAIN FORMAT=TREE FOR SCHEMA customer1 SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id; -> Nested loop inner join (cost=2.3 rows=5) -> Table scan on items (cost=0.55 rows=3) -> Index lookup on orders using fk_item_id (item_id=items.id) (cost=0.472 rows=1.67) 这对于大多数 EXPLAIN 使用的情况可能不太有用,但是如果我们有多个具有相同表结构的 SCHEMA,并且想要一次性收集所有 SCHEMA 的统计信息,我们可以创建一个存储过程 PROCEDURE 来为我们做到这一点: DELIMITER | CREATE PROCEDURE explain_query_for_schema(IN schema_name VARCHAR(64), IN query VARCHAR(1000)) BEGIN SET @explain_stmt = CONCAT("EXPLAIN FORMAT=JSON INTO @explain_output FOR SCHEMA ", schema_name, " ", query); PREPARE stmt FROM @explain_stmt; EXECUTE stmt; INSERT INTO explain_outputs (schema_name, query, explain_output) VALUES (schema_name, query, @explain_output); END | CREATE PROCEDURE explain_query_for_all_schemas(IN query VARCHAR(1000)) BEGIN DECLARE done BOOLEAN DEFAULT FALSE; DECLARE schema_name VARCHAR(64); DECLARE cur_schema_names CURSOR FOR SELECT schema_name_table.schema_name FROM schema_name_table; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur_schema_names; explain_loop: LOOP FETCH cur_schema_names INTO schema_name; IF done THEN LEAVE explain_loop; END IF; CALL explain_query_for_schema(schema_name, query); END LOOP; CLOSE cur_schema_names; END | DELIMITER ; SET @query = "SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id"; CALL explain_query_for_all_schemas(@query); SELECT schema_name, query, JSON_EXTRACT(explain_output, "$.query_block.cost_info.query_cost") AS query_cost, created_at FROM explain_outputs; +-------------+---------------------------------------------------------------------------+------------+---------------------+ | schema_name | query | query_cost | created_at | +-------------+---------------------------------------------------------------------------+------------+---------------------+ | customer1 | SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id | "2.30" | 2023-11-14 20:56:47 | | customer2 | SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id | "0.70" | 2023-11-14 20:56:47 | | customer3 | SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id | "9.10" | 2023-11-14 20:56:47 | +-------------+---------------------------------------------------------------------------+------------+---------------------+ 就是这样。EXPLAIN 的两个相对简单的扩展乍一看可能并不重要,但使存储过程能够以编程方式处理 EXPLAIN 输出。我们自己将其用于 《使用 MySQL Autopilot Indexing 删除索引猜测值》 这个案例中,其中 EXPLAIN INTO 和 EXPLAIN FOR SCHEMA 对于收集数据以建议更好的索引至关重要。我们希望它对您和我们一样有用。 如果您想了解更多信息,这些都记录在 MySQL EXPLAIN 文档 中。 更多技术文章,请访问:https://opensource.actionsky.com/ 关于 SQLE SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。 SQLE 获取 类型 地址 版本库 https://github.com/actiontech/sqle 文档 https://actiontech.github.io/sqle-docs/ 发布信息 https://github.com/actiontech/sqle/releases 数据审核插件开发文档 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

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

WEB安全新玩法 [2] 防范前端验证绕过

用户登录,几乎是所有 Web 应用所必须的环节。Web 应用通常会加入一些验证手段,以防止***者使用机器人自动登录,如要求用户输入图形验证码、拖动滑动条等。但是,如果验证的逻辑仅仅在前端执行,是很容易被***者绕过的。**iFlow 业务安全加固平台**可以为只使用前端验证的应用打上动态虚拟补丁,使之成为需要前后端配合执行的验证逻辑,大幅度提高***者的***难度。 ----- 以某个开源购物网站为例,其管理员后台登录只使用了前端验证。我们尝试一下,如何在不修改网站源代码的前提下,使用**iFlow**实现前后端配合身份验证。 # 一、前端验证的原始网站 原始网站设置了滑动条拖动验证,但仅使用了前端验证,极易被***者甚至一般用户绕过。 ## 1.1 正常用户访问 网站管理员在输入 **账号** 和 **口令** 后,必须拖动下方的 **滑动条** 到最右端,才能点击 **登录按钮** 发送登录信息。 ![图1](https://img-blog.csdnimg.cn/20200915170758580.png#pic_center) 反映在 HTTP 协议层面,是如下交互的: ```mermaid sequenceDiagram participant 正常用户 participant 浏览器 participant Web服务器 正常用户->>浏览器: 地址栏输入:/shopx/admin.php 浏览器->>Web服务器: 请求:/shopx/admin.php Web服务器->>浏览器: 返回:登录页面 浏览器->>Web服务器: 请求:/shopx/js/drag.js Web服务器->>浏览器: 返回:drag.js 浏览器->>正常用户: 显示:登录页面 正常用户->>浏览器: 填写账号口令 正常用户->>浏览器: 拖动滑动条 Note over 浏览器: 设置前端元素 正常用户->>浏览器: 点击登录按钮 Note over 浏览器: 前端元素验证通过 浏览器->>Web服务器: 发送:登录信息 Web服务器->>浏览器: 返回:登录结果页面 浏览器->>正常用户: 显示:登录结果页面 ``` 在实现上,当用户将滑动条拖到最右端时,前端代码将 DOM 中的一个数据元素 `validate-status` 的值设置为 `1`。 ## 1.2 ***者访问 使用浏览器自带的开发者工具 (F12) 或者使用浏览器自动化工具 (如 WebDriver),将数据元素 `validate-status` 的值直接设置为 `1`。 下图显示的是仅使用浏览器自带工具来修改元素: ![图2](https://img-blog.csdnimg.cn/20200915171115426.png#pic_center) 如此,***者无需实际拖动滑动条验证,同样能够发出登录信息。HTTP 协议层面交互如下: ```mermaid sequenceDiagram participant ***者 participant 浏览器 participant Web服务器 ***者->>浏览器: 地址栏输入:/shopx/admin.php 浏览器->>Web服务器: 请求:/shopx/admin.php Web服务器->>浏览器: 返回:登录页面 浏览器->>Web服务器: 请求:/shopx/js/drag.js Web服务器->>浏览器: 返回:drag.js 浏览器->>***者: 显示:登录页面 ***者->>浏览器: 填写账号口令 rect rgb(250, 128, 128) ***者->>浏览器: 【自行修改前端元素】 end ***者->>浏览器: 点击登录按钮 Note over 浏览器: 前端元素验证通过 浏览器->>Web服务器: 发送:登录信息 Web服务器->>浏览器: 返回:登录结果页面 浏览器->>***者: 显示:登录结果页面 ``` # 二、iFlow虚拟补丁后的网站 我们在 Web 服务器前部署 **iFlow 业务安全加固平台**,它有能力拦截、计算和修改双向 HTTP 报文并具备存储能力,成为 Web 应用的虚拟补丁。本例中,iFlow 通过在前端动态插入代码和在后端基于会话的状态保存,使得滑动条验证逻辑在前后端同时进行。 ## 2.1 正常用户访问 iFlow 在前端的拖动滑动条前端脚本中动态插入了一段代码,使得用户在完成拖动滑动条时,浏览器自动向 iFlow 发送一条信息并被 iFlow 保存为一个标记。用户在发送登录信息时,iFlow 检查该标记,对于一个正常用户,这个标记一定是存在的,于是登录过程正常继续。 正常用户的 HTTP 协议交互过程如下: ```mermaid sequenceDiagram participant 正常用户 participant 浏览器 participant iFlow participant Web服务器 正常用户->>浏览器: 地址栏输入:/shopx/admin.php 浏览器->>Web服务器: 请求:/shopx/admin.php Web服务器->>浏览器: 返回:登录页面 浏览器->>Web服务器: 请求:/shopx/js/drag.js Web服务器->>iFlow: 返回:drag.js rect rgb(160, 250, 160) iFlow->>浏览器: 修改:在drag.js插入代码 end 浏览器->>正常用户: 显示:登录页面 正常用户->>浏览器: 填写账号口令 正常用户->>浏览器: 拖动滑动条 Note over 浏览器: 设置前端元素 浏览器->>iFlow: 请求:/iflow/dragged.dummy rect rgb(160, 250, 160) Note over iFlow: 为会话设置drag_ok标志 end 正常用户->>浏览器: 点击登录按钮 Note over 浏览器: 前端元素验证通过 浏览器->>iFlow: 发送:登录信息 rect rgb(160, 250, 160) Note over iFlow: 会话中有drag_ok标志 end iFlow->>Web服务器: 发送:登录信息 Web服务器->>浏览器: 返回:登录结果页面 浏览器->>正常用户: 显示:登录结果页面 ``` ## 2.2 ***者访问 如前所示,***者强行修改前端元素,可以通过前端验证。但当发送登录信息而 iFlow 检查标记时,由于***者之前并未实际拖动滑动条发送标记请求,因此该标记并不存在。iFlow 可以据此判断这是一个恶意访问,于是终止登录过程。 ***者的 HTTP 协议交互过程如下: ```mermaid sequenceDiagram participant ***者 participant 浏览器 participant iFlow participant Web服务器 ***者->>浏览器: 地址栏输入:/shopx/admin.php 浏览器->>Web服务器: 请求:/shopx/admin.php Web服务器->>浏览器: 返回:登录页面 浏览器->>Web服务器: 请求:/shopx/js/drag.js Web服务器->>iFlow: 返回:drag.js rect rgb(160, 250, 160) iFlow->>浏览器: 修改:在drag.js中插入代码 end 浏览器->>***者: 显示:登录页面 ***者->>浏览器: 填写账号口令 rect rgb(250, 128, 128) ***者->>浏览器: 【自行修改前端元素】 end ***者->>浏览器: 点击登录按钮 Note over 浏览器: 前端元素验证通过 浏览器->>iFlow: 发送:登录信息 rect rgb(160, 250, 160) Note over iFlow: 会话中无drag_ok标志 end iFlow->>浏览器: 拒绝访问 rect rgb(250, 128, 128) 浏览器->>***者: 拒绝访问 end ``` ## 2.3 代码 **iFlow 内置的 W2 语言是一种专门用于实现 Web 应用安全加固的类编程语言**。它介于配置和通用语言之间,具备编程的基本要素和针对 HTTP 协议的特有扩展,能为业务系统编写涉及复杂判断和动态修改的逻辑。 考虑到安全产品的使用者通常为非程序员,他们习惯面对配置文件而非一段代码。因此,W2 语言虽包含语言要素,仍以规则文件方式呈现,并采用可以体现层次结构和方便词法校验的 JSON 格式。 用 W2 语言实现上述虚拟补丁的代码如下: ```json [ { "if": [ "REQUEST_FILENAME == '/shopx/js/drag.js'" ], "then": { "execution": { "directive": "alterResponseBody", "op": "string", "target": "function dragOk(){", "substitute": "function dragOk(){$.get('/iflow/dragged.dummy');" } } }, { "if": [ "REQUEST_FILENAME == '/iflow/dragged.dummy'" ], "then": { "execution": [ "SESSION.drag_ok@60 = true" ] } }, { "if": [ "REQUEST_FILENAME == '/shopx/admin.php'", "@ARGS.s == 'login'", "!SESSION.drag_ok" ], "then": { "verdict": { "action": "deny", "log": "Drag verifycode is not ok!" } } } ] ``` 示例代码中有三条规则,分别作用如下—— **第一条规则** 当浏览器请求 `drag.js` 时,iFlow 拦截响应报文,在 `dragOK()` 函数中插入一个代码片段,其作用是当用户拖拽验证框完成后向服务器发送一条验证请求,即下一条规则中的 `/iflow/dragged.dummy`; **第二条规则** 当浏览器请求 `/iflow/dragged.dummy` 时 (用户拖动完成后由 `dragOK()` 函数自动发出),iFlow 拦截此请求,将该会话 (SESSION) 存储中的 `drag_ok` 标志设置为 `true` ; **第三条规则** 当用户点击登录按钮时发出请求时,iFlow 拦截此请求,检查会话 (SESSION) 存储中的 `drag_ok` 标志是否为 `true` (正常用户操作在上一条规则中应该被设置),如果不为 `true` 则 iFlow 阻止该用户的继续操作。 > **注意**:上述会话中的 `drag_ok` 标志是保存在服务器端的 **iFlow** 存储中的,在浏览器端是看不到数据更无法进行修改的。 # 三、总结 iFlow 使用三条规则在不修改服务器端代码的前提下,透明地实现了在后端执行的拖动验证逻辑。 此外我们可以看到,iFlow 的规则是根据应用的实际情况和对安全功能的特定需求量身定制的,它不具备开箱即用的特点但却适合构造复杂的防护逻辑。 当然,这仅是一个入门的例子,主要是为了体现防御思路和 iFlow 的能力。聪明的读者一定会想到——***者可以针对这个防御手段采取对应的***方式 (如主动发出后端验证请求),而防御者也可以将防御手段制作得更高明一些 (如 js 混淆、检查滑动速度和时间等),这些我们在以后的例子中再慢慢展开。至少,比起原始的网站系统,现在***者没那么容易欺骗 Web 应用了。(张戈 | 天存信息)

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

云存储网关复制模式新玩法 - 部分复制

说到云存储网关的复制模式,相信不少人都有既爱又恨的感觉。复制模式确实是一个非常实用的功能,它将数据在云端和网关侧同时保留了两份,不但降低了数据丢失的风险,同时也极大地提高了从网关访问数据的性能。如果预算允许,我相信所有用户都会选择复制模式,这样所有的数据都会缓存在网关,使用起来性能绝对是杠杠的。问题就是,复制模式对缓存容量要求高,缓存盘贵啊。 想用户所想,急用户所急,云存储网关推出了新的复制模式功能 - 部分复制。不像之前只允许整个共享运行在复制模式,这次用户可以指定文件夹,只让这些被指定的文件夹运行在复制模式,其他未指定的,默认则会运行在缓存模式。这样,用户在预算有限的情况下,就可以选择那些重要的、经常需要访问的文件夹,只让它们运行在复制模式。​花很少的钱,享受更好的体验,不香吗? 下面我们就来看一下怎么使用部分复制的功能。 创建共享的时候,勾选高级设置,并选择开启复制模式,同时勾选复制模式高级​设置,进入下一步,勾选配置复制目录,并按提示填上需要运行在复制模式的目录,再完成共享的创建即可。如下截图所示: 这样创建出来的共享,所有在文件夹/important和/frequent_use中的文件,都会被永久​保留在网关的缓存盘中,而网关的缓存淘汰策略,只会作用于不属于这两个文件夹的其他文件。 性价比这么高的功能,赶紧去用起来吧!

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

【阿里云技术】PostgreSQL的20+种玩法

作者 德哥,周正中,阿里云高级技术专家,PostgreSQL 中国社区发起人之一,PostgreSQL 象牙塔发起人之一,DBA+社群联合发起人之一,10余项数据库相关专利,曾就职于斯凯网络,负责数据库部门。 背景 数据库对于一家企业来说,相比其他基础组件占据比较核心的位置。有很多企业由于最初数据库选型问题,导致一错再错,甚至还有为此付出沉痛代价的。数据库的选型一定要慎重,但是这么多数据库,该如何选择呢?我前段时间写过一篇关于数据库选型的文章,可以参考如下《数据库选型思考》另外,PostgreSQL这个数据库这些年的发展非常的迅猛,虽然国内还跟不上国外的节奏,但是相信国人逐渐会融合进去。 所以我专门针对PostgreSQL提炼了它的一些应用场景(普通的应用场景就不举例了),希望对你的选型可以起到一定的参考作用。 1 任意字段组合查询 - ERP、电商、网站、手机APP 等业务场景 在一些前端的人机交互页面中,经常会有很多选择框,让用户进行选择,这些选择框可能对应的是数据库表中的不同字段。这种画面经常出现在ERP,电商,网站,手机APP等场景中。对于开发人员来说是一件很头疼的事情,因为不知道该对哪些字段创建索引,或者干脆对所有字段都建立索引,给数据库带来较大的性能和维护的问题。PostgreSQL中有两个技术(gin, bloom索引),可以完美的解决这类业务场景的问题。 《宝剑赠英雄 - 任意组合字段等效查询, 探探PostgreSQL多列展开式B树》《PostgreSQL 9.6 黑科技 bloom 算法索引,一个索引支撑任意列组合查询》 2 高并发、高效率范围查询 - 金融、物联网、智能DNS 等业务场景 有些场景,经常要对值进行范围的比对。比如物联网,对传感器上传的值,进行范围比对。智能DNS,需要对来源IP进行判断,并找出其落在哪个IP地址段内。金融行业,经常要设置一些指标范围,时刻判断指数是否落在某个区间,当一些指数落在某个范围区间时,触发下一步的操作(比如买入或卖出)。传统的两个字段+复合B树的索引,效率低下,通常8核的机器只能达到3000多的QPS。PostgreSQL通过(range类型和gist,sp-gist索引),可以将效率提升20多备,8核的机器可以达到8万的QPS。 《聊聊between and的坑 和 神奇的解法》《PostgreSQL 黑科技 range 类型及 gist index 20x+ speedup than Mysql index combine query》《PostgreSQL 黑科技 range 类型及 gist index 助力物联网(IoT)》《从难缠的模糊查询聊开 - PostgreSQL独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》 3 网格化、矢量化地图 - 地理类应用、LBS社交、导航 等业务场景 人们为了更好的描述一个东西,有一种将大化小的思路,比如时钟被分为了12个区域,每个区域表示一个小时,然后每个小的区域又被划分为更小的区域表示分钟。 在GIS系统中,也有类似的思想,比如将地图划分成网格。通过编码来简化地理位置的判断(比如相交,包含,距离计算等),但是请注意使用网格带来的问题,比如精度的问题,网格的大小决定了精度,又比如相对坐标的问题,可能无法描述清楚边界的归属。PostgreSQL可以提供给你更好的选择,矢量化的运算。 在PostGIS中虽然也支持网格对象的描述方式,但是并不是使用这种方法来进行几何运算(比如相交,包含,距离计算等),所以不存在类似的精度问题,个人建议没有强需求的话,不必做这样的网格转换。 如果是多种精度地图的切换(比如多个图层,每个图层代表一种地图精度),建议使用辐射的方式逐渐展开更精细的图层,以点为中心,逐渐辐射。(很多专业的地图软件是这样做的) 《蜂巢的艺术与技术价值 - PostgreSQL PostGIS's hex-grid》《PostGIS 地理信息数据 多核并行处理》 4 异步消息 - 物联网、WEB、金融 等业务场景 《从电波表到数据库小程序之 - 数据库异步广播(notify/listen)》《从微信小程序 到 数据库"小程序" , 鬼知道我经历了什么》 一个例子这个例子使用PostgreSQL的异步消息通知机制(notify/listen),以及数据库的触发器,PostGIS地理库插件,结合nodejs, socket.io实现了一个实时的客户端GPS坐标更新的小业务。1.在数据库中新增GPS坐标,数据库端编写的"小程序"会自动发送异步消息给客户端,客户端马上就展示了当前新增的坐标 2.修改GPS坐标,数据库端编写的"小程序"会自动发送异步消息给客户端,客户端刷新了当前坐标 3.删除GPS坐标,数据库端编写的"小程序"会自动发送异步消息给客户端,客户端刷新了当前坐标 [《[转载] postgres + socket.io + nodejs 实时地图应用实践》](https://github.com/digoal/blog/blob/master/201701/20170113_02.md) 5 流式实时数据处理 - 物联网、金融 等业务场景 在物联网、金融行业中,有大量的数据产生,同时需要实时的对数据进行处理。pipelinedb是基于PostgreSQL的一个流式计算数据库,纯C代码,效率极高(32c机器,单机日处理流水达到了250.56亿条)。同时它具备了PostgreSQL强大的功能基础,正在掀起一场流计算数据库制霸的腥风血雨。在物联网(IoT)有非常广泛的应用场景,越来越多的用户开始从其他的流计算平台迁移到pipelineDB。pipelinedb的用法非常简单,首先定义stream(流),然后基于stream定义对应的transform(事件触发模块),以及Continuous Views(实时统计模块)数据往流里面插入,transform和Continuous Views就在后面实时的对流里的数据进行处理,对开发人员来说很友好,很高效。值得庆祝的还有,所有的接口都是SQL操作,非常的方便,大大降低了开发难度。《流计算风云再起 - PostgreSQL携PipelineDB力挺IoT》除此之外,PostgreSQL的undo table,batch调度, 异步消息结合,也能达到与pipeline一样的效果。 《PostgreSQL 流式数据处理(聚合、过滤、转换...)系列 - 9》 6 GIS、图像近似度运算 - 互联网、AR红包、虚拟现实与GIS结合、广告营销 等业务场景 《基于PostgreSQL的流式PipelineDB, 1000万/s实时统计不是梦》《"物联网"流式处理应用 - 用PostgreSQL实时处理(万亿每天)》 AR红包是GIS与图像、社交、广告等业务碰撞产生的一个全新业务场景。需要做广告投放的公司,可以对着广告牌,或者店铺中的某个商品拍照,然后藏AR红包。要找红包的人,需要找到这家店,并且也对准藏红包的物体拍摄,比较藏红包和找红包的两张图片,就可以实现抢红包的流程。可以想象的空间很多。使用的核心技术是GIS(地理位置)与图像近似度比较。PostgreSQL对于这两项技术都可以很好的支持。《(AR虚拟现实)红包 技术思考 - GIS与图像识别的完美结合》 7 相似内容搜索、去重 - 互联网、数据公司、搜索引擎 等业务场景 在搜索引擎、数据公司、互联网中都会有网络爬虫的产品,或者有人机交互的产品。有人的地方就有江湖,盗文、盗图的现象屡见不鲜,而更惨的是,盗图和盗文还会加一些水印。也就是说,你在判断盗图、盗文的时候,不能光看完全一致,可能要看的是相似度。这给内容去重带来了很大的麻烦,不过还好,PostgreSQL数据库整合了相似度去重的算法和索引接口,可以方便的处理相似数据。比如相似的数组、相似的文本、相似的分词、相似的图像的搜索和去重等等。又比如鉴黄。 《电商内容去重内容筛选应用(如何高效识别转载盗图侵权?) - 文本相似、图片集相似、数组相似的优化和索引技术》《PostgreSQL 在视频、图片去重,图像搜索业务中的应用》《从相似度算法谈起 - Effective similarity search in PostgreSQL》 8 任意字段模糊查询 - 互联网、前端页面、搜索引擎 等业务场景 在一些应用程序中,可能需要对表的所有字段进行检索,有些字段可能需要精准查询,有些字段可能需要模糊查询或全文检索。比如一些前端页面下拉框的勾选和选择。比如一些域名的模糊查询。这种需求对于应用开发人员来说,会很蛋疼,因为写SQL很麻烦,例子:之前写过一篇文章来解决这个问题《PostgreSQL 行级 全文检索》使用的是全文检索,而当用户的需求为模糊查询时? 如何来解决呢?PostgreSQL中可以很好的解决这个问题,适用于任意字符(包括英文、中文、等等)。《PostgreSQL 全表 全字段 模糊查询的毫秒级高效实现 - 搜索引擎颤抖了》《从难缠的模糊查询聊开 - PostgreSQL独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》 9 在线处理、离线分析、在线分析混合需求 - 互联网、传统企业、金融 等业务场景 随着IT行业在更多的传统行业渗透,我们正逐步的在进入DT时代,让数据发挥价值是企业的真正需求,否则就是一堆废的并且还持续消耗企业人力,财力的数据。传统企业可能并不像互联网企业一样,有大量的开发人员、有大量的技术储备,通常还是以购买IT软件,或者以外包的形式在存在。数据的核心 - 数据库,很多传统的行业还在使用传统的数据库。随着IT向更多行业的渗透,数据类型越来越丰富(诸如人像、X光片、声波、指纹、DNA、化学分子、图谱数据、GIS、三维、多维 等等。。。),数据越来越多,怎么处理好这些数据,怎么让数据发挥价值,已经变成了对IT行业,对数据库的挑战。对于互联网行业来说,可能对传统行业的业务并不熟悉,或者说互联网那一套技术虽然在互联网中能很好的运转,但是到了传统行业可不一定,比如说用于科研、军工的GIS,和互联网常见的需求就完全不一样。除了对数据库功能方面的挑战,还有一方面的挑战来自性能方面,随着数据的爆炸,分析型的需求越来越难以满足,主要体现在数据的处理速度方面,而常见的hadoop生态中的处理方式需要消耗大量的开发人员,同时并不能很好的支持品种繁多的数据类型,即使GIS可能也无法很好的支持,更别说诸如人像、X光片、声波、指纹、DNA、化学分子、图谱数据、GIS、三维、多维 等等。那么我们有什么好的方法来应对这些用户的痛处呢?且看ApsaraDB产品线的PostgreSQL与HybridDB如何来一招左右互搏,左手在线事务处理,右手数据分析挖掘,解决企业痛处。对传统企业来说,OLTP系统大多数使用的是Oracle等商业数据库,使用PostgreSQL可以与Oracle的功能、性能、SQL语法等做到高度兼容。而对于分析场景,使用MPP产品HybridDB(基于GPDB),则可以很好的解决PB级以上的AP需求。 《ApsaraDB的左右互搏术 - PostgreSQL+HybridDB解决企业痛处 TP+AP混合需求》对于中小型企业,数据量在10TB量级的,分析型的事务甚至也可以交给PostgreSQL来处理。因为它具备了多核并行处理的能力、列存储、JIT、算子复用、甚至向量化执行等技术,相比传统的数据库,在OLTP方面有10倍以上的性能提升。(同时还可以使用LLVM技术,GPU卡FPGA卡来 硬件加速分析) 《分析加速引擎黑科技 - LLVM、列存、多核并行、算子复用 大联姻 - 一起来开启PostgreSQL的百宝箱》《PostgreSQL 9.6 引领开源数据库攻克多核并行计算难题》《PostgreSQL 向量化执行插件(瓦片式实现) 10x提速OLAP》 10 用户群体搜索、根据标签圈人 - 电商、广告投放 等业务场景 电商推荐系统 部分需求介绍比如一家店铺,如何找到它的目标消费群体?要回答这个问题,首先我们需要收集一些数据,比如: 这家店铺以及其他的同类店铺的浏览、购买群体。我们在逛电商时,会产生一些行为的记录,比如在什么时间,逛了哪些店铺,看了哪些商品,最后在哪家店铺购买了什么商品。 然后,对于单个商店来说,有哪些用户逛过他们的商店,购买过哪些商品,可以抽取出一部分人群。 得到这些用户群体后,筛选出有同类消费欲望、或者具备相同属性的群体。对这部分人群的属性进行分析,可以获得一个更大范围的群体,从而可以对这部分群体进行营销。 以上是对电商推荐系统的两个简单的推理。PostgreSQL, HybridDB解决了推荐系统的三个核心问题精准,属于数据挖掘系统的事情,使用PostgreSQL, Greenplum 的 MADlib机器学习库可以实现。实时,实时的更新标签,在数据库中进行流式处理,相比外部流处理的方案,节约资源,减少开发成本,提高开发效率,提高时效性。高效,使用PostgreSQL以及数组的GIN索引功能,实现在万亿USER_TAGS的情况下的毫秒级别的圈人功能。 《恭迎万亿级营销(圈人)潇洒的迈入毫秒时代 - 万亿user_tags级实时推荐系统数据库设计》 11 位置信息处理、点面判断、按距离搜索、化学数据处理 - 危化品监管 等业务场景 危化品的种类繁多。包括如常见的易爆、易燃、放射、腐蚀、剧毒、等等。由于危化品的危害极大,所以监管显得尤为重要, 生产环节将各个原来人工监控的环节数字化,使用 传感器、流计算、规则(可以设置为动态的规则) 代替人的监管和经验。 销售环节利用社会关系分析,在销售环节挖掘不法分子,挖掘骗贷、骗保的虚假交易。利用地理位置跟踪,掌控整个交易的货物运输过程。 仓储环节仓储环节依旧使用传感器、流计算、应急机制对仓管的产品进行实时的监管,而对于危化品本身,我们已经不能使用普通的数据类型来存储,很幸运的是在PostgreSQL的生态圈中,有专门支持化学行业的RDKit支持,支持存储化合物类型,以及基于化合物类型的数据处理 (包括化学反应,分解等等)。 运输环节小结一下,在危化品的运输环节,使用传感器对货车、集装箱内的危化品的指标进行实时的监控,使用流式数据库pipelineDB流式的处理传感器实时上报的数据;使用PostgreSQL+PostGIS+pgrouting 对于货车的形式路径进行管理,绕开禁行路段、拥堵路段。 当出现事故时,使用PostgreSQL的GIS索引,快速的找出附近的应急救助资源(如交警、消防中队、医院、120)。同时对危化品的货物存储,使用化学物类型存储,可以对这些类型进行更多的约束和模拟的合成,例如可以发现化学反应,防止出现类似天津爆炸事件。 消耗环节增加剩余量的监控,在闭环中起到很好的作用,达到供需平衡,避免供不应求,或者供过于求的事情发生。 动态指挥中心在给生产、仓库、物流配送、消耗环节添加了终端、传感器后,就建立了一个全面的危化品监管数据平台。 构建实时的监管全图。 缉毒、发现不法分子等通过社会关系学分析,结合RDKit插件,在数据库中存储了人的信息,存储了人与化学物的关系(比如购买过),然后,根据社会关系学分析,将一堆的化合物(原材料)结合起来,看看会不会发生反应,生成毒品或危化品。从而发现不法分子。 《从天津滨海新区大爆炸、危化品监管聊聊 IT人背负的社会责任感》 12 图式数据搜索 - 金融风控、公安刑侦、社会关系、人脉分析 等业务场景 人类是群居动物,随着人口的增长,联络方式越来越无界化,人与人,人与事件,人与时间之间形成了一张巨大的关系网络。有许多场景就是基于这张巨大的关系网络的,比如。 猎头挖人作为IT人士或者猎头、HR,对Linkedin一定不陌生,领英网实际上就是一个维护人际关系的网站。 通过搜索你的一度人脉,可以找到与你直接相关的人,搜索2度人脉,可以搜索到与你间接相关的人。当然你还可以继续搜索N度人脉,不过那些和你可能就不那么相关了。如果你知道和美女范冰冰隔了几度人脉,是不是有点心动了呢?其实在古代,就有这种社会关系学,还有这种专门的职业,买官卖官什么的,其实都是人脉关系网。看过红楼梦的话,你会发现那家子人怎么那么多亲戚呢?2.公安破案公安刑侦学也是一类人脉相关的应用,只是现在的关系和行为越来越复杂,这种关系也越来越复杂,原来的人能接触的范围基本上就靠2条腿,顶多加匹马。现在,手机,电脑,ATM机,超时,摄像头,汽车等等,都通过公路网、互联网连接在一起。一个人的行为,产生的关系会更加的复杂,单靠人肉的关系分析,刑侦难度变得越来越复杂。3.金融风控比如银行在审核贷款资格时,通常需要审核申请人是否有偿还能力,是否有虚假消息,行为习惯,资产,朋友圈等等。 同样涉及到复杂的人物关系,人的行为关系分析等等。 此类围绕人为中心,事件为关系牵连的业务催生了图数据库的诞生。目前比较流行的图数据库比如neo4j,等。详见https://en.wikipedia.org/wiki/Graph_database PostgreSQL是一个功能全面的数据库,其中就有一些图数据库产品的后台是使用PostgreSQL的,例如OpenCog, Cayley等。除了这些图数据库产品,PostgreSQL本身在关系查询,关系管理方面也非常的成熟,十亿量级的关系网数据,3层关系运算仅需毫秒。还可以用于运算人与人之间的最短关系,穷举关系等。主要用到的技术plpgsql服务端编程、异步消息、数组、游标等。《金融风控、公安刑侦、社会关系、人脉分析等需求分析与数据库实现 - PostgreSQL图数据库场景应用》 13 大量数据的求差集、最新数据搜索, 最新日志数据与全量数据的差异比对, 递归收敛扫描 - 物联网、数据同步、数据清洗、数据合并 等业务场景 有一个这样的场景,一张小表A,里面存储了一些ID,大约几百个到万个。(比如说巡逻车辆ID,环卫车辆的ID,公交车,微公交的ID)。另外有一张日志表B,每条记录中的ID是来自前面那张小表的,但不是每个ID都出现在这张日志表中,比如说一天可能只有几十个ID会出现在这个日志表的当天的数据中。(比如车辆的行车轨迹数据,每秒上报轨迹,数据量就非常庞大,但是每天出勤的车辆有限)。那么我怎么快速的找出今天没有出现的ID呢。(哪些巡逻车辆没有出现在这个片区,是不是偷懒了?哪些环卫车辆没有出行,哪些公交或微公交没有出行)? select id from A where id not in (select id from B where time between ? and ?);select a.id from a left join b on (a.id=b.aid) where b.* is null; 这个QUERY会很慢,通常需要几百秒到几十秒,有什么优化方法呢。通过PostgreSQL的递归查询,可以高效的解决这个问题(在几亿记录中筛选出与几万记录的逻辑差集)。优化后只需要10毫秒左右。《用PostgreSQL找回618秒逝去的青春 - 递归收敛优化》同样的方法,还可以用于数据清洗与合并的场景,比如在物联网的环境中,每个传感器,每个小时会上报若干条数据(有新增的,有更新的,有删除的指标等),对于同一个KEY,后台的应用程序只关心最后一条记录。使用PostgreSQL的递归收敛,每秒可以清洗或合并千万量级的数据。除了物联网,同样适用于数据库之间的数据逻辑同步。《时序数据合并场景加速分析和实现 - 复合索引,窗口分组查询加速,变态递归加速》 14 数据一致性分享、数据泵 - 跨业务平台实时分享数据 等业务场景 在IoT的场景中,有流式分析的需求,也有存储历史数据的需求,同时还有数据挖掘的需求,搜索引擎可能也需要同一份数据,还有一些业务可能也要用到同一份数据。但是如果把数据统统放到一个地方,这么多的业务,它们有的要求实时处理,有的要求批量处理,有的可能需要实时的更新数据,有的可能要对大数据进行分析。显然一个产品可能无法满足这么多的需求。就好比数据库就分了关系数据库,NOSQL,OLTP场景,OLAP场景一样。 也是因为一个产品无法满足所有的业务需求。在企业中通常是借助数据冗余来解决各类场景的需求。那么如何才能够更好的分享数据,保证数据的一致性,提高分享的实时性呢?10万级别左右的机器,PostgreSQL 的数据吞吐量可以达到100万条/s以上,同时数据库本身具备了严格的可靠性和一致性保证。PostgreSQL为分享数据提供了插槽的概念,每个插槽对应一个目标端,支持断点续传,支持多个目标端。用于流式的分享数据是非常好的选择。 《实时数据交换平台 - BottledWater-pg with confluent》 15 分词搜索、模糊搜索、相似度搜索 - 电商、公安、传统企业 等业务场景 看刑侦剧经常有看到人物拼图,然后到图库搜索的,以前可能靠的是人肉,使用PG,可以靠数据库的图形近似度搜索功能。《弱水三千,只取一瓢,当图像搜索遇见PostgreSQL (Haar wavelet)》 而对于文本搜索,大家一定会想到分词,比如搜索引擎、淘宝的商品内容搜索、文章的关键字搜索等等。PostgreSQL内置了分词引擎,可以很好的满足这类搜索的需求。但是千万不要以为分词可以搞定一切需求,比如这样的需求就搞不定。hello world打成了hello word或者hello w0rld,你要让数据库匹配出来,怎么搞?又或者你的业务需要写正则进行匹配,怎么搞?比如一些域名的查询,www.firefoxcn.org 可能你只想输入其中的一个部分来搜索,如果firefox可以匹配。甚至更变态的 fi[a-z]{1}e.*?.?? ,这样的查询。数据量小,并发小时,这种查询是可以忍受全表扫描和CPU处理过滤的。但是想想一下,你是一个日请求过亿的业务,或者数据量亿级别的,全表扫描和CPU的开销会让你疯掉的。PostgreSQL完美的解决了这类变态的需求。 使用PostgreSQL regexp库,将正则转换为NFA样式(图形化词组)。 将NFA样式再进行转换,转换为扩展的图形样式(trigrams),包括拆分后的查询词组与NOT词组。 简化,过滤不必要的trigrams。 打包为TrgmPackedGraph结构,支持GIN,GIST索引的检索。 《聊一聊双十一背后的技术 - 毫秒分词算啥, 试试正则和相似度》《中文模糊查询性能优化 by PostgreSQL trgm》 《PostgreSQL 百亿数据 秒级响应 正则及模糊查询》[《PostgreSQL 1000亿数据量 正则匹配 速度与激情》](https://github.com/digoal/blog/blob/master/201603/20160307_01.md)还有一种场景,比如口音纠正、口音相似度搜索。 16 文本分析、人物画像 - 电商、公安、传统企业、广告商 等业务场景 在日常的生活中,我们可能会经常需要一些像相近、相仿、距离接近、性格接近等等类似这样的需求,对数据进行筛选。在PostgreSQL中,这些场景都支持索引排序和检索。 《聊一聊双十一背后的技术 - 分词和搜索》《PostgreSQL 全文检索加速 快到没有朋友 - RUM索引接口(潘多拉魔盒)》《PostgreSQL 如何高效解决 按任意字段分词检索的问题 - case 1》 比如收集了人群的各种喜好的数据,通过对关联数据的聚类分析,或者按喜好的重叠度进行排序,找出目标人群。这里就涉及到文本的近似度分析,PostgreSQL的文本分析功能可以很好的支持此类场景。 《PostgreSQL 文本数据分析实践之 - 相似度分析》 17 高并发更新少量记录 - 电商、票务系统 等业务场景 秒杀在商品交易中是一个永恒的话题,从双十一,到一票难求,比的仅仅是手快吗?其实对于交易平台来说,面对的不仅仅是人肉,还有很多脚本,外挂自动化的抢购系统,压力可想而知。秒杀的优化手段很多,就拿数据库来说,有用排队机制的,有用异步消息的,有用交易合并的。今天我要给大家介绍一种更极端的秒杀应对方法,裸秒。目前可能只有PostgreSQL可以做到裸秒,也即是说,来吧,一起上。PostgreSQL提供了一种ad lock,可以让用户尽情的释放激情,以一台32核64线程的机器为例,每秒可以获取、探测约130万次的ad lock。试想一下,对单条记录的秒杀操作,达到了单机100万/s的处理能力后,秒杀算什么?100台机器就能处理1亿/s的秒杀请求。 《聊一聊双十一背后的技术 - 不一样的秒杀技术, 裸秒》《PostgreSQL 使用advisory lock或skip locked消除行锁冲突, 提高几十倍并发更新效率》 18 实时用户画像 - 电商、实时广告、实时营销、金融 等业务场景 用户画像在市场营销的应用重建中非常常见,已经不是什么新鲜的东西,比较流行的解决方案是给用户贴标签,根据标签的组合,圈出需要的用户。通常画像系统会用到宽表,以及分布式的系统。宽表的作用是存储标签,例如每列代表一个标签,但是通常数据库到2000个列基本就是极限了,上万TAG的话,只能使用多表JOIN来实现,效率较差。另一方面,使用宽表(甚至列存储),标签的筛选性能也比较差(无法达到实时级别)。以PostgreSQL数据库为基础,给大家讲解一下更加另类的设计思路,以BIT来存储用户,每行一个TAG的方式。10万亿级TAG/users,毫秒级圈人。《基于 阿里云 RDS PostgreSQL 打造实时用户画像推荐系统》 19 动态规划 - 物流配送、打车软件、导航软件、出行软件、高速、高铁 等业务场景 每年双十一的交易额都创新高,今年也不例外,双十一几乎成了各种IT系统的大考,物流也不例外。每次双十一快递几乎都被爆仓,但是随着技术的发展,今年,听说双十一刚过,小伙伴们的包裹都快收到了。今天,来给大家分享一下物流与背后的数据库技术,当然我讲的还是PostgreSQL, Greenplum, PostGIS一类,大伙了解我的。物流行业是被电子商务催生的产业之一。快件的配送和揽件的调度算法是物流行业一个非常重要的课题,直接关系到配送或揽件的时效,以及物流公司的运作成本。好的算法,可以提高时效,降低成本,甚至可以更好的调动社会资源,就像滴滴打车一样,也许能全民参与哦。以后也许上班路途还能顺路提供快递服务呢。以物流行业为例,PostgreSQL与Greenplum为物流行业应用提供了包括机器学习、路径规划、地理位置信息存储和处理等基础服务。 《聊一聊双十一背后的技术 - 物流、动态路径规划》 20 流式同步多副本、极致数据可靠性 - 金融、传统企业、互联网 等业务场景 传统的金融行业高度依赖共享存储来解决数据库的高可用,数据0丢失以及异地容灾的场景。共享存储的解决方案价格昂贵,对厂商的依赖较大。PostgreSQL基于同步流复制的 任意副本 解决方案,在解决0丢失,高可用以及容灾的问题的同时,还可以提供只读的功能。相比传统的存储解决方案,优势更加明显。 《PostgreSQL 金融行业高可用和容灾解决方案》《PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别》《2017金秋将要发布的PostgreSQL 10.0已装备了哪些核武器?》 21 块级瘦索引 - 物联网、金融、日志、行为轨迹类数据 等业务场景 在物联网、金融、日志类型场景中,数据持续不断的产生,对于堆存储来说,有线性相关的特点。例如,时间字段往往和物理存储的顺序具有线性相关性。例如,有一些自增字段,也和堆存储的物理顺序线性相关。对与物理存储线性相关的字段(时间,自增字段),PostgreSQL提供了一种BRIN块级范围索引,索引中存储了对应数据块中的字段统计信息(例如最大值,最小值,平均值,记录数、SUM,空值个数等)这种索引很小,因为索引的粒度是连续的块,而不是每条记录。通常比BTREE索引小几百倍。如果字段的线性相关性很好,进行范围查询或者精确检索时,效率非常高。对于统计查询,也可以使用BRIN索引,提高分析统计的效率。[《PostgreSQL 物联网黑科技 - 瘦身几百倍的索引(BRIN index)》](https://github.com/digoal/blog/blob/master/201604/20160414_01.md)《PostgreSQL 9.5 new feature - BRIN (block range index) index》《PostgreSQL 聚集存储 与 BRIN索引 - 高并发行为、轨迹类大吞吐数据查询场景解说》 22 持续数据写入,高效、0丢失 - 运营商网关、物联网、IT系统FEED 等业务场景 在运营商网关、物联网的工业数据采集和处理,IT系统的FEED等业务场景中,数据产生的量非常庞大,这些数据要在保证可靠性的情况下,快速的入库。对于PostgreSQL来说,使用中端x86服务器(通常在10万以内,32核,SSD+SATA结合)上的数据插入速度(目标表包含一个brin索引),实际测试可以达到每天上百TB的写入。从而以较高的性价比,满足此类业务场景的需求。《PostgreSQL 如何潇洒的处理每天上百TB的数据增量》 23 时序数据有损压缩 - 时序、物联网、FEED数据、金融 等业务场景 在物联网、金融、FEED等场景中,往往有大批量的指标数据产生并进入数据库,通常包含 时间、值 两个字段。这些数据由于量非常庞大,而且就像音频一样,实际上是可以对其进行有损的压缩存储的。最为流行的是旋转门的压缩算法,在PostgreSQL中可以使用UDF,方便的实现这个功能。从而实现流式时序数据的有损压缩。 《旋转门数据压缩算法在PostgreSQL中的实现 - 流式压缩在物联网、监控、传感器等场景的应用》 24 会话级资源隔离 - 多租户、云、混合业务资源控制 等业务场景 在很多场景中,用户希望可以控制每个连接(会话)的资源使用情况,例如CPUIOPSMEMORY等。PostgreSQL是进程结构,可以通过cgroup很好的实现这个需求,不需要对数据库内核进行改造。另一方面,基于PostgreSQL的产品GPDB,则是在数据库的内核层面实施的控制。 《PostgreSQL 会话级资源隔离探索》 25 基因工程 - 生命科学、医疗 等业务场景 PostgreSQL凭借良好的扩展性,不仅仅是一个数据库,同时也是具备非常强大的数据处理能力的数据平台。很多垂直行业的用户拿它来做各种和业务贴合非常紧密的事情。例如PostgreSQL在生命科学领域的应用案例 - 基因工程。通常的思维可能是这样的,把数据存在数据库,需要运算的时候,再把数据取出进行运算(例如配对),需要花费非常多的网络传输时间。 PostgreSQL提供了基因工程相关的数据类型,操作类型,索引。满足基因工程业务的需求。用户可以直接在数据库中对基因数据进行处理。同时还可以利用MPP来解决更大数据量的问题(例如压缩后百TB级别)。 《为了部落 - 如何通过PostgreSQL基因配对,产生优良下一代》 26 数据预测、挖掘 - 金融数据分析、机器学习 等业务场景 PostgreSQL、以及HybridDB(基于GPDB),等PostgreSQL相关的数据库,都支持MADlib机器学习库,这个库支持机器学习领域常见的算法(例如聚类、线性回归、贝叶斯、文本处理等等)其中在数据领域用得较多的数据预测,可以使用MADLib的多元回归库,进行数据的预测。结合plR语言 或者R + pivotalR 、 python + pythonR插件,可以自动将Rpython语言的命令转换为MADlib库函数,对数据进行分析。非常适合使用R或者python对数据进行分析的数据科学家使用。其特点是高效(数据与运算一体,可以使用LLVM向量计算等技术优化,同时不需要传播数据,节约了传播的开销)、易用(支持常见的SQL、r, python等编程)。 《PostgreSQL 线性回归 - 股价预测 1》《在PostgreSQL中用线性回归分析linear regression做预测 - 例子2, 预测未来数日某股收盘价》 27 数据库端编程 - ERP、电商、传统企业、电商、运营商 等业务场景 在传统企业、电商、运营商等涉及用户交互、或者多个系统交互的业务场景中,通常一个事务涉及到很复杂的业务逻辑,需要保证数据的一致性,同时还需要与数据库多次交互。比如 银行开户 , 涉及的业务系统多,逻辑复杂。在传统企业中,通常使用商业数据库的过程函数,实现此类复杂的逻辑。PostgreSQL的数据库过程函数支持的语言非常丰富,比如plpgsql(可与Oracle pl/sql功能比肩),另外还支持语言的扩展,例如支持python,perl,java,c,r等等作为数据库的过程函数语言。对于开发人员来说,几乎可以在PostgreSQL数据库中处理任何业务逻辑。《论云数据库编程能力的重要性》 28 ECPG,C嵌入式开发 - 金融 等业务场景 在金融行业中,用得非常多的是嵌入式SQL开发,可能为了处理复杂的逻辑,同时还需要非常高的效率、以及方便的代码管理。所以此类场景就会用到嵌入式SQL开发,取代部分数据库过程语言的代码。PostgreSQL 的ECPG,与Oracle的Pro*C功能对齐,是个非常好的选择。 https://www.postgresql.org/docs/9.6/static/ecpg.html 29 数据库水平拆分、跨平台数据融合 - 金融、电商、互联网、物联网 等业务场景 PostgreSQL 从 2011年的9.1版本引入FDW开始,发展到现在已经支持几乎所有的外部数据源读写操作,例如mysql,oracle,pgsql,redis,mongo,hive,jdbc,odbc,file,sqlserver,es,S3,......。https://wiki.postgresql.org/wiki/Fdw开放的接口,允许用户自己添加外部数据源的支持。9.6针对postgres_fdw(即PostgreSQL外部数据源)再次增强,开始支持对sort, where, join的下推,支持remote cancel query, 用户使用FDW可以对应用透明的实现数据库的sharding,单元化需求。内核层支持sharding,这种分片技术相比中间件分片技术的好处: 支持跨库JOIN 支持绑定变量 支持master(coordinator)节点水平扩展 支持segment(datanode)节点水平扩展 支持函数和存储过程 支持sort, where, join的下推,支持remote cancel query,10.x支持聚合算子的下推。ps: 目前还不支持分布式事务(需要用户干预2PC) ,10.x的版本会增加内核层面的分布式事务控制。 《PostgreSQL 9.6 单元化,sharding (based on postgres_fdw) - 内核层支持前传》《PostgreSQL 9.6 sharding + 单元化 (based on postgres_fdw) 最佳实践 - 通用水平分库场景设计与实践》 除了postgres_fdw,PostgreSQL还有很多FDW,也就是说,你可以在PostgreSQL数据库中,访问几乎任何外部数据。就像访问本地的表效果一样。 30 地理位置信息查询 - LBS、社交、物流、出行、导航 等业务场景 在LBS、社交、物流、出行、导航等场景中,最为常见的一个需求是基于位置的搜索,比如搜索附近的人,并按距离由近到远排序。在PostgreSQL中,有专门的GiST, SP-GiST索引支持,可以做到非常高效的检索,100亿地理位置数据,查询某个点附近的点,普通硬件,单个数据库响应时间在1毫秒以内。PostgreSQL在位置信息近邻(KNN)查询方面的性能参考。 《PostgreSQL 百亿地理位置数据 近邻查询性能》 参考文献 《宝剑赠英雄 - 任意组合字段等效查询, 探探PostgreSQL多列展开式B树》 《PostgreSQL 9.6 黑科技 bloom 算法索引,一个索引支撑任意列组合查询》《聊聊between and的坑 和 神奇的解法》《PostgreSQL 黑科技 range 类型及 gist index 20x+ speedup than Mysql index combine query》《PostgreSQL 黑科技 range 类型及 gist index 助力物联网(IoT)》《从难缠的模糊查询聊开 - PostgreSQL独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》《蜂巢的艺术与技术价值 - PostgreSQL PostGIS's hex-grid》《PostGIS 地理信息数据 多核并行处理》《从电波表到数据库小程序之 - 数据库异步广播(notify/listen)》《从微信小程序 到 数据库"小程序" , 鬼知道我经历了什么》《[转载] postgres + socket.io + nodejs 实时地图应用实践》《流计算风云再起 - PostgreSQL携PipelineDB力挺IoT》《PostgreSQL 流式数据处理(聚合、过滤、转换...)系列 - 9》《基于PostgreSQL的流式PipelineDB, 1000万/s实时统计不是梦》《"物联网"流式处理应用 - 用PostgreSQL实时处理(万亿每天)》《(AR虚拟现实)红包 技术思考 - GIS与图像识别的完美结合》《电商内容去重内容筛选应用(如何高效识别转载盗图侵权?) - 文本相似、图片集相似、数组相似的优化和索引技术》《PostgreSQL 在视频、图片去重,图像搜索业务中的应用》《从相似度算法谈起 - Effective similarity search in PostgreSQL》《PostgreSQL 行级 全文检索》《PostgreSQL 全表 全字段 模糊查询的毫秒级高效实现 - 搜索引擎颤抖了》《从难缠的模糊查询聊开 - PostgreSQL独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》《ApsaraDB的左右互搏术 - PostgreSQL+HybridDB解决企业痛处 TP+AP混合需求》《分析加速引擎黑科技 - LLVM、列存、多核并行、算子复用 大联姻 - 一起来开启PostgreSQL的百宝箱》《PostgreSQL 9.6 引领开源数据库攻克多核并行计算难题》《PostgreSQL 向量化执行插件(瓦片式实现) 10x提速OLAP》《恭迎万亿级营销(圈人)潇洒的迈入毫秒时代 - 万亿user_tags级实时推荐系统数据库设计》《从天津滨海新区大爆炸、危化品监管聊聊 IT人背负的社会责任感》《金融风控、公安刑侦、社会关系、人脉分析等需求分析与数据库实现 - PostgreSQL图数据库场景应用》《用PostgreSQL找回618秒逝去的青春 - 递归收敛优化》《时序数据合并场景加速分析和实现 - 复合索引,窗口分组查询加速,变态递归加速》

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册