在项目里刚好有3个服务,同一个网关内层的3个服务,两个php的,一个golang的,为了提高负载以及进行分流,部分客户的接口调用会被网关自动分配到go服务。
恰好为了测试,我写了一个全量用户的生产、测试环境调用接口返回结果进行对比的脚本,于是发现了题中的问题:两个php服务里的接口返回值写入xlsx后,直接copy出来是正常的json串,golang的接口返回值copy出来变成双重引号如图
排查过程:
1、先通过python的requests请求接口直接打印出返回值,看看是否是两个双引号,结果发现php跟go服务都是正常的json串。
2、继续排查,猜想问题会不会出现编码传输格式上,于是对比php跟go接口响应标头。
php服务响应头如下:
go服务应头如下
go跟php响应头的差别只在于两点:php多了TimeStamp,Content-Type里面多了charset=utf-8。
首先排除TimeStamp,从名称上就可以看出来不会对返回值格式或内容有任何影响;
然后尝试用flask编写两个接口,Content-Type里面分别为application/json、application/json; charset=utf-8,写入excel后发现并没有任何不同。
3、响应头也没问题,继续猜想会不会是go服务代码缺陷,接口在return response之前并没有序列化,而是直接返回了object对象?
我们先了解一个概念:序列化与反序列化。
序列化是把程序对象转换为字节序列的过程,反序列化就是把字节序列恢复为程序对象的过程。
因为不同的客户端、服务端可能使用的语言不同,为了兼容都是用序列化之后的数据进行传输,比如前端js将页面参数序列化之后传递给后端java服务。
开始实验,本地flask直接返回字典{"username": username, "password": password},写入excel的居然真的出现了两个双引号。
4、于是让开发排查代码里是不是没有作序列化,但是出人意料的是,go代码里是做了序列化才返回的。
所以上面的猜想都不成立,研究一度陷入僵局,直到...
5、偶然注意到copy出来的返回值尾巴上有个莫名其妙的换行。
根据以前经常写json数据入csv、xlsx文件的经验,就算是格式化后加了多个引号的json数据(例如pandas的to_csv方法里的quoting参数即可控制是否加引号),也不可能加换行符。
所以猜想会不会是返回值多了个隐形的换行符,然后在pacharm的cmd里调一下接口看看,果然go服务返回体尾巴上换行了,而php则不会
6、于是在写入excel之前把返回值rstrip()一下做最后的确认,结果从excel复制出来的数据真的没有多重引号了。
至此,揪出来这个go服务的bug!
大家好,又见面了,我是你们的朋友全栈君。以前很少关注这方面的问题,直达我们的技术经理找我们说要换框架,为什么换框架呢,因为缓存的问题,原来的项目是用版本号作为刷新的依据的。因为微信公众号上有这样一个机制,使用版本好的话,有时做不到及时刷新,所以就用了vue.js,因为它有这样的功能就是如果某个文件里面的数据改变了,那么vue.js就会把这个文件的名字也相应的改掉,所以缓存里面的东西就用不了了,这样就做到了及时刷新,向后台请求数据。以前没有总结过js关于清除浏览器缓存的方法,今天就借此总结一下吧。浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能。但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数据。像股票类网站实时更新等,这样的网站是不要缓存的,像有的网站很少更新,有缓存还是比较好的。今天主要介绍清除缓存的几种方法。清理网站缓存的几种方法meta方法<METAHTTP-EQUIV="pragma"CONTENT="no-cache">//CONTENT="no-cache"
21.合并两个有序链表力扣题目链接[1]将两个升序链表合并为一个新的「升序」链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例一:输入:l1=[1,2,4],l2=[1,3,4] 输出:[1,1,2,3,4,4] 复制「提示:」两个链表的节点数目范围是[0,50]100<=Node.val<=100l1和l2均按「非递减顺序」排列思路:有序链表的合并问题,是最经典的链表题目,考查链表的遍历与末尾的判断。这里我们声明一个哨兵节点作为新链表的起始位置。然后开始比较两个链表的值,将具有较小值的链表节点赋值给新链表当前节点的next指针。然后新链表和待排序链表的当前指针都向后移动一位继续下个节点的比较。当list1或者list2为空时,跳出循环。此时可能还有另一个链表的指针还没有走到末尾,因此直接将尚未走完的链表赋值给新链表当前节点的next指针。最后返回哨兵节点的下一个节点引用即可。因为哨兵节点是用于串联起一个链表,最终结果中不能包含该节点。完整代码如下:哨兵节点/** *Definitionforsingly-linkedlist. *functionListNo
keepalived做HA时,经常会遇到抢占式的master和backup之间的切换example:通常如果master服务死掉后backup会变成master,但是当master服务又好了的时候master此时会抢占VIP,这样就会发生两次切换对业务繁忙的网站来说是不好的。所以我们要在配置文件加入 nopreempt 非抢占,但是这个参数只能用于state为backup,故我们在用HA的时候最好master和backup的state都设置成backup让其通过priority来竞争。注意:这样配置后,我们要注意启动keepalived服务的顺序,假设我想让A成为backup那就不能先启动A的keepalived服务。以下是结合MHA架构主、备库配置事例主库[root@MySQLtest~]#more/etc/keepalived/keepalived.conf #20140916 #!/bin/bashglobal_defs{ router_idmysqlmha }vrrp_scriptcheck_run{ script"/etc/keepalived/check_m
大家好,可以叫我才哥。最近有好朋友在咱们交流群分享力扣算法题,感觉还蛮好玩的。然后才哥去力扣看了看,很快就怂了,觉得自己像个傻子,傻傻的都不会写!!不过,硬着头皮写了一段时间,发现还是收获很多,对于锻炼逻辑思维能力和编码能力都有很不错的助力,就是费时间一个算法题可能要研究一个晚上才能独立码出理想的代码。那么,力扣里的算法题都是什么样的呢?大家都喜欢刷什么难度的题,通过率都如何?咱们今天就简单介绍一下吧!目录:1.数据获取2.数据可视化2.1.难度分布2.2.通过率分布2.3.提交数分布2.4.题解数分布3.那些最热门和最噩梦的算法题3.1.最热门3.2.最噩梦3.3.最简单?1.数据获取直接用python从力扣爬取全部算法题题库列表数据即可#题库列表数据接口地址 url='https://leetcode-cn.com/api/problems/all/' 复制力扣题库由于获取的数据是json格式的,所以比较好解析,具体数据爬取及清洗处理过程见下面代码:importrequests importpandasaspd url='https://leetco
前言React是一个构建用户界面的js库,从UI=render()这个等式中就很好的映射了这一点,UI的显示取决于等式右边的render函数的返回值.而编写React应用,就是在编写React组件,组件中最重要的数据就是props和state,有了数据,怎么让其以什么样的显示,那就是CSS做的事情了在React中,一切皆可以是Js,也就是说在js里面可以写css,这相比传统的内容(html),层叠样式(css),行为动作(js)进行分离,这种分离仅仅是把三个不同的技术进行了物理上的分离,进行分开管理,如果从另一个视觉角度上讲,并没有实现高内聚的特点既然前端本身就是页面的展示,那么把js和css放在一起,也是一种细粒度的组合,css也可以和Js一样,通过模块化的形式嵌入到js里面去CSSmodules很好的解决了样式冲突,利用了分而治之的理念,在如今组件化开发大行其道上,同样css也在不断的进化,如同js一样,也有变量,函数等具备Js一样的活力,那么在React中是怎么实现样式的模块化的?通过单独的*.css文件定义组件的样式,并且通过clssName指定他们,有什么不好的?在JSX上进
sed先来一段小日志,这只是一部分日志。#!/bin/bash #sip=`cat*|awk'{print$2}'|awk-F"'"'{print$2}'|sort|uniq|wc-l` #host=`cat*|awk-F'----''{print$2}'|awk'{print$2}'|sort|uniq|wc-l` #uri=`cat*|awk'{print$4}'|awk-F"'"'{print$2}'|sort|uniq|wc-l` #echo"sip:$sip" #echo"host:$host" #echo"uri:$uri" dir=/data/log/userdata/data/app cd$dir cat*>count_app.log 'sip':'100.114.190.205
注一般线性回归中,使用的假设函数是一元一次方程,也就是二维平面上的一条直线。但是很多时候可能会遇到直线方程无法很好的拟合数据的情况,这个时候可以尝试使用多项式回归。多项式回归中,加入了特征的更高次方(例如平方项或立方项),也相当于增加了模型的自由度,用来捕获数据中非线性的变化。添加高阶项的时候,也增加了模型的复杂度。随着模型复杂度的升高,模型的容量以及拟合数据的能力增加,可以进一步降低训练误差,但导致过拟合的风险也随之增加。图A,模型复杂度与训练误差及测试误差之间的关系0.多项式回归的一般形式1.多项式回归的实现1.1直线方程拟合下面先用直线方程拟合上面的数据点:复制1lin_reg=LinearRegression() 2lin_reg.fit(X,y) 3print(lin_reg.intercept_,lin_reg.coef_) 4#[4.97857827][[-0.92810463]] 5X_plot=np.linspace(-3,3,1000).reshape(-1,1) 6y_plot=np.dot(X_plot,lin_reg.coef_.T)+lin_reg.inte
大数据文摘出品作者:郑璇真、YYY据路透社7月11日报道,在被英国数据保护监管机构查出数据共享违反法律之后,Facebook目前面临来自英国信息专员办公室(ICO)的50万英镑(664,000美元)罚款处理。尽管这对市值高达5900亿美元的Facebook来说是九牛一毛,仅仅相当于Facebook每8分钟的一次收入,但50万英镑已是英国1998年数据保护法允许的最高罚款。但是,在最终决定罚款50万英镑之前,Facebook仍有机会回应ICO的意向通知。Facebook表示正在审阅ICO发出的调查报告,并将很快做出回应。“他们的陈述将将在本月晚些时候到期,目前尚未对案件的案情进行最终审查。我们将在确定最终意见之前仔细考虑Facebook做出的任何陈述,”ICO的信息专员伊丽莎白德纳姆说。Facebook自今年早些时候开始受到审查,据透露,有8700万用户的个人数据被政治咨询公司CambridgeAnalytica不当收集和误用,他们帮助特朗普在2016年赢得美国总统职位。有趣的是,由于泄密事件泄密被曝光的时间早于新的欧盟通用数据保护法规(GDPR),ICO的罚款是根据旧的英国法律实施的。
拼接规则腾讯云API接口请求URL的拼接规则为: https://+请求域名+请求路径+?+最终请求参数串 组成部分说明: 请求域名:请求域名由接口所属的产品或所属产品的模块决定,不同产品或不同产品的模块的请求域名会有不同,如腾讯云CVM的查询实例列表(DescribeInstances)的请求域名为:cvm.api.qcloud.com。具体产品请求域名详见各接口说明。 请求路径:腾讯云API对应产品的请求路径,一般是一个产品对应一个固定路径(如腾讯云CVM请求路径固定为/v2/index.php)。 最终请求参数串:接口的请求参数串包括公共请求参数和接口请求参数。 使用示例腾讯云API接口最终的请求URL结构形式如下:以腾讯云CVM查询实例列表接口(DescribeInstances)为例,其中前6个参数为公共请求参数,后6个参数为接口请求参数。 https://cvm.api.qcloud.com/v2/index.php? Action=DescribeInstances &SecretId=xxxxxxx &Region=gz &Timestamp
假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是HTTP1.1,通常会开启ajax请求询问服务端是否有更新,通过定时器反复轮询服务端响应的资源是否有更新。 在长时间不更新的情况下,反复地去询问会对服务器造成很大的压力,对网络也有很大的消耗,如果定时的时间比较大,服务端有更新的话,客户端可能需要等待定时器达到以后才能获知,这个信息也不能很及时地获取到。 而有了WebSocket协议,就能很好地解决这些问题,WebSocket可以反向通知的,通常向服务端订阅一类消息,服务端发现这类消息有更新就会不停地通知客户端。 WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议,它实现了浏览器与服务器全双工(full-duplex)通信—允许服务器主动发送信息给客户端,这样就可以实现从客户端发送消息到服务器,而服务器又可以转发消息到客户端,这样就能够实现客户端之间的交互。对于WebSocket的开发,Spring也提供了良好的支持,目前很多浏览器已经实现了WebSocket协议,但是依旧存在着很多浏览器没有实现该协议,为
官方文档的筛选 【1】KaliLinux是什么? KaliLinux是一个高级渗透测试和安全审计Linux发行版. KaliLinux特性 Kali是BackTrackLinux完全遵循Debian开发标准的完整重建.全新的目录框架、复查并打包所有工具、还为VCS建立了Git树. 超过300个渗透测试工具: 复查了BackTrack里的每一个工具之后,我们去掉了一部分已经无效或功能重复的工具. 永久免费: KaliLinux一如既往的免费.你永远无需为KaliLinux付费. 开源Git树: 我们是开源软件忠实的拥护者,那些想调整或重建包的人可以浏览我们的开发树得到所有源代码. 遵循FHS: Kali的开发遵循Linux目录结构标准,用户可以方便的找到命令文件、帮助文件、库文件等.. 支持大量无线设备: 我们尽可能的使KaliLinux支持更多的无线设备,能正常运行在各种各样的硬件上,能兼容大量USB和其它无线设备. 集成注入补丁的内核: 作为渗透测试者或开发团队经常需要做无线安全评估.所以我们
try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,但return并不是让函数马上返回结果,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回结果,它要执行finally语句后才真正开始返回,,但此时finally块中的代码已经影响不了return返回的值了 publicclassDemo{ publicstaticvoidmain(String[]args){ System.out.println(num()); } publicstaticintnum(){ inti=0; try{ i=1; returni; }catch(Exceptione){ }finally{ i=2; } returni; } } 复制 打印结果:1 复制 返回的是基本数据类型,直接返回值 publicclassDemo{ publicstaticvoidmain(String[]args){ System.out.println(num().getI()); } pub
吹水 考场只A了一道题属实没救了。 不懂啊,怎么感觉B比F难... A-XorBattle 倒着考虑,遇到一个\(1\)的轮的时候,如果当前数字不在之后所有数字的线性基中,那么\(1\)显然有必胜策略。否则是否异或不会影响到之后是否胜利。 维护线性基即可。 #include<bits/stdc++.h> usingnamespacestd; typedeflonglongll; constintN=1010,M=64; lla[N];intn;chars[N];llb[N]; llinsert(llx){ for(inti=60;~i;i--)if(1&(x>>i)){ if(!b[i]){b[i]=x;break;} elsex^=b[i]; } returnx; } voidMain() { for(inti=0;i<M;i++)b[i]=0; cin>>n;for(inti=1;i<=n;i++)scanf("%lld",&a[i]); scanf("%s",s+1); boolAns=0;
选择项目->添加->docker支持,这是选择 Linux,Windows的生成会有很多问题 #方式一复制 打开Dockerfile更改 FROMmcr.microsoft.com/dotnet/aspnet:3.1ASbase RUNapt-getupdate&&apt-getinstall-ylibgdiplus WORKDIR/app EXPOSE80 EXPOSE443 FROMmcr.microsoft.com/dotnet/sdk:3.1ASbuild WORKDIR/src COPY./**/*.csproj./ RUNforfilein$(ls*.csproj);domkdir-p./${file%.*}/&&mv$file./${file%.*}/;done RUNdotnetrestore"WebSerivce/WebSerivce.csproj" COPY.. WORKDIR"/src/WebSerivce" RUNdotnetbuild"WebSerivce.cs
*querySelector(css选择器)*通过css选择器去获取一个元素*它获取到的只有一个元素,如果说是有重复的,那它只取第一个**主语*document从整个文档里去获取元素*父级从父级里去获取元素复制 <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title></title> <style> {##color>li:first-child{#} {#background:#ff0000;#} {#}#} {##} {##color>li:nth-child(4){#} {#background:yellow;#} {#}#} </style> <script> window.onload=function(){ varred=document.querySelector('#colorli:first-child'); red.style.background='red'; va
华为2010年进入企业级市场,短短几年发展迅猛。迅速成为国内老大。因为现在国家多信息安全的重视,国产化设备使用越来越高,华为抓住这次发展机遇。与华为有竞争关系的企业有复制 这个要看哪些领域,还有对方是否也认为华为是竞争对手或潜在的竞争对手,现在归纳如下:运营商网络:爱立信、诺基亚(阿朗已被其收购)、中兴。智能终端:三星、中兴、小米、LG。企业业务:(企业交换机等数通产品,服务器,存储,云计算等):惠普戴尔思科ibm富士通emc亚马逊 微软浪潮 H3C等复制 华为2010年进入企业级市场,企业级BG是华为未来增长非常大的一个BG,一个领域。后来华为进入存储行业,2016年华为自己说进入存储行业有10多年。后来华为和赛门铁克Symantec(做杀毒软件,GHOST软件)在成都联合成立一家公司华赛(3000多员工),当时租用别人的办公区域,后来华为把华赛进行收购,华为在成都成立华为研究所(大概有10000员工),当时主要做存储行业,当时存储就是说S2500\复制 S5500等设备,是当时华赛的产品。后来华为的产品根据华赛的产品名字做了修改,在设备名字后面加的T,如:复制
一、思考❓❔ 1.git操作难吗? git操作命令繁杂 需求复杂场景,使用不易 原理深邃,对初学者来说是有难度的 2.那么难,还要学吗? 作为IT行业从业者(搬砖小工),不会Git?滚,出去~~~ 小白:那么难,又要学会,“我好南啊!”,有没有傻瓜式操作,写好代码,点几下,就能进行版本控制的呢? 大佬:当然有,你天天用的pycharm,就能完全符合你的胃口哟! 二、使用Pycharm进行版本控制?? 1.从远程仓库克隆项目 从远程仓库将一个已存在的项目克隆到本地 打开pycharm,VCS-->CheckoutfromVersionControl-->Git 复制粘贴远程仓库(GitHub)中项目地址-->点击Test-->点击Clone 克隆成功之后,会弹出窗口,点击Yes-->ThisWindow 2.对本地已存在的项目进行版本管理 打开本地项目,VCS-->EnableVersionControlIntegration 选择版本控制类型,选择Git或者Subversion 三、基本操作
webworker工作线程是Html5里面提出来的一个新api,对于JavaScript我们的印象是单线程执行,如果运行复杂运算的时候,页面可能就会失去响应,是运行在后台的javascript,独立于其他脚本,创建后,会在后台执行,并不会影响浏览器对于页面的响应方法:postMessage()用于向html页面传回一段消息,terminate()——终止webworker并释放浏览器/计算机资源事件:onmessage</p>使用:直接new一个出来,接收一个指向执行的javascript代码的地址。通过worker实例的onmessage方法可以接受工作线程发送过来的响应信息工作线程通过postMessage可以向主线程发送消息,但是注意,这里的postMessage只接受一个参数最后工作线程创建出来,如果不用了记得把他干掉work.terminate()示例html代码如下:复制 <divid="numDiv">0</div> <buttonid="start">start</button> <buttonid="
P5628【AFOI-19】面基(dp+容斥) 题目传送门 题目大意:略 题目分析: 首先我们观察数据范围,我们发现给定的图是一棵树,那么我们可以直接\(dfs\)来计算重要度,根据乘法原理可知。对于某条边的重要度为边两侧的节点个数的乘积。 接下来我们考虑用\(dp\)来进行求解,我们令\(f_{i,j}\)为以\(i\)为根,与\(i\)距离小于\(j\)的重要度。那么我们可以很容易的得出转移方程 \(f_{u,k}=\sum_{i\inson}f_{i,k-1}+val\) 那么转移方程是否正确呢?答案是否定的,因为在这个转移方程中,只考虑了孩子,而没有考虑父亲,所以我们还需要将父亲的重要度加上,我们假设当前应该转移\(f_{u,k}\),那么我们需要加上\(f_{fa,k-1}\),但是这样的话,以\(u\)为根的子树又加了一次,所以我们还需要减掉\(f_{u,k-2}\)。至此,我们可以得出正确的转移方程: \(f_{u,k}=\sum_{i\inson}f_{i,k-1}+val+f_{fa,k-1}-f_{u,k-2}\) 代码实现: Viewcode #include&
对于现在的vue、react、webpack来说也许有点旧了,有时候,越简单的技术越可靠,备份一下 module.exports=function(grunt){ //Projectconfiguration. grunt.initConfig({ pkg:grunt.file.readJSON('package.json'), compass:{ development:{ options:{ generatedImagesDir:'public/src/slice',//合并后的雪碧图dir imagesDir:'public/src/slice',//雪碧图合并前图片碎片dir sassDir:'public/src/sass', cssDir:'public/src/sass-css', outputStyle:'compressed',//CSSoutputmode.Canbe:nested,expanded,compact,compressed. force:false } } }, sprite:{ options:{ //sprite