@
andj4cn 反证的过程可以考虑:没有 committed entry 的 node 因为自己更 up to date 而成为 leader -> leader 会保留自己有的 entries 而删掉自己没有的 entries -> follower 的 committed 的 entry 因为 leader 没有而需要被删掉(!!!!) 那么这个 committed entry 他就不是个 committed entry。
@
andj4cn 有了我在 6L 所说的这个基础,你再看下你的问题,就是说成功的 candidate 必须比 any other node 都更 up to date, 也就是说一个 entry 只要 committed 了,只要还有一个活着的 peer 有这个 entry,那么这个 candidate 就也得有这个 entry,否则他就没有比这个 peer 更 up to date (这里可以考虑下反证)。如果假设所有有这个 committed entry 的 peer 全死了,也就是说 > 1/2 的 peer 都死了,那么这个 candidate 就会得不到足够的投票。在前面两种情况下无论哪种,这个 candidate 都不能成为 leader。如果还有疑问,可以再继续讨论
@
andj4cn 我刚刚又考虑了一下,我发现你有一个地方理解可能有所偏差,Raft 不会说哪个节点 up-to-date 了,而是说某一个节点比另一个节点更 up-to-date,就是说 more up to date than another node 或者说 at least as up to date as another node. 另外也不是说某一个 node 比另一个 node 更 up-to-date 就表示这个 node 有所有 committed entries, 而是说某一个 node 要比 any other node*都*更 up-to-date 才能表示这个 node 有所有 committed entries. 你看下我理解的你的理解和你实际的理解是不是相同?
@
andj4cn 记住你会比较两个 term,第一个 term 是 node 本身的 term,如果这个 term 小了,会被直接拒绝 vote,被拒绝的 node 会 step back as follower。但是,尽管如此,如果这个 node 足够幸运,他还有机会在 update 了自己的 term 之后再次 request vote, 因为他已经把自己的 term 更新成别人比较高的 term 了,所以而后比较的将是第二个 term,即 last_log_entry 的 term,在这里才用到 up-to-date 的比较原则。你看你懂了没?
我之前说的不清楚,我丢失了一个“最后一个 entry ”,如果我重新说一遍这句话,我会这么说:`其他的包含当前节点没有的 committed 的 log, 那么这些其他节点就要么<最后一个 entry>的 term 比该节点<最后一个 entry>的 term 大,要么与该节点<最后一个 entry>同 term 但<log>比该节点 log 长`。原文:"Raft determines which of two logs is more up-to-date by comparing the index and term of the last entries in the logs. If the logs have last entries with different terms, then the log with the later term is more up-to-date. If the logs end with the same term, then whichever log is longer is more up to date"。你看现在你懂没懂?还没明白的话我再继续解释
因为假设某节点会 win the election 但是有一些 committed 的 log 它没有,那么根据 committed 的标准,一定会有等于一半总节点数的活着的节点含有了这个 committed 的 log。而因为这些节点有该节点没有的而且 committed 的 log, 那么这些其他节点就要么比该节点 term 大,要么与该节点同 term 但比该节点 log 长,因此则会比该节点更 up-to-date,从而导致有大于等于一半总节点数(有 committed log 的那些节点和失联的 leader 节点)的节点不给他 vote, 使其不能 win the election. 最后会是那些有更多 committed 的 log 的节点 win the election. 因此,win the election 的节点一定是含有所有 committed 的 log 的节点。不知道说的对不对,欢迎讨论。如果这回答写在知乎上,一定会有人说怎么又中英文混写了,不过会说这话的人估计也不会点进来这个问题,23333
我是这样做的:
1. 我用 Jupyter Notebook 写我要调用的功能, 但实现功能的函数本身写在 py 文件里.
2. py 文件用 Jupyter Notebook 的前端文本编辑器编辑, 虽然可以, 但功能有限, 补全, 批量修改都用不了; 用 SSH 和 Vim 虽然也可以, 但是相比常用的 Pycharm, Sublime Text, 少了一些直观的感受. 所以我在 Linux 的机器上开了一个 samba 的服务, 共享 Linux 的文件夹, 再在路由器开端口映射, 最后用 MacBook 的 Finder 连接服务器的功能加载这个远程文件夹, 这样就可以用 MacBook 的 Sublime Text 或其它文本编辑器实时的编辑了.
3. py 文件每次修改了以后, 在 Jupyter Notebook 执行程序块, 但 Jupyter Notebook 导入的还是老的 py 文件, 需要添加一行%load_ext autoreload 和%autoreload 2, 这样只有写新函数的时候才需要重新执行 import 的代码块, 其余时候直接执行 py 文件修改过的函数所在的代码块就可以了.
4. Dropbox 不是不行, 而是做不到实时修改实时变化, 因为 dropbox 的同步需要一定时间, 而 samba 就完美解决了这个问题, 因为你改的代码是在远程机器上的.
5. 代码同步的问题, 你在远程 Linux 机器调好以后, 开启 Dropbox. 这也仅仅是起到备份的功能而已.
C 的话, C 语言连好头文件以后吗, 首先编译成汇编语言, 这里面应该是不会变变量名的, 而后汇编语言转换成二进制, 这里就没有变量名什么事儿了, 执行的时候就不会影响速度. 但是编译的时候大概可能会影响速度, 要看编译器的优化程度了, 据说 Intel 自己的编译器比较牛.
哈哈,遇到过这个问题,你改下 sudoer 的内容,对于需要免密执行的命令程序加入 sudoer 里面就行了,比如 systemctl suspend 之类的
虽然不是最优解, 但是考虑下带深度限制的 dfs?
js 不懂,但理论上,从后往前生成中间结果,保存成表,如 case2 的 ddff,ddgg,ddhh,再用第一个 array 中的元素连接它,可以节约一些时间。
感觉这个帖子跟你们之前的招聘帖子的 JD 两个风格。是换 HR 了吗{手动 doge }
给大家换个思路:市面上成品音箱本质上是电源变压器+功放+喇叭的串联。那么电源变压器我们可以用笔记本的直流,功放可以买成品也可以用音频处理芯片自己做板子,喇叭可以买无源的自己觉得好看的各种尺寸的。这样在每个环节都可以按自己的需求来确定价格和效果,也更容易更换不满意的部分(模块化)。我自己买的一套 50+100+99,反正就听个响。音箱线直接可以用电子设计中几毛钱一根的鳄鱼夹导线代替,走的就是电流,也没太多讲究。实际上这东西没有想象的那么复杂。
ML 里代价函数不一定是这个符号,可以用 cost,也可以用 loss 损失,这个似然函数看起来本意是想用 likelihood 的 L,但又像英镑的符号。你想写哪个都可以,只要写清楚了含义就行,个人推荐 Cost 或 L ( loss )。
Thanks! But I don't think i'm qualified, maybe two years later!