.Net рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рднрд╛рдЧ 1)

рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдПрдХ рдЪрд░реНрдЪрд╛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ .Net рдордВрдЪ рдкрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рд▓рд╛рддрд╛ рд╣реВрдВред рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдФрд░ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВред рдиреЗрдЯ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдкрд╛рдардХ рдХреЛ C # рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрдорд╛рдВрдб рдФрд░ SVN рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪреВрдВрдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡реЙрд▓реНрдпреВрдо рд╣рдм рдкрд░ рд╡рд┐рд╖рдпреЛрдВ рдХреА рдФрд╕рдд рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдорд╛рддреНрд░рд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЬреЛ рд╣реИрдмреНрд░реЛрд╕рд░ рдХреЛ рдкреАрдбрд╝рд╛ рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдореВрд▓ рдмрд╛рддреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рднреА рд▓рд┐рдЦреЗрдВрдЧреЗ (рдирд╣реАрдВ)!


рд╣реИрд▓реЛ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд╝рд░реНрд╕ рдХреНрдпрд╛ рд╣реИрдВ?


рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреГрд╖реНрда рдкрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд╝рд░реНрд╕ (рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝) рдПрдХ рдХреБрд╢рд▓ рдФрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ Google рдЕрдкрдиреЗ рд▓рдЧрднрдЧ рд╕рднреА рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред .Net рд╕рд╣рд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреНрд░рдорд╛рдВрдХрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ Google рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреЛрдмреЙрдл рдореБрдЭреЗ рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдиреЗрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ?


рд╣рд╛рдВ, рдЖрдк рд╕рд╣реА рд╣реИрдВ, Google .Net рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝-рдиреЗрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ (рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ) рдЬреЛ рдХрд┐ рдиреЗрдЯрдмреЙрдлрд╝ рдХреЛ рдиреЗрдЯ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдиреЗрддреГрддреНрд╡ рдорд╛рд░реНрдХ рдЧреНрд░реЗрд╡реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ.рдХреЙрдо рдкрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рдФрд░ рдХрдИ рдЕрдиреНрдп рдорд╣рд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрд╕рд╕реЗ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣ рдЦреБрд╢реА рд╕реЗ рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЧрд╛ (рдЬреЛ рд╡рд┐рд╖рдп рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ)ред

рдореБрдЭреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?


рдЬрдм рдпрд╣ .Net рдореЗрдВ рдХреНрд░рдорд╛рдВрдХрди рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рд╣рд░ рдХреЛрдИ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рдлреЙрд░реНрдореИрдЯрд░ рдФрд░ xml рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рддреЗрдЬ рд╣реИ рдФрд░ рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдиреЗрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рднреАрддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдФрд░ рджреВрд╕рд░рд╛ рдорд╛рдирд╡-рдкрдардиреАрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ SOAP рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЧрддрд┐ рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдзрддрд╛ рдЕрдкрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ! рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреЛрдмреЙрдл рдЖрдкрдХреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рддреЛ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдХреНрд░рдорд╛рдВрдХрди рд╕реЗ рд╣реАрди рдирд╣реАрдВ рд╣реИ рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд▓ рднреА рд╣реИ?


рд╣рд╛рдБ, рдпрд╣ рдмрд╛рдд рд╣реИред рдЖрдЗрдП рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ, рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдмреЛрдл-рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдерд╛рдПрдБ рд╣реИрдВ:
using System;
using ProtoBuf;

namespace Proto.Sample
{
public enum TaskPriority
{
Low,
Medium,
High
}

[ Serializable ] // <-- BinaryFormatter
[ProtoContract]
public class Task
{
[ProtoMember(1)]
public int Id { get ; set ; }

[ProtoMember(2)]
public DateTime CreatedAt { get ; set ; }

[ProtoMember(3)]
public string CreatedBy { get ; set ; }

[ProtoMember(4)]
public TaskPriority Priority { get ; set ; }

[ProtoMember(5)]
public string Content { get ; set ; }
}
}


* This source code was highlighted with Source Code Highlighter .

рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝-рдиреЗрдЯ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕реАрдзреЗ рдкреНрд░рд╛рд░реВрдк рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ - рдЦреЗрддреЛрдВ рдХреЗ рдХреНрд░рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗ:
using System;
using System.Collections. Generic ;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using ProtoBuf;

namespace Proto.Sample
{
internal class Program
{
private static void Main( string [] args)
{
var tasks = new List <Task>
{
new Task
{
Id = 1,
CreatedBy = "Steve Jobs" ,
CreatedAt = DateTime .Now,
Priority = TaskPriority.High,
Content = "Invent new iPhone"
},
new Task
{
Id = 2,
CreatedBy = "Steve Ballmer" ,
CreatedAt = DateTime .Now.AddDays(-7),
Priority = TaskPriority.Low,
Content = "Install own Skype"
}
};

Console .WriteLine( "The test of binary formatter:" );

const string file1 = "tasks1.bin" ;

TestBinaryFormatter(tasks, file1, 1000);
TestBinaryFormatter(tasks, file1, 2000);
TestBinaryFormatter(tasks, file1, 3000);
TestBinaryFormatter(tasks, file1, 4000);
TestBinaryFormatter(tasks, file1, 5000);

Console .WriteLine( "\nThe test of protobuf-net:" );

const string file2 = "tasks2.bin" ;

TestProtoBuf(tasks, file2, 1000);
TestProtoBuf(tasks, file2, 2000);
TestProtoBuf(tasks, file2, 3000);
TestProtoBuf(tasks, file2, 4000);
TestProtoBuf(tasks, file2, 5000);

Console .WriteLine( "\nThe comparision of file size:" );

Console .WriteLine( "The size of {0} is {1} bytes" , file1, ( new FileInfo(file1)).Length);
Console .WriteLine( "The size of {0} is {1} bytes" , file2, ( new FileInfo(file2)).Length);

Console .ReadKey();
}

private static void TestBinaryFormatter(IList<Task> tasks, string fileName, int iterationCount)
{
var stopwatch = new Stopwatch();
var formatter = new BinaryFormatter();
using ( var file = File .Create(fileName))
{
stopwatch.Restart();

for ( var i = 0; i < iterationCount; i++)
{
file.Position = 0;
formatter.Serialize(file, tasks);
file.Position = 0;
var restoredTasks = ( List <Task>)formatter.Deserialize(file);
}

stopwatch.Stop();

Console .WriteLine( "{0} iterations in {1} ms" , iterationCount, stopwatch.ElapsedMilliseconds);
}
}

private static void TestProtoBuf(IList<Task> tasks, string fileName, int iterationCount)
{
var stopwatch = new Stopwatch();
using ( var file = File .Create(fileName))
{
stopwatch.Restart();

for ( var i = 0; i < iterationCount; i++)
{
file.Position = 0;
Serializer.Serialize(file, tasks);
file.Position = 0;
var restoredTasks = Serializer.Deserialize< List <Task>>(file);
}

stopwatch.Stop();

Console .WriteLine( "{0} iterations in {1} ms" , iterationCount, stopwatch.ElapsedMilliseconds);
}
}
}
}


* This source code was highlighted with Source Code Highlighter .

рдкрд░рд┐рдгрд╛рдо:
The test of binary formatter:
1000 iterations in 423 ms
2000 iterations in 381 ms
3000 iterations in 532 ms
4000 iterations in 660 ms
5000 iterations in 814 ms

The test of protobuf-net:
1000 iterations in 1056 ms
2000 iterations in 76 ms
3000 iterations in 129 ms
4000 iterations in 152 ms
5000 iterations in 202 ms

The comparision of file size:
The size of tasks1.bin is 710 bytes
The size of tasks2.bin is 101 bytes


* This source code was highlighted with Source Code Highlighter .

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рди рдХреЗрд╡рд▓ рдЧрддрд┐ рдореЗрдВ, рдмрд▓реНрдХрд┐ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдореЗрдВ рднреА рдмрд╛рдЗрдирд░реА рдХреНрд░рдорд╛рдВрдХрди рдХреЛ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдмреЙрдл-рдиреЗрдЯ рдХреЛ "рдардВрдб рд╢реБрд░реВ" рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛ред рд▓реЗрдХрд┐рди рдЖрдк рдирд┐рдореНрди рд╕рд╣рд╛рдпрдХ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
var model = TypeModel.Create();
model.Add( typeof (Task), true );
var compiledModel = model.Compile(path);
compiledModel.Serialize(file, tasks);


* This source code was highlighted with Source Code Highlighter .

рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкрд░рд┐рдгрд╛рдо рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рд▓рдЧрднрдЧред рдЧрддрд┐ рдФрд░ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдкрдиреЗ рдореБрдЭреЗ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?


рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдкреНрд░реЛрдЯреЛрдмреЙрдл рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 20 рд╕реЗ рдЕрдзрд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИрдВред рдкреВрд░реА рд╕реВрдЪреА рдпрд╣рд╛рдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ ред рдореИрдВ рдХреЗрд╡рд▓ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИред

UPD: рднрд╛рдЧ 2

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


All Articles