前言 上周六有个群友@我说Gitee的反馈模块新增了截图功能,我就去体验了下,发现他们用的就是我的插件,本文就跟大家分享下这个插件,欢迎各位感兴趣的开发者阅读本文。...gitee反馈 影响体验的一些小问题 上周二,从GitHub来了个网友,加了我微信,给我的插件提了两个issues,因为周内没时间处理这些问题,就计划周末统一处理下插件的issues。...getDrawBoundaryStatus(currentX, currentY, cutBoxPosition) ) return; getDrawBoundaryStatus函数实现如下所示...,我就一遍又一遍的体验QQ的截图,观察他是怎么做的,突然,我灵感惊现,我既然有裁剪框的坐标和大小信息,我重新绘制一下这个裁剪框不就好了,裁剪框四周的8个可操作点删除后,我就可以删掉生成图片时优化那8个点的计算逻辑...我是神奇的程序员,一位前端开发工程师。
上面我们说到,该程序的逻辑是分配10GiB的物理内存,所以运行两次,也就是要分配20GiB的物理内存。 但在我们的测试机器上,物理内存一共才16GiB,所以,运行两个这样的进程肯定是不行的。...该函数调用了__oom_kill_process: ?...oom_evaluate_task函数中,会使用oom_badness,计算某进程badness的点数,点数越高,越容易被kill掉。...这也就解释了,为什么上面在第二次执行那个程序时,被kill掉的是第一次执行的那个进程,而不是第二次执行的进程,因为第一次执行的那个进程,占用的物理内存更大。...另外也欢迎关注我公众号,主要是结合实际,讲一些linux内核相关的知识。
上面我们说到,该程序的逻辑是分配10GiB的物理内存,所以运行两次,也就是要分配20GiB的物理内存。 但在我们的测试机器上,物理内存一共才16GiB,所以,运行两个这样的进程肯定是不行的。...这也就解释了为什么上面第二次运行该程序时,mmap是没有报错的。...该函数调用了__oom_kill_process: ?...oom_evaluate_task函数中,会使用oom_badness,计算某进程badness的点数,点数越高,越容易被kill掉。...这也就解释了,为什么上面在第二次执行那个程序时,被kill掉的是第一次执行的那个进程,而不是第二次执行的进程,因为第一次执行的那个进程,占用的物理内存更大。
问: 我有一个调用自己的函数: def get_input(): my_var = input('Enter "a" or "b": ') if my_var !...: Type "a" or "b": a got input: a 但是,如果我输入别的东西,然后输入 "a" 或 "b",我会得到这样的结果: Type "a" or "b": purple You...Type "a" or "b": a got input: None 我不明白为什么 get_input() 函数返回的是 None,因为它本应只返回 my_var。这个 None 是从哪里来的?...我该如何修复我的函数呢? 答: 它返回 None 是因为当你递归调用它时: if my_var != "a" and my_var !...因此,尽管递归确实发生了,但返回值却被丢弃了,然后你会从函数末尾退出。在函数末尾退出意味着 Python 会隐式地返回 None,就像下面这样: >>> def f(x): ...
很多时候,我们在面对一些热点数据的时候,通常会选择将热点数据放到redis中,以减少数据库的查询,减轻数据库的压力。但是如果我们使用redis的方式不对,那么可能导致系统的性能不升反降。...使用缓存的场景不正确 我们知道redis是基于内存实现的,所以速度会非常快,我们通常会将热点数据放到redis中,以减少对数据库的压力。...但是我们为了保证缓存与数据库的数据一致性,在数据进行修改的时候,我们就需要对缓存进行维护。 所以如果数据的变更很频繁的话,就需要对缓存进行频繁的维护,缓存的命中率也会特别低。...缓存的使用场景应该是修改频率不高,查询频率较高的场景。如果使用redis的场景不对,通常会导致我们得不偿失。 2. key设计不当导致产生了bigkey 什么是bigkey?...如果我们选择appendfsync always的话,虽然数据的安全性高,但是每次写入都要刷盘会导致redis的性能很大程度的降低,所以我们一般会选择appendfsync everysec的策略来对数据进行持久化
大家好,又见面了,我是你们的朋友全栈君。 前几天看了动脑老师老宋讲的jsonp原理,觉得很受用,现做下笔记。...接下来我在server2下放了个callback.js文件,然后写了alert(‘hello jsonp!!!’)...,因为两个服务的端口不一样,存在跨域问题,在server1中的index.html是没办法直接访问server2下的callback.js文件的。...结论: jsonp通过在服务端用一个回调函数把数据一起包裹起来并返回给客户端(jsonp名字就是这样来的json padding),然后客户端写好回调(处理数据),并动态创建一个script节点,通过src...属性来调用服务端返回的回调函数。
02 eval 实际上,eval是一个Python基础函数,用于执行字符串形式的计算表达式,例如以下简单实例: ?...注意事项: eval支持接收一个inplace参数控制原地创建新变量或者返回新的dataframe;也支持仅用表达式而不设置新变量名,此时返回数据为series格式,如下图所示; eval表达式中也支持调用函数执行复杂计算...以及[]等等,此时如果灵活运用query函数,那么会便捷不少。...例如,下述例子中C C列中有个空格,直接用于字符串表达式会存在报错,此时可使用反引号加以修饰,同时查询条件中应用了@修饰符引用外部变量。当然,与eval中类似,这里当然也可以用f字符串修饰引用。...注意事项: query中也支持inplace参数,控制是否将查询过滤条件作用于dataframe本身; 与eval类似,query中也支持引用外部函数。
在公众号粉丝群里面,经常有同学问:为什么自己的爬虫明明设置了代理,但一访问网站就能被发现。我总结了几种常见的情况。...https://httpbin.org/ip', proxies={'http': 'http://IP:port'}).text print('使用代理:', resp) 运行效果如下图所示: 为什么使用了代理以后...如果大家有兴趣的话,我再写一篇文章来讲。 你的代理IP是服务器IP 有很多代理供应商,他们批量采购云服务器来搭建代理服务。例如国内的供应商会采购阿里云、腾讯云、华为云的服务器来搭建代理。...国内的云服务供应商的服务器IP地址是否公布过我不太清楚,但他们的IP范围肯定是跟家用IP不一样的。...服务器供应商的IP池被污染 有些人的爬虫写得非常垃圾,自以为有代理就无所畏惧,爬虫请求漏掉百出,网站即使不检查IP频率,也可以从其它特征知道这是爬虫请求,于是网站就会连带着这个代理IP一起封掉。
但如果有一天,你发现我写了这样一个类: class People: def say(self): print(f'我叫做:{self.name}') def __new...一个不能被初始化的类,有什么用? 这就要引入我们今天讨论的一种设计模式——混入(Mixins)。 Python 由于多继承的原因,可能会出现钻石继承[1]又叫菱形继承。...为了保留多继承的优点,但又摒除缺点,于是有了混入这种编程模式。 Mixins 是一个 Python 类,它只有方法,没有状态,不应该被初始化。它只能作为父类被继承。...不同的 Mixin 的方法互不重叠。...显然,这样写会报错,因为两个类的实例是不能比较大小的: 但在现实生活中,当我们说 某人比另一个人大时,实际上是指的某人的年龄比另一人年龄大。
大家好,又见面了,我是你们的朋友全栈君。...最近在用 OpenCV 识别棋盘棋子,基本的思路是这样的:先转灰度,再做高斯模糊和二值化,此时棋盘格上有的有棋子,有的无棋子;通过迭代腐蚀,消去棋子,再迭代膨胀回来,就得到了一个纯净的棋盘;识别棋盘,标定位置...就是提升图像的暗部细节。这与加曝处理是不一样的,加曝一般不区分图像的暗部和亮部。...奇怪的是,我在网上搜到的伽马校正函数看起来都很复杂,即便是 python 写的,也都得十几行甚至几十行,可我写的伽马校正函数只有一行。为什么会这样呢?是我理解的不对吗?...、伽马校正(gamma=2)的灰度二值化效果、伽马校正(gamma=3)的灰度二值化效果: 对于彩色图片,这个伽马校正函数依然有效。
除此之外,推荐看一下阮一峰的一篇博客:进程与线程的一个简单解释,用图解释十分生动形象。 为什么这个问题是面试高频? 既然这个问题是面试当中会被经常问到的,所以我去网上找一个答案,背出来不就好了。...我们来分析一下为什么众多面试官老是问这个问题,他应该并不是想听到一个对书本上概念的重复。 那么,他究竟想考什么?...在这里插入图片描述 同理,上图我们知道线程包含: 栈(堆栈):主线程的main函数、进行函数调用的参数和返回地址、局部变量等内容都会被压入栈内 PC(Program Couner):程序计数器,PC的指针指向代码所在的内存地址...总结 总之,如果上述内容你都了解,那肯定是不怕被问到(大佬,请收下我的膝盖);如果看了此篇文章之后,你能答出个大概,我相信面试官也会放过你,毕竟,我们也真的不是背书机器。...如果你能看到这,能否给我点个关注,点个赞让我也收到鼓励。如果觉得我写的内容有误,也欢迎评论指出。 注意,要敲黑板啦。 ? th (2).jpeg 进程是什么?它指的是一个运动中的程序。
回调机制的另一个好处是,在程序执行期间可以动态更改被调用的回调函数。 1、C语言中的回调 不同的编程语言有不同的实现回调的方式。...有两种不同的函数用于处理接收到的字节事件。在初始化函数中,函数指针被分配了应该使用的函数的地址用于处理事件。这是注册回调函数的操作。.../*指向回调函数的函数指针*/ uint8_t ( *Receive_Byte) ( void ); /* * 简化的初始化函数 * 这里函数指针被分配了一个函数的地址(注册回调函数) */ void...它是使用数据类型元素的数组实现的。数据类型是具有成员和成员的结构。用于为寄存器中的每个回调函数分配一个标识(唯一编号)。函数指针被分配与唯一关联的回调函数的地址。...//具有特定函数代码的回调函数如何被调用的示例 uint8_t execute_callback(uint8_t FuncCode, uint8_t * p_data_buf, uint16_t len
八年程序猿却说:我被裁只用了5分钟 感觉自己已经废掉了,一直在金融公司从事Java开发工作,之前薪资18K ,深圳。...月薪20K的Java程序员很厉害?八年程序猿却说:我被裁只用了5分钟 为什么不建议她选择薪酬最高的offer,反而去选择月薪20K的offer呢?...四、建立技术体系 在我的群里有这样一套技术学习体系供大家提供学习思路: ? 月薪20K的Java程序员很厉害?八年程序猿却说:我被裁只用了5分钟 ? 月薪20K的Java程序员很厉害?...八年程序猿却说:我被裁只用了5分钟 ? 月薪20K的Java程序员很厉害?八年程序猿却说:我被裁只用了5分钟 ? 月薪20K的Java程序员很厉害?八年程序猿却说:我被裁只用了5分钟 ?...月薪20K的Java程序员很厉害?八年程序猿却说:我被裁只用了5分钟 2018已经过去过去,2019还想一成不变吗?
一、写在开头在上一篇学习序列化的文章中我们提出了这样的一个问题:“如果在我的对象中,有些变量并不想被序列化应该怎么办呢?”...当时给的回答是:不想被序列化的变量我们可以使用transient或static关键字修饰;transient 关键字的作用是阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient...当时没有解释具体为什么static和transient 关键字修饰的变量就不能被序列化了,这个问题实际上在很多大厂的面试中都可能会被问及。我们今天在这篇中进行解释吧。...来说,在整个序列化过程中,它并未参与,原因是:我们在序列化与反序列化之间插入了属性的重新赋值操作,最后输出中打印出的是最新赋值,说明仅是调用了实例对象的属性值,而不是反序列化的结果。...四、总结好啦,今天针对为什么static和transient关键字修饰的变量不能被序列化进行了一个解释,下次大家在面试的时候再被问道就可以这样回答啦,不过,还有的BT面试官会问transient关键字修饰的变量真的不能被序列化吗
为什么setState是有时候是异步会不会有同步的呢?为什么多次更新state的值会被合并只会触发一次render?为什么直接修改this.state无效???...我们在调用setState时,也就调用了 this.updater.enqueueSetState,updater是通过依赖注入的方式,在组件实例化的时候注入进来的,而之后被赋值为classComponentUpdater...注释中讲到scheduleWork是异步渲染的核心,正是它里面调用了reqeustWork函数。...那如果我不是10000次,只有两次呢?...所以如果你不想拿到setState批量更新后的值,直接用回调函数就好啦。 4.
大家好,又见面了,我是你们的朋友全栈君。 本人写了一段用户授权的代码,出现错误:40029 不合法的oauth_code 问题。 上网找了答案说是调用了两次请求,发回的code相同,所以失效。...但是就是不知道为什么,我会发出两次请求。...wechat_redirect”%(APP_ID,REDIRECT_URI)) return HttpResponseRedirect(url) else: return HttpResponse(u’关注成功’) 授权后,回调函数获取...code,进行调用下面的函数进行请求获取access_token代码如下: def getUserByCode(APP_ID,APP_SECRET,code): url = “https://api.weixin.qq.com...类型转化为string类型 arr = json.loads(jsons) return arr 请问各位:我这样写问题出现在哪?
通过百度得知View有一个监听函数,亲测使用有效,特此记录,方便日后查阅。...中获取GridView的高度,在这个回调之前获取的高度都是0 //处理完后remove掉,至于为什么,后面有解释 gv_test.getViewTreeObserver() .removeOnGlobalLayoutListener...onGlobalLayout,很奇怪,为什么是三次?...后来有一次屏幕锁了,发现调用了两次。经过测试,app退到后台后重新进入会调用一次,屏幕锁屏后重新打开会调用两次(小米两次,努比亚1次),其中一次猜测是控件的可见性改变了。...解决的办法就是第一次回调后,就把回调remove掉,如:gv_test.getViewTreeObserver() .removeOnGlobalLayoutListener(this); 如有错误,敬请雅正
顾名思义,batcher是批量的意思,所以就是批量更新,为什么要批量更新呢,先看一下下面的情况: 我出来了 <div v-if="show && true"...批量很容易理解,都放到一个队列里,最后一起执行就是批量执行了,但是要理解MutationObserver的回调或者setTimeout的回调为什么能异步调用就需要先来了解一下JavaScript语言里的事件循环...微任务会在宏任务之前执行,即使宏任务的回调先被添加到队列里。...show的值都会触发这两个watcher的更新,也就是会调两次batcher.push(this)方法,第一次调用后会执行_.nextTick(flush)注册一个回调,连续两次修改show的值,会调用四次上述提到的...batcher.push(this)方法,因为重复添加的被过滤掉了,所以最后会有两个watcher被添加到队列里,以上这些操作都是同步任务,所以是连续被执行完的,等这些同步任务都被执行完了后就会把刚才注册的回调
128(0x80的10进制)的缩写,我们一般叫80中断,当调用了这个指令之后,CUP会停止当前的调度,保存当前的执行中的线程的状态,然后在中断向量表中寻找 128代表的回调函数,将之前写到寄存器中的数据...(write /参数)当作参数,传递到这个回调函数中,由这个回调函数去寻找对应的系统函数write进行写出操作!...为什么不是直接拷贝,而是多了一步记录文件信息的步骤呢?...而且NIO中每次写入写出不在是以一个一个的字节写出,而是用了一个Buffer内存块的方式写出,也就是说只需要告诉CPU 我这个数据块的数据开始的索引以及数据偏移量就可以直接读取,但是JVM通过垃圾回收的时候...我们在创建这个虚引用的时候传入了一个队列,在这个对象被回收的时候,被引用的对象会进入到这个回调!
里放入新的回调函数 Promise.resolve().then(flushCallbacks) } } 测试一下: // 第一次调用 then方法已经被调用了 但是 flushCallbacks...// 此时 callbacks 里的 3 个函数被依次执行。...我建议真正想看模板被编译后的原理的同学,可以去尤大开源的vue-template-explorer 网站输入对应的模板,就会展示出对应的 render 函数。...(diff 算法详解) 组件中的data为什么是函数 因为组件是用来复用的,JS里对象是引用关系,这样作用域没有隔离,而new Vue的实例,是不会被复用的,因此不存在引用对象问题 这句话反正我压根没听懂...这个问题我同样举个例子来方便理解,假设我们有这样的一个组件,其中的 data 直接使用了对象而不是函数: var Counter = { template: `<span @click="count
领取专属 10元无门槛券
手把手带您无忧上云