问:我们有什么?
答:从主机收集的统计信息。
问:我们想得到什么?
答:网络拓扑! 更准确地说,您需要为RingSync 构建正确的对等方(主机) 链 。
我们必须提出一种算法,该算法首先将统计信息转换为网络拓扑,然后转换为对等链。 到目前为止,该算法如下所示:
–-[**]--> --[**]-->
如果您喜欢阅读GitHub Pages上的 “第1部分” ,那么这里是GitHub Pages 上该部分的链接 。
警告 :以下是我在“第1部分”中警告过的相同的Habr分析器工件 。
注意 :我将使用“ –-[???]-->
”代替“ –-[**]-->
–-[???]-->
”。
收集到的统计数据向我们显示了在哪些主机上接收广播流量的速度下降了。 例如,查看网络“ N2_2”(上一篇文章“ LLTR第1部分”中的“ Network
”)中零迭代的结果:
{300,164,164},
2个主机状态在此处清晰可见:
- 正常速度(值“
300
”)- 无反应 ; - 速度下降(值“
164
”)- 有反应 。
我在干什么 要二值化! 如果将不存在反应的编码为0 ,并将存在 反应的编码为1 ,则可以将一次迭代中主机的所有反应都放入一个变量中( 32-512位 [ AVX-512 ])。 除了节省内存(和缓存所用的空间)之外,这还将提高处理速度-特定迭代( SIMD )的所有主机响应将在一条指令中立即处理。
注意 :因为 对于大量主机使用LLTR Basic非常昂贵( 请参阅“ LLTR Part 0 :: LLTR Advanced”部分的开头 ),然后所有内容都可以放入64位 x86‑64寄存器中。
注意 :在指向另一篇文章(另一部分)中该部分的链接的文本中,我将添加以下格式的零件号:“ LLTR零件编号 :: ‹区域名称› ”。 在链接的“ title
”中,我将写下该零件的名称,例如,“ LLTR Part 0 ::”,“自动检测网络拓扑并弹出不受管理的交换机”。 不可能完成的任务?”
让我们以零迭代为例,看看二值化后的样子:
{300,164,164} --[]--> 011
非常紧凑,但是在查看所有迭代列表时,我希望“ 1
”( 存在反应 )立即引起我的注意。 现在,“ 1
”在背景“ 0
”下并不突出( 例如 ,虚假数据):
0101011010110 1100010110010 0101101010111 0100010110100
为了突出显示“ 1
”,我引入了表示法:
- “
1
”表示1- 有反应 ; - ”
.
”表示0- 无反应 。
让我们再次看一下“伪数据”:
.1.1.11.1.11. 11...1.11..1. .1.11.1.1.111 .1...1.11.1..
好得多( 恕我直言 )。
目前,该算法如下所示:
–-[]--> --[???]--> --[???]-->
我们将在本文的末尾保留二值化的详细信息,并专注于算法的其余部分。
根据特定的输入/输入数据(特殊情况,边界条件;根据TDD进行的测试)创建算法最容易。 在我们的例子中,初始数据取决于网络拓扑,因此您需要建立一个既小又包含不同交换机连接方案( 星形 , 串行连接 )的网络。 也许其中可以包含一些特殊的东西...总的来说,想象力吸引了这样的网络(元素的表示法与“ LLTR第0部分::拓扑:“交换机的串行连接” ” 部分结尾处使用的表示法相似):
注意 :查看此网络时,出现问题“如果其中一个交换机...,是否可以在此拓扑中进行全面扫描”(在“ LLTR Part 0 ::拓扑:“交换机的串行连接 ” 部分的末尾附近),您会注意到没有主机直接连接到其中一台交换机。 而且,没有问题,因为 另外3台交换机连接到该交换机(我只计算了“从下面”连接的交换机,没有考虑到它是从“上面”连接到另一台交换机的事实),每个交换机都有主机。
但是,在此图中,有一些额外的(分散注意力的)细节。 我将通过删除来清理它:
在此,“无主机”开关立即可见。 另外,我安排了所有交换机,使它们中的主机在垂直方向上不会相互重叠。 如果将来我不想以文本条目“ .....1......
”的形式而是以图表的形式(一个垂直方向上只有一个主机)来显示“主机反应”,这将很有用:
现在想象一下在扫描该网络的所有迭代结束时获得的统计信息。 网络中有12个主机(不包括广播主机),因此,我们将获得132次迭代的数据。 但是,并非所有迭代结果都对我们有用,例如,它们将无用:
清洗后,在所有132个迭代结果中,将仅保留5个 (主机响应):
1111111111.. 11111111.... ..111....... .....111.... 11..........
注意 :为清楚起见,我按从大到小的“ 1
”的顺序排列了迭代。
该算法开始看起来像这样:
–-[]--> --[ ]--[ ]--[???]--> --[???]-->
重置点
我本来打算将所有这些内容都包含在剧透中,但最终我意识到这是故事的重要组成部分,阅读时最好不要错过。
¬( 阅读时请不要跳到大脑 :丛
[重置点]在剩余的5个迭代结果中,前两个引起注意:第一个包括第二个,第二个包括剩余的三个较低的。 在这里,我想起“ LLTR第0部分::拓扑:“开关的串行连接” ”中的“阴影”。 在同一部分中,在每次迭代结束时,我们根据刚获得的数据形成(或不形成)新的簇。 现在我们需要做同样的事情。
但是我们如何形成新的集群? 实际上,当前迭代的“ 1
”主机的所有(不是单个)反应都是“新集群”,我们只需找到与现有集群的交集(“∩”;不是空的“∅”)即可从较大的集群中删除(“∖”)较小群集中包含的群集主机。
但是,在我们的操作中有一个条件/分支(如果):您需要确定哪个群集更大,然后执行简单的操作(A∖B)-从较大的群集(A)中减去较小的(B)。 代表由于分支预测不正确(如果其中根本有“分支预测块”)而需要重置管道而造成的较长管道CPU的折磨,我几乎决定使用 “?:
” ,但是在那时...
我站在马桶上挂钟。 突然滑倒,在水槽上打了个头,当我醒来时,我有了一个异象,一个脑中的照片,一个异象-一个流驱动器流分离器( 回到未来 ) :
并立即看到他在重叠集群示例中的工作(更确切地说,一组(集群)严格包含在另一组中)“ ”):
.....11..... - a ..11111111.. - b ..111..111.. - c=a^b ............ - aa=a&c ..111..111.. - bb=b&c .....11..... - cc=a&b
不相交的簇:
..111....... - a .......111.. - b ..111..111.. - c=a^b ..111....... - aa=a&c .......111.. - bb=b&c ............ - cc=a&b
事实证明:
- “
aa
”包含“ aa
”特有的元素; - 在“
bb
”中-对于“ b
”是唯一的; - 在“
cc
”中-与“ a
”和“ b
”相同。
集群相交的另一个示例(“不可能”,但很好的示例):
...1111..... - a .....1111... - b ...11..11... - c=a^b ...11....... - aa=a&c .......11... - bb=b&c .....11..... - cc=a&b
注意 :这种响应(主机响应)不在源数据中。
同样,您可以摆脱需要 :
.....11..... - a .....11..... - b ............ - c=a^b ............ - aa=a&c ............ - bb=b&c .....11..... - cc=a&b
但是,稍后...
头部撞到水槽后不再受伤,头脑清醒,出现明显的问题...
在输入处,我们有2个变量(迭代结果/宿主反应/簇/集合/ ...),但是输出中已经有3个变量,并且其中至少有一个为空(“∅”)。 如果您没有立即摆脱“∅”,那么将来您将不得不将它们包括在处理中。 因此,最好立即消除“∅”。 但是怎么做呢? 使用条件/分支! ...总的来说,我回到了开始的地方。 另外,如果一切都如上所述完成,加上它摆脱了“,”,那么最后我们得到:
1111111111.. 11111111.... ..111....... .....111.... 11..........
这是:
........11.. - "............", :( ..111....... .....111.... 11..........
现在该问一个问题:“如何从中获得网络拓扑?” 现在,该数据可以“说明”特定主机属于哪个群集(即该主机连接到的交换机),但是现在该数据完全缺少有关交换机拓扑结构的信息(即,如何连接)彼此之间切换)-我们在数据转换期间丢失了此信息。 另外,最右边的2个主机属于哪个群集(交换机)? 如果我们将每条线路视为一个单独的群集(或指示哪些主机已连接到特定的交换机),那么事实证明这2个极限主机未在任何地方连接! 此外,我们的网络上有6台交换机,剩下4条线路,另外2条线路在哪里? 我们删除了其中一个(如上面的评论所述),而在另一个中,应该有“最右边的2个主机”。
[ goto reset point ]进一步发展这个想法是没有用的。 死角(git分支)。 您将不得不回滚到“重置点”标签,忘记它之后的所有内容,而将这个分支留给故事。
现在,为了不陷入另一个“死枝”,您需要确定内存中网络拓扑的最终结构(表示形式)。 也就是说,在“网络拓扑”时我们想要得到的是:
–-[]--> --[ ]--[ ]--[???]--> <strong> </strong> --[???]-->
首先 ,所有主机都必须存在:
<strong>..........11</strong> <-- 1111111111.. 11111111.... ..111....... .....111.... 11..........
其次 ,必须指出父母(每个集群的父集群;此刻: parent⊋child ;在网络图上,我将父母置于孩子上方)(集群编号添加在左侧):
0) ..........11 parent: ? 1) 1111111111.. parent: ? 2) 11111111.... parent: 1 3) ..111....... parent: 2 4) .....111.... parent: 2 5) 11.......... parent: 2
注意 :如果您在这里注意到一些奇怪的事情,请将此网络的图表与此数据进行比较,那么您就喜欢我。
剧透,最好在阅读整个列表之前不要打开
实际上(根据该图),集群1的父级是集群0,但是不满足条件“ 父级 ⊋ 子级 ”。 也许在“ 第一个 ”中我们犯了一个错误,而不是“ ..........11
”,值得加上“ 111111111111
”吗?
第三 ,应该有一个“根”父母将各个树 (即forest )链接到一棵树中:
-1) 111111111111 0) ..........11 parent:-1 1) 1111111111.. parent:-1 2) 11111111.... parent: 1 3) ..111....... parent: 2 4) .....111.... parent: 2 5) 11.......... parent: 2
第四 ,最好有每个父母的孩子名单:
-1) 111111111111 children: 0,1 0) ..........11 parent:-1 1) 1111111111.. parent:-1, children: 2 2) 11111111.... parent: 1, children: 3,4,5 3) ..111....... parent: 2 4) .....111.... parent: 2 5) 11.......... parent: 2
最后 ,现在可以将孩子排除在父母之外:
-1) ............ children: 0,1 0) ..........11 parent:-1 1) ........11.. parent:-1, children: 2 2) ............ parent: 1, children: 3,4,5 3) ..111....... parent: 2 4) .....111.... parent: 2 5) 11.......... parent: 2
现在每一行描述一个集群,即 指向连接到同一交换机的主机。 但是,等等,我们的网络中有6台交换机,并且有7个集群! 最后,是时候从“ 扰流板,最好先阅读整个列表 ” 之前打开扰流板的文本,并纠正这种情况:
0) ..........11 children: 1 1) ........11.. parent: 0, children: 2 2) ............ parent: 1, children: 3,4,5 3) ..111....... parent: 2 4) .....111.... parent: 2 5) 11.......... parent: 2
此数据恰好是“网络拓扑”-它描述了交换机的树,您可以从中确定连接到特定交换机的所有主机。
–-[]--> --[ ]--[ ]--[???]--> <strong> </strong> --[???]-->
仍然需要了解如何将数据带入此表单。 实际上,我们所做的一切(首先,第二,...)都可以转换为算法:
- “首先”(经过扰流器校正后,它类似于“第三次”动作)- 添加“根”群集 “
111111111111
”( 通用 ),包括(林中所有树的主机∪与广播主机位于同一台交换机上的主机),即 它包括网络上的所有主机。 - “第二”- 为每个群集搜索父级 ;
- “第四”- 为每个父母建立一个孩子名单 ;
- “最后”-将孩子排除在父母之外 。
现在,您可以将这些操作添加到常规算法中(稍微改变外观):
● ● [] ► [ ] [ ] ► / [ "" ] ► / [ ] [ ] [ ] ► ● [???] ► ●
替代视图
● ► [] ▬ ► [ ] [ ] ▬ / ► [ "" ] ▬ / ► [ ] [ ] [ ] ● ► [???] ● ●
让我们看看如果将此算法应用于另一个网络会发生什么。 我想从“ LLTR第1部分::更多具有不同拓扑的网络,添加新网络 ” 部分中获取Network_ serial
网络及其仿真结果(统计信息)。
注意 :为什么选择此特定网络? 它很大,从它收集的数据中也有缺陷(请参见扰流板“网络的模拟结果”末尾)。
走吧
二值化
主机反应:
.111111.. .111111.. .111111.. .111111.. .111111.. .111111.. .......11 .......11 ..1...... ...1111.. ...1111.. ...1111.. ...1111.. .......11 .......11 1........ ...1111.. ...1111.. ...1111.. ...1111.. .......11 .......11 1........ .1....... ....1.... .....11.. .....11.. .......11 .......11 1........ .1....... ..1...... .....11.. .....11.. .......11 .......11 1........ .1....... ..1...... ...1..... ......1.. ......... ......... ......... .1....... ..1...... ...1..... ....1.... ......... ......... ......... .1....... ..1...... ...1..... ....1.... .....1... ........1 1........ .111111.. .111111.. .111111.. .111111.. .111111.. .111111.. 1........ .111111.. .111111.. .111111.. .111111.. .111111.. .111111.. .......1.
从单一反应中纯化
.111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .......11 --> .......11 .......11 --> .......11 ..1...... --> ...1111.. --> ...1111.. ...1111.. --> ...1111.. ...1111.. --> ...1111.. ...1111.. --> ...1111.. .......11 --> .......11 .......11 --> .......11 1........ --> ...1111.. --> ...1111.. ...1111.. --> ...1111.. ...1111.. --> ...1111.. ...1111.. --> ...1111.. .......11 --> .......11 .......11 --> .......11 1........ --> .1....... --> ....1.... --> .....11.. --> .....11.. .....11.. --> .....11.. .......11 --> .......11 .......11 --> .......11 1........ --> .1....... --> ..1...... --> .....11.. --> .....11.. .....11.. --> .....11.. .......11 --> .......11 .......11 --> .......11 1........ --> .1....... --> ..1...... --> ...1..... --> ......1.. --> ......... --> ......... ......... --> ......... ......... --> ......... .1....... --> ..1...... --> ...1..... --> ....1.... --> ......... --> ......... ......... --> ......... ......... --> ......... .1....... --> ..1...... --> ...1..... --> ....1.... --> .....1... --> ........1 --> 1........ --> .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. 1........ --> .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .111111.. --> .111111.. .......1. -->
清除重复项(我们得到“集群/森林”):
.111111.. .......11 ...1111.. .....11.. .........
另外, 为方便起见 ,我将按数量“ 1
”的降序排序:
.111111.. ...1111.. .....11.. .......11 .........
注意 :可能值得在算法中包括排序。 你觉得呢
添加一个“根”集群(我们得到“集群/树”):
111111111 .111111.. ...1111.. .....11.. .......11 .........
它包括2棵树的主机(网络的左部分“ .111111..
”和右“ .......11
”部分)和1台主机(“ 1........
””位于一棵树上)与广播主机切换)。
父级搜索每个集群:
0) 111111111 1) .111111.. parent: 0 2) ...1111.. parent: 1 3) .....11.. parent: 2 4) .......11 parent: 0 5) ......... parent: 4
注意 :这就是数据缺口带来的负面影响的所在-第4个群集成为第5个群集的父对象! 通常,任何集群都可以成为第五集群的父集群,因为 它是空的(∅)。
为每个父母建立一个孩子的清单:
0) 111111111 children: 1,4 1) .111111.. parent: 0, children: 2 2) ...1111.. parent: 1, children: 3 3) .....11.. parent: 2 4) .......11 parent: 0, children: 5 5) ......... parent: 4
将孩子从父母中排除:
0) 1........ children: 1,4 1) .11...... parent: 0, children: 2 2) ...11.... parent: 1, children: 3 3) .....11.. parent: 2 4) .......11 parent: 0, children: 5 5) ......... parent: 4
在这一步,我们应该得到一个“网络拓扑”。 我们知道了。 如果我们只对主机的位置感兴趣,那么这种“网络拓扑”对我们来说是非常令人满意的。 但是,我们的网络中出现了另一台交换机,其中0台主机!
要解决所有问题,在第一步中就消除了这些“数据缺陷”就足够了。 可以在“二值化”后立即完成:
● ● [] ► [<strong> (∅), (⦱)</strong>] [ ] [ ] ► / [ "" ] ► / [ ] [ ] [ ] ► ● [???] ► ●
我们删除空集(∅;“ .........
”),但是为什么要删除Universe(⦱;“ 111111111
”)? 当我们开始实施“二值化”阶段时,答案将变得显而易见。 “二值化”实施方式的不同变体可以在同一数据(具有所描述缺陷的数据)上产生“ .........
”和“ 111111111
”。 而且,因为 不可能在正确的输入数据中获得“ 111111111
”,而要获得“ .........
”,则可以删除所有“ 111111111
”(此外,它们不携带任何信息,除了数据中有“缺陷”)。
如果将此算法(经过改进,修正)应用于同一网络(“ Network_ serial
”),则“网络拓扑”将如下所示:
0) 1........ children: 1,4 1) .11...... parent: 0, children: 2 2) ...11.... parent: 1, children: 3 3) .....11.. parent: 2 4) .......11 parent: 0
Note : , . , . , 2 ( “switch0”), 1 ( 2 ):
“ ”
0) 11........ children: 1,4 1) ..11...... parent: 0, children: 2 2) ....11.... parent: 1, children: 3 3) ......11.. parent: 2 4) ........11 parent: 0
0) 1...... children: 1,4 1) .1..... parent: 0, children: 2 2) ..1.... parent: 1, children: 3 3) ...11.. parent: 2 4) .....11 parent: 0
“ ”. “ ” “ ”. RingSync , ( : Pre‑order ). “ ” :
1 1........ hostS/seed -> host0 -> . .11...... host1 -> host2 -> . ...11.... host3 -> host4 -> . .....11.. host5 -> host6 -> . .......11 host7 -> host8/leech
Note : (, ) , broadcast .
, “ ” ( ), (“ Network_ serial
”). ( ), . :
, “ ” (“ ”):
..........11 1 hS/seed -> h10 -> h11 -> ........11.. . h8 -> h9 -> ..111....... . h2 -> h3 -> h4 -> .....111.... . h5 -> h6 -> h7 -> 11.......... . h0 -> h1/leech
( “ ”) . , – 2, .. (∅). , “ ” , “ ” ( , ), (∅) ? , : ‑, “” , ( , ;); ‑, ( ).
, “ ” , “ ”
我试图将算法(以及排序)应用于此网络,并且在获得“网络拓扑”时,群集的位置开始让我想起很多 ...
, “ ”, …
Note : , , . .
我什至更改了连接到一台交换机的对等连接的顺序(它们仍然可以按任何顺序连接),但这都没有帮助。
对等链:
..........11 1 hS/seed -> <strong>h11</strong> -> <strong>h10</strong> -> ........11.. . <strong>h9</strong> -> <strong>h8</strong> -> ..111....... . h2 -> h3 -> h4 -> .....111.... . h5 -> h6 -> h7 -> 11.......... . h0 -> h1/leech
“ Network_ serial
”…
, :
switch0 -> switch1 -> switch2 -> switch3 -┐ switch4 <- switch0 <- switch1 <- switch2 <-----------┘
… “” “ switch0 <- switch1 <- switch2
”. :
switch0 -> switch4 -┐ switch3 <- switch2 <- switch1 <- switch0 <-----------┘
:
, , , !
Note : , .. “ ”.
Note : “ ”, “ ” ( ; – L0 ) – .
, “ ” .
Note : , – .
() : “ ” ( LLTR 0:: : “ ” ) :
- – ;
- – ;
- – ( );
- – ( ) – , .
Note : “ – ” “ , ”, , , .
Note : – ( ). – ( ) . , ( ): ( ); ( ).
:
● ● [] ► [ (∅), (⦱)] [ ] [ ] ► / [ "" ] ► / [ ] [ ] [ ] ► ● [ /] ► ●
“ ” “ Network_ serial
” :
1 1........ hostS/seed -> host0 -> . .......11 host7 -> host8 -> . .11...... host1 -> host2 -> . ...11.... host3 -> host4 -> . .....11.. host5 -> host6/leech
“ ”, .
“ ” . “ ” :
s0) ..........11 1 hS/seed -> h10 -> h11 -> s1) ........11.. . h8 -> h9 -> s3) ..111....... . h2 -> h3 -> h4 -> s4) .....111.... . h5 -> h6 -> h7 -> s5) 11.......... . h0 -> h1/leech
? , , , ( ):
s0 -> s1 -> s2 -> s3 -┐ ┌- s4 <- s2 <------┘ └------> s2 -> s5
Note : “ s#
” “ ” (. ).
# TL;DR
:
- (~~ k‑medoids ~~) + (∅), (⦱) + :
a min
a max
- 2
- + (∅), (⦱)
- :
- ( : )
- ( O(nlogn) O(1) )
- ( nth_element implementations complexities )
a medL
(medLow) a medR
(medHi)- 2 ,
- +
- + “” :
- + “”
- +
bitCount
( max min)
- :
- min (min) (max) ( ) , ;
bitCount(a i )==bitCount(a i |a min )
, : a i ==a i |a min
- , ( ) –
- min ( )
- () :
- ( “” “”)
- :
- “”, max , or|=a i ,
a max &=~or
( “ a max ^=or
” – )
( a max
a min
, .. , )
- /:
- (RingSync)
Note :
, .
. ( ), .
“ , ”
, , (“ {…}
”) () . ():
“”, ():
, :
? TensorsFlowing
即 – , “, ” – .
?
:
- – ( ) , . “” , .. “” “” . , “ ”, .
- – “” / , , . . , (Interprocedural optimization, Whole program optimization; Link‑time optimization) “” – .
Note : : .. (2D/3D , , *, …). (), , , ( , , 24 , ; , ACPI ), ( ) , :(. (, , …) , ‑ . , , ‑. ( “” “”), “ *”. , – , , , . () – , . – ( ), . – , //‑/ /. (debug) ‑ .
Note : Debug , (, – { 9 , ; – ×16 ( 1.2 1.5); → }), warning' .
Note : , , , ‑. , , ( “ ” ) .
# Tooo Long; Didn't Read; Visualize, plz.
Note : , ( GIF “TensorsFlowing” “ ”). GIF “TensorsFlowing” GIF “ Loop over python list animation ”. , GIF , “ ” / . , ‑ 1:1, “ ”.
Note : GIF ( “Loop over python list animation”), . , , . ( ;)
Note : ( ) ( ). , .
Note : GIF ( “Scroll Down”) – (Ctrl+R), GIF . ( , ; , ‑ <oembed>
? )
#1
int average;{ int max,min; max=min=countFill[i][0]; for(int j=1;j<numHosts;j++){ max=countFill[i][j]>max?countFill[i][j]:max; min=countFill[i][j]<min?countFill[i][j]:min; } average=(max+min)/2; }
Note : GIF …
#2
int lo=0; struct CnN{ int Count; }iFill[numHosts]; for(int j=0,hi=numHosts-1;j<numHosts;j++){ if(countFill[i][j]<average) iFill[lo++].Count=countFill[i][j]; else iFill[hi--].Count=countFill[i][j]; } bitCluster[i]=0; if(lo==0||lo==numHosts) continue;
Note : ( ) .
#3
int averageMed;{ CnN *iFillLo=&iFill[0]; CnN *iFillHi=&iFill[lo]; const int hi=numHosts-lo; if(lo>1) std::nth_element(iFillLo,&iFillLo[lo/2],&iFillLo[lo],[](const CnN a,const CnN b){return a.Count<b.Count;}); if(hi>1) std::nth_element(iFillHi,&iFillHi[hi/2],&iFillHi[hi],[](const CnN a,const CnN b){return a.Count<b.Count;}); averageMed=(iFillLo[lo/2].Count+iFillHi[hi/2].Count)/2; }
Note : std::nth_element()
, , ( + = ).
#4
for(unsigned int j=0;j<numHosts;j++) bitCluster[i]|=( (countFill[i][j]<averageMed)?1:0 )<<j;
#5
bitCluster[i] = bitCluster[i]^(1<<((i/(numHosts-1))+(i%(numHosts-1)+1))%numHosts) ? bitCluster[i]:0;
Note : GIF
。 ReadMe ( ; ‑ , ).
...
3‑ 1.92 , , 1.6 - 2 . , 3‑ ( ) ( Go – 2 , – 2 - 4 ). (4 ), 2.5 LLTR.
+ TODO' + .
, ‑ , , , 2 .
Note : , / , …
扰流板
2 ?
是的
# Tooo Long; Didn't Read; Visualize, plz.
TODO[old]: (1 – gif_1, , 2 – gif_2, , …)
TODO: ,
? ( )
TODO: ( GIF “TensorsFlowing”, ‑ – ),
( Note, GIF , , , YouTube. : 4:2:0 TV‑ ( 16 - 235 ). , – (). : SVG – , “ ‑”; SWF – RIP)
( ), std (, ) ( );
( “ 1
” == “ 1
” ). 一个例子:
0) 111111111111 1) 1111111111.. 2) 11111111.... 3) ..111....... 4) .....111.... <- , 2‑, 3‑ 5) 11..........
(.. ), .. “ 1
” ( ) (. “ ” “ ”). “ 1
”, ..:
0) 111111111111 1) 1111111111.. 0 2) 11111111.... 1 3) ..111....... 2 4) .....111.... 2 5) 11.......... 4
( , – + (+), )
( “”). CPU, + . , , , , .
...
3: OMNeT++
LLTR 3: OMNeT++
Golang. ( , )
( , OMNeT++ c Qtenv)
( “background/fresh” “.ned” {“ grey99
” → “ -,-,0;bgi=background/fresh
”}, “blueprint/print-26.png” Qtenv “LLTR 1:: ”)
( , “OMNetProject (v0.9) lltdapp”)
( , “hostS” – ( ) . , , – broadcast , unicast , .. – , . , – “ ”. “ – ”, : “ ” – “Serial” “ 1” ( – “ ”). – (, , broadcast unicast )[ rand , , – , – ])
( Precision Time Protocol (PTP) 2016-04-12)
( – , , “a3_v0.3_ft0.1.0”, “a3_v0.3.0” – , ; “ft” – fixed time)
.
TODO [x]: , , . “ TODO [x]” “ ” ( )
参考文献:
4:
LLTR 4:
∀ habrauser ∈ {user ∈ Habrahabr | user “”},
(, . )
参考文献:
, (hostsCount) – . . ? (: )
(, “”, {“”,“”,“”})
( ( ) [ ; “ ”], – n‑ “ ”; , LLTR, )
Permutation of bitsets (“lexicographic” order) derivation (mathematical induction)
( , __ [ , , , ]):
n=4; k=2 bitset i 0011 <- 0 0101 <- 1 1001 <- 2 0110 <- 3 1010 <- 4 1100 <- 5
Note: , .. bitset k i < bitset k i+1 , i – “ ”; k – ; n – .
“” ( ; /; , “”/), ?
- ( “B9”) ( “ ” O_o; , )
- “
_tmain()
” ( ) - , , – “
med()
” “ demed()
”
, :
:
“ ” (“ ”; “Permutations of multisets”).
有什么区别? ( [abcdef]), ( [000011]).
, ( ):
a => 0 b => 0 c => 0 d => 0 e => 1 f => 1
, , .. , , [abcdfe] ⇒ [000011], [000011] . (, )
{{000011}}.
{abcdef} 6! ( nuclphys.sinp.msu.ru/mathan/p1/m0204.html ).
.
, , ( [000011]) , ( (“1”) 2! × (“0”) 4! ) = 2! × 4! = 2! × (6−2)! 。
= 6! ∕ (2! × (6−2)!).
( nuclphys.sinp.msu.ru/mathan/p1/m0204.html ), ( ru.wikipedia.org/wiki/?stable=1 ) – . . “ ” ( ru.wikipedia.org/wiki/?stable=1 ), “” “1” “0” – ( ru.wikipedia.org/wiki/?stable=1#___ ).
EN: → → combination: ( k‑combination with repetitions / k‑multicombination / multisubset ), ( en.wikipedia.org/wiki/Combination?stable=1#Example_of_counting_multisubsets ), “Stars and Bars” ( en.wikipedia.org/wiki/Stars_and_bars_(combinatorics)?stable=1#Proofs_via_the_method_of_stars_and_bars ). (/ ): “1” – Star, “0” – Bar.
, “Stars and Bars” “” ( “ ” – k‑combination with repetitions) “ ” (permutations of multisets): en.wikipedia.org/wiki/Permutation?stable=1#Permutations_of_multisets .
RU: ru.wikipedia.org/wiki/?stable=1#__
PS stackoverflow.com/a/24257996 , ( – : n!∕((n−k)!); n⩵k; (n−k)!⇒1; n! ).
PPS [ alisey Trif ] ‑ / ( “Permutations of multisets”), ?
5: OMNeT++ 2
LLTR 5: OMNeT++ 2
( LLTR-Process sequence, – { “LLTD-Process (vFinal)”}, – , i → dstId, )
参考文献:
6+7: +
LLTR 6:
, Golang.
参考文献:
LLTR 7: (: “ ” – )
( 4 { //Wi‑Fi}, 3 ? – 2 ! – MacBook, Wi‑Fi Ethernet Thunderbolt)
( , “ ”, , “ ”)
( Wi‑Fi UDP broadcast – WNIC //. : How to override wifi broadcast speed limit? , Why does my UDP Broadcast wireless communication is capped at 1MBs? . 3 Mbps, 5 Mbps { }. MacBook {Wi‑Fi } Super‑, broadcast‑, unicast, {Wi‑Fi- ‑} unicast‑ broadcast { – Wi‑Fi}. , Wi‑Fi- – CPU . ‑.)
( UDP‑, !? : Windows “” {Windows NIC ?..}, API, “ CPU” { Win8 API, … (. “LLTD/flood/main.go”)}. “ ”. – API , “” . *nix { API}, , “” {. “LLTD/flood/main.go”}. : “ iperf3 and microbursts ”)
( → . { ; SMB}: → → → MacBook . , .)
( “LLTD/Prepare test environment.txt”)
参考文献:
( “LLTD/Client.go”, “‑” – “LLTD/flood/main.go”)
( {Client1} NIC , – , , “ ” : “ interface always dead”)
Note: – Wi‑Fi ( ADSL‑/, ADSL – )
Note: ‑ : “” 100 Mbps unicast ; 100 Mbps broadcast . ( , /, )
TODO : : ( – ; ; +1/−1 ). Google Wave, Google Docs, Discus. :
- –
- – ,
- :
- , (.. ) – “” “ ” – (.. “” )
UserJS/UserCSS, , , .. , .
– – , UI (, , ) ( , “”). “” UserCSS. , , , ( ), ( ) ( ).
( ) ( ). ( UserJS UserCSS; Opera Presto , Firefox )
– “ OMNeT++ 2”.
TODO [x]: () + , + , , OMNeT++ v5.0b1 INET v3.0.0 + , ( ), – /
:
- OMNetProjectLLTD lltdapp + sim – LLTR , “LLTD” (“R” – “D”, //) [ “ 1”, .. article_1 a1_v0.30.0
] { , } - OMNetProject (before v0.9) lltdapp – (“LLTDClient.cc”: , DISCARD‑ “” ARP) [ article_1 ] { “for diff (LLTR)” – (diff) , , }
- OMNetProject (v0.9) lltdapp – (“LLTDClient.cc”: “
trafCount[stepN]++
”): (. “ timeCalcEnd
” “ timeoutCalc
”), (“stat.txt”: ) [ 3] { “ , ”, .. , } - Timers (QPC) – – ( “Timers.cpp”; “ The Windows Timestamp Project: Adjustment of System Time (NTP) ”) [ 6] { , Golang, “ 6”}
- OMNetProject (v0.9.1) lltdapp – , : (“LLTDClient.cc”: “
sntpTimeOffset
” “ sntpLatency
” – , ) [ 3] - “fixed event time” – :
- OMNetProject (v0.9.3) lltdapp – v0.9.1 + , + v0.9.2ft [ 3]
- Get sequence (math induction) – : unicast_src_host i+1 = unicast_dst_host i , .. , (unicast dst), , (unicast src) [ 4] { , “” ( ) – “” , : “ ” ( ), , , }
- OMNetProject (v0.9.4) lltdapp – : , “ ” [ 5]
- OMNetProject (vFinal) lltdapp – [ 5]
- LLTD-Process (vFinal) – [ 5]
- GoLLTD – Go (“LLTD/old/main.old.go”) + + (“LLTD/Prepare test environment.txt”) + , : “Timers/”, “SNTP/”, “LLTD/flood/broadcast.txt”, “LLTD/Prepare test environment.txt”, “LLTD/flood/old/main.go”, “LLTD/flood/main.go”, “LLTD/” [ 6,7]
( ) (), . “ ” – , .
Note : – , ( ) – .
“ ”, , “ ”.
“ ”, , :
– . , – “ ”.
Note : “” – ( −1 ) ( ) (: ; ; – ); “‑‑‑” – ( ) , , ( ), , { “” ( ) – , , “ ?”; + “ ' ', ”, : (cookie) view‑only}
Note : (‑)
# Check‑list (TODO's)
TODO, .
PNG{SVG} (SVG thumbnail PNG) :
- PNG:
- [ 778px, 756px] ‑ ( . )
- ‑ 7z (un[7z]me), ( – “ ”, ‑ , ‑ )
- [ Photoshop] “Save for Web” → PNG 24+alpha
- [ GIMP] “8bpc RGBA” ( ), “ Save for Web ”
- 256 + alpha‑
- [ Adobe Fireworks] (Ctrl+Shift+X) → PNG‑8 + alpha
- []
- “” , Image Catalyst ( “” 2 : 2.1 2.5 , ):
- “” Image Catalyst 2.1 ([5] Xtreme profile)
Tools\config.ini
[options] ; , "true" "false". fs = true ; PNG. 0, %NUMBER_OF_PROCESSORS%. threatpng = 0 ; . , "true" "false". up = false [JPEG] ; Metadata. Metadata JPEG, "true" "false" , . dc = true ;Delete comment field (as left by progs like Photoshop & Compupic). de = true ;Strip Exif section (smaller JPEG file, but lose digicam info). di = true ;Delete IPTC section (from Photoshop, or Picasa). dx = true ;Deletex XMP section. du = true ;Delete non image sections except for Exif and comment sections. [PNG] ; ColorType BitDepth. ColorType BitDepth PNG, "true" "false". nc = true ; -. "Dirty Transparency" PNG c -, "true" "false". na = true ; Chunks. ; Chunks Chunks, "remove" Chunks Chunks, . ; Chunks Chunks, "keep" Chunks Chunks, . ; Chunks: ;text = iTXt,tEXt,zTXt ;color = cHRM,sRGB,iCCP,gAMA ;misc = bKGD,pHYs,sBIT,sPLT,hIST,tIME ;all = all of noncritical chunks hunks = remove all
Note : “ Image Catalyst 2.1 . Enter. ”, , , ( “Image Catalyst 2.1” “Image-Catalyst-2.1”)
- “” Image Catalyst 2.5 ([1] Xtreme profile)
Tools\config.ini
[options] ;Number of streams. If value early 0, is used value of parameter %NUMBER_OF_PROCESSORS%. thread=0 ;Automatic replacement of original images by the optimized. outdir=true ;Check update update=false [PNG] ;Parameters of optimization of PNG: ;/a# - PNG dirty transparency 0=Clean, 1=Optimize; ;/g# - PNG gamma 0=Remove, 1=Apply & Remove, 2=Keep; ;/na - PNG don't change RGB values for fully transparent pixels; ;/nc - PNG don't change ColorType and BitDepth; ;/np - PNG don't change Palette. xtreme=/a1 /g0 advanced=/a0 /g0 ;Remove PNG Metadata (Chunks). chunks=true [JPEG] ;Remove JPEG Metadata. metadata=true [GIF] ;Remove GIF Metadata. giftags=true
Note : “ Attention: running 2 of Image Catalyst. ”, , , ( “iCatalyst-2.5”)
merge_min.bat
@echo off setlocal enabledelayedexpansion :: Copy file from source to destination directory only if :: source file is smaller in size than in destination directory echo Src dir: %~f1 echo Dst dir: %~f2 echo --- for /r "%~1" %%A in (*) do ( set FileA=%%~fA set FileB=!FileA:%~f1=%~f2! set FileASize=%%~zA for %%Z in ("!FileB!") do set FileBSize=%%~zZ if !FileASize! LSS !FileBSize! copy "!FileA!" "!FileB!" )
- “.svg” ( ) – (SVG) (un[7z]me)
- SVG:
- {SVG 1.1; UTF-8; ; : ; : “1:100”; } ( , 2 – 1‑ )
- transform SVG ( 90 ) ( SVG ):
- DevTools transform ( “
[transform]
”) - “
Rotate90AndSwapWH()
” ( “ ”)
Rotate90AndSwapWH()
Sub Rotate90AndSwapWH() Dim sr As ShapeRange, s As Shape, w#, h# Set sr = ActiveSelectionRange On Error Resume Next boostStart2 "Rotate 90 and Swap WH" For Each s In sr s.GetSize w, h s.Rotate -90 s.SetSizeEx s.CenterX, s.CenterY, w, h Next s boostFinish2 End Sub
+ boostStart2/boostFinish2:
:
Private Sub boostStart2(ByVal unDo$) On Error Resume Next ActiveDocument.BeginCommandGroup unDo Optimization = True EventsEnabled = False End Sub Private Sub boostFinish2() On Error Resume Next EventsEnabled = True Optimization = False ActiveWindow.Refresh ActiveDocument.EndCommandGroup
- :
- ( )
- XML ( )
- ( ):
- “
DOCTYPE
” “ Creator
” “ 96ppi
” ( ppi CorelDRAW SVG) - “
metadata
”, “ id
” ( ) - svg:
- “
xmlns
” “ xml:space
” - “
xmlns:xlink
” - [, “
style
” “ fill-rule:evenodd; clip-rule:evenodd
”] “ version
” “ style
” ` style="margin:16px auto" shape-rendering="geometricPrecision" fill-rule="evenodd" clip-rule="evenodd" xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full"
`
- ( ) `
"
` ` "
`
- ( <rect> <g>), , “
viewBox
” ( <svg>)- , SVG , CorelDRAW – , , , ( , )
- SVG optimiser :
- :
- Whitespace: pretty
- Style type: optimal
- Truncate * numbers: unchanged
- ( , “Remove clean group”, )
- <svg>
- <style> – SVG optimiser CDATA ( )
- XML
- PNG SVG:
- “PNG_SVG.bat” ( 7-Zip SVG: “
-txz -m0=LZMA2:lc1:pb0 -mx
”)
PNG_SVG.bat
@echo off setlocal enabledelayedexpansion :: PNG+7Zip{SVG} echo PNG dir: %~f1 echo SVG dir: %~f2 echo --- for /r "%~2" %%A in (*.svg) do ( set SVG=%%~fA set PNG=!SVG:%~f2=%~f1!.png "%ProgramFiles%\7-Zip\7z.exe" a dummy -txz -m0=LZMA2:d96m:fb74:lc1:pb0 -mx -so -- "!SVG!" >> "!PNG!" )
“ LZMA2:d96m:fb74:lc1:pb0
”?
‑ ( “RingSync_no_problem.svg”):
- "LZMA2:d96m:fb64" 6804 byte - "LZMA2:d96m:fb74" 6800 byte - "LZMA2:d96m:fb74:lc2" 6812 byte - "LZMA2:d96m:fb57:lc2" 6780 byte - "LZMA2:d96m:fb57:lc1" 6768 byte - "LZMA2:d96m:fb56:lc1" 6760 byte - "LZMA2:d96m:fb49:lc1" 6760 byte - "LZMA2:d96m:fb56:lc1:pb0" 6696 byte - "LZMA2:d96m:fb46:lc1:pb0" 6688 byte (fb44-fb47) - "LZMA2:d96m:fb63:lc1:pb0" 6688 byte - "LZMA2:d96m:fb66:lc1:pb0" 6684 byte - "LZMA2:d96m:fb74:lc1:pb0" 6692 byte
svg “ LZMA2:d96m
” (fb64), “ LZMA2:d96m:fb74:lc1:pb0
” .
Note : Image Catalyst: ping timeout, ( 2.5) ( 2.1 – )
Image Catalyst.bat
v2.1 diff:
182c182 < if defined thrt >nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:waithreat --- > if defined thrt >nul 2>&1 timeout /t 1 /nobreak & goto:waithreat 203c203 < 1>nul 2>&1 ping -n 1 -w 500 127.255.255.255 --- > 1>nul 2>&1 timeout /t 1 /nobreak 237c237 < if exist "%~1" (1>nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:waitflag) --- > if exist "%~1" (1>nul 2>&1 timeout /t 1 /nobreak & goto:waitflag) 513c513 < if exist "%tmppath%\typelog.lck" (1>nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:savelog) --- > if exist "%tmppath%\typelog.lck" (1>nul 2>&1 timeout /t 1 /nobreak & goto:savelog) 534c534 < if "%jpeg%" equ "0" if "%png%" equ "0" 1>nul ping -n 1 -w 500 127.255.255.255 2>nul & goto:finmessage --- > if "%jpeg%" equ "0" if "%png%" equ "0" 1>nul timeout /t 1 /nobreak 2>nul & goto:finmessage 572c572 < 1>nul ping -n 1 -w 500 127.255.255.255 2>nul --- > 1>nul timeout /t 1 /nobreak 2>nul
V2.5 diff:
319,320c319 < call:division float 1024 100 < call:echostd " In - !float! " --- > call:echostd " In - !float! " 322d320 < call:division change 1024 100 324,325c322 < call:division float 1024 100 < call:echostd " Out - !float! (!change! , %5%%%%%%)" --- > call:echostd " Out - !float! (!change! , %5%%%%%%)" 362,363c359,360 < set /a "ww=%random%%%%1" < 1>nul 2>&1 ping -n 1 -w %ww% 127.255.255.255 --- > set /a "ww=%random%%%%1/1000" > 1>nul 2>&1 timeout /t %ww% /nobreak 707c704 < if %jpeg% equ 0 if %png% equ 0 if %gif% equ 0 1>nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:finmessage --- > if %jpeg% equ 0 if %png% equ 0 if %gif% equ 0 1>nul 2>&1 timeout /t 1 /nobreak & goto:finmessage 741d737 < call:division changePNG 1024 100 747d742 < call:division changeJPG 1024 100 753d747 < call:division changeGIF 1024 100 800c794 < call:echostd " Total %1: %%change%1%% , %%perc%1%%%%%%" --- > call:echostd " Total %1: %%change%1%% , %%perc%1%%%%%%"
Note : Image Catalyst ( ) CP866, diff, , .
:
- 778px – (780px – − 2px )
- 756px – (758px – − 2px )
- 738px – (740px – − 2px )
- Image Catalyst v2.1 v2.5, ( “ merge_min.bat ”).
- – : habrastorage “dwbmwbyvlzes80cep1hvcdb5iy.png” () HTTP‑ “
Content-Disposition : inline ;...
”, , , (): “dwbmwbyvlzes80cep1hvcdb5iy.png#real-name.png”. , – ( ). SVG – (), , … - (id, name). . ( – , , – )
- , ( ).
- ‑ (un[7z]me), habrastorage – , CloudFlare Polish .
Note : habrastorage SVG ( ): ( ), PNG{SVG} ( SVG, , – ) ( , , / – ‑ / , )
git:
Note : habrahabr <oembed> , GitHub , .
Note : TODO‑ , 43 KiB ( “ 0”), 69 KiB ( “ 1”), 45 KiB ( ).
