LLTR Teil 2: Algorithmus zur Bestimmung der Netzwerktopologie aus gesammelten Statistiken

Link Layer Topology Logo anzeigen


F: Was haben wir?
A: Von Hosts gesammelte Statistiken.


F: Was wollen wir bekommen?
A: Netzwerktopologie! Genauer gesagt müssen Sie die richtige Kette von Peers (Hosts) für RingSync erstellen .


Wir müssen einen Algorithmus entwickeln, der Statistiken zuerst in eine Netzwerktopologie und dann in eine Peer-Kette umwandelt. Bisher sieht der Algorithmus folgendermaßen aus:


 –-[**]-->   --[**]-->   


Wenn Sie gerne „Teil 1“ auf GitHub-Seiten gelesen haben, finden Sie hier einen Link zu diesem Teil auf GitHub-Seiten.


Warnung : Nachfolgend finden Sie dieselben Habr-Parser-Artefakte , vor denen ich in „Teil 1“ gewarnt habe.


Jede mögliche politische Erfahrung ist von Magie nicht zu gehört.  - Arthur C. Clarke


Hinweis : Weiter anstelle von " –-[**]--> " verwende ich " –-[???]--> ".


Die gesammelten Statistiken zeigen uns, auf welchen Hosts die Geschwindigkeit des Empfangs von Broadcast-Verkehr gesunken ist. Schauen Sie sich zum Beispiel das Ergebnis der Null-Iteration im Netzwerk „N2_2“ an („ Network “ aus dem vorherigen Artikel „LLTR Teil 1“):


 {300,164,164}, 


2 Hoststaaten sind hier deutlich sichtbar:


  • normale Geschwindigkeit (Wert " 300 ") - keine Reaktion ;
  • Die Geschwindigkeit ist gesunken (Wert „ 164 “) - es gibt eine Reaktion .


Worauf komme ich hinaus? Zur Binarisierung! Wenn wir das Fehlen einer Reaktion als 0 und das Vorhandensein einer Reaktion als 1 codieren, können wir alle Reaktionen der Wirte in einer einzigen Iteration in einer Variablen ( 32 - 512 Bit [ AVX - 512 ]) zusammenfassen. Dies spart nicht nur Speicherplatz (und Speicherplatz in Caches), sondern erhöht auch die Verarbeitungsgeschwindigkeit. Alle Hostantworten einer bestimmten Iteration ( SIMD ) werden gleichzeitig in einem Befehl verarbeitet.


Hinweis : weil Die Verwendung von LLTR Basic für eine große Anzahl von Hosts ist sehr teuer ( siehe Anfang des Abschnitts „LLTR Part 0 :: LLTR Advanced“ ), dann passt alles in 64-Bit- x86-64-Register.


Hinweis : Im Text des Links zu dem Abschnitt in einem anderen Artikel (einem anderen Teil) werde ich die Teilenummer im Format „ LLTR-Teilenummer :: ‹ Abschnittsname › “ hinzufügen. Und im " title " des Links schreibe ich den Namen des Teils auf, zum Beispiel für "LLTR Part 0 ::", "Automatische Erkennung der Netzwerktopologie und nicht verwaltete Switches werden angezeigt." Mission unmöglich? "


Nehmen wir das gleiche Beispiel für eine Null-Iteration und sehen, wie es nach der Binärisierung aussehen wird:


 {300,164,164} --[]--> 011 


Sehr kompakt, aber ich möchte, dass „ 1 “ (das Vorhandensein einer Reaktion ) sofort auffällt, wenn ich eine Liste aller Iterationen ansehe. Jetzt hebt sich „ 1 “ nicht vom Hintergrund „ 0 “ ab (gefälschte Daten für ein visuelles Beispiel ):


 0101011010110 1100010110010 0101101010111 0100010110100 


Um „ 1 “ hervorzuheben, führe ich die Notation ein:


  • " 1 " bedeutet 1 - es gibt eine Reaktion ;
  • . Bedeutet 0 - keine Reaktion .


Schauen wir uns noch einmal die „gefälschten Daten“ an:


 .1.1.11.1.11. 11...1.11..1. .1.11.1.1.111 .1...1.11.1.. 


So viel besser ( IMHO ).


Der Algorithmus sieht im Moment folgendermaßen aus:


  –-[]-->   --[???]-->   --[???]-->   


Wir belassen die Details der Binärisierung am Ende des Artikels und konzentrieren uns auf den Rest des Algorithmus.


Es ist am einfachsten, einen Algorithmus zu erstellen, der auf bestimmten Eingabe- / Eingabedaten basiert (Sonderfälle, Randbedingungen; Tests in Bezug auf TDD ). In unserem Fall hängen die Anfangsdaten von der Netzwerktopologie ab. Sie müssen daher ein Netzwerk erstellen, das sowohl klein als auch gleichzeitig verschiedene Switch-Verbindungsschemata ( Stern , serielle Verbindung ) enthält. Vielleicht kann etwas Besonderes darin enthalten sein ... Im Allgemeinen hat die Vorstellungskraft ein solches Netzwerk gezeichnet (die Notation für die Elemente ähnelt der Notation am Ende des Abschnitts „ LLTR Part 0 :: Topologie:„ Serielle Verbindung von Switches “ )):


Grafik: LLTR Hybrid Network


Hinweis : Wenn Sie sich dieses Netzwerk ansehen , stellt sich die Frage "Ist es möglich, einen vollständigen Scan in dieser Topologie durchzuführen, wenn einer der Switches ..." (am Ende des Abschnitts " LLTR Part 0 :: Topologie:" Serielle Verbindung von Switches ") ", und Sie bemerken dass kein Host direkt mit einem der Switches verbunden ist. Darüber hinaus gibt es keine Probleme, weil 3 weitere Switches sind mit diesem Switch verbunden (ich habe nur die Switches gezählt, die „von unten“ angeschlossen sind, ohne die Tatsache zu berücksichtigen, dass sie mit einem anderen Switch „von oben“ verbunden sind), von denen jeder Hosts hat.


In diesem Diagramm gibt es jedoch einige zusätzliche (ablenkende) Details. Ich werde es reinigen, indem ich entferne:


  • Broadcast-Host (nicht in der Eingabe / Statistik enthalten);
  • Ports, die Switches miteinander verbinden.

Grafik: LLTR Hybrid Network (klar)


Hier ist der Schalter „ohne Hosts“ sofort sichtbar. Außerdem habe ich alle Switches so angeordnet, dass sich die darin enthaltenen Hosts nicht vertikal überlappen. Dies ist nützlich, wenn ich in Zukunft "Host-Reaktionen" nicht in Form eines Texteintrags " .....1...... ", sondern in Form eines Diagramms .....1...... möchte (es gibt nur einen Host in einer Vertikalen):


Grafik: LLTR-Hybridnetzwerk (klar), Erläuterung der Bezeichnung „Host-Antworten“


Stellen Sie sich nun die Statistiken vor, die wir am Ende aller Iterationen des Scannens dieses Netzwerks erhalten. Es gibt 12 Hosts im Netzwerk (ohne Broadcast-Host), daher werden Daten zu 132 Iterationen vorliegen. Es werden jedoch nicht alle Iterationsergebnisse für uns nützlich sein, zum Beispiel werden sie nutzlos sein:



Nach der Reinigung bleiben von allen 132 Iterationsergebnissen nur 5 (Host-Antworten) übrig:


 1111111111.. 11111111.... ..111....... .....111.... 11.......... 


Hinweis : Aus Gründen der Übersichtlichkeit habe ich die Iterationen in der Reihenfolge von einer größeren Anzahl von „ 1 “ zu einer kleineren angeordnet.


Der Algorithmus sah folgendermaßen aus:


  –-[]-->   --[   ]--[  ]--[???]-->   --[???]-->   

Rücksetzpunkt

Ich habe darüber nachgedacht, all dies in den Spoiler aufzunehmen, aber am Ende wurde mir klar, dass dies ein wichtiger Teil der Geschichte ist, den man beim Lesen besser nicht verpassen sollte.


¬ ( Beim Lesen nicht zum Gehirn springen : Cong



[Rücksetzpunkt] In den verbleibenden 5 Iterationsergebnissen ziehen die ersten beiden die Aufmerksamkeit auf sich: Die erste enthält die zweite und die zweite enthält die verbleibenden 3 unteren. Hier erinnere ich mich an den „Schatten“ aus dem Abschnitt „ LLTR Teil 0 :: Topologie:„ Serielle Verbindung von Schaltern “ “. Im selben Abschnitt haben wir am Ende jeder Iteration neue Cluster gebildet (oder nicht gebildet), basierend auf den gerade erhaltenen Daten. Jetzt müssen wir dasselbe tun.


Aber wie haben wir neue Cluster gebildet? Tatsächlich waren alle (nicht einzelnen) Reaktionen der " 1 " -Hosts der aktuellen Iteration der "neue Cluster". Wir mussten nur die Schnittpunkte ("∩"; nicht leeres "∅") mit den vorhandenen Clustern finden, um ("∖") aus dem größeren zu entfernen Cluster-Hosts in einem kleineren Cluster enthalten.


In unseren Aktionen gab es jedoch eine Bedingung / Verzweigung (wenn): Sie müssen bestimmen, welcher der Cluster größer ist, und dann eine einfache Operation ausführen (A ∖ B) - subtrahieren Sie den kleineren (B) vom größeren Cluster (A). Ich stellte die Qual einer CPU mit einer langen Pipeline dar, die durch die Notwendigkeit verursacht wurde, die Pipeline zurückzusetzen, wenn die Verzweigungsvorhersage falsch ist (wenn überhaupt ein "Verzweigungsvorhersageblock" darin ist), und entschied mich fast, den “?: " Zu verwenden . Aber in diesem Moment ...

Ich stand auf der Toilette und hängte die Uhr auf. Plötzlich rutschte er aus, schlug mit dem Kopf auf das Waschbecken und als ich aufwachte, hatte ich eine Vision, ein Bild in meinem Gehirn, eine Vision davon - ein Stream Drive Stream Separator ( Zurück in die Zukunft ) :

Zurück in der Zukunft: Flux Divider
 // Flux Divider c=a^b; aa=a&c; bb=b&c; cc=a&b; 


Und sehen Sie sich sofort seine Arbeit am Beispiel überlappender Cluster an (genauer gesagt, eine Menge (Cluster) ist in einer anderen Menge streng „ “ enthalten):


 .....11..... - a ..11111111.. - b ..111..111.. - c=a^b ............ - aa=a&c ..111..111.. - bb=b&c .....11..... - cc=a&b 


Disjunkte Cluster:


 ..111....... - a .......111.. - b ..111..111.. - c=a^b ..111....... - aa=a&c .......111.. - bb=b&c ............ - cc=a&b 


Es stellt sich heraus, dass:


  • " aa " enthält Elemente, die nur für " a " gelten.
  • in " bb " - einzigartig für " b ";
  • in " cc " - gemeinsam mit " a " und " b ".


Ein weiteres Beispiel mit sich überschneidenden Clustern („unmöglich“, aber ein gutes Beispiel):


 ...1111..... - a .....1111... - b ...11..11... - c=a^b ...11....... - aa=a&c .......11... - bb=b&c .....11..... - cc=a&b 


Hinweis : Diese Art der Antwort (Host-Reaktion) ist nicht in den Quelldaten enthalten.


Auf die gleiche Weise können Sie Takes loswerden:


 .....11..... - a .....11..... - b ............ - c=a^b ............ - aa=a&c ............ - bb=b&c .....11..... - cc=a&b 


Aber etwas später ...

Der Kopf hört auf zu schmerzen, nachdem er auf die Spüle geschlagen hat, der Geist klärt sich auf und offensichtliche Probleme tauchen auf ...

Am Eingang haben wir 2 Variablen (Iterationsergebnisse / Wirtsreaktionen / Cluster / Mengen / ...), aber es gibt bereits 3 am Ausgang, und mindestens eine davon ist leer ("∅"). Wenn Sie "∅" nicht sofort entfernen, müssen Sie sie in Zukunft in die Verarbeitung einbeziehen. Daher ist es besser, "∅" sofort loszuwerden. Aber wie geht das? Bedingung / Verzweigung verwenden! ... Im Allgemeinen kehrte ich dorthin zurück, wo ich angefangen hatte. Wenn außerdem alles wie oben beschrieben ausgeführt wird und "," entfernt wird, erhalten wir am Ende Folgendes:


 1111111111.. 11111111.... ..111....... .....111.... 11.......... 


Das:


 ........11..             -     "............",     :( ..111....... .....111.... 11.......... 


Es ist Zeit, die Frage zu stellen: "Wie erhält man die Netzwerktopologie daraus?" Jetzt können diese Daten „sagen“, zu welchem ​​Cluster ein bestimmter Host gehört (dh zu welchem ​​Switch der Host verbunden ist), aber diesen Daten fehlen jetzt vollständig Informationen über die Topologie der Switches (dh wie sie verbunden sind) wechselt untereinander) - wir haben diese Informationen während der Datenkonvertierung verloren. Zu welchem ​​Cluster (Switch) gehören außerdem die beiden Hosts ganz rechts? Wenn wir jede Leitung als separaten Cluster betrachten (oder als Hinweis darauf, welche Hosts mit einem bestimmten Switch verbunden sind), stellt sich heraus, dass diese beiden extremen Hosts nirgendwo verbunden sind! Außerdem haben wir 6 Switches im Netzwerk und es sind noch 4 Leitungen übrig. Wo sind noch 2 Leitungen? Wir haben einen gelöscht (wie der obige Kommentar lautet), und im anderen sollte es "2 Hosts ganz rechts" geben.


[ gehe zum Rücksetzpunkt ] Diese Idee weiterzuentwickeln ist nutzlos. Sackgasse (Git-Zweig). Sie müssen zum Label "Reset Point" zurückkehren und alles vergessen, was danach war, aber diesen Zweig für die Story verlassen.


Um nun nicht in einen weiteren „toten Zweig“ zu fallen, müssen Sie sich für die endgültige Struktur (Darstellung) der Netzwerktopologie im Speicher entscheiden. Das heißt, mit dem, was wir zum Zeitpunkt der „Netzwerktopologie“ erhalten möchten:


  –-[]-->   --[   ]--[  ]--[???]--> <strong> </strong> --[???]-->   


Zunächst müssen alle Hosts anwesend sein:


 <strong>..........11</strong> <-- 1111111111.. 11111111.... ..111....... .....111.... 11.......... 


Zweitens müssen die Eltern angegeben werden (der Elterncluster für jeden Cluster; im Moment: Eltern Kind ; im Netzwerkdiagramm habe ich die Eltern über den Kindern platziert) (Clusternummern werden links hinzugefügt):


 0) ..........11 parent: ? 1) 1111111111.. parent: ? 2) 11111111.... parent: 1 3) ..111....... parent: 2 4) .....111.... parent: 2 5) 11.......... parent: 2 


Hinweis : Wenn Sie hier etwas Seltsames bemerken und das Diagramm dieses Netzwerks mit diesen Daten vergleichen, dann mögen Sie mich.


Spoiler, es ist besser, erst zu öffnen, wenn die gesamte Liste gelesen wurde

Tatsächlich ist (gemäß dem Diagramm) der Elternteil für Cluster 1 Cluster 0, aber dann ist die Bedingung „ Elternteil parent Kind “ nicht erfüllt. Vielleicht haben wir in " First " einen Fehler gemacht, und statt " ..........11 " hat es sich gelohnt, " 111111111111 " hinzuzufügen?



Drittens sollte es einen „Stamm“ -Elternteil geben, der einzelne Bäume (dh Wald ) zu einem Baum verbindet:


 -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 


Viertens wäre es schön, mit jedem Elternteil eine Liste von Kindern zu haben:


 -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 


Und schließlich ist es jetzt möglich, Kinder von ihren Eltern auszuschließen:


 -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 


Nun beschreibt jede Zeile einen Cluster, d.h. zeigt auf Hosts, die mit demselben Switch verbunden sind. Warten Sie jedoch, es gibt 6 Switches in unserem Netzwerk und 7 Cluster! Es ist endlich Zeit, den Text aus dem Spoiler über " Spoiler, es ist besser, erst zu öffnen, wenn die gesamte Liste gelesen wurde" zu lesen und die Situation zu korrigieren:


 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 


Diese Daten sind genau die „Netzwerktopologie“ - sie beschreiben den Switch-Baum, und daraus können Sie alle Hosts ermitteln, die mit einem bestimmten Switch verbunden sind.


  –-[]-->   --[   ]--[  ]--[???]--> <strong> </strong> --[???]-->   


Es bleibt zu verstehen, wie die Daten in dieses Formular gebracht werden. Tatsächlich kann alles, was wir getan haben (erstens, zweitens ...), in einen Algorithmus umgewandelt werden:


  1. "Erstens" (nachdem Sie Korrekturen vom Spoiler vorgenommen haben, ähnelt dies der Aktion "Drittens") - fügen Sie einen "Root" -Cluster " 111111111111 " ( universell ) hinzu, einschließlich (Hosts aller Bäume in der Gesamtstruktur - Hosts, die sich auf demselben Switch wie der Broadcast-Host befinden ), d.h. Es enthält alle Hosts im Netzwerk.
  2. "Zweitens" - Suche nach einem übergeordneten Element für jeden Cluster ;
  3. "Viertens" - Erstellen einer Liste von Kindern für jeden Elternteil ;
  4. "Und schließlich" - der Ausschluss von Kindern von ihren Eltern .


Jetzt können Sie diese Aktionen zum allgemeinen Algorithmus hinzufügen (das Aussehen wurde leicht geändert):


                                               ●  ●                                [] ►                 [   ]                          [  ] ► /                [ "" ] ► /        [    ] [     ]              [   ] ►   ●                                        [???] ►   ● 

Alternative Ansicht

 ●      ► [] ▬   ► [   ]                   [  ] ▬ /   ► [ "" ] ▬ / ► [    ]                   [     ]                   [   ] ●   ► [???] ●    ● 


Mal sehen, was passiert, wenn Sie diesen Algorithmus auf ein anderes Netzwerk anwenden. Ich möchte das Network_ serial Netzwerk Network_ serial und seine Simulationsergebnisse (Statistiken) aus dem Abschnitt „ LLTR Teil 1 :: Mehr Netzwerke mit unterschiedlichen Topologien, Hinzufügen neuer Netzwerke “ übernehmen.


Hinweis : Warum habe ich dieses bestimmte Netzwerk ausgewählt? Es ist ziemlich groß und es gibt Fehler in den daraus gesammelten Daten (siehe das Ende des Spoilers „Simulationsergebnisse“ für dieses Netzwerk).


Lass uns gehen!


Binarisierung

Host-Reaktionen:


 .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. 


Reinigung aus Einzelreaktionen

 .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. --> 


Bereinigung von Duplikaten (wir erhalten "Cluster / Gesamtstruktur"):


 .111111.. .......11 ...1111.. .....11.. ......... 


Außerdem werde ich der Einfachheit halber in absteigender Reihenfolge nach der Menge „ 1 “ sortieren:


 .111111.. ...1111.. .....11.. .......11 ......... 


Hinweis : Es kann sinnvoll sein, die Sortierung in den Algorithmus aufzunehmen. Was denkst du?


Hinzufügen eines "Root" -Clusters (wir erhalten "Cluster / Baum"):


 111111111 .111111.. ...1111.. .....11.. .......11 ......... 


Es enthält Hosts von 2 Bäumen (links " .111111.. " und rechts " .......11 " Teil des Netzwerks) und 1 Host (" 1........ " auf einem mit Broadcast-Host wechseln).


Übergeordnete Suche für jeden Cluster:


 0) 111111111 1) .111111.. parent: 0 2) ...1111.. parent: 1 3) .....11.. parent: 2 4) .......11 parent: 0 5) ......... parent: 4 


Hinweis : Hier kam es zu den negativen Auswirkungen von Datenlücken - der 4. Cluster wurde zum übergeordneten Cluster für den 5.! Im Allgemeinen kann jeder Cluster zum übergeordneten Cluster des 5. Clusters werden, weil es ist leer (∅).


Erstellen einer Liste von Kindern für jeden Elternteil:


 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 


Ausschluss von Kindern von den Eltern:


 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 


In diesem Schritt sollten wir eine "Netzwerktopologie" erhalten. Und wir haben es verstanden. Wenn wir nur am Standort der Hosts interessiert sind, ist diese „Netzwerktopologie“ für uns durchaus zufriedenstellend. In unserem Netzwerk erschien jedoch ein weiterer Switch, in dem 0 Hosts!


Um alles zu beheben, reicht es nach einem der ersten Schritte aus, diese „Datenfehler“ zu beseitigen. Dies kann unmittelbar nach der „Binarisierung“ erfolgen:


                                               ●  ●                                [] ►   [<strong>   (∅),    (⦱)</strong>]               [   ]                          [  ] ► /                [ "" ] ► /        [    ] [     ]              [   ] ►   ●                                        [???] ►   ● 


Wir löschen leere Mengen (∅; “ ......... ”), aber warum Universen entfernen (⦱; “ 111111111 ”)? Die Antwort wird offensichtlich, wenn wir mit der Implementierung der Binarisierungsphase beginnen. Verschiedene Varianten der Implementierung von "Binarisierung" können sowohl " ......... " als auch " 111111111 " mit denselben Daten erzeugen (Daten mit dem beschriebenen Fehler). Und weil Es ist genauso unmöglich, " 111111111 " in den richtigen Eingabedaten zu erhalten wie " ......... ", dann können wir alle " 111111111 " löschen (außerdem enthalten sie außer diesen keine Informationen Es gibt "Fehler" in den Daten).


Wenn Sie diesen (erweiterten, korrigierten) Algorithmus auf dasselbe Netzwerk Network_ serial (" Network_ serial "), Network_ serial die "Netzwerktopologie" folgendermaßen aus:


 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 


Hinweis : Schön, es ist die Diagonale. Es ähnelt einer einzelnen Matrix , kann jedoch nicht in seiner reinen Form erhalten werden. Sie können sicherstellen, dass jeder Cluster 2 Hosts enthält (dazu müssen Sie einen Host in „switch0“ hinzufügen), aber wir können nicht nur 1 Host in jedem Cluster erhalten (in extremen Clustern gibt es immer mindestens 2 Hosts ):


Beispiele für Nicht-Identitätsmatrix

 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 


Wir konnten den Algorithmus beenden, um die richtige „Netzwerktopologie“ zu erhalten. Es bleibt eine „Peer-Kette“ aus der „Netzwerktopologie“ aufzubauen. In dem Artikel über RingSync habe ich bereits beschrieben, wie das geht ( Baumspaziergang in der Tiefe: Vorbestellung ). Infolgedessen sollte die „Peer-Kette“ folgendermaßen aussehen:


 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, .. (∅). , “ ” , “ ” ( , ), (∅) ? , : ‑, “” , ( , ;); ‑, ( ).


, “ ” , “ ”

: LLTR   (clear),  ,   “depth first traversal”


( ) , , “ ”,



, “ ”, …


Note : , , . .



, ( ), .


: LLTR   (clear);


:


 ..........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:: : “ ” ) :


  1. – ;
  2. – ;
  3. – ( );
  4. – ( ) – , .


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


:


  1. (~~ k‑medoids ~~) + (∅), (⦱) + :
    1. a min a max
    2. 2
      1. + (∅), (⦱)
    3. :
      1. ( : )
      2. ( O(nlogn) O(1) )
      3. ( nth_element implementations complexities )
    4. a medL (medLow) a medR (medHi)
    5. 2 ,
    6. +
  2. + “” :
    1. + “”
    2. + bitCount ( max min)
  3. :
    1. min (min) (max) ( ) , ;
      bitCount(a i )==bitCount(a i |a min ) , : a i ==a i |a min
    2. , ( ) –
    3. min ( )
  4. () :
    1. ( “” “”)
  5. :
    1. “”, max , or|=a i , a max &=~or
      ( “ a max ^=or ” – )

    2. ( a max a min , .. , )
  6. /:
    1. (RingSync)


Note : git , .



Hypothese. ( ), .

,


, , (“ {…} ”) () . ():


 //    "  " int ...;{   //    "" } 


“”, ():


 //==[Name]==// int ...;{   ... } 


, :


Tensors Flowing

? TensorsFlowing


d.h. – , “, ” – .


?
:


  • – ( ) , . “” , .. “” “” . , “ ”, .
  • – “” / , , . . , (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; } 

:  –  1


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 : ( ) .


:  –  2


#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; } 

:  –  3


Note : std::nth_element() , , ( + = ).



#4

 for(unsigned int j=0;j<numHosts;j++) bitCluster[i]|=( (countFill[i][j]<averageMed)?1:0 )<<j; 

:  –  4


#5

 bitCluster[i] = bitCluster[i]^(1<<((i/(numHosts-1))+(i%(numHosts-1)+1))%numHosts) ? bitCluster[i]:0; 

:  –  5


Note : GIF git . ReadMe ( ; ‑ , ).



OMNeT++ “ ”, “ DAT_EX.h ”.



...


#


3‑ 1.92 , , 1.6 - 2 . , 3‑ ( ) ( Go – 2 , – 2 - 4 ). (4 ), 2.5 LLTR.


+ TODO' + .


, ‑ , , , 2 .


Note : , / , …


Spoiler

2 ?


Nein

?


, , . , , 2 . .



Ja


# 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 ” ). Ein Beispiel:


 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]” “ ” ( )


Referenzen:




4:

LLTR 4:


Wolfram Mathematica – Numbers (last episode 1 season) – .



∀ habrauser ∈ {user ∈ Habrahabr | user “”},

, “” .



(, . )


Referenzen:



, (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”).
Was ist der Unterschied? ( [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, )


Referenzen:




6+7: +

LLTR 6:


, Golang.


Referenzen:



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”)


Referenzen:



( “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. Format:


  • – ,
  • :
    • , (.. ) – “” “ ” – (.. “” )


UserJS/UserCSS, , , .. , .


– – , UI (, , ) ( , “”). “” UserCSS. , , , ( ), ( ) ( ).


( ) ( ). ( UserJS UserCSS; Opera Presto , Firefox )


– “ OMNeT++ 2”.


TODO [x]: () + , + , , OMNeT++ v5.0b1 INET v3.0.0 + , ( ), – /


:



( ) (), . “ ” – , .


Note : – , ( ) – .


“ ”, , “ ”.


“ ”, , :


:    TOP SECRET


– . , – “ ”.


Note : “” – ( −1 ) ( ) (: ; ; – ); “‑‑‑” – ( ) , , ( ), , { “” ( ) – , , “ ?”; + “ ' ', ”, : (cookie) view‑only}


Note : (‑)



LLTD v1 – TCP ( map?), ,
() ,


LLTD v0.9 – client , ( )


v0.5 Go
IP, github.com/hashicorp/mdns
github.com/davecheney/mdns
grokbase.com/t/gg/golang-nuts/132tcpawde/go-nuts-udp-multicast-who-is-on-my-network


PS ( ) “ ”.
r=rand();
r, .
:
1. ‑ . , – . + ± ( “” ).
2. “”. ( , ; ) + ( “” )


iperf3 and microbursts burntchrome.blogspot.ru/2016/09/iperf3-and-microbursts.html



# Check‑list (TODO's)


TODO, .


PNG{SVG} (SVG thumbnail PNG) :


  1. PNG:
    1. [ 778px, 756px] ‑ ( . )
    2. ‑ 7z (un[7z]me), ( – “ ”, ‑ , ‑ )
      • [ Photoshop] “Save for Web” → PNG 24+alpha
      • [ GIMP] “8bpc RGBA” ( ), “ Save for Web
    3. 256 + alpha‑
    4. “” , Image Catalyst ( “” 2 : 2.1 2.5 , ):
      1. “” 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”)


      2. “” 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”)



      3. 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!" ) 

    5. “.svg” ( ) – (SVG) (un[7z]me)
  2. SVG:
    1. {SVG 1.1; UTF-8; ; : ; : “1:100”; } ( , 2 – 1‑ )
    2. transform SVG ( 90 ) ( SVG ):
      1. DevTools transform ( “ [transform] ”)
      2. 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   'Refresh End Sub 

    3. :
      • :
        • ( [, ] )
        • ( )
    4. ( )
    5. XML ( )
      1. ( ):
        • DOCTYPE ” “ Creator ” “ 96ppi ” ( ppi CorelDRAW SVG)
        • metadata ”, “ id ” ( )
        • svg:
          1. xmlns ” “ xml:space
          2. xmlns:xlink
          3. [, “ 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" `
        • ( ) ` " ` ` " `
      2. ( <rect> <g>), , “ viewBox ” ( <svg>)
        • , SVG , CorelDRAW – , , , ( , )
      3. SVG optimiser :
        • :
          • Whitespace: pretty
          • Style type: optimal
          • Truncate * numbers: unchanged
          • ( , “Remove clean group”, )
        • <svg>
        • <style> – SVG optimiser CDATA ( )
      4. XML
  3. PNG SVG:
    1. “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:


  • git tag git “git-tag-‹›” .
  • git , / , “article_#”. ( LLTR Simulation Model )
  • ( “http”), ( ) web.archive.org, sohabr.net:
     var res=str.match(/http[^#)\s]*/gm); var res_l=res.length; for(var i=0;i<res_l;i++) console.log(res[i]); var archive = res.filter(function(a){return a.search(/(omnetpp.org\/doc\/omnetpp\/manual\/#|wikipedia|\/github.com\/)/)==-1;}); 
    • , web.archive.org sohabr.net .
    • habrahabr.ru habr.com, .. web.archive.org ( , ).
  • , Wikipedia “?stable=1”.
  • () MediaWiki (“#.D0.AD.D0.B2.D1.80.D0.B8.D1.81…”; “wikipedia”, “#.D0”) (“#…”).
  • C ( ) + Git.
  • [ “ 2”] (“LLTR #::”), “title” ( ).
  • (id, name), (, “#”) ( title “ ”).
    • sohabr.net ` id ` ( ), ` <a name=""></a> `?
    • “Unicode Link Symbol” (U+1F517; “&#128279;”) , (Chrome , , ), .. .
  • (<hr />) – , UserCSS ( UserCSS ).
  • ` <p><br /></p> `, UserCSS ` <br /> `, ` margin ` ` <p> ` ( ).
    • `<p> ` , Markdown… (, ` <p> ` info , , UserCSS, ).
  • height ( ‑), , width.
  • Full width brackets ” ( ; , ).
  • “ ?”
    • ( , , ). , ( ) , . , – . , ( ). /, . //, – .
    • ”.
  • habrahabr.ru/info/help/posts/ ( , old )
    , how‑to – « » (tutorial), ;
  • .


Note : habrahabr <oembed> , GitHub , .


Note : TODO‑ , 43 KiB ( “ 0”), 69 KiB ( “ 1”), 45 KiB ( ).




DOI: 10.5281/zenodo.1407060

Source: https://habr.com/ru/post/de421243/


All Articles