Dans les parties précédentes ...
Q: Qu'avons-nous?
R: Statistiques collectées auprÚs des hÎtes.
Q: Que voulons-nous obtenir?
R: Topologie du réseau! Plus précisément, vous devez créer la chaßne de pairs (hÎtes) appropriée pour RingSync .
Nous devons trouver un algorithme qui transforme d'abord les statistiques en topologie de réseau, puis en chaßne de pairs. Jusqu'à présent, l'algorithme ressemble à ceci:
â-[**]--> --[**]-->
Si vous avez aimé lire la «Partie 1» sur les pages GitHub , voici un lien vers cette partie sur les pages GitHub.
Avertissement : Vous trouverez ci-dessous les mĂȘmes artefacts Habr-parser que j'ai avertis dans la "Partie 1" .
Remarque : plus loin au lieu de « â-[**]-->
», j'utiliserai « â-[???]-->
».
Les statistiques collectées nous montrent sur quels hÎtes la vitesse de réception du trafic de diffusion a chuté. Par exemple, regardez le résultat de l'itération zéro dans le réseau "N2_2" (" Network
" de l'article précédent "LLTR Part 1"):
{300,164,164},
2 Ătats hĂŽtes sont clairement visibles ici:
- vitesse normale (valeur «
300
») - aucune réaction ; - la vitesse a chuté (valeur "
164
") - il y a une réaction .
à quoi je veux en venir? à la binarisation! Si nous codons l' absence de réaction comme 0 et la présence d'une réaction comme 1 , alors nous pouvons mettre toutes les réponses des hÎtes en une seule itération dans une variable ( 32 - 512 bits [ AVX - 512 ]). En plus d'économiser de la mémoire (et de l'espace dépensé dans les caches), cela augmentera la vitesse de traitement - toutes les réponses de l'hÎte d'une itération particuliÚre ( SIMD ) seront traitées simultanément dans une instruction.
Remarque : car l'utilisation de LLTR Basic pour un grand nombre d'hÎtes coûte trÚs cher ( voir le début de la section «LLTR Part 0 :: LLTR Advanced» ), puis tout tient dans des registres 64 bits x86-64.
Remarque : Dans le texte du lien vers la section situĂ©e dans un autre article (une autre partie), j'ajouterai le numĂ©ro de piĂšce au format: « LLTR Part # :: âč section name âș ». Et dans le " title
" du lien, j'écrirai le nom de la partie, par exemple, pour "LLTR Part 0 ::", "Détecter automatiquement la topologie du réseau et les commutateurs non gérés apparaßtront." Mission impossible? "
Prenons le mĂȘme exemple d'itĂ©ration zĂ©ro et voyons Ă quoi cela ressemblera aprĂšs la binarisation:
{300,164,164} --[]--> 011
TrÚs compact, mais j'aimerais que « 1
» (la présence d'une réaction ) attire immédiatement mon attention lors de l'affichage d'une liste de toutes les itérations. Maintenant, " 1
" ne se distingue pas du fond " 0
" (fausses données, pour un exemple visuel ):
0101011010110 1100010110010 0101101010111 0100010110100
Pour mettre en évidence « 1
», j'introduis la notation:
- «
1
» signifie 1 - il y a une réaction ; - "
.
âSignifie 0 - aucune rĂ©action .
Regardons à nouveau les «fausses données»:
.1.1.11.1.11. 11...1.11..1. .1.11.1.1.111 .1...1.11.1..
Tellement mieux (Ă mon humble avis ).
Pour l'instant, l'algorithme ressemble Ă ceci:
â-[]--> --[???]--> --[???]-->
Nous laissons les détails de la binarisation à la fin de l'article et nous concentrons sur le reste de l'algorithme.
Il est plus facile de crĂ©er un algorithme basĂ© sur des donnĂ©es d'entrĂ©e / entrĂ©e spĂ©cifiques (cas particuliers, conditions aux limites; tests en termes de TDD ). Dans notre cas, les donnĂ©es initiales dĂ©pendent de la topologie du rĂ©seau, vous devez donc trouver un rĂ©seau qui serait Ă la fois petit et contenant en mĂȘme temps diffĂ©rents schĂ©mas de connexion de commutateur ( Ă©toile , connexion sĂ©rie ). Il sera peut-ĂȘtre possible d'y inclure quelque chose de spĂ©cial ... En gĂ©nĂ©ral, l'imagination a dessinĂ© un tel rĂ©seau (la notation des Ă©lĂ©ments est similaire Ă la notation utilisĂ©e Ă la fin de la section " LLTR Part 0 :: Topologie:" connexion sĂ©rie des commutateurs " "):

Remarque : en regardant ce réseau, la question "est-il possible d'effectuer une analyse complÚte dans cette topologie si l'un des commutateurs ..." (vers la fin de la section " LLTR Part 0 :: Topologie:" connexion série des commutateurs " "), et vous remarquez qu'aucun hÎte n'est directement connecté à l'un des commutateurs. De plus, il n'y a pas de problÚme, car 3 autres commutateurs sont connectés à ce commutateur (j'ai compté uniquement les commutateurs connectés «par le bas», sans considérer qu'il est connecté à un autre commutateur «par le haut»), chacun ayant des hÎtes.
Cependant, dans ce diagramme, il y a quelques détails supplémentaires (distrayants). Je vais le nettoyer en supprimant:
- hÎte de diffusion (il n'est pas dans l'entrée / les statistiques);
- ports reliant les commutateurs entre eux.
Ici, le commutateur «sans hÎtes» est immédiatement visible. De plus, j'ai disposé tous les commutateurs de maniÚre à ce que les hÎtes ne se chevauchent pas verticalement. Cela sera utile si, à l'avenir, je souhaite afficher les «réactions de l'hÎte» non pas sous la forme d'une entrée de texte « .....1......
», mais sous la forme d'un diagramme (il n'y a qu'un seul hÎte sur une verticale):
Imaginez maintenant les statistiques que nous obtenons à la fin de toutes les itérations de l'analyse de ce réseau. Il y a 12 hÎtes dans le réseau (hors hÎte de diffusion), par conséquent, nous aurons des données sur 132 itérations. Cependant, tous les résultats de l'itération ne nous seront pas utiles, par exemple, ils seront inutiles:
AprÚs le nettoyage, sur les 132 résultats d'itération, seuls 5 (réponses de l'hÎte) resteront:
1111111111.. 11111111.... ..111....... .....111.... 11..........
Remarque : pour plus de clarté, j'ai organisé les itérations dans l'ordre, d'un plus grand nombre de « 1
» à un plus petit.
L'algorithme a commencé à ressembler à ceci:
â-[]--> --[ ]--[ ]--[???]--> --[???]-->
réinitialiser le point
J'ai pensé à inclure tout cela dans le spoiler, mais à la fin j'ai réalisé que c'est une partie importante de l'histoire, qu'il vaut mieux ne pas manquer lors de la lecture.
ÂŹ ( Ne sautez pas au cerveau lors de la lecture : Cong
[point de rĂ©initialisation] Dans les 5 rĂ©sultats d'itĂ©ration restants, les deux premiers attirent l'attention: le premier comprend le second, et le second comprend les 3 autres infĂ©rieurs. Ici, je rappelle le «shadow» de la section « LLTR Part 0 :: Topology:« serial connection of switches » ». Dans la mĂȘme section, Ă la fin de chaque itĂ©ration, nous avons formĂ© (ou n'avons pas formĂ©) de nouveaux clusters sur la base des donnĂ©es qui viennent d'ĂȘtre obtenues. Maintenant, nous devons faire de mĂȘme.
Mais comment avons-nous formé de nouveaux clusters? En fait, toutes les réactions (non uniques) des hÎtes « 1
» de l'itĂ©ration actuelle Ă©taient le «nouveau cluster», nous n'avions qu'Ă trouver les intersections («â©Â»; pas vides «â
») avec les clusters existants afin de supprimer («â») du plus grand hĂŽtes de cluster inclus dans un cluster plus petit.
Cependant, dans nos actions, il y avait une condition / ramification (si): vous devez dĂ©terminer lequel des clusters est le plus grand, puis effectuer une opĂ©ration simple (A â B) - soustraire le plus petit (B) du plus grand cluster (A). ReprĂ©sentant le tourment d'un CPU avec un long pipeline causĂ© par la nĂ©cessitĂ© de rĂ©initialiser le pipeline si la prĂ©diction de branche est incorrecte (s'il y a un "bloc de prĂ©diction de branche"), j'ai presque dĂ©cidĂ© d'utiliser l' â?:
" , Mais Ă ce moment-lĂ ...
Je me tenais sur les toilettes et suspendais l'horloge. Soudain, il a glissĂ©, s'est cognĂ© la tĂȘte contre l'Ă©vier, et quand je me suis rĂ©veillĂ©, j'ai eu une vision, une image dans mon cerveau, une vision de cela - un sĂ©parateur de flux d'entraĂźnement de flux ( Retour vers le futur ) :
Et voir immédiatement son travail sur l'exemple des clusters qui se chevauchent (plus précisément, un ensemble (cluster) est strictement inclus " " dans un autre ensemble):
.....11..... - a ..11111111.. - b ..111..111.. - c=a^b ............ - aa=a&c ..111..111.. - bb=b&c .....11..... - cc=a&b
Clusters disjoints:
..111....... - a .......111.. - b ..111..111.. - c=a^b ..111....... - aa=a&c .......111.. - bb=b&c ............ - cc=a&b
Il s'avĂšre que:
- «
aa
» contient des éléments propres à « a
»; - en «
bb
» - unique à « b
»; - en «
cc
» - commun à « a
» et « b
».
Un autre exemple avec des grappes qui se croisent («impossible», mais un bon exemple):
...1111..... - a .....1111... - b ...11..11... - c=a^b ...11....... - aa=a&c .......11... - bb=b&c .....11..... - cc=a&b
Remarque : ce type de réponse (réaction de l'hÎte) ne figure pas dans les données source.
De la mĂȘme maniĂšre, vous pouvez vous dĂ©barrasser des prises :
.....11..... - a .....11..... - b ............ - c=a^b ............ - aa=a&c ............ - bb=b&c .....11..... - cc=a&b
Mais, un peu plus tard ...
La tĂȘte cesse de faire mal aprĂšs avoir atteint l'Ă©vier, l'esprit s'Ă©claircit et des problĂšmes Ă©vidents surgissent ...
En entrĂ©e, nous avons 2 variables (rĂ©sultats d'itĂ©ration / rĂ©actions de l'hĂŽte / clusters / ensembles / ...), mais il y en a dĂ©jĂ 3 en sortie, et au moins l'une d'entre elles sera vide ("â
"). Si vous ne vous dĂ©barrassez pas immĂ©diatement de «â
», vous devrez les inclure dans le traitement Ă l'avenir. Par consĂ©quent, il est prĂ©fĂ©rable de se dĂ©barrasser immĂ©diatement de «â
». Mais comment faire? Utilisez la condition / ramification! ... En général, je suis retourné à mon point de départ. De plus, si tout est fait comme décrit ci-dessus, en plus il se débarrasse de «,», alors à la fin nous obtenons de:
1111111111.. 11111111.... ..111....... .....111.... 11..........
Câest:
........11.. - "............", ïŒïŒ ..111....... .....111.... 11..........
Il est temps de poser la question: "Comment obtenir la topologie du rĂ©seau Ă partir de cela?" Maintenant, ces donnĂ©es peuvent «dire» Ă quel cluster un hĂŽte particulier appartient (c'est-Ă -dire Ă quel commutateur l'hĂŽte est connectĂ©), mais ces donnĂ©es manquent maintenant complĂštement d'informations sur la topologie des commutateurs (c'est-Ă -dire, comment sont connectĂ©s commutateurs entre eux) - nous avons perdu ces informations lors de la conversion des donnĂ©es. De plus, Ă quel cluster (commutateur) les 2 hĂŽtes les plus Ă droite appartiennent-ils? Si nous considĂ©rons chaque ligne comme un cluster sĂ©parĂ© (ou comme une indication des hĂŽtes connectĂ©s Ă un commutateur particulier), il s'avĂšre que ces 2 hĂŽtes extrĂȘmes ne sont connectĂ©s nulle part! De plus, nous avons 6 commutateurs sur le rĂ©seau, et il reste 4 lignes, oĂč sont 2 lignes supplĂ©mentaires? Nous en avons effacĂ© un (comme l'indique le commentaire ci-dessus), et dans l'autre, il aurait dĂ» y avoir «2 hĂŽtes Ă l'extrĂȘme droite».
[ goto reset point ] Développer cette idée est inutile. Impasse (branche git). Vous devrez revenir à l'étiquette de «point de réinitialisation», en oubliant tout ce qui était aprÚs, mais en laissant cette branche pour l'histoire.
Maintenant, afin de ne pas tomber dans une autre "branche morte", vous devez décider de la structure finale (représentation) de la topologie du réseau en mémoire. Autrement dit, avec ce que nous voulons obtenir au moment de la «topologie du réseau»:
â-[]--> --[ ]--[ ]--[???]--> <strong> </strong> --[???]-->
Tout d'abord , tous les hĂŽtes doivent ĂȘtre prĂ©sents:
<strong>..........11</strong> <-- 1111111111.. 11111111.... ..111....... .....111.... 11..........
DeuxiĂšmement , les parents doivent ĂȘtre indiquĂ©s (le cluster parent pour chaque cluster; pour le moment: parent â enfant ; sur le schĂ©ma du rĂ©seau, j'ai placĂ© les parents au-dessus des enfants) (les numĂ©ros de cluster sont ajoutĂ©s Ă gauche):
0) ..........11 parent: ? 1) 1111111111.. parent: ? 2) 11111111.... parent: 1 3) ..111....... parent: 2 4) .....111.... parent: 2 5) 11.......... parent: 2
Remarque : si vous remarquez quelque chose d'étrange ici, en comparant le schéma de ce réseau avec ces données, alors vous m'aimez.
Spoiler, il vaut mieux ne pas ouvrir avant d'avoir lu toute la liste
En fait (selon le diagramme), le parent du cluster 1 est le cluster 0, mais alors la condition « parent â enfant » n'est pas remplie. Peut-ĂȘtre que dans " First " nous avons fait une erreur, et au lieu de " ..........11
" cela valait la peine d'ajouter " 111111111111
"?
TroisiĂšmement , il devrait y avoir un parent «racine» reliant des arbres individuels (c.-Ă -d. ForĂȘt ) en un seul arbre:
-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
QuatriĂšmement , ce serait bien d'avoir des listes d'enfants avec chaque parent:
-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
Et enfin , il est désormais possible d'exclure les enfants de leurs parents:
-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
Maintenant, chaque ligne dĂ©crit un cluster, c'est-Ă -dire pointe vers des hĂŽtes connectĂ©s au mĂȘme commutateur. Cependant, attendez, il y a 6 commutateurs dans notre rĂ©seau, et il y a 7 clusters! Il est enfin temps de lire le texte du spoiler ci-dessus " Spoiler, il vaut mieux ne pas ouvrir avant d'avoir lu la liste entiĂšre ", et corriger la situation:
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
Ces données sont précisément la «topologie du réseau» - elles décrivent l'arborescence des commutateurs, et à partir de là , vous pouvez déterminer tous les hÎtes connectés à un commutateur particulier.
â-[]--> --[ ]--[ ]--[???]--> <strong> </strong> --[???]-->
Reste Ă comprendre comment amener les donnĂ©es sur ce formulaire. En fait, tout ce que nous avons fait (d'une part, d'autre part, ...) peut ĂȘtre converti en algorithme:
- "PremiĂšrement" (aprĂšs avoir fait des corrections Ă partir du spoiler, cela devient similaire Ă l'action "troisiĂšme") - ajoutez un cluster "racine" "
111111111111
" ( universel ), y compris (hĂŽtes de tous les arbres de la forĂȘt, hĂŽtes situĂ©s sur le mĂȘme commutateur que l'hĂŽte de diffusion ), c'est-Ă -dire Il inclut tous les hĂŽtes du rĂ©seau; - «DeuxiĂšmement» - rechercher un parent pour chaque cluster ;
- «QuatriÚmement» - établir une liste d'enfants pour chaque parent ;
- «Et enfin» - l' exclusion des enfants de leurs parents .
Vous pouvez maintenant ajouter ces actions à l'algorithme général (légÚrement changé l'apparence):
â â [] âș [ ] [ ] âș / [ "" ] âș / [ ] [ ] [ ] âș â [???] âș â
Vue alternative
â âș [] ⏠âș [ ] [ ] ⏠/ âș [ "" ] ⏠/ âș [ ] [ ] [ ] â âș [???] â â
Voyons ce qui se passe si vous appliquez cet algorithme à un autre réseau. Je voudrais prendre le réseau Network_ serial
et ses résultats de simulation (statistiques) de la section " LLTR Part 1 :: Plus de réseaux avec différentes topologies, en ajoutant de nouveaux réseaux ".
Remarque : Pourquoi ai-je choisi ce réseau particulier? Il est assez volumineux et il existe des failles dans les données collectées (voir la fin du spoiler «Résultats de simulation» pour ce réseau).
C'est parti!
Binarisation
Réactions de l'hÎte:
.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.
Purification à partir de réactions uniques
.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. -->
Nettoyage des doublons (nous obtenons «clusters / forĂȘt»):
.111111.. .......11 ...1111.. .....11.. .........
De plus, pour plus de commodité , je vais trier par ordre décroissant de la quantité « 1
»:
.111111.. ...1111.. .....11.. .......11 .........
Remarque : il peut ĂȘtre utile d'inclure le tri dans l'algorithme. Qu'en penses-tu?
Ajout d'un cluster «racine» (on obtient «clusters / arborescence»):
111111111 .111111.. ...1111.. .....11.. .......11 .........
Il comprend des hĂŽtes de 2 arbres (Ă gauche " .111111..
" et Ă droite " .......11
" du réseau) et 1 hÎte (" 1........
" situé sur un commutateur avec hÎte de diffusion).
Recherche parent pour chaque cluster:
0) 111111111 1) .111111.. parent: 0 2) ...1111.. parent: 1 3) .....11.. parent: 2 4) .......11 parent: 0 5) ......... parent: 4
Remarque : C'est lĂ que s'est produit l'impact nĂ©gatif des lacunes dans les donnĂ©es - le 4e cluster est devenu le parent du 5e! En gĂ©nĂ©ral, tout cluster peut devenir le parent du 5e cluster, car il est vide (â
).
Construire une liste d'enfants pour chaque parent:
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
Exclusion des enfants des parents:
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
à cette étape, nous devions obtenir une «topologie de réseau». Et nous l'avons. Si nous ne sommes intéressés que par l'emplacement des hÎtes, alors cette «topologie de réseau» est tout à fait satisfaisante pour nous. Cependant, un autre commutateur est apparu dans notre réseau, dans lequel 0 hÎte!
Pour tout rĂ©parer, il suffira aprĂšs l'une des premiĂšres Ă©tapes d'Ă©liminer ces «failles de donnĂ©es». Cela peut ĂȘtre fait immĂ©diatement aprĂšs la «binarisation»:
â â [] âș [<strong> (â
), (⊱)</strong>] [ ] [ ] âș / [ "" ] âș / [ ] [ ] [ ] âș â [???] âș â
Nous supprimons les ensembles vides (â
; « .........
»), mais pourquoi supprimer les univers (⊱; « 111111111
»)? La rĂ©ponse deviendra apparente lorsque nous commencerons Ă mettre en Ćuvre la phase de «binarisation». DiffĂ©rentes variantes de la mise en Ćuvre de la «binarisation» peuvent produire Ă la fois « .........
» et « 111111111
» sur les mĂȘmes donnĂ©es (donnĂ©es prĂ©sentant le dĂ©faut dĂ©crit). Et, parce que il est aussi impossible d'obtenir " 111111111
" dans les données d'entrée correctes que d'obtenir " .........
", alors nous pouvons supprimer tous les " 111111111
" (en plus, ils ne contiennent aucune information sauf que il y a des "défauts" dans les données).
Si vous appliquez cet algorithme (augmentĂ©, corrigĂ©) au mĂȘme rĂ©seau (« Network_ serial
»), la «topologie du réseau» ressemblera à ceci:
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 :
, .
HypothĂšse. ( ), .
â , â
, , (â {âŠ}
â) () . ():
ââ, ():
, :
? TensorsFlowing
c'est-Ă -dire â , â, â â .
?
:
- â ( ) , . ââ , .. ââ ââ . , â â, .
- â ââ / , , . . , (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 : , / , âŠ
Spoiler
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
â ). Un exemple:
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]â â â ( )
Références:
4:
LLTR 4:
â habrauser â {user â Habrahabr | user ââ},
(, . )
Références:
, (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â).
Quelle est la différence? ( [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, )
Références:
6+7: +
LLTR 6:
, Golang.
Références:
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â)
Références:
( â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 + , ( ), â /
:
- 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 ( ).
