在头文件里使用 #ifndef #define #endif 可以避免重复定义,可是如果在其中定义变量向下面这样 #ifndef _TEST_H #define _TEST_H int a; #endif...如果有多个文件引用了这个头文件的话就会提示重复定义。...这是因为编译器需要经过预处理、编译、汇编、连接才可以生成可执行程序,在编译器执行链接这一步骤时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。...但是如果需要使用的全局变量较多的话,放在主文件前面显得比较臃肿,如果想使用这些全局变量有不想使用大量的extern的话,可以单独建一个.c文件,将需要的变量放入其中,然后建一个头文件(.h文件)在所有的变量声明前加上...然后在需要调用这些变量的文件中声明调用这个.h文件就可以了。这样就可以达到目的了。
我告诉他可以每块盘跑一个 TiKV 实例,这样实现了多磁盘容灾,就不需要组 RAID 了。 当然最后一句只是玩笑话,毕竟 TiDB 是个数据库,只能做到数据容灾。...比如文件系统基于 TiKV 的优势是什么?又比如 CAP 应该如何取舍?相比于常见的分布式文件系统存储后端,我认为 TiKV 最大的优势是天然支持分布式事务,基于此我们可以保证文件系统的严格一致性。...TiKV 上,可以在读取大段数据时直接使用 TiKV 的 scan 接口一次扫描出所需的文件块。...git 远程仓库可以直接使用 TiFS 存储项目并运行 git 任务,比如 rebase 或 cherry-pick,而无需先转存到本地文件系统;多节点应用读写同一文件时可以直接使用 flock 来解决冲突...但 pjdfstest 并不能覆盖读写正确性和并发下正确性,后面需要再跟进其它的测试。 从理论上来说 TiFS 的读写性能的影响因素主要有三个:文件系统块大小、网络带宽延迟和负载块大小。
说明文档残缺 Kubernetes目前在快速迭代,国内可能最新的文档才使用0.6.2的版本,可是当下的版本都已经多了0.17.0了,中间有的服务的启动参数稍稍的发生了变化,但是仅凭-h参数打印出来的说明和官方的...proxy需要的nat我们也不能提供。...联想到我们目前的情况,我又想起我们当时为什么要下力气弄docker,经理对我们说:“一切都要以解决问题为目标” 那我们当时需要解决的问题:1.解决发布效率底下,发布复杂混乱的问题,2.解决业务包的升级问题
linux信号 而为什么不能在容器中kill 1号进程呢?进程在收到信号后,就会去做相应的处理。 第一个选择是忽略这个信号,但有两个信号例外:SIGKILL 和 SIGSTOP,进程不能忽略。...在没有别的参数时这个信号类型默认为SIGTERM,是可以被捕获的 SIGKILL(9) Linux 里两个特权信号之一,不能被忽略也不能被捕获。进程一旦收到 SIGKILL就要退出。...为什么在容器中不能kill 1号进程? 对于不同的程序,结果是不同的。把c程序作为1号进程就无法在容器中杀死,而go程序作为1号进程却可以。...如果信号被忽略了,那么 init 进程就不能收到指令了。 想要知道 init 进程为什么收到或者收不到信号,就要去看 sig_task_ignored()的实现。...0000000000004000 [root@043f4f717cb5 /]# kill 1 # docker ps CONTAINER ID IMAGE COMMAND CREATED 重点总结 “为什么我在容器中不能
Yodonicc无论你对async/await的立场如何,我都想向你说明,根据我的经验,为什么async/await往往会使代码复杂度更高,而不是更低。...我看了第一种情况,发现我们在两个不同的地方保存了两块不同的数据,然后只是返回一个对象。唯一可以优化的地方是保存函数。没有任何其他选择。我看了第二个例子,也有同样的想法。唯一可以优化的地方是保存函数。...也许只是因为我对Promise的太熟悉了,但我看了第三个例子,我很快看到了一个机会。我看到我们在连续调用save,尽管其中一个并不依赖于另一个。 我们可以将我们的两个save调用并行化。...JavaScript中的try块会立即将这部分代码排除在许多引擎优化之外,因为代码不能再被分解成确定的片段。...但后来我真的看到了一些promise的代码,它们看起来惊人地像回调地狱。我很困惑,为什么有人会这样使用promise。最终,我得出结论,有些人对promise的工作原理有一个非常基本的误解。
随着深入地使用了,发现真的是很不错的一款 Markdown 编辑工具。下面说说目前发现的一些吸引我的特点。...图片功能 这是我最喜欢的一个功能,也是我决定使用 Typora 的主要原因。...Typora 的编辑区域是由 CSS 样式来控制的,我使用的是 GitHub 主题,样式文件路径为:/Users/fengwei/Library/Application Support/abnerworks.Typora.../themes/github.css ,在该文件中搜索 #write ,下图红框的三处修改为想要的宽度即可: 总结 Typora 的功能非常丰富,上面记录的是比较吸引我的一些特点,更多的功能需要在深入使用的过程中去慢慢发现...现在最新的 Typora 需要收费,89 元可以支持三个设备,这个价格我觉得很亲民了,而且还是买断式的。如果不想使用收费版,仍然可以使用之前的测试版。 Typora 会成为接下来我的主力写作工具。
Android 复习笔记目录 唠唠任务栈,返回栈和生命周期 唠唠 Activity 的生命周期 扒一扒 Context 为什么不能使用 Application Context 显示 Dialog?...本文永久更新地址: https://xiaozhuanlan.com/topic/3958126407 目录 为什么不能使用 Application Context 显示 Dialog?...为什么不能使用 Application Context 显示 Dialog?...在上一篇文章 扒一扒 Context 中遗留了一个问题: 为什么不能使用 Application Context 显示 Dialog ?...这一块的源码我就不在文章里一点一点追了。大家可以对着下面的流程图自己啃一下源码。
Android 复习笔记目录 唠唠任务栈,返回栈和生命周期 唠唠 Activity 的生命周期 扒一扒 Context 为什么不能使用 Application Context 显示 Dialog?...本文永久更新地址: https://xiaozhuanlan.com/topic/3958126407 目录 为什么不能使用 Application Context 显示 Dialog?...为什么不能使用 Application Context 显示 Dialog?...在上一篇文章 扒一扒 Context 中遗留了一个问题: 为什么不能使用 Application Context 显示 Dialog ?...每次思考下一篇的主题都会想很久,大家有什么好的面试题可以评论在留言区,这都将成为我的写作素材。
在代码中,我们会使用 async/await 从第三方 API 获取数据。如果你对 async/await 熟悉的话,你会知道,每个 async 函数都会默认返回一个隐式的 promise。...Instead, write the async function inside your effect and call it immediately: 这就是为什么不能直接在 useEffect 中使用...因此,我们可以不直接在 useEffect 里使用用 async 函数,需要把函数提取出来,像下面这样: import React, { useState, useEffect } from 'react
Configuration的注解,为什么还要写spring.factories文件?”...) public @interface SpringBootApplication { …… } 其中比较重要的是@EnableAutoConfiguration和@ComponentScan两个注解...看到这里,想必已经了解@EnableAutoConfiguration注解的工作原理,回到最初的话题,“为什么要写spring.factories文件?”...,不难得出spring.factories文件是帮助spring-boot项目包以外的bean(即在pom文件中添加依赖中的bean)注册到spring-boot项目的spring容器的结论。...而spring.factories文件,则是用来记录项目包外需要注册的bean类名。
看到这个标题的读者,在你们的心里多多少少都有自己的答案,下面说一下我的答案....我这里安装了jclasslib Bytecode viewer插件,方便查看字节码....下面是测试代码,一个静态方法query,一个普通方法shadow,这两个方法的参数和函数体完全一样. // 静态方法 public static void query(String year) {...month = 12; String address = "Jiangsu"; System.out.println(address); } 执行编译,如下 查看字节码,如下 详细看下两个方法的局部变量表
不说了,直接开怼实验 创建一个yaml文件: [root@k8s-master ~]# cat pod-1.yaml apiVersion: v1 kind: Pod metadata: name...Pod [root@k8s-master ~]# kubectl apply -f pod-1.yaml pod/test-pod created 查看到最开始我们创建Pod(test-pod)里的两个容器是成功了...nginx-app-756ffb5cc8-bgcbh 1/1 Running 0 4d17h nginx-app-756ffb5cc8-smztw 1/1...,且状态为Error了,这是因为两个容器的端口被占用了。...nginx-app-756ffb5cc8-bgcbh 1/1 Running 0 4d17h nginx-app-756ffb5cc8-smztw 1/1
小勤:大海,为什么我这两个简单的表建立数据关系有问题啊? 大海:啊?出什么问题了?...我看看: 小勤:真的嘢!里面有两个小米,一个是宏仁生产的,一个是德昌生产的。但是,产品名称重复不行吗? 大海:当然不行啊,你产品名称是重复的,我怎么知道订单明细表里的产品应该对应你产品表里哪一个啊?...让这两个小米要打一架?谁赢算谁? 小勤:那用vlookup都不会出错,能查到结果啊! 大海:那你能保证用vlookup查到的结果是你想要的吗?...大海:所以说,仔细想想,这种逻辑是不能成立的。 小勤:啊,知道了,看来我还是得把订单明细表里的产品ID放出来,不然做出来的数据分析都是不对的。 大海:很棒,这么快就想到产品ID的问题了。...只是我没想到我的数据那么快就存在这种情况。 大海:呵呵,名称重复的情况太正常了,所以尽可能都用ID编码。
但如果有一天,你发现我写了这样一个类: class People: def say(self): print(f'我叫做:{self.name}') def __new...显然,这样写会报错,因为两个类的实例是不能比较大小的: 但在现实生活中,当我们说 某人比另一个人大时,实际上是指的某人的年龄比另一人年龄大。...所以如果要让这两个实例比较大小,我们需要实现多个魔术方法: class People(): def __init__(self, name, age): self.age = age...def __ge__(self, other): return self.age >= other.age 运行效果如下图所示: 但如果这几个魔术方法会在多个类中使用...return self.age > other.age def __ge__(self, other): return self.age >= other.age 然后在使用
来源:http://suo.im/4XaI8Q 编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。...因为foreach的本质就是使用的迭代器Iterator,所有的Collection集合类都会实现Iterable接口。 找到ArrayList类的iterator()方法 ?...使用自己的Itr内部类,并且实现了Iterator接口 迭代器的本质是先调用hasNext()方法判断存不存在下一个元素,然后再使用next()方法取下一个元素 ?...Itr内部类实现 上面arraylist1为什么能remove成功呢,其实它只循环了一次,所以成功了。...arraylist2为什么remove失败呢,因为他在循环第二次的时候,也remove成功了,但是第三次判断next的时候cursor的值为2导致不等于现在的size 1,所以执行了next方法,最重要的来了
来源:http://suo.im/4XaI8Q 编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。...因为foreach的本质就是使用的迭代器Iterator,所有的Collection集合类都会实现Iterable接口。...找到ArrayList类的iterator()方法 使用自己的Itr内部类,并且实现了Iterator接口 迭代器的本质是先调用hasNext()方法判断存不存在下一个元素,然后再使用next()方法取下一个元素...Itr内部类实现 上面arraylist1为什么能remove成功呢,其实它只循环了一次,所以成功了。...arraylist2为什么remove失败呢,因为他在循环第二次的时候,也remove成功了,但是第三次判断next的时候cursor的值为2导致不等于现在的size 1,所以执行了next方法,最重要的来了
当需要比较A , B两个文件 , A文件中存在 , 并且把也在B文件中存在的行去除掉 , 可以使用这个awk的用法来 awk '{if(ARGIND==1) {val[$0]}else{if($0...in val) delete val[$0]}}END{for(i in val) print i}' A B 使用awk的同时处理多文件功能,配合数组变量来进行处理 先扫描文件A,把文件A中的每行作为数组的...key放入数组 再扫描文件B,判断B中的每行是否存在于数组中,如果存在就删除这个数组元素 最后统一打印数组中的key
链接:http://suo.im/4XaI8Q 编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。...使用自己的Itr内部类,并且实现了Iterator接口 迭代器的本质是先调用hasNext()方法判断存不存在下一个元素,然后再使用next()方法取下一个元素 ?...Itr内部类实现 上面arraylist1为什么能remove成功呢,其实它只循环了一次,所以成功了。...arraylist2为什么remove失败呢,因为他在循环第二次的时候,也remove成功了,但是第三次判断next的时候cursor的值为2导致不等于现在的size 1,所以执行了next方法,最重要的来了...我是如何用 Redis 做实时订阅推送的?
来源:blog.csdn.net/belongtocode/article/details/100635246 背景 平时工作中大家经常使用到boolean以及Boolean类型的数据,前者是基本数据类型...,后者是包装类,为什么不推荐使用isXXX来命名呢?...工作中使用基本类型的数据好还是包装类好 咱们举个例子,一个计算盈利的系统,其盈利比例有正有负,若使用了基本类型bouble定义了数据,当RPC调用时,若出现了问题,本来应该返回错误的,但是由于使用了基本类型...若使用了包装数据类型Double,当RPC调用失败时,会返回null,这样直接就能看到出现问题了,而不会因为默认值的问题影响判断。...其实阿里java开发手册中对于这个也有强制规定: 因此,这里建议大家POJO中使用包装数据类型,局部变量使用基本数据类型。
来总结一下我RxJava遇到的坑,或者说我为什么不在推荐使用RxJava。相信熟悉或者关注我的朋友,绝大多数都是因为RxJava。所以看到这个标题你已经会惊讶。...为什么突然不再支持RxJava了呢? 先讲讲历史 在我的文章中已经讲过很多次RxJava诞生之初就是因为异步。...详细关于这段可以参考我的知乎回答:你会在实际工作中使用 rxjava 吗?...你永远无法预测你同事的RxJava水平 上面几点可能有点抽象,而这点和接下来的几点都是我在实际工作中遇到的实际情况。首先就是你并不能预测或者要求你的同事RxJava到达什么样的水平。...这个Bug还是后台反馈给我的说为什么android每次都会发两个一模一样的请求?其实问题就出在stationLine和station并没有共享结果。造成了每次请求都要发两次。
领取专属 10元无门槛券
手把手带您无忧上云