小勤:大海,为什么我从Excel文件夹导入的数据重复了? 大海:数据给我来试试看?...Step-01:新建查询-从文件夹 确定后,我们看到文件夹里有3个文件: 这里,显然是因为将合并工作表和数据源放在了同一个文件夹下,所以Power Query将合并工作表也显示了出来,并且...Table 和DefineName的情况在Excel中可通过以下方法识别(以下2图不是本文涉及的数据导入操作步骤): 了解这些内容之后,我们就可以按需要去选择数据以避免重复了。...Step-06:展开数据 Step-07:将第一行提升为标题行 Step-08:删除不需要的列 Step-09:删除不需要的空行 Step-10:数据上载 小勤:原来Excel里还隐藏了这么多东西...知道了。好在从Power Query的每个步骤里出来的结果都是看得见摸得着的东西,还比较容易理解,只需要操作上注意筛选一下就行了。
搭了个V**,但是默认V**没有在做转发,用的iptables做的nat转发,可是每次重启,都需要重新执行iptables命令。...# 查看网卡信息 ifconfig 我看到我ppp0的IP地址是192.168.10.1,所以iptable的nat规则如下 # 把192.168.10.0/24这个网络的请求,转发到eth0网卡上面...sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE 其实这句iptables我都忘了怎么写,也不记得再哪里找到的...history | grep iptables 记录在博客了,再也不怕服务器重启了~~ 谁教一下我怎么让他重启也能自动运行呗!
没有什么比一门新的编程语言更令开发者兴奋了,不是么? 因此,我在 4、5 个月之前开始学习 Go。在这里我将告诉你,你为什么也要学习这门新语言。...在这篇文章中,我不打算教你怎样写 “Hello World!!”。网上有许多其他的文章会教你。我将阐述软硬件发展的现状以及为什么我们要学习像 Go 这样的新语言?...另一方面,Go 于 2009 年发布,那时多核处理器已经上市了。这也是为什么 Go 是在考虑并发的基础上构建的。Go 用 goroutine 来替代线程,它们从堆中消耗了大约 2 KB 的内存。...这太酷了!!! 用 Go 编写的代码易于维护 我告诉你一件事,Go 没有像其他语言一样疯狂于编程语法,它的语法非常整洁。...与 Swift 等这些新的语言不一样[9],Go 的语法非常稳定。自从 2012 年首次公开发布 1.0 版本以来,它保持不变并且向后兼容。
我们都知道,数据库中的数据,只要应用程序员不主动删除,就可以任意次读写,多少次都行。数据库还对外提供了很漂亮的接口——SQL ——让程序员操作数据。...调用方的责任太大。 于是消息队列(MQ)就出现了,程序A把数据往消息队列中一扔,完事走人,程序B想什么时候读就什么时候读,极其灵活。...可是传统的MQ也有问题,通常情况下,一个消息确认被读取以后,就会被删除。如果来了一个新的程序C,也想读之前的消息,或者说之前一段时间的消息,传统MQ表示无能无力。...Kafka出现了,它也是一个消息队列,但是它能保存很长一段时间的消息(因为在硬盘上),队列中每个消息都有一个编号1,2,3,4.... ,这样就支持多个程序来读取。...例如:程序B读到了编号为3的消息, 程序C读到了编号为5的消息, 这时候来了一个新的程序D,可以从头开始读。
如果说这个例子里分类是八比二的话,那么只会有 20% 的用户终止了与公司继续接触,剩下 80% 的用户则会继续使用公司产品。 但问题是,这 20% 的用户流失可能对公司非常的重要。...精度 = 所有正确预测 / 全部预测 精度计算了所有预测中正确所占的比例,直觉告诉我们这么算确实没问题,可是到了不平衡数据集上,情况就变得复杂了…… 举例来说,你从市场部那边拿到了过去一年的客户流失情况数据...去年总共有十万的客户,其中有两万的客户流失了。现在,如果说我们预测全部的十万客户都留存到了年底,这就意味着你的精度是 80,000/100,000,足足有 80%!但实际上你一个客户流失都没有预测到。...因此,如果我们成功预测到了所有的二万用户流失,也就是两万的真正,但同时也有两万并没有流失的客户被模型混淆在了其中,那么这一点在精准度里也会有所体现: 没有假正:20,000/(20,000+0)= 100%...还是用之前的例子,如果我们成功预测出所有的流失客户,没有错过任何一个,那么我们将拥有: 没有假负:20,000/(20,000+0)= 100% 如果我们错估了五千的客户,那么召回率将下降,但计算式的分母不变
代码层面从功能上看没有任何问题但是投入使用后却让我头大问题描述====系统上点击数据录入功能在全局监控中会受到相关消息的通知。...我们1W个用户同事在线的可能有5000+ 。 那么我们需要5000次以上的反射着肯定是吃不消的。这也是为什么本文开头说功能正常不代表业务正常。解决方案====这就是量变引起质变。...在多客户的情况下我们的设计弊端就暴露出来。这里也是笔者自己给自己挖坑。既然找到问题我们就好解决了。下面我们对代码做了一下改动我将数据缓存起来。因为在同一批次推送时本来也应该保证数据一致性。...而且我们系统对数据实时性也是可以接受一定时间延迟的。我在这里又加上缓存这样就解决了我们循环的问题经过测试本次改动在CPU上大概优化了100倍。...总结==功能开发完成仅仅代表功能的实验没有问题单用户和多用户完全是两种不同的用户形态。我们功能设计初期就应该尽量考虑数据量的问题唯一做的好的地方是我通过责任链模式将数据解析隔离出来。
运行在JVM中也是一样的,那你可能会有疑问,既然将类型擦除了,那为什么我声明的泛型为String类型时,不能往里add一个整型的数据呢?...一般作为初级工程师知道这些就算合格了。 我们往深一层研究下,难道我们一定不能往声明泛型为String的list中增加一个整型元素吗?...但是我能改成下面这样吗?...如果到这里你基本上都会的话,我觉得完全具有中级工程师的能力了。...2、不能用来方法的重载 为什么呢?举个例子: ? 如上图所示,在不同的泛型作为参数时,编译器编译时进行类型擦除,那参数不就一样了吗?那还谈什么重载呢!
3个月前,我写了一篇文章,详细讲述了用解析库编写计算器的过程。然而,读者们普遍反应,他们对于见到一个从头开始写并且除了电池以外别无他物的计算器更感兴趣。我想,为什么不呢?...这一步很简单,且不是本文的重点,因此在此处我省略了很多。 首先,我定义了一些标记(数字不在此中,它们是默认的标记)和一个标记类型: ? 下面就是我用来标记expr表达式的代码: ?...第二步:语法定义 我选择的解析器实现自一个本地垂直解析器,其来源于LL解析器的一个简单版本。它是一个最简单的解析器实现,事实上,只有仅仅14行代码。...在深入到实际的解析器实现之前,我们可对语法进行讨论。在我之前发表的文章中,我使用过LR解析器,我可以像如下方式定义计算器语法(标记使用大写字母表示): ?...(如果您还不理解上述语法,请阅读我之前发表的文章) 现在我使用LL解析器,以如下方式定义计算器的语法: ? 大家可以看到,这里有一个微妙的变化。有关”addandmul”的递归定义被反转了。
END 创建 SQL 函数,在某些情况下会破坏其官方的.NET 和 Java 数据库驱动。但只要不通过 Npgsql 或 PgJDBC 修改数据库模式,就不会出现问题。...使用 SQL 标准语法编写的函数或过程能快速解析,并存储为解析树形式。这可更好地追踪函数的依赖关系,并具有更好的安全性。...完全支持语句拆分或是要去更改 API,或是要去新建一个更复杂的解析器。 Npgsql 已关注当前解析器的开销问题,决定更改 API。...其进展可关注软件缺陷报告“新的 PG14 SQL 标准函数破坏了 PgJDBC 解析器(New PG14 SQL-standard function bodies break our SQL parser...今日好文推荐 GitLab 技术选型为何如此不同:坚持用过气 Web 框架十多年、坚决不用微服务 首个冲刺科创板的国产数据库:78 岁老教授打磨四十年,每一行代码都自主可控 为什么 Rust 是初创公司的绝佳选择
你实际上在这本书的第五部分中,学到了如何阅读它,但是规模较小。你知道正则表达式,扫描器和解析器的工作原理,以及如何阅读这样的语法。所有你需要做的是研究这种语法,并一次实现一点。...在实现它的时候,我将完全忽略任何“块”语法。 一旦你研究了这个语法,你应该开始为 HTTP 编写解析器,使用你已经创建的东西。...使用你的数据结构,解析工具以及任何东西,来为 HTTP 的小型子集创建解析器。覆盖尽可能多的这种语法。...你可以下载这组测试用例,并通过你的解析器运行它们,来确保它有用。我从杰出的 And-HTTP 服务器中提取了许多这些测试用例,然后用更基本的例子来扩展它们。你的目标是使它们尽可能多地通过。...破坏它 你一定要试图破坏这个 Web 服务器,但你也应该在这里尝试不同的东西。你已经编写了一个 HTTP 解析器,尝试使用 RDP 风格的解析器,以最合理的方式处理有效的 HTTP。
打破复杂数据架构的束缚,大大降低数据的使用门槛,释放数据潜能,让数据涌现智能。 1 背景 1. 近二十年大数据发展史 2002 年我加入 Microsoft SQL Server 引擎团队。...我曾一度思考过继续做数据库是不是一个正确的职业选择。与数据库行业的成熟稳定相比,互联网业务蓬勃发展,对数据库能力和性能的要求与日俱增,一场解决水平扩展的战争悄然开始。...我认为答案是肯定的,过去二十年技术的发展已经探索和解决了各个子问题,现在是综合解决这些问题,大大降低数据使用门槛的时候了。...3 构建云原生分布式 Data Warebase 的要素 为什么要把 Database 和 Data Warehouse 放在一起呢?我们先考虑一下反过来的问题:为什么要把数据库、搜索、和数仓分开?...高吞吐的分布式事务是个有挑战的问题,可能给系统带来一定的额外开销,这也是大家(包括我自己)曾经一度认为数据库和数仓必须分开的原因之一。我们在此深度剖析一下数仓场景的写入问题。
为了这个问题,我将x=x+1这个式子写给几个小学生看,他们的第一反应是“这个等式怎么这样写啊?”,“这个式子写的不对,两边不相等!”。...我说这不是等式,这表示将变量x的值变大一个数,也就是将变量x的值加1后再赋值给变量x...后面的话没法继续进行下去了,小学生的神情是这样的: ?...(PS:1968年,美国一位母亲投诉老师教会了她孩子字母“O”,状告幼儿园破坏了孩子的想象力,结果幼儿园败诉。)...我说这的确可以看作是一个方程,到了初中阶段,老师会教你们这是“2元1次方程”,上面的等式等同于: x + 1 -y =0 这时候有小朋友说我知道了,这叫做“等式变换”。...我说是的,在上面的方程中,等式右边未知数不管用字母x表示,还是用a表示,它们都只是一个符号而已,同样等式左边的字母y或者b也都仅仅是一个符号而已,所以上面两个方程对应的函数可以像下面这样表示: y= x
最后,在 Pinecone 的抽象语法树中不会包含任何标识符类型信息,它就是一个简单的结构化的标识符。 解析器的作用 解析器负责将结构添加到词法分析器,并产生有序列表中的令牌(Token)。...为什么自定义更好 在词法分析器中,我仍然决定使用自己的代码。首先,词法分析器是一个小程序,如果我自己不写,感觉就像不会写我自己的“left-pad”一样愚笨。 但是语法解析器是另一回事。...这可以是自动化的,但是在构建系统之间切换时会变得很麻烦 我喜欢构建酷的东西 为什么我自己决定做一个中心角色?...这是我花了相当长的一段时间才弄清楚的,行为树和抽象语法树之间有一个细微但非常重要的区别,这也促成了解析器的重新编写。 行为树 vs AST 从简单的原理上来讲,行为树是带有上下文的 AST。...我们真正应该问的问题是为什么要设计自己的语言?可能的答案: 有趣 拥有自己的编程语言真是太酷了 这是一个很好的副业项目 心理模型 虽然这三个可能都是正确的,但还有一个更大的动机:拥有正确的心智模型。
说明:Rust 2021 Edition 计划是官方博客准备在 4月30 号提前发布的,目前是预先发布到了官方博客的 GitHub 仓库中,为了一睹为快,我就提前把它发布出来。...如果不做这样的区分,都用「版本」就会很乱。 为什么不用「版」呢,因为「版」对应发行版本,对应 Stable/Nightly/Beta 发行版。 什么是「版次( Edition)」?...默认 Cargo Feature 解析器(Resolver) 从Rust 1.51.0开始,Cargo 支持了可选的新的 Feature 解析器[8],可以通过Cargo.toml中的resolver...仅添加trait实现会破坏现有代码。array.into_iter()现在已可编译,由于方法调用语法的工作原理,该函数隐式调用(&array).into_iter()。添加trait实现将改变含义。...保留语法 为了将来为某些新语法腾出空间,我们决定为前缀的标识符和文字保留语法:prefix#identifier,prefix" string",prefix'c'和prefix#123,其中prefix
这篇文章分析了当前的 pgen 解析器的诸多缺陷,并介绍了 PEG 解析器的优点,令人振奋。这项改造工作仍在进行中,Guido 说他还会写更多相关的文章。...几年前,有人问 Python 是否会转换用 PEG 解析器(或者是 PEG 语法,我不记得确切内容、谁说的、什么时候说的)。我稍微看过这个主题,但没有头绪,就放弃了。...在一个语句的开头,解析器需要根据它看到的第一个标记符,来决定它要查看的 statement 的可选内容。(为什么呢?pgen 的自动解析器就是这样工作的。)...(还有更多细节,但在这我不关注。) 为什么不直接从解析树编译呢?...我还没进展到这个地步,但已经有了一个原型,可以将一个 Python 的子集编译成一个 AST,其速度与当前 CPython 的解析器大致相当。
最终,我们就拥有了一棵树,从这个 Python 代码的根开始,并且每个代码块,print,函数定义和函数调用都是根的分支,它们也有子分支,以此类推。 为什么我们这样做?...很多早期的糟糕语言是直线语言,我们现在知道了他们不必须是这样。我们可以使用解析器构建树结构。 解析器的任务是从扫描器中获取记号列表,并将其翻译成更有意义的语法树。...在本练习中,我将对如何编写 RDP 解析器进行更正式的描述,然后让你使用我们上面的 Python 小代码片段来尝试它。 RDP 使用多个相互递归的函数调用,它实现了给定语法的树形结构。...你会注意到,这些是我在练习 33 中让你为扫描器创建的三个操作,这就是为什么。你需要他们来实现一个 RDP 解析器。 你可以使用这三个函数来编写语法解析函数,从扫描器中获取记号。...BNF 描述了所需的记号,以及这些记号如何重复来形成语言的语法。BNF 还使用与正则表达式相同的符号,所以*,+和?有相似的含义。
这篇文章分析了当前的 pgen 解析器的诸多缺陷,并介绍了 PEG 解析器的优点,令人振奋。这项改造工作仍在进行中,Guido 说他还会写更多相关的文章,我们就拭目以待吧。 ?...几年前,有人问 Python 是否会转换用 PEG 解析器(或者是 PEG 语法,我不记得确切内容、谁说的、什么时候说的)。我稍微看过这个主题,但没有头绪,就放弃了。...在一个语句的开头,解析器需要根据它看到的第一个标记符,来决定它要查看的 statement 的可选内容。(为什么呢?pgen 的自动解析器就是这样工作的。)...(还有更多细节,但在这我不关注。) 为什么不直接从解析树编译呢?...我还没进展到这个地步,但已经有了一个原型,可以将一个 Python 的子集编译成一个 AST,其速度与当前 CPython 的解析器大致相当。
我们将为语法编写一个语法(元语法),然后我们将从中生成一个新的元解析器。幸运的是我从一开始就计划了,所以这是一个非常简单的练习。...(为什么不呢?保持事情尽可能简单总是一个好主意,这个语法使用左递归的话,不是很清晰。)请注意,单个的 item 已被分层,但递归的 items 没有,因为它已经是一个列表。...但是既然我们已经有了动作,许多其它解析器也会想要自定义它们的导入,所以为什么我们不试试看,能否添加一个更通用的功能呢。 有很多方法可以剥了这只猫的皮(译注:skin this cat,解决这个难题)。...有了这些东西,元语法可以由辅助的元解析器解析,并且生成器可以将它转换为新的元解析器,由此解析自己。更重要的是,新的元解析器仍然可以解析相同的元语法。...如果我们使用新的元编译器编译元语法,则输出是相同的:这证明生成的元解析器正常工作。 这是带有动作的完整元语法。
然后,当我尝试不同的方法时,我开始把我认为有意义的东西包含在我的探索过程中。 在这篇文章中,我想和大家分享一下我如何构建 CSS 以及为什么我这样做。 希望它可以帮助你找到你喜欢的方法。...这是最重要的,特别是当我需要在短时间内进行修改时。我不想因为改变一处而破坏别的东西。 我必须立即知道一个 class 放在这个伟大工程中的什么地方,以防止大脑过载。...我必须 立即知道一个组件是否使用了 JavaScript,所以如果我改变了它的 CSS,我不会意外地破坏任何组件。 在我的探索中,我发现 BEM 和 命名空间 符合我寻找的标准。...(BEM 元素具有 .block__element 语法)。 在这一点上,你仍然可能不喜欢 BEM 丑陋的 --modifier 语法。我知道为什么,但我爱上这个语法是因为我很讨厌命名。...同样,我也不能立即知道.button-secondary是否也是修饰符! 很具有讽刺意味,但是这个丑陋的语法让我的代码更简洁,更易于维护。
我曾几次提及左递归是一块绊脚石,是时候去解决它了。基本的问题在于:使用递归下降解析器时,左递归会因堆栈溢出而导致程序终止。 【这是我的 PEG 系列的第 5 部分。...事实上,上面的语法也能识别出来,如果我们重写成这样: expr: term '+' expr | term 但是,如果我们用它生成一个解析树,那么解析树的形状会有所不同,这会导致破坏性的后果,比如当我们在语法中添加一个...原始的左递归语法已经表诉了所需的关联性,因此,如果我们可以直接以该形式生成解析器,那将会很好。我们可以!一位粉丝向我指出了一个很好的技巧,还附带了一个数学证明,很容易实现。我会试着在这里解释一下。...我没有证明为什么这个算法总是有效的,不管这个语法有多疯狂。那是因为我实际上没有读过那个证明。...到此,今天的故事结束了:我们已经成功地在 PEG(-ish)解析器中驯服了左递归。
领取专属 10元无门槛券
手把手带您无忧上云