рдЪрд▓реЛ MongoDb рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ



рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдЪреНрдЪ-рд▓реЛрдб рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдЖрдк рдЕрдм рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рд╕реНрддреНрд░реАрдп рд╕рдВрдмрдВрдз рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред NoSQL рдбреЗрдЯрд╛рдмреЗрд╕ рддреЗрдЬреА рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рд░рд╣реЗ рд╣реИрдВ (NoSQL рди рдХреЗрд╡рд▓ SQL рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ)ред рдРрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ MongoDB рд╣реИ, рдЬрд┐рд╕рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдбрд┐рдЬреНрдиреА, рдХреНрд░реЗрдЧрд▓рд┐рд╕реНрдЯ, рдлреЛрд░рд╕реНрдХреНрд╡реЗрдпрд░ рдЬреИрд╕реА рдХрдВрдкрдирд┐рдпреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрд╛рд░-рдмрд╛рд░ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛:
NoSQL MongoDB, NoRM рдФрд░ ASP.NET MVC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ MongoDB рд╕рд╛рдЭрд╛ рдХрд░рдирд╛
рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ MongoDB рдкреНрд░рддрд┐рдХреГрддрд┐

рдпрд╣ рдПрдХ .net рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ MongoDb рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рд▓реЗрдЦ рд╣реИред

рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
1. рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ( http://www.mongodb.org/downloads ), рдЕрдирдЬрд╝рд┐рдк рдФрд░ рд░рди рдореЛрдВрдЧреЙрдб (рдпрд╣ рд╕рд░реНрд╡рд░ рд╣реИ)
2. рдбреНрд░рд╛рдЗрд╡рд░ ( https://github.com/mongodb/mongo-csharp-driver/downloads )
3. рдЪрд▓рд┐рдП


рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдирд╛ред


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛рдмреЗрд╕ c: / data / db рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ

Mongo.exe рдЪрд▓рд╛рдПрдБ рдФрд░ рдПрдХ рдирдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдБ:
use mongoblog 


рдПрдХреНрд╕реЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб) рддреБрд░рдВрдд рд╕реЗрдЯ рдХрд░реЗрдВ:
 db.addUser("admin", "masterkey") 


MongoDb рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рдЙрдиреНрдореБрдЦ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреБрд░рдВрдд рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕рдВрд╕реНрдерд╛рдПрдБ рд╣реЛрдВрдЧреА, рдЕрдиреБрдЪреНрдЫреЗрдж рдФрд░ рдЯрд┐рдкреНрдкрдгреА, рдФрд░ рдЕрдиреБрдЪреНрдЫреЗрдж рдореЗрдВ рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА:

 public partial class Article { [BsonId] public ObjectId Id { get; set; } //    - id   public string Url { get; set; } public string Title { get; set; } public string Teaser { get; set; } public string Content { get; set; } public DateTime AddedDate { get; set; } public List<string> Tags { get; set; } public bool IsPublished { get; set; } public string Bulk { get; set; } public List Comments { get; set; } public Article() { Id = ObjectId.GenerateNewId(); Tags = new List<string>(); Comments = new List(); } } public partial class Comment { [BsonId] public ObjectId Id { get; set; } //    - id   public DateTime AddedDate { get; set; } public string Content { get; set; } public Comment() { Id = ObjectId.GenerateNewId(); } } 


рдЕрдЧрд▓рд╛, MongoDB рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


# 1 рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рдиред


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдкрд░ 27017 рдкреЛрд░реНрдЯ рд░рдЦрддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рд╣реИ)ред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
 public MongoDBContext(string ConnectionString, string User, string Password, string Database) { var mongoUrlBuilder = new MongoUrlBuilder(ConnectionString); server = MongoServer.Create(mongoUrlBuilder.ToMongoUrl()); MongoCredentials credentials = new MongoCredentials(User, Password); database = server.GetDatabase(Database, credentials); } 


# 2 / # 3 рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рдирд╛ / рдмрджрд▓рдирд╛


рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд╛рдо рд╕реЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
 var collection = database.GetCollection<T>(table); 

рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 collection.Insert<T>(obj); 

рдпрд╛ (рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП)
 collection.Save<T>(obj); 


MongoDb рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ _id рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ - рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкреИрд░рд╛рдореАрдЯрд░ред рдпрджрд┐ рд╕реЗрд╡ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░, рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдореМрдЬреВрджрд╛ рдЖрдИрдбреА рд╣реИ, рддреЛ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


# 4 рдЕрдиреБрдХреНрд░рдордг


рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
 collection.EnsureIndex(IndexKeys.Descending("AddedDate")); 


рдпрд╣ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЫрдБрдЯрд╛рдИ рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдПрдЧрд╛ред

# 5 рд╣рдЯрд╛рдирд╛


рдЖрдИрдбреА рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреНрд╡реЗрд░реА (рдХреНрд╡реЗрд░реА) рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣реИ
 var query = Query.EQ("_id", id) 

рдФрд░ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 collection.Remove(query); 


# 6 рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдЦ


рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЫрд╛рдБрдЯреЗ рдЧрдП рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЕрдирд┐рд░реНрдзрд╛рд░рд┐рдд (IsDeleted = false) рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реЛрд╣реА рддрд┐рдерд┐ (резреж рддрд╛рд░реАрдЦ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрд╛рдВрдЯрд╛ рдЧрдпрд╛ (рд╣рдо резреж рдЖрдЗрдЯрдо рдЫреЛрдбрд╝ рдХрд░ рдЕрдЧрд▓реЗ резреж рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ), рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░реНрд╕рд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 var cursor = collection.Find(Query.EQ("IsDeleted", false)); cursor.SetSortOrder(SortBy.Descending("AddedDate")); cursor.Skip = 90; cursor.Limit = 10; foreach (var obj in cursor) { yield return obj; } 


# 7 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рдирд╛ред


рдЪреВрдВрдХрд┐ MongoDb рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рдЙрдиреНрдореБрдЦ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЯрд┐рдкреНрдкрдгреА рд▓реЗрдЦ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝ рджреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓реЗрдЦ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 var article = db.GetByID<Article>("Articles", articleId); comment.AddedDate = DateTime.Now; article.Comments.Add(comment); db.Save<Article>("Articles", article); 


# 8 рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╣рдЯрд╛рдПрдБред


рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред рд╣рдо рд▓реЗрдЦ рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╕реНрддреБ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред

# 9 рдЦреЛрдЬред


рджрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдПрдХ рддрддреНрд╡ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 Query.Matches("Text", @".* .*"). 

рдЦреЛрдЬ рдХреЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ 2 рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдкреЗрдЯреНрдпрд╛! = рдкреЗрдЯреНрдпрд╛, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред
рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдмрд▓реНрдХ рдлреАрд▓реНрдб рдмрдирд╛рдпрд╛, рдЬрд╣рд╛рдБ рд╕рднреА рдлрд╝реАрд▓реНрдбреНрд╕ + рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдореИрдВ рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдБред

# 10 рдмреИрдХрдЕрдк рдЖрдзрд╛рд░ред


рдпрд╣ рдмреИрдХрдЕрдк рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рдирд╣реАрдВ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рдХреЗрд╡рд▓ рдЙрд╕реА рд╕рдордп рд╕рднреА рд▓реЗрдЦрди рдХрдорд╛рдВрдб рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ)ред рдлрд┐рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреЙрдкреА, рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдПрдлрд╝рдЯреАрдкреА рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрдирд▓реЙрдХ (рдЕрдирд▓реЙрдХ) рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЯреАрдореЗрдВ:
 public void Lock() { var command = new CommandDocument(); command.Add("fsync", 1); command.Add("lock", 1); var collection = server.AdminDatabase.RunCommand(command); } public void Unlock() { var collection = server.AdminDatabase.GetCollection("$cmd.sys.unlock"); collection.FindOne(); } 

рдпрджрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 mongod --repair 


рд╕реНрд░реЛрдд рдХреЛрдб



рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди (asp.net mvc рдкрд░) рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
https://bitbucket.org/chernikov/mongodbblog

рд╣рд╛рдВ, рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

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


All Articles