Точка входа в программирование
19.7K subscribers
1.38K photos
253 videos
2 files
2.89K links
Фундаментальные знания по основам программирования

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/zrgj
Download Telegram
Как работают хэш-функции

Хэш-функция — это алгоритм, который принимает произвольные данные (например, строку или файл) и преобразует их в фиксированную строку определенной длины, называемую хэш-значением.
Два ключевых свойства:

1. Для одного и того же ввода всегда возвращается одинаковый хэш.
2. Невозможно восстановить исходные данные по хэшу (обратное преобразование).

Давайте рассмотрим пример

Возьмём строку "password123" и пропустим её через хэш-функцию (например, SHA-256). Она вернёт хэш-значение:
password123 → ef92b778bae11c00c8cc0d9525c7f90631ad9e11cdec095c9c3af7b06ecf90fc


Хэш будет одинаковым для "password123", сколько бы раз вы его ни рассчитывали. Но если изменить хотя бы один символ, хэш станет совершенно другим.

Пример кода на Python

import hashlib

# Пример строки
text = "password123"

# Использование SHA-256 для получения хэша
hash_object = hashlib.sha256(text.encode())
hash_value = hash_object.hexdigest()

print("Хэш:", hash_value)


Результат: ef92b778bae11c00c8cc0d9525c7f90631ad9e11cdec095c9c3af7b06ecf90fc

Где используется:

1. Для хранения паролей: Вместо хранения пароля "password123" его хэш сохраняют в базе данных. Когда пользователь вводит пароль, хэш снова рассчитывается и сравнивается с сохранённым хэшем.

2. Для ускорения поиска данных: Например, в хэш-таблицах (словарях Python). При добавлении ключа "text" его хэш помогает найти место для хранения значения.

3. В хэш-таблицах: Структура данных для хранения пар «ключ-значение». Хэш-функция вычисляет индекс, где хранится значение, что ускоряет доступ к данным.

#простымисловами
👍11
Зачем нужны контейнеры в программировании

Контейнеры, такие как Docker, нужны, чтобы создавать лёгкие и изолированные окружения для запуска приложений. Проще говоря, это как коробка, в которую вы кладёте ваше приложение вместе со всем, что ему нужно для работы (например, библиотеки, зависимости, настройки), а потом можете запустить эту коробку где угодно.

Зачем это нужно?

1. «Работает у меня». У вас есть приложение, которое отлично работает на вашей машине. Но на сервере оно не запускается из-за разных версий библиотек или зависимостей. С контейнером такие проблемы исчезают, потому что всё, что нужно приложению, идёт с ним в одном «пакете».

2. Универсальная упаковка. Контейнеры работают одинаково на любом компьютере или сервере, будь то ваш ноутбук, облако или чужая инфраструктура. Это экономит время и нервы.

3. Изоляция. Каждый контейнер полностью изолирован. Если в одном контейнере что-то сломалось или идёт нагрузка, это не повлияет на другие.

Пример из реальной жизни

Представьте, что вы повар и вам нужно приготовить блюдо в чужой кухне. Но в чужой кухне может не быть нужных продуктов, посуды и приборов. Контейнер — это коробка, в которой вы привозите всё, что вам нужно: продукты, кастрюли, специи. Теперь вы можете готовить это блюдо в любой кухне, не беспокоясь о том, что чего-то будет не хватать.

Где это используется?

В разработке: программисты создают контейнер с приложением, и каждый в команде может работать в одинаковых условиях.

В тестировании: легко запускать копии приложения с разными настройками для проверки.

В продакшене: легко развернуть приложение на реальном сервере без сюрпризов.

#простымисловами
🔥11👍3
Что такое асинхронность

Сперва немного терминологии. Асинхронность — это способность программы выполнять несколько задач одновременно, не дожидаясь завершения каждого шага. Это особенно полезно, когда программа выполняет долгие операции (например, загрузку данных из сети), но при этом не блокирует выполнение других задач.

Если код работает синхронно, каждая операция выполняется строго по порядку. Это может привести к задержкам:

import time

print("Загрузка данных...")
time.sleep(5) # Программа засыпает на 5 секунд
print("Данные загружены!")


В примере выше всё остальное в программе «заморожено», пока выполняется sleep(). Если бы это была веб-страница, она зависла бы на несколько секунд.

Как работают async/await

В асинхронном программировании код выполняется без блокировки. Программа продолжает работать, пока выполняются долгие задачи.

Пример на Python с asyncio:

import asyncio

async def загрузка_данных():
print("Загрузка данных...")
await asyncio.sleep(5) # Не блокирует программу
print("Данные загружены!")

async def main():
await загрузка_данных()

asyncio.run(main())


Давайте разберёмся, что здесь происходит:

1. async делает функцию асинхронной.
2. await говорит «подожди, но не блокируй остальную программу».
3. asyncio.run(main()) запускает асинхронную операцию.

Асинхронность делает код быстрее и эффективнее, особенно при работе с долго выполняющимися операциями!

#простымисловами #основы
👍11
Forwarded from Веб-страница
Как правильно работать с DOM в JavaScript в 2025 году?

Работа с DOM (Document Object Model) — это основа веб-разработки. С каждым годом появляются новые, более эффективные способы манипуляции элементами страницы. Давайте разберём, как сегодня правильно работать с DOM в JavaScript, чтобы код был быстрым, удобным и безопасным.

1. Получение элементов

Вместо старых getElementById и getElementsByClassName сегодня лучше использовать querySelector и querySelectorAll. Они более универсальные и понятные.

const title = document.querySelector("#title"); // Получает 1 элемент (по id)
const buttons = document.querySelectorAll(".btn"); // Получает список всех кнопок с классом .btn


querySelector и querySelectorAll позволяют находить элементы так же, как в CSS (.класс, #id, input[type="text"] и т. д.). А также querySelectorAll возвращает не «живую» коллекцию, а обычный статичный список (NodeList), что логичнее при итерации.

2. Изменение текста и HTML

Всё зависит от того, что именно нужно поменять.

textContent — если надо изменить только текст (без HTML).

title.textContent = "Привет, мир!";


Не используйте innerHTML, если вставляете данные от пользователя — это дыра в безопасности (XSS-атаки). Если всё же используется innerHTML, убедитесь, что данные проверены.

title.innerHTML = "<strong>Важное сообщение!</strong>";


insertAdjacentHTML — отличная альтернатива innerHTML, если нужно добавить HTML в определённое место, не перезаписывая весь элемент.

title.insertAdjacentHTML("beforeend", "<span> 👋</span>");


3. Изменение классов

Правильный способ через classList, потому что `className`заменяет все классы сразу, из-за чего можно случайно удалить важные стили.

title.classList.add("highlight"); // Добавит класс
title.classList.remove("hidden"); // Удалит класс
title.classList.toggle("active"); // Переключит класс (если был — уберёт, если не было — добавит)


4. Изменение стилей

Не стоит вручную писать style.cssText, потому что он затирает всё, что было до этого. Используйте style для отдельных свойств.

title.style.color = "red";
title.style.fontSize = "24px";


Если нужно много стилей — лучше добавьте или измените класс. Так проще, централизованно и удобнее управлять дизайном.

title.classList.add("error"); // В CSS заранее определите .error { color: red; }


5. Создание и добавление новых элементов

Лучший способ — использовать createElement, а не innerHTML.

const newDiv = document.createElement("div"); // Создаём элемент <div>
newDiv.textContent = "Новый блок!";
newDiv.classList.add("box");
document.body.appendChild(newDiv); // Добавляем в конец <body>


Если нужно добавлять элементы в разные места:

appendChild() — добавляет в конец родителя.

prepend() — добавляет в начало.

before() и after() — добавляют перед или после элемента.

title.after(newDiv); // Вставит newDiv сразу после title

// С помощью append() можно сразу добавлять текст и несколько элементов
const container = document.querySelector(".container");
container.append("Просто текст", document.createElement("span"));


6. Удаление элементов

Самый актуальный способ — remove().

newDiv.remove(); // Удалит элемент из DOM


Раньше приходилось делать так (и это было неудобно):

newDiv.parentNode.removeChild(newDiv); // Старый подход


7. Обработчики событий (современный подход)

Раньше часто использовали`onclick`, но перезаписывает предыдущие обработчики и плохо управляется. Лучше используйте addEventListener.

const button = document.querySelector("#myButton");

button.addEventListener("click", () => {
alert("Кнопка нажата!");
});


Мы рассказали только часть советов. Если знаете что-то ещё важное, о чем мы не рассказали тут, поделитесь в комментариях.

#простымисловами #фронтенд
🤓21
Что такое рекурсия

Рекурсия — это когда функция вызывает сама себя, чтобы решить задачу. Большая задача разбивается на маленькие кусочки, которые решаются по одному, пока не дойдёшь до самого простого случая.

Как работает рекурсия?

У рекурсии всегда есть две важные части:

1. Базовый случай — когда задача становится настолько простой, что её можно решить сразу, без новых вызовов.

2. Рекурсивный случай — когда функция вызывает саму себя, но с более простыми данными.

Максимально простой пример рекурсии на Python

Давайте посчитаем факториал 3 (пишется как 3!) — это 3 * 2 * 1 = 6.

Вот код:

def factorial(n):
if n == 0: # Базовый случай: если n равно 0, возвращаем 1
return 1
else: # Рекурсивный случай: n умножаем на факториал числа поменьше
return n * factorial(n-1)


Как это работает шаг за шагом для `factorial(3)`:

1. factorial(3): 3 * factorial(2)

2. factorial(2): 2 * factorial(1)

3. factorial(1): 1 * factorial(0)

4. factorial(0): возвращает 1 (базовый случай)

5. Теперь идём обратно:

- 1 * 1 = 1

- 2 * 1 = 2

- 3 * 2 = 6

Итог: factorial(3) = 6.

#простымисловами #рекурсия
👍4
Простыми словами: Как хранятся пароли в базах данных

Пароли в базе данных не хранятся в виде обычного текста, который можно просто прочитать (если код писал адекватный человек). Вместо этого их превращают в специальные зашифрованные коды с помощью процесса, который называется хеширование. Эти коды называются хешами, и они выглядят как случайный набор символов. Главное — из хеша нельзя узнать исходный пароль, но можно проверить, правильный ли пароль ввёл пользователь.

Как это работает?

Когда вы придумываете пароль при регистрации, система его хеширует (превращает в код) и сохраняет этот код в базе данных.

Когда вы входите в систему и вводите пароль, система снова его хеширует и сравнивает с тем кодом, что уже есть в базе. Если они совпадают — вход разрешён.

Почему так делают?

— Безопасность. Если кто-то взломает базу данных, он увидит только хеши, а не настоящие пароли. Без исходного пароля хеши бесполезны для входа.
— Секретность. Даже люди, которые управляют системой, не могут узнать твой пароль.

По сути, пароли в базе — это не сами пароли, а их «закодированные отпечатки». Это как замок, который открывается только правильным ключом, но сам ключ нигде не записан. Даже если базу украдут, твои данные останутся защищёнными.

На картинке выше пример схемы хеширования паролей для хранения в БД.

#простымисловами #безопасность #бд
👍82
Что такое очередь и где её применяют

Очередь (queue) — ряд данных, хранящий элементы последовательным образом. Очередь похожа на стек, но в отличие от него, работает по принципу FIFO — First In, First Out (англ. «первым пришёл — первым ушёл»). Данные добавляют в конец, а извлекают из начала.

Для понимания, приведем пример: очередь людей. Последний занял место — последним и будешь, а первый — первым ее и покинет.

Бывают неклассические, двусторонние очереди. В них можно добавлять элементы и извлекать их из начала и конца структуры. Элементы посередине недоступны.

Применение очередей:
— реализация очередей, например на доступ к определённому ресурсу;
— управление потоками в многопоточных средах;
— генерация значений.
— для создания буферов.

#простымисловами
👍3
Что такое утиная типизация

Простыми словами, утиная типизация — это когда в программировании нас интересует не то, как называется объект или к какому классу он относится, а то, что он умеет делать. Если объект ведет себя как утка — например, умеет крякать и плавать, — то для программы он и есть утка, даже если это совсем другой объект. Ведь, если оно выглядит как утка, плавает как утка и крякает как утка, то это, наверное, утка.

В Python типы объектов проверяются не заранее (как в некоторых других языках), а прямо во время работы программы за счет динамической типизации. Утиная типизация в Python означает, что вы можете использовать любой объект в коде, если у него есть нужные вам методы или свойства. Python не заставляет вас говорить: «Это должна быть утка». Ему достаточно, что объект умеет делать то, что вы от него хотите.

Представьте, что у вас есть функция:

def заставить_крякать(объект):
объект.крякать()


Эта функция ожидает, что у объекта будет метод крякать(). Теперь создадим два класса:

class Утка:
def крякать(self):
print("Кря-кря!")

class Человек:
def крякать(self):
print("Эээ... Кря-кря?")


И используем их:

утка = Утка()
человек = Человек()

заставить_крякать(утка) # Вывод: Кря-кря!
заставить_крякать(человек) # Вывод: Эээ... Кря-кря?


Функция заставить_крякать работает и с Утка, и с Человек, потому что у обоих есть метод крякать(). Python не проверяет, утка это или человек, — ему важно только, что метод есть.

Такой подход дает нам гибкость и простоту при работе с кодом. С другой стороны поддерживать его становится сложнее, а следовательно, возрастает риск появления ошибок.

#простымисловами #python
👍5
Гайд: что такое хеш-таблицы

Представьте, что вам нужно мгновенно находить нужные данные среди миллионов записей — например, определять, есть ли пользователь в базе, или быстро подсчитывать количество посещений страницы. Обычный массив или список справится с этим за O(n), а хэш-таблица — за O(1) в среднем.


Внутри гайд подробно и с примерами рассказываем:

• Что такое хеш-функция
• Как работают хэш-таблицы
• Основные операции с хеш-функциями

Сохраняйте, это точно пригодится

#hash #простымисловами
👍9
As Code: очередной тренд или будущее разработки ПО?

Обычная практика в IT-командах: все решения, договоренности живут ОТДЕЛЬНО от кода — в чатах, документах, головах. Со временем происходит масштабирование и всё это превращается в такой хаос, что проще снести и написать с нуля.

Тут на помощь приходит As Code.

Это не просто методология, а философия, где все — от инфраструктуры до документации и политик безопасности — становится кодом.


Рассказываем почему As Code критически важен для современных IT-компаний и как он эволюционировал c 1970-х годов: https://tprg.ru/7gx5

#простымисловами #архитектура
👍8😁1