1. Поколения памяти: объекты делятся на поколения (0, 1, 2) для оптимизации очистки.
2. Триггер срабатывания: GC запускается при нехватке памяти или явным вызовом.
3. Сбор поколений: сначала очищаются молодые объекты (0 поколение), а затем старшие.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Когда браузер отправляет запрос и получает ответ от API, это включает несколько шагов, которые следуют HTTP-протоколу. Этот процесс включает в себя создание и отправку HTTP-запроса, обработку на сервере и получение HTTP-ответа.
Обычно запрос инициируется через JavaScript с использованием встроенных функций, таких как
XMLHttpRequest, fetch или сторонние библиотеки, такие как Axios. fetch('https://api.example.com/data', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token'
}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
Метод: Указывает тип запроса (например, GET, POST, PUT, DELETE). URL: Указывает на какой URL отправляется запрос. Заголовки (Headers): Включают информацию о типе содержимого, авторизации и других метаданных. Тело (Body): Содержит данные, которые отправляются с запросом (для методов POST, PUT и PATCH).
Браузер использует сетевые протоколы для отправки сформированного HTTP-запроса на указанный сервер через интернет.
Сервер получает HTTP-запрос.
Сервер обрабатывает запрос, выполняя соответствующие действия, такие как чтение данных из базы данных, выполнение логики приложения или взаимодействие с другими сервисами.
Статус код (Status Code): Указывает результат обработки запроса (например, 200 OK, 404 Not Found, 500 Internal Server Error). Заголовки (Headers): Могут включать метаданные о содержимом ответа, кэшировании и других параметрах. Тело (Body): Содержит данные, которые отправляются обратно клиенту, часто в формате JSON или XML.
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85
{
"id": 1,
"name": "Example",
"description": "This is an example response"
}
Браузер получает HTTP-ответ от сервера.
Статус код: Браузер или JavaScript-код проверяет статус код, чтобы определить, был ли запрос успешным. Заголовки: Заголовки могут быть использованы для получения дополнительной информации о ответе. Тело: Браузер разбирает тело ответа, если это необходимо, например, преобразует JSON-данные в объект JavaScript.
Полученные данные могут быть использованы в приложении для обновления интерфейса пользователя, хранения в локальном хранилище или выполнения других действий.
Отправка запроса
fetch('https://api.example.com/data', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token'
}
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(data => {
console.log('Data received:', data);
// Используем данные для обновления UI или других целей
})
.catch(error => {
console.error('There has been a problem with your fetch operation:', error);
});Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
2. Исполнительный (динамический): достигается через переопределение методов (overriding) и виртуальные функции.
3. Полиморфизм позволяет обрабатывать объекты разных типов единообразно, например, через интерфейсы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
DNS (Domain Name System) переводит доменные имена (например,
www.example.com) в IP-адреса (например, 192.0.2.1), чтобы компьютеры могли общаться. Браузер отправляет запрос к DNS-серверу.
DNS-сервер обращается к корневым, TLD и авторитетным серверам.
Авторитетный сервер возвращает IP-адрес.
Браузер использует IP-адрес для соединения с веб-сайтом.
IPv4-адрес.
IPv6-адрес.
Псевдоним.
Почтовый сервер.
Текстовые данные.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
2. O: Принцип открытости/закрытости (Open/Closed Principle).
3. L: Принцип подстановки Барбары Лисков (Liskov Substitution Principle).
4. I: Принцип разделения интерфейсов (Interface Segregation Principle).
5. D: Принцип инверсии зависимостей (Dependency Inversion Principle).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Маршрутизация в ASP.NET Core сопоставляет URL-запросы с контроллерами и действиями.
Определение маршрутов
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Пример контроллера
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
public class ProductsController : Controller
{
public IActionResult Index() => View();
public IActionResult Details(int id) => View();
}
Атрибуты маршрутизации
[Route("api/[controller]")]
public class ProductsController : Controller
{
[HttpGet("{id}")]
public IActionResult GetProduct(int id)
{
return View();
}
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
2. Усложнение взаимодействия: требуется настройка API и их маршрутизации.
3. Трудности тестирования и деплоя: распределённые системы сложнее тестировать и синхронизировать.
4. Затраты на ресурсы: каждый сервис требует выделения собственных ресурсов, что увеличивает их потребление.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
HTTP-запросы делятся на несколько типов, каждый из которых предназначен для выполнения определенных операций. Основные типы HTTP-запросов включают GET, POST, PUT, DELETE, PATCH и другие. Данные в этих запросах могут передаваться через URL, заголовки или тело запроса в зависимости от типа запроса и его назначения.
Запрос для получения данных с сервера. Данные передаются в URL в виде параметров запроса.
GET /api/products?category=electronics&page=2 HTTP/1.1
Host: example.com
Запрос для отправки данных на сервер для создания ресурса. Данные передаются в теле запроса.
POST /api/products HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "New Product",
"price": 19.99
}
Запрос для отправки данных на сервер для обновления существующего ресурса. Данные передаются в теле запроса.
PUT /api/products/1 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "Updated Product",
"price": 29.99
}
Запрос для удаления ресурса на сервере. Данные могут передаваться в URL или заголовках, но тело запроса обычно не используется.
DELETE /api/products/1 HTTP/1.1
Host: example.com
Запрос для частичного обновления ресурса на сервере. Данные передаются в теле запроса.
PATCH /api/products/1 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"price": 24.99
}
Запрос, аналогичный GET, но сервер возвращает только заголовки ответа без тела. Данные передаются в URL, как и в GET-запросе.
HEAD /api/products HTTP/1.1
Host: example.com
Запрос для получения поддерживаемых сервером методов HTTP для указанного ресурса. Данные передаются в URL.
OPTIONS /api/products HTTP/1.1
Host: example.com
GET-запрос с использованием fetch API в JavaScript
fetch('https://example.com/api/products?category=electronics&page=2')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));POST-запрос с использованием fetch API в JavaScript
fetch('https://example.com/api/products', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'New Product',
price: 19.99
})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
1. Поддерживает Windows, macOS и Linux.
2. Легковесный, с открытым исходным кодом, предназначен для высокой производительности.
3. Подходит для разработки веб-приложений, облачных сервисов и микросервисов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Это небольшие фрагменты данных, которые веб-сайты сохраняют на устройствах пользователей для хранения информации о сессии и отслеживания состояния. Куки используются для различных целей, таких как аутентификация пользователей, хранение настроек и предпочтений, а также отслеживание активности пользователей на сайте.
Уникальный идентификатор для каждого куки.
Данные, которые хранит куки.
Домен, для которого куки действителен.
Путь на сервере, для которого куки действителен.
Дата или время, когда куки должен быть удален.
Указывает, что куки должны передаваться только через HTTPS.
Указывает, что куки недоступен через JavaScript, только через HTTP(S) запросы.
Сервер отправляет куки в ответе на запрос клиента с использованием заголовка
Set-Cookie. HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; Expires=Wed, 09 Jun 2023 10:18:14 GMT
Content-Type: text/html
Браузер автоматически добавляет соответствующие куки в заголовок
Cookie при каждом последующем запросе к серверу, для которого эти куки действительны. GET /dashboard HTTP/1.1
Host: example.com
Cookie: sessionId=abc123
Установка куки на сервере (пример на Node.js с использованием Express)
const express = require('express');
const app = express();
app.get('/', (req, res) => {
// Устанавливаем куки
res.cookie('sessionId', 'abc123', {
maxAge: 900000,
httpOnly: true
});
res.send('Куки установлены');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});Доступ к куки на клиенте (пример на JavaScript)
// Установка куки
document.cookie = "username=JohnDoe; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/";
// Получение всех куки
let cookies = document.cookie;
console.log(cookies);
Куки с флагом
Secure передаются только по HTTPS-соединениям. Куки с флагом HttpOnly недоступны через JavaScript, что помогает защитить их от XSS-атак.Обычно один куки не должен превышать 4KB, и на одном домене может быть установлено не более 20-30 куки.
Куки могут содержать чувствительные данные, поэтому важно защищать их и использовать шифрование, если необходимо.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
1. Используется для хранения объектов и данных, срок жизни которых заранее не известен.
2. Память в куче управляется сборщиком мусора (GC).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Библиотека для создания заглушек (mock-объектов) в модульных тестах. Она позволяет изолировать тестируемый код от внешних зависимостей, таких как базы данных или веб-сервисы, упрощая и повышая надежность тестирования.
Изолирует тестируемый код от внешних зависимостей.
Легко создавать заглушки и настраивать их поведение.
Проверяет вызовы методов заглушек, параметры и частоту вызовов.
Интерфейс и класс
public interface IUserRepository
{
User GetUserById(int id);
void SaveUser(User user);
}
public class UserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void UpdateUser(int id, string newName)
{
var user = _userRepository.GetUserById(id);
if (user == null) throw new ArgumentException("User not found");
user.Name = newName;
_userRepository.SaveUser(user);
}
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
Модульный тест с Moq
using Moq;
using Xunit;
public class UserServiceTests
{
[Fact]
public void UpdateUser_ShouldUpdateUserName()
{
// Arrange
var mockRepository = new Mock<IUserRepository>();
var user = new User { Id = 1, Name = "Old Name" };
mockRepository.Setup(repo => repo.GetUserById(1)).Returns(user);
var userService = new UserService(mockRepository.Object);
// Act
userService.UpdateUser(1, "New Name");
// Assert
Assert.Equal("New Name", user.Name);
mockRepository.Verify(repo => repo.SaveUser(user), Times.Once);
}
[Fact]
public void UpdateUser_ShouldThrowExceptionIfUserNotFound()
{
// Arrange
var mockRepository = new Mock<IUserRepository>();
mockRepository.Setup(repo => repo.GetUserById(1)).Returns((User)null);
var userService = new UserService(mockRepository.Object);
// Act & Assert
Assert.Throws<ArgumentException>(() => userService.UpdateUser(1, "New Name"));
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Forwarded from easyoffer
easyoffer
Backend
Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты
Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты
Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты
Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты
Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты
C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты
C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты
Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты
DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты
PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты
Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты
Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Обеспечивают гибкость и модульность, позволяя использовать зависимости через абстракции.
2. Используются в многократной реализации, так как классы могут реализовывать несколько интерфейсов.
3. Позволяют писать тестируемый код за счёт внедрения зависимостей (Dependency Injection).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1🔥1
Это технология, которая позволяет автоматически связывать объекты в коде с таблицами в базе данных. Это упрощает работу с базой данных, позволяя разработчикам работать с данными как с объектами, а не писать сложные SQL-запросы.
Позволяет использовать объектно-ориентированный подход.
Генерирует SQL-запросы автоматически.
Управляет транзакциями на уровне объектов.
Легко обновлять структуру БД через код.
Пример с Entity Framework (C#)
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
// Использование
using (var context = new AppDbContext())
{
var product = new Product { Name = "Example" };
context.Products.Add(product);
context.SaveChanges();
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
1. Если ресурс существует, он обновляется, а если нет — создаётся.
2. Это идемпотентный метод, что означает одинаковый результат при многократных вызовах с теми же данными.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤1
Запрос к базе данных отправляется в момент выполнения операций, которые требуют взаимодействия с базой данных. В контексте использования ORM, таких как Entity Framework, это происходит в определенные моменты, когда вы явно вызываете методы для сохранения изменений или выполнения запросов.
Все изменения, сделанные в контексте (например, добавление, обновление, удаление объектов), отправляются в базу данных.
using (var context = new AppDbContext())
{
var product = new Product { Name = "Example" };
context.Products.Add(product);
context.SaveChanges(); // Запрос к базе данных отправляется здесь
}
Методы, такие как
ToList(), FirstOrDefault(), SingleOrDefault(), Count(), и другие, вызывают выполнение запроса к базе данных для получения данных.using (var context = new AppDbContext())
{
var products = context.Products.ToList(); // Запрос к базе данных отправляется здесь
}
Асинхронные методы, такие как
SaveChangesAsync(), ToListAsync(), и другие, также отправляют запросы к базе данных.using (var context = new AppDbContext())
{
var product = new Product { Name = "Example" };
context.Products.Add(product);
await context.SaveChangesAsync(); // Запрос к базе данных отправляется здесь
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
1. Указывает серверу удалить указанный ресурс по заданному URL.
2. Также является идемпотентным, так как повторные вызовы не изменяют результат.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2❤1👀1
Это механизм, который позволяет объектам уведомлять другие объекты о том, что произошло определенное действие. Это важная часть паттерна "наблюдатель" (observer pattern), который используется для реализации асинхронного взаимодействия между объектами.
Делегаты определяют сигнатуру методов, которые могут быть вызваны при возникновении события.
События — это специальные делегаты, которые могут быть вызваны для уведомления подписчиков о происходящем действии.
Объекты, которые подписаны на событие и реагируют на его вызов.
Определение делегата и события
public class Publisher
{
// Определение делегата
public delegate void NotifyEventHandler(object sender, EventArgs e);
// Определение события на основе делегата
public event NotifyEventHandler Notify;
// Метод, вызывающий событие
public void RaiseEvent()
{
if (Notify != null)
{
Notify(this, EventArgs.Empty);
}
}
}
Подписка на событие и обработчик события
public class Subscriber
{
public void OnNotify(object sender, EventArgs e)
{
Console.WriteLine("Получено уведомление о событии.");
}
}
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
// Подписка на событие
publisher.Notify += subscriber.OnNotify;
// Вызов события
publisher.RaiseEvent();
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
1. 400 Bad Request: запрос клиента некорректен.
2. 401 Unauthorized: требуется аутентификация.
3. 403 Forbidden: доступ запрещён.
4. 404 Not Found: ресурс не найден.
5. 500 Internal Server Error: ошибка на стороне сервера.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4