Computer Science
8.43K subscribers
1 photo
15 links
По всем вопросам: @altmainf

Уважаемый менеджер: @altaiface
Download Telegram
Рекурсия

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

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

Оборотной стороной этого довольно простого по структуре механизма является то, что на каждый рекурсивный вызов требуется некоторое количество оперативной памяти компьютера, и при чрезмерно большой глубине рекурсии может наступить переполнения стека вызовов.
«Битый сектор» или «бэд сектор»

Сталкиваясь с понятиями «битый сектор» или начинающие пользователи обычно понимают, что речь идет о какой-то серьезной проблеме, но не понимают как эту проблему решать.

Допустим, что жесткий диск вашего компьютера подвергся низкоуровневому форматированию на заводе-изготовителе. В результате этого процесса на магнитном носителе были созданы дорожки и сектора, которые в процессе работы компьютера используются для хранения данных. Сектора – это физически размеченные области на поверхности магнитного носителя, предназначенные для хранения данных.

Если такой сектор будет поврежден механически, то вся информация, которая в нем хранилась, будет безвозвратно утеряна.

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

Как рассматривалось ранее, каждый протокол связан с определенным номером порта TCP или UDP

IANA — это организация, которая решает, какой номер порта является стандартным для каждого из протоколов. 

Когда создается новый протокол, его разработчики отправляют в IANA запрос на резервирование номера порта. Вместо того чтобы разрабатывать новый протокол и подавать заявку на номер порта, многие разработчики интернет-приложений используют для связи через интернет общие протоколы. 

Например, многие приложения становятся доступными через интернет благодаря интеграции с веб-сервером. В таких случаях HTTP используется для передачи необработанных данных в приложения и из них.
Кодирование информации -  процесс преобразования данных из одной формы в другую для передачи, хранения или обработки. Существует множество алгоритмов кодирования, каждый из которых предназначен для определенных целей и обладает своими преимуществами и недостатками. Несколько основных алгоритмов кодирования:

Базовые алгоритмы кодирования:
• ASCII (American Standard Code for Information Interchange): используется для кодирования символов на основе 7- или 8-битных двоичных чисел.
• Unicode: обеспечивает универсальное представление текста в различных языках и символьных системах.

Алгоритмы сжатия:
• Lempel-Ziv-Welch (LZW): используется для сжатия данных без потерь, особенно эффективен при кодировании текстов.
• Deflate: комбинирует алгоритмы сжатия Хаффмана и LZ77 (Lempel-Ziv 1977).

Кодирование с использованием математических методов:
• Алгоритмы Хаффмана: строит оптимальный префиксный код для каждого символа, исходя из его вероятности встречи.
• Арифметическое кодирование: преобразует последовательность символов в одно дробное число в интервале [0,1] с учетом их вероятностей.

Криптографические алгоритмы кодирования:
• AES (Advanced Encryption Standard): симметричный алгоритм шифрования, широко применяемый для защиты данных.
• RSA (Rivest-Shamir-Adleman): асимметричный алгоритм шифрования, используемый для обмена ключами и цифровой подписи.

Алгоритмы кодирования для изображений и звука:
• JPEG (Joint Photographic Experts Group): используется для сжатия цифровых изображений.
• MP3 (MPEG Audio Layer III): алгоритм сжатия аудио.

Алгоритмы кодирования для видео:
• H.264 (Advanced Video Coding): стандарт для сжатия видео с высокой эффективностью.
RFID (Radio-Frequency Identification) - это технология, которая позволяет беспроводно идентифицировать и отслеживать объекты с помощью радиочастотных сигналов. RFID-метки состоят из маленького микрочипа и антенны, которая обеспечивает коммуникацию с RFID-считывателем.

Основная идея работы RFID-системы заключается в том, что RFID-метки могут передавать информацию, когда они находятся в поле действия радиочастотных сигналов, создаваемых RFID-считывателем.

Процесс работы RFID-системы можно разделить на несколько этапов:

- Инициация: RFID-считыватель генерирует радиочастотный сигнал, создавая электромагнитное поле в определенной области.
- Детектирование: Когда RFID-метка находится в поле действия считывателя, электромагнитное поле индуцирует электромагнитный ток в антенне метки. Этот ток питает микрочип в метке, активируя его.
- Коммуникация: Активированный микрочип в RFID-метке начинает передавать данные об объекте или товаре через антенну, используя радиочастотные волны. Эта информация может быть уникальным идентификатором метки, серийным номером или другой полезной информацией.
- Считывание: Антенна RFID-считывателя принимает радиочастотные сигналы от метки, которые затем передаются считывателю для обработки.
- Обработка данных: RFID-считыватель декодирует полученные данные и передает их на дальнейшую обработку или хранение. В зависимости от конкретной системы меток и приложения, считыватель может также записывать данные на метку.

RFID-метки могут быть активными (с собственным источником питания и более высоким радиусом действия) или пассивными (питаются от энергии, передаваемой от считывателя), а также иметь различные рабочие частоты в зависимости от региональных стандартов и требований применения.

RFID-технология широко используется в различных сферах, включая логистику, инвентаризацию, управление запасами, контроль доступа и другие области, где требуется автоматизированная идентификация и отслеживание объектов.
Как работают SSL-сертификаты?

Использование SSL гарантирует, что данные, передаваемые между пользователями и веб-сайтами или между двумя системами, невозможно прочитать сторонним лицам или системам.

Процесс работает следующим образом:

 1. Браузер или сервер пытается подключиться к веб-сайту (веб-серверу), защищенному с помощью SSL.
 
2. Браузер или сервер запрашивает идентификацию у веб-сервера.
 
3. В ответ веб-сервер отправляет браузеру или серверу копию своего SSL-сертификата.
 
4. Браузер или сервер проверяет, является ли этот SSL-сертификат доверенным. Если это так, он сообщает об этом веб-серверу.
 
5. Затем веб-сервер возвращает подтверждение с цифровой подписью и начинает сеанс, зашифрованный с использованием SSL.
 
6. Зашифрованные данные используются совместно браузером или сервером и веб-сервером.
Специальные протоколы для работы почтовых серверов

• SMTP (Simple Mail Transfer Protocol): Этот протокол используется для отправки электронных писем. Он работает на транспортном уровне и обеспечивает процесс передачи сообщений от отправителя к получателю.

• IMAP (Internet Message Access Protocol):
IMAP позволяет клиентам электронной почты получать доступ к своим сообщениям на почтовом сервере. Это полезно, когда пользователь хочет получать доступ к своей почте с разных устройств.

• POP3 (Post Office Protocol version 3):
Это еще один протокол для получения электронной почты, который позволяет электронным почтовым клиентам загружать сообщения с почтового сервера на локальное устройство.
RSS-каналы — это формат электронной доставки контента, который позволяет пользователям подписываться на автоматические обновления от выбранных веб-сайтов.

Основные моменты, которые стоит знать о RSS:

• RSS (Really Simple Syndication): Это формат, который используется для публикации часто обновляемой информации, такой как блоги, новостные статьи и видео.
• Подписка: Пользователи могут подписаться на RSS-каналы, используя RSS-агрегатор или читалку новостей, что позволяет им видеть обновления в одном месте.
• Автоматические обновления: Когда веб-сайт публикует новый контент, информация автоматически обновляется в RSS-канале, и подписчики получают уведомление.
• Преимущества: RSS-каналы помогают пользователям следить за большим количеством веб-сайтов без необходимости посещать каждый сайт индивидуально.
IP-телефония, также известная как VoIP (Voice over Internet Protocol), это технология, которая позволяет совершать голосовые вызовы, используя интернет-соединение вместо традиционной телефонной линии.

Ключевые аспекты IP-телефонии:

• Преобразование голоса: Голос преобразуется в цифровой сигнал, который передается через интернет.
• SIP (Session Initiation Protocol): Протокол, используемый для установления сессий в IP-телефонии.
• Экономия: VoIP часто считается более экономичным вариантом, поскольку многие провайдеры предлагают бесплатные или недорогие вызовы, особенно международные.
• Гибкость: Пользователи могут совершать звонки с различных устройств, включая компьютеры, смартфоны и специальные IP-телефоны.
• Дополнительные функции: Кроме голосовых вызовов, VoIP может включать видеозвонки, конференц-связь, передачу файлов и текстовые сообщения.
URL-адрес

URL (Uniform Resource Locator) — специальная форма обозначения индивидуального адреса ресурса в интернете. 

URL-адрес есть не только у сайтов, но и у различных файлов (документов, изображений, видео и так далее), загруженных в Интернет. Поэтому введя определенный URL в адресную строку браузера, пользователь может отыскать требуемый документ или сайт.

У адреса URL имеется вполне конкретная структура, которая включает:
 • Метод доступа к ресурсу, он же именуется сетевым протоколом;
 • Авторизация для доступа;
 • Хост – DNS адрес, прописываемый как IP адрес;
 • Порт – обязательный атрибут при указании IP адреса (по умолчанию - 80 порт);
 • Путь – информация о методе получения доступа;
 • Параметр (якорь) – данные о файле внутри ресурса (ссылка на абзац внутри страницы сайта).
Принципы сжатия данных

Сжатие данных - алгоритмическое преобразование данных, производимое с целью уменьшения занимаемого ими объёма.

Все методы сжатия данных делятся на два основных класса:
- Сжатие без потерь
- Сжатие с потерями

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

Сжатие без потерь обычно используется для передачи и хранения текстовых данных, компьютерных программ, реже — для сокращения объёма аудио- и видеоданных, цифровых фотографий и т.п.

Сжатие с потерями, обладающее значительно большей, чем сжатие без потерь, эффективностью, обычно применяется для сокращения объёма аудио- и видеоданных и цифровых фотографий в тех случаях, когда такое сокращение является приоритетным, а полное соответствие исходных и восстановленных данных не требуется.
Какие бывают записи для домена

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

A-запись - указывает IPv4 адрес сервера, к которому нужно обратиться по доменному имени. A-записей у домена может быть несколько. В этом случае выбирается случайный.

AAAA-запись - указывает на IPv6 адрес сервера. Также, эта запись иногда упоминается как Квадра-А (четыре А)

MX-запись - указывает на ip-адрес или доменное имя сервера, отвечающего за прием почты на этот домен (MX-сервер)

TXT-запись - Сюда записывают различную служебную информацию, для которой нет выделенных полей. Можно записать контактные данные администратора, или что угодно.

CNAME-запись - служит для указания, что домен является синонимом другого домена. 

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

SRV-запись - служит для хранения адресов различных серверов, обслуживающих домен.
Типы интерфейсов жестких дисков

Интерфейсы жестких дисков предназначены для обмена информацией между устройствами внешней памяти и материнской платой. Они влияют на многие рабочие характеристики накопителей и на их производительность. 

Есть несколько типов интерфейсов:
 ⁃ SCSI — Small Computer System Interface
Один из самых старых интерфейсов. Применялись в основном в ПК топ-класса, а впоследствии и в серверах.  
 ⁃ SAS — Serial Attached SCSI
Разрабатывался в усовершенствования Small Computers System Interface
 ⁃ Firewire — IEEE 1394
Представляет собой один из наиболее часто используемых форматов высокоскоростной последовательной внешней шины.
 ⁃ SATA — Serial ATA
Последовательный интерфейс обмена данными с накопителями информации. SATA является развитием интерфейса ATA, который после появления SATA был переименован в PATA.
Как начать работу с нейронными сетями: Практическое руководство для новичков

Нейронные сети — это инструмент машинного обучения, который помогает решать задачи распознавания образов, классификации текста, предсказания и многих других. В этой статье мы разберемся, как создать и обучить простую нейронную сеть с помощью Python и библиотеки TensorFlow.

Шаг 1: Установка необходимых библиотек
Для начала вам нужно установить несколько библиотек. Используйте команду:
pip install tensorflow numpy matplotlib

Шаг 2: Импортирование библиотек
В вашем Python-файле импортируем необходимые библиотеки:
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
import matplotlib.pyplot as plt


Шаг 3: Загрузка и подготовка данных
Для примера мы будем использовать датасет MNIST, который содержит изображения рукописных цифр. Этот набор данных встроен в TensorFlow:
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images, test_images = train_images / 255.0, test_images / 255.0


Мы нормализуем изображения, деля их на 255, чтобы значения пикселей были в диапазоне от 0 до 1.

Шаг 4: Построение модели
Теперь давайте создадим простую нейронную сеть с помощью Keras:
model = models.Sequential([
layers.Flatten(input_shape=(28, 28)),
layers.Dense(128, activation='relu'),
layers.Dense(10)
])


Здесь:
• Flatten преобразует изображение 28x28 в одномерный вектор.
• Dense добавляет полносвязный слой с 128 нейронами и активацией ReLU.
• Последний слой содержит 10 нейронов, один для каждой цифры.

Шаг 5: Компиляция модели
Теперь компилируем модель, используя оптимизатор Adam и функцию потерь SparseCategoricalCrossentropy:
model.compile(optimizer='adam',
loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])


Шаг 6: Обучение модели
Теперь обучим модель на тренировочных данных:
model.fit(train_images, train_labels, epochs=5)

Шаг 7: Оценка модели
После обучения мы можем оценить точность модели на тестовых данных:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Тестовая точность: {test_acc}")


Шаг 8: Прогнозирование
Для предсказания цифр на новых изображениях используем модель так:
predictions = model.predict(test_images)
print(f"Предсказанная цифра: {np.argmax(predictions[0])}")


Заключение
Поздравляю! Вы создали свою первую нейронную сеть. Конечно, это лишь базовый пример, но его можно адаптировать и улучшить для более сложных задач. Изучив основы, вы сможете переходить к более продвинутым моделям и задачам.
Понимание архитектуры компьютера: Как работают процессоры и память

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

1. Процессор (CPU)
Процессор — это центральный компонент, который выполняет большинство операций в компьютере. Он состоит из нескольких ключевых частей:

• ALU (Арифметико-логическое устройство): выполняет все арифметические операции (сложение, вычитание, умножение) и логические операции (AND, OR, NOT).
• Control Unit (CU): управляет процессом выполнения инструкций. Он интерпретирует команды из памяти и управляет их выполнением.
• Registers (Регистр): маленькие, быстрые ячейки памяти, которые используются для хранения данных, которые активно обрабатываются.

2. Память
Память компьютера используется для хранения данных и программ. Есть несколько типов памяти:

• Оперативная память (RAM): используется для временного хранения данных, которые активно используются процессором. Это быстрый тип памяти, но она теряет данные при выключении питания.
• Постоянная память (ROM): используется для хранения программного обеспечения, которое не изменяется, например, BIOS. Эти данные сохраняются при выключении питания.
• Кэш-память: это сверхбыстрая память, которая хранит часто используемые данные и команды, чтобы ускорить выполнение операций.

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

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

• L1 (самая быстрая и маленькая)
• L2 (более большая, но немного медленнее)
• L3 (еще большая и медленная по сравнению с L1 и L2)

Каждый уровень кэш-памяти помогает уменьшить количество времени, которое процессор тратит на извлечение данных из более медленной основной памяти (RAM).
Основы алгоритмов сортировки: Разбор популярных алгоритмов и их применения

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


1. Bubble Sort (Сортировка пузырьком)
Это один из самых простых алгоритмов сортировки. Он многократно проходит по списку, сравнивая соседние элементы и меняя их местами, если они находятся в неправильном порядке.
def bubble_sort(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
if not swapped:
break
return arr

# Пример использования
arr = [64, 34, 25, 12, 22, 11, 90]
print("Отсортированный массив:", bubble_sort(arr))

Преимущества:
• Простота реализации.
• Подходит для небольших массивов.

Недостатки:
• Низкая эффективность для больших массивов (O(n²)).


2. Selection Sort (Сортировка выбором)
Алгоритм выбирает минимальный (или максимальный) элемент на каждом шаге и меняет его местами с первым элементом, затем повторяет процесс для оставшихся элементов.
def selection_sort(arr):
for i in range(len(arr)):
min_idx = i
for j in range(i+1, len(arr)):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr

# Пример использования
arr = [64, 34, 25, 12, 22, 11, 90]
print("Отсортированный массив:", selection_sort(arr))

Преимущества:
• Простота реализации.
• Не требует дополнительной памяти (интерактивная сортировка).

Недостатки:
• Как и пузырьковая сортировка, имеет сложность O(n²) в худшем случае.


3. Merge Sort (Сортировка слиянием)
Merge Sort — это алгоритм сортировки, основанный на принципе "разделяй и властвуй". Он рекурсивно делит массив пополам, сортирует каждую половину и затем сливает их.
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]

merge_sort(left_half)
merge_sort(right_half)

i = j = k = 0
while i < len(left_half) and j < len(right_half):
if left_half[i] < right_half[j]:
arr[k] = left_half[i]
i += 1
else:
arr[k] = right_half[j]
j += 1
k += 1

while i < len(left_half):
arr[k] = left_half[i]
i += 1
k += 1

while j < len(right_half):
arr[k] = right_half[j]
j += 1
k += 1
return arr

# Пример использования
arr = [64, 34, 25, 12, 22, 11, 90]
print("Отсортированный массив:", merge_sort(arr))

Преимущества:
• Эффективен для больших массивов.
• Имеет сложность O(n log n).

Недостатки:
• Требует дополнительной памяти для слияния.


4. Quick Sort (Быстрая сортировка)
Quick Sort — это еще один алгоритм с разделением. Он выбирает опорный элемент, делит массив на две части (меньшие и большие элементы относительно опорного) и рекурсивно сортирует каждую часть.
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)

# Пример использования
arr = [64, 34, 25, 12, 22, 11, 90]
print("Отсортированный массив:", quick_sort(arr))

Преимущества:

• Эффективен для больших массивов.
• Среднее время работы O(n log n).

Недостатки:
• В худшем случае (например, если массив отсортирован) сложность может быть O(n²).
Что такое «Большое O» и почему это важно?

"Большое O" — это способ оценки сложности алгоритмов.
Он позволяет понять, как быстро растет время выполнения алгоритма с увеличением данных.

Например, алгоритм с O(n) работает быстрее, чем алгоритм с O(n²), когда данные начинают увеличиваться.

Знание теории сложности алгоритмов помогает разрабатывать более быстрые и эффективные программы, особенно при работе с большими объемами данных.
Как работает протокол DNS?

DNS (Domain Name System) — это система, которая переводит доменные имена в IP-адреса, чтобы браузеры могли находить нужные сайты.

Пример: Когда вы вводите в браузере адрес www.example.com, DNS переводит это имя в IP-адрес сервера, на котором находится сайт. Например, адрес www.example.com может быть связан с IP-адресом 93.184.216.34.

Реальный пример: Когда вы подключаетесь к интернет-магазину или социальной сети, DNS-серверы отвечают за быстрое и точное преобразование доменных имен в адреса серверов, что позволяет вам посещать сайты.
Как работать с большими данными: Hadoop vs Spark

Многие современные приложения требуют обработки больших объемов данных. Для этого используют такие технологии как Hadoop и Spark, которые решают задачу распределенной обработки данных. В этой статье мы рассмотрим основные различия между ними и их применение.

1. Hadoop
Hadoop — это фреймворк для распределенной обработки и хранения данных. Он состоит из двух основных компонентов:

• HDFS (Hadoop Distributed File System) — система распределенного хранения данных.
• MapReduce — модель обработки данных, которая разбивает задачу на множество небольших задач, обрабатываемых параллельно.

Преимущества Hadoop:
• Хорошо подходит для обработки огромных объемов данных.
• Идеален для задач с низкими требованиями к задержке (например, пакетная обработка).

Недостатки Hadoop:
• Обработка данных может быть медленной, так как выполняется в пакетном режиме.
• Не поддерживает реальное время обработки.


2. Apache Spark
Apache Spark — это фреймворк для обработки данных в реальном времени, который стал популярным после того, как показал значительное улучшение в производительности по сравнению с Hadoop.

Преимущества Spark:
• Работает быстрее, так как использует in-memory вычисления (все данные обрабатываются в памяти, а не на диске).
• Поддерживает обработку в реальном времени (Streaming).
• Простота использования с высокоуровневыми API.

Недостатки Spark:
• Требует значительных ресурсов памяти для обработки больших данных в памяти.
• Может не подходить для долгосрочных вычислений, требующих больших дисков.
______________
Выбор между Hadoop и Spark
• Hadoop идеально подходит для пакетной обработки и хранения больших данных.
• Spark лучше всего использовать для задач, требующих быстрого отклика, например, в реальном времени.
Как работают RESTful API и JSON?

RESTful API (Representational State Transfer) — это архитектурный стиль взаимодействия приложений через HTTP. Он использует стандартные HTTP-методы (GET, POST, PUT, DELETE) и часто передает данные в формате JSON.

Пример: Когда вы отправляете запрос на сервер с помощью GET-запроса, например, на /api/products, сервер может вернуть список товаров в формате JSON:
[
{"id": 1, "name": "Laptop", "price": 1000},
{"id": 2, "name": "Phone", "price": 500}
]