Добавлены новые статьи:
All checks were successful
continuous-integration/drone/push Build is passing

- Реализация Base64 на Java.md
- Реализация SHA-256 на Java.md
- Base64.md
- Кодирование данных.md
- Сжатие данных.md
- Криптографическая хеш-функция.md
- Кодирование данных.md
и прочие
This commit is contained in:
Struchkov Mark 2024-09-14 22:02:28 +03:00
parent 4ed89604e0
commit 4a1d913afa
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
22 changed files with 452 additions and 29 deletions

39
dev/algorithm/GZIP.md Normal file
View File

@ -0,0 +1,39 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Разработка|00 Разработка]]"
parents:
- "[[../fundamental/Сжатие данных|Сжатие данных]]"
linked:
---
GZIP (GNU ZIP) — это формат сжатия данных и программное обеспечение, разработанное для сжатия и распаковки файлов. GZIP был создан в 1992 году Жан-Лу Гейли и Марком Адлером как замена более ранних программ сжатия данных, таких как Compress. GZIP основан на алгоритме DEFLATE, который сочетает в себе методы LZ77 (Lempel-Ziv 1977) и кодирование Хаффмана для эффективного сжатия данных.
**Основные характеристики GZIP:**
- **Эффективное сжатие**: GZIP обеспечивает высокую степень сжатия данных, что позволяет значительно уменьшить размер файлов, особенно текстовых.
- **Скорость**: GZIP работает быстро и является эффективным как для сжатия, так и для распаковки данных.
- **Поддержка различных форматов**: GZIP сжимает данные в формате .gz, но не сохраняет структуру файлов и директорий (для этого используются архиваторы вроде tar).
- **Универсальность**: GZIP широко поддерживается в Unix-подобных системах (Linux, BSD), а также доступен на Windows и других платформах.
- **Использование заголовков**: GZIP добавляет к сжатому файлу заголовок, который содержит метаданные, такие как имя оригинального файла, временная метка и контрольная сумма CRC32 для проверки целостности данных.
**Применения GZIP:**
- **Сжатие файлов**: Используется для сжатия отдельных файлов, что экономит место на диске и уменьшает время передачи данных.
- **Веб-технологии**: GZIP часто используется для сжатия веб-контента (HTML, CSS, JavaScript) перед отправкой с сервера на клиент, что ускоряет загрузку веб-страниц.
- **Архивирование**: В Unix-подобных системах GZIP часто используется вместе с утилитой tar для создания архивов (tar.gz или .tgz), которые содержат несколько файлов и директорий.
- **Протоколы передачи данных**: Протоколы, такие как HTTP и FTP, поддерживают сжатие GZIP для уменьшения объема передаваемых данных.
**Реализации:**
- [[../../../../_inbox/Реализация GZIP в Java|Реализация GZIP в Java]]
- [[../../../../_inbox/GZIP сжатие в Nginx|GZIP сжатие в Nginx]]
***
## Мета информация
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
**Родитель**:: [[../fundamental/Сжатие данных|Сжатие данных]]
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -14,9 +14,9 @@ linked:
Самый простой способ побороть эту проблему, это использовать fingerprint файла. То есть, когда файл меняется, вы меняете его название. Делается это обычно добавлением какого-нибудь префикса/суфикса к названию файла.
Например у нас есть файл стилей `style.css`, мы можем посчитать для него MD5 хэш и добавить его в название. Тогда у нас получится следующее название: `style.e626dd36e0085927f334adbe3eb38e7a.css`.
Например у нас есть файл стилей `style.css`, мы можем посчитать для него [[../cryptography/MD5|MD5]] хеш и добавить его в название. Тогда у нас получится следующее название: `style.e626dd36e0085927f334adbe3eb38e7a.css`.
При любом изменении файла MD5 хэш должен пересчитываться. Таким образом при изменении файла у него будет другое название, и браузер будет вынужден скачать его в любом случае.
При любом изменении файла [[../cryptography/MD5|MD5]] хеш должен пересчитываться. Таким образом при изменении файла у него будет другое название, и браузер будет вынужден скачать его в любом случае.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]

View File

@ -26,7 +26,7 @@ Latency - это время, необходимое для выполнения
- **Использование кэширования**: [[Кэширование]] часто запрашиваемых данных на сервере или ближе к клиенту может существенно сократить время доступа к этим данным, поскольку избавляет от необходимости каждый раз обращаться к основному источнику данных.
- **Оптимизация базы данных**: Индексация, оптимизация запросов и структур данных, а также выбор подходящего типа базы данных могут снизить время доступа к данным
- **Минимизация расстояния**: Размещение серверов ближе к конечным пользователям или использование сети доставки контента ([CDN](highload/Content%20Delivery%20Network.md)) может снизить физическую задержку, связанную с расстоянием, которое должны преодолеть данные.
- **Сокращение объема передаваемых данных**: Минимизация размера данных, передаваемых между клиентом и сервером (например, сжатие данных и изображений), может уменьшить время их передачи.
- **Сокращение объема передаваемых данных**: Минимизация размера данных, передаваемых между клиентом и сервером (например, [[../fundamental/Сжатие данных|сжатие данных]] и изображений), может уменьшить время их передачи.
***
## Мета информация
**Область**:: [[../../meta/zero/00 HighLoad|00 HighLoad]]

View File

@ -25,9 +25,28 @@ linked:
Дополнительно для работы со статическими файлами можно отменить [[../Fingerprint|Fingerprint]].
Один из подходов это инвалидация по времени. Для кэшированных данных устанавливается TTL, и по прошествию времени кэш удаляется. Такое вариант подходит для редко изменяемых данных, устаревание которых не приводит к серьезным проблемам в бизнес-логике, например словари. При таком варианте важно подобрать оптимальное время жизни кэша, слишком маленькое время жизни будет давать плохую производительность, слишком большое ухудшит опыт пользователей. В оценке эффективности кэша поможет метрика [[CacheMissRate]].
## Инвалидация по TTL
Один из подходов это инвалидация по времени. Для кэшированных данных устанавливается TTL, и по прошествию времени кэш удаляется. Такое вариант подходит для редко изменяемых данных, устаревание которых не приводит к серьезным проблемам в бизнес-логике, например словари.
Некоторые чувствительные данные нужно инвалидировать сразу при изменении. Тут может помочь тегирование ключей.
При таком варианте важно подобрать оптимальное время жизни кэша, слишком маленькое время жизни будет давать плохую производительность, слишком большое ухудшит опыт пользователей. В оценке эффективности кэша поможет метрика [[CacheMissRate]].
Если просто установить TTL, то спустя какое-то время он истечет и данные будут удалены, но что если к ним постоянно обращаются. В некоторых случаях я использую подход, при котором при запросе данных из кэша проверяется оставшийся TTL, и если он меньше, чем некоторое значение, то TTL устанавливается заново.
Данные остаются в кэше, если ими активно пользуются. В таком случае при обновлении данных, необходимо вручную положить новые данные или инвалидировать кэш по событиям.
```lua
local key = KEYS[1];
local threshold = tonumber(ARGV[1]);
local new_ttl = tonumber(ARGV[2]);
local value = redis.call('get', key);
if value then
local ttl = redis.call('pttl', key);
if ttl >= 0 and ttl <= threshold then
redis.call('pexpire', key, new_ttl);
end;
end;
return value;
```
***
## Мета информация
**Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]]

View File

@ -0,0 +1,61 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-09-13
zero-link:
- "[[../../../meta/zero/00 HighLoad|00 HighLoad]]"
parents:
- "[[Кэширование]]"
linked:
---
Представим, что нам нужно кэшировать результат работы следующего метода:
```java
public List<User> getUsersByType(String userType, Set<Long> userIds)
```
Метод принимает 2 аргумента: строку и коллекцию. Ключ кэширования должен учитывать значения этих входящих аргументов и должен обладать следующими свойствами:
- При изменении параметров, ключ кэширования также должен изменяться. В данном случае, если изменятся значения аргументов `userType` и `userIds`, мы должны получить новое значение ключа.
- По параметрам ключ должен определяться однозначно, то есть для одних и тех же значений аргументов ключ кэширования должен принимать только одно значение. Иначе мы рискуем понизить эффективность процесса кэширования, создавая несколько кэшей для одной и той же выборки.
Сформируем ключ кэширования для нашего метода. В качестве хранилища будем использовать [[Redis]].
В начале ключа я обычно обязательно указываю какой-то уникальный префикс сервиса, чтобы не получить коллизию между разными сервисами. Пускай в данном случае префикс будет `USER_SERVICE`. Также добавляю уникальный префикс метода, в данном случае будет `USERS`.
В качестве разделителей рекомендую использовать `:`, в [[../../../../../_inbox/Redis|Redis]] это позволяет визуально сгруппировать ключи. Это позволяет визуально группировать ключи при использовании UI клиента. Таким образом начало нашего ключа выглядит следующим образом: `USER_SERVICE:USERS:`.
Значения аргументов метода также должны попасть в ключ. Возьмем наш первый аргумент `String userType`. Для аргумента также можно использовать префиксы, но это не обязательно. В данном случае пусть будет `USER_TYPE`. А вот для самого значения параметра есть несколько вариантов:
- Оставить строкой и просто выполнить конкатенацию.
- Использовать [[../../cryptography/Криптографическая хеш-функция|хеш-функцию]] с фиксированной длиной выхода, например [[../../cryptography/MD5|MD5]]. Фиксированная длина выхода нужна, чтобы иметь предсказуемую и ограниченную длину ключа.
Оставим просто строкой, так как тип пользователя вряд ли может быть длинным. В итоге пока наш ключ выглядит как-то так: `USER_SERVICE:USERS:USER_TYPE:VIP:`.
Переходим ко второму аргументу `Set<Long> userIds`. С коллекцией все будет сложнее. Мы точно должны использовать какую-нибудь [[../../cryptography/Криптографическая хеш-функция|хеш-функцию]], но как?
> [!WARNING] Disclamer
> Этот способ я придумал сам, возможно он не самый удачный, но он работает. Если вы придумаете лучше, напишите в комментариях ниже 👇
Во-первых, коллекцию необходимо предварительно отсортировать. Иначе на одинаковые параметры коллекций мы будем получать разные результаты [[../../cryptography/Криптографическая хеш-функция|хеш-функции]].
Во-вторых, нужно представить коллекцию как что-то понятное для [[../../cryptography/Криптографическая хеш-функция|хеш-функции]]. Для этого я преобразую коллекцию в JSON. JSON используется, потому что ваша коллекция может быть из сложных объектов.
Теперь используем [[../../cryptography/SHA-256|SHA-256]], чтобы из нашей строки получить какой-то хеш. И уже этот хеш мы добавляем к нашему ключу, получается примерно такое:
```
USER_SERVICE:USERS:USER_TYPE:VIP:USER_ID:315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
```
> [!QUESTION] Почему SHA-256, а не MD5?
> [[../../cryptography/MD5|MD5]] подвержен коллизиям, [[../../cryptography/SHA-256|SHA-256]] считается более устойчивым к коллизиям.
***
## Мета информация
**Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]]
**Родитель**:: [[../Кэширование|Кэширование]]
**Источник**::
**Создана**:: [[2024-09-13]]
**Автор**::
### Дополнительные материалы
- [[../../snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]]

View File

@ -13,7 +13,7 @@ linked:
Обычно кэшируются только GET запросы, так как они должны быть [[../Идемпотентность|идемпотентны]].
Заголовки для кэширования:
- ETAG. Тег, который позволяет указать версию файла. Можно использовать MD5.
- ETAG. Тег, который позволяет указать версию файла. Можно использовать [[../../cryptography/MD5|MD5]].
- If-Modified-Since. Дата изменения файла.
- Cache-Control
- public - Сохранять может не только браузер, но и промежуточные узлы

View File

@ -16,12 +16,12 @@ linked:
> [!TIP] Работа без кэша
> Хорошая система должна уметь выдерживать нагрузку и без кэша. Задача кэша ускорить ответ, а не держать нагрузку.
==Системы используемые для кэширования обычно не являются надежными, так что не следует хранить только там какие-то важные данные.== Чаще всего кэш реализуется на основе хэш-таблиц и использует [принцип локальности](../fundamental/Принцип%20локальности.md).
Сами данные можно разделить на несколько категорий:
- **Можно потерять**. К этой категории относятся кэши выборок из базы данных. Потеря таких ключей не так страшна, потому что мы можем легко восстановить их значения, обратившись заново к backendу. Однако частые потери кэшей приводят к излишним обращениям к БД.
- **Не хотелось бы потерять**. Здесь можно упомянуть счетчики посетителей сайта, просмотров ресурсов и т.п. Хоть и восстановить эти значения иногда напрямую невозможно, но значения этих ключей имеют ограниченный по времени смысл: через несколько минут их значение уже неактуально, и будет рассчитано заново.
- **Совсем не должны терять**. Кэш удобен для хранения сессий пользователей. Однако содержимое сессий не хотелось бы терять никогда иначе пользователей на сайте будет «разлогинивать». Как попытаться избежать? Можно кластеризовать систему кэширования, так вероятность потери снижается.
==Системы используемые для кэширования обычно не являются надежными, так что не следует хранить только там какие-то важные данные.==
## Уровни кэширования
![](../../meta/files/images/Pasted%20image%2020240617195054.png)
@ -37,20 +37,14 @@ linked:
- Сквозное. Все запросы проходят через кэш. [Схема](../../meta/files/images/Pasted%20image%2020240617194731.png).
- Кэширование на стороне сервиса. [Схема](../../meta/files/images/Pasted%20image%2020240617194759.png).
- Опережающее. Кладем данные в кэш заранее. [Схема](../../meta/files/images/Pasted%20image%2020240617194938.png).
## Ключ кэширования
Ключ кэширования должен обладать следующими свойствами:
- При изменении параметров выборки, которую мы кэшируем, ключ кэширования должен изменяться (чтобы с новыми параметрами мы не «попали» в старый кэш).
- По параметрам выборки ключ должен определяться однозначно, т.е. для одной и той же выборки ключ кэширования должен быть только один, иначе мы рискуем понизить эффективность процесса кэширования, создавая несколько кэшей для одной и той же выборки.
Можно использовать следующий вариант (пример для PHP): если существует некоторая точка в коде, через которую проходят все обращения к БД, а любое обращение полностью описывается (содержит все параметры запроса) в некоторой структуре `$options`, можно использовать следующий ключ:
Чаще всего кэш реализуется на основе хеш-таблиц и использует [принцип локальности](../fundamental/Принцип%20локальности.md). Для работы с хеш-таблицей вам необходим [[highload/Ключ кэширования|ключ кэширования]] и сами данные. По ключу данные кладутся и забираются из таблицы.
```php
$key = md5(serialize($options))
```
Для хранения результатов кэширования я обычно использую JSON. Использую для этого библиотеку [[../../../../knowledge/dev/java/other/Jackson|Jackson]], но есть один [[../../../../_inbox/Преобразование Json из коллекции в Java объект при помощи Jackson|нюанс при работе с коллекциям]], который стоит учитывать.
Такой ключ удовлетворяет первому условию: при изменении `$options` будет обязательно изменен `$key`, но и второе условие будет соблюдаться, если мы будем все типы данных в $options использовать «канонически», т.е. не допускать строки `"1"` вместо числа `1`. Функция `md5` используется для «сжатия» данных.
При желании результат кэширования можно сжать используя [[../algorithm/GZIP|GZIP]]. Однако, приходится использовать [[../other/Base64|Base64]], чтобы преобразовать байты полученные от gzip в строку, и уже в таком виде положить в Redis. Не смотря на то, что Base64 увеличивает размер строки на 33% все равно получается намного компактнее, чем просто JSON.
Если мы закэшировали какие-то данные от backendа, например, выборку из БД, рано или поздно исходные данные изменяются, и кэш перестает быть валидным. Причем очень желательно, чтобы кэш сбрасывался сразу же за изменением. За это отвечает [[highload/Инвалидация кэша|Инвалидация кэша]]
Рано или поздно исходные данные изменяются, и кэш перестает быть валидным. Часто важно, чтобы кэш сбрасывался сразу же за изменением. За это отвечает [[highload/Инвалидация кэша|Инвалидация кэша]]
***
## Мета информация
**Область**:: [[../../meta/zero/00 HighLoad|00 HighLoad]]

45
dev/cryptography/MD5.md Normal file
View File

@ -0,0 +1,45 @@
---
aliases:
- Message Digest Algorithm 5
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Криптография|00 Криптография]]"
- "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
parents:
- "[[Криптографическая хеш-функция]]"
linked:
---
MD5 (Message Digest Algorithm 5) — это [[криптографическая хеш-функция]], которая преобразует входные данные в 128-битное (16-байтное) значение, называемое хешем или дайджестом сообщения.
> [!DANGER]
> Сегодня MD5 считается устаревшим и небезопасным для большинства криптографических приложений. В современных системах вместо MD5 рекомендуется использовать более безопасные алгоритмы, такие как [[SHA-256]] или SHA-3, которые обладают лучшей устойчивостью к коллизиям и другим атакам.
Широко используется для проверки целостности данных и в других криптографических задачах.
**Основные характеристики MD5:**
- **Фиксированная длина выхода**: Независимо от размера входных данных (например, текст или файл), хеш всегда имеет длину 128 бит (16 байт).
- **Однонаправленность**: MD5 является однонаправленной функцией, что означает, что невозможно восстановить исходные данные по их хешу.
- **Быстродействие**: MD5 работает быстро и эффективно, что сделало его популярным для использования в приложениях, где требуется быстрая обработка данных.
**Недостатки MD5:**
- **Уязвимость к коллизиям**: MD5 подвержен коллизиям, что означает, что существует возможность найти два различных входа, которые дают одинаковый хеш. Это делает MD5 небезопасным для криптографических применений, таких как цифровые подписи и сертификаты.
- **Атаки на предобраз**: Существуют методы, позволяющие найти вход, соответствующий заданному хешу, что еще больше подрывает надежность MD5.
- **Низкая устойчивость к криптографическим атакам**: Со временем были разработаны более мощные алгоритмы, такие как [[SHA-256|SHA-256]] и SHA-3, которые обеспечивают лучшую безопасность по сравнению с MD5.
**Применения MD5:**
- **Проверка целостности данных**: Используется для проверки целостности файлов и данных, например, в контексте загрузки программного обеспечения, где MD5 хеши публикуются вместе с файлами для проверки их целостности.
- **Создание контрольных сумм**: MD5 был популярен для создания контрольных сумм файлов, чтобы быстро проверить, не были ли файлы изменены.
- **Идентификаторы и хеширование строк**: MD5 использовался для создания уникальных идентификаторов и хеширования паролей (хотя сейчас это считается небезопасной практикой).
***
## Мета информация
**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]]
**Родитель**:: [[Криптографическая хеш-функция]]
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -0,0 +1,39 @@
---
aliases:
- Secure Hash Algorithm 256-bit
- SHA256
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Криптография|00 Криптография]]"
- "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
parents:
- "[[Криптографическая хеш-функция]]"
linked:
---
SHA-256 (Secure Hash Algorithm 256-bit) — это [[криптографическая хеш-функция]], которая преобразует входные данные в 256-битное (32-байтное) значение, называемое хешем. SHA-256 является частью семейства алгоритмов SHA-2.
**Основные характеристики SHA-256:**
- **Фиксированная длина выхода**: Независимо от размера входных данных (например, файл, текст, строка), выход всегда имеет длину 256 бит (32 байта).
- **Однонаправленность**: Хеш-функция является однонаправленной, что означает, что по хешу невозможно восстановить исходные данные.
- **Устойчивость к коллизиям**: Вероятность нахождения двух различных входов, которые дают один и тот же хеш, чрезвычайно мала, что делает SHA-256 устойчивой к коллизиям.
- **Устойчивость к предобразу**: Трудно найти вход, который соответствует заданному хешу.
- **Быстродействие**: SHA-256 работает достаточно быстро для большинства приложений, включая цифровые подписи, контроль целостности данных и криптографические протоколы.
**Применения SHA-256:**
- **Хранение паролей**: Хеширование паролей перед хранением для защиты от утечек данных.
- **Контроль целостности данных**: Проверка целостности файлов или сообщений с помощью хеша.
- **Криптовалюты**: SHA-256 используется в алгоритме доказательства работы (Proof-of-Work) в блокчейне Bitcoin.
- **Цифровые подписи**: Используется для создания цифровых подписей, которые подтверждают подлинность и целостность сообщений.
**Реализации:**
- [[../snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]]
## Мета информация
**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]], [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]
**Родитель**:: [[Криптографическая хеш-функция]]
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -0,0 +1,26 @@
---
aliases:
- хеш-функция
- хеш-функцию
- хеш функция
- хеш функции
- хеш-функции
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Криптография|00 Криптография]]"
parents:
linked:
---
- [[MD5]]
- [[SHA-256]]
***
## Мета информация
**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -0,0 +1,21 @@
---
aliases:
- кодирования данных
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Разработка|00 Разработка]]"
parents:
linked:
---
- [[../other/Base64|Base64]]
***
## Мета информация
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -0,0 +1,21 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Разработка|00 Разработка]]"
parents:
linked:
---
- [[../algorithm/GZIP|GZIP]]
- [[../snippet/Сжатие изображений без потери качества|Сжатие изображений без потери качества]]
***
## Мета информация
**Область**::
**Родитель**::
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -18,6 +18,10 @@ linked:
Пример настройки в корневом `build.gradle`
```gradle
plugins {
id("org.kordamp.gradle.jandex") version "2.0.0"
}
buildscript {
repositories {
gradlePluginPortal()
@ -31,6 +35,9 @@ buildscript {
apply plugin: "org.kordamp.gradle.jandex"
subprojects {
apply plugin: "org.kordamp.gradle.jandex"
tasks.withType(Javadoc).configureEach {
dependsOn('jandex')
options.encoding = 'UTF-8'

36
dev/other/Base64.md Normal file
View File

@ -0,0 +1,36 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Разработка|00 Разработка]]"
parents:
- "[[../garden/ru/dev/fundamental/Кодирование данных|Кодирование данных]]"
linked:
---
Base64 — это метод [[../fundamental/Кодирование данных|кодирования данных]], который преобразует двоичные данные (например, файлы, изображения, или любой другой тип бинарных данных) в текстовый формат, используя набор из 64 символов (буквы латинского алфавита, цифры, а также символы + и /). Base64 часто используется для передачи данных через текстовые среды, такие как электронная почта или URL, где могут быть ограничения на использование двоичных данных.
**Основные характеристики Base64:**
- **Кодирование и декодирование**: Base64 преобразует каждый триплет байтов (24 бита) входных данных в четыре символа (по 6 бит каждый). В случае, если количество байтов не кратно трём, на выход добавляются один или два символа = для заполнения.
- **Читаемый текстовый формат**: Закодированные данные выглядят как обычный текст, состоящий из букв, цифр и нескольких специальных символов.
- **Преобразование размера**: Закодированные Base64 данные увеличиваются в размере примерно на 33% по сравнению с исходными двоичными данными.
- **Безопасность и надежность передачи**: Base64 кодирование не является средством защиты данных, оно не обеспечивает шифрования.
**Применения Base64:**
- **Электронная почта (MIME)**: Используется для кодирования вложений в электронных письмах, чтобы их можно было безопасно передать через SMTP, который поддерживает только текст.
- **Web**: Используется для передачи данных через URL или в JSON, а также для встраивания изображений и других медиафайлов в HTML и CSS.
- **Кодирование API**: Используется для кодирования данных в API запросах, особенно когда нужно передать бинарные данные в JSON.
- **Хранение данных**: В некоторых базах данных или конфигурационных файлах может быть удобно хранить бинарные данные в текстовом формате.
**Реализации:**
- [[../snippet/Реализация Base64 на Java|Реализация Base64 на Java]]
***
## Мета информация
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
**Родитель**:: [[../fundamental/Кодирование данных|Кодирование данных]]
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -0,0 +1,55 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
parents:
- "[[../other/Base64]]"
linked:
---
**Кодирование данных в Base64:**
```java
import java.util.Base64;
public class Base64EncodingExample {
public static void main(String[] args) {
// Пример строки для кодирования
String originalString = "This is a test string for Base64 encoding.";
// Кодирование строки в Base64
String encodedString = Base64.getEncoder().encodeToString(originalString.getBytes());
System.out.println("Encoded String: " + encodedString);
}
}
```
**Декодирование данных из Base64:**
```java
import java.util.Base64;
public class Base64DecodingExample {
public static void main(String[] args) {
// Пример закодированной строки Base64
String encodedString = "VGhpcyBpcyBhIHRlc3Qgc3RyaW5nIGZvciBCYXNlNjQgZW5jb2Rpbmcu";
// Декодирование строки из Base64
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
System.out.println("Decoded String: " + decodedString);
}
}
```
***
## Мета информация
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]
**Родитель**:: [[../other/Base64|Base64]]
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -0,0 +1,51 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-09-14
zero-link:
- "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
- "[[../../meta/zero/00 Криптография|00 Криптография]]"
parents:
- "[[../cryptography/SHA-256|SHA-256]]"
linked:
---
Преобразование строки в [[../cryptography/SHA-256|SHA-256]]:
```java
public class SHA {
public static String hashSha256(String data) {
try {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] encodedHash = digest.digest(data.getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedHash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Cannot find SHA-256 algorithm", e);
}
}
private static String bytesToHex(byte[] hash) {
final StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
}
```
***
## Мета информация
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]], [[../../meta/zero/00 Криптография|00 Криптография]]
**Родитель**:: [[../cryptography/SHA-256|SHA-256]]
**Источник**::
**Создана**:: [[2024-09-14]]
**Автор**::
### Дополнительные материалы
-

View File

@ -5,8 +5,9 @@ tags:
date: 2023-11-20
zero-link:
- "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
parents:
linked:
parents:
- "[[../../../../knowledge/dev/java/other/Jackson|Jackson]]"
linked:
---
Чаще всего по работе я сталкиваюсь с проблемой десериализации и сериализации даты. Многие разработчики отступают от стандартного формата времени `yyyy-MM-dd'T'HH:mm:ss*SSSZZZZ` и изобретают свои форматы.
@ -109,7 +110,7 @@ public class Foo {
***
## Мета информация
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]
**Родитель**::
**Родитель**:: [[../../../../knowledge/dev/java/other/Jackson|Jackson]]
**Источник**::
**Автор**::
**Создана**:: [[2023-11-20]]

View File

@ -4,7 +4,8 @@ tags:
date: 2023-11-20
zero-link:
- "[[../../meta/zero/00 Снипеты на bash|00 Снипеты на bash]]"
parents:
parents:
- "[[../garden/ru/dev/fundamental/Сжатие данных|Сжатие данных]]"
linked:
---
Размер изображений составляет существенную часть от размера страницы сайта. Поэтому часто я сжимаю изображения на своих сайтах. В этой заметке рассказываю какими способами я это делаю.
@ -112,7 +113,7 @@ CPU time decode 1.074758, encode 16.759768, other 0.018592, total 17.899076 sec
***
## Мета информация
**Область**:: [[../../meta/zero/00 Снипеты на bash|00 Снипеты на bash]]
**Родитель**::
**Родитель**:: [[../fundamental/Сжатие данных|Сжатие данных]]
**Источник**::
**Автор**::
**Создана**:: [[2023-11-20]]

View File

@ -9,13 +9,16 @@ title: Java разработка
- [Устройство Java](Устройство%20Java.md)
- [JDK](../../dev/java/JDK.md)
- [[../../dev/java/Java Reflection|Java Reflection]]
- [Снипеты для Java](00%20Снипеты%20для%20Java.md)
- Системы сборки
- [Maven](00%20Maven.md)
- [[00 Gradle|Gradle]]
- Фреймворки
- [Quarkus](00%20Quarkus.md)
- [SpringBoot](00%20SpringBoot.md)
- Библиотеки
- [Hibernate](00%20Hibernate.md)
- [[../../../../knowledge/dev/java/other/Jackson|Jackson]]
- [Снипеты для Java](00%20Снипеты%20для%20Java.md)
## Мои рассуждения
- [Использование wildcard imports в Java](../../dev/java/Использование%20wildcard%20imports%20в%20Java.md)
- [Сравнение константы слева в Java](../../dev/java/Сравнение%20константы%20слева%20в%20Java.md)

View File

@ -6,4 +6,5 @@ date:
parents:
title: Криптография
---
- [[../../dev/cryptography/Криптографическая хеш-функция|Криптографическая хеш-функция]]
- [Генерация аппаратного SSH ключа](../../dev/cryptography/Генерация%20аппаратного%20SSH%20ключа.md)

View File

@ -5,15 +5,14 @@ title: Продуктивность
linked:
zero-link:
---
Будучи недовольны своей продуктивностью, первым делом мы задумываемся о том, где взять больше времени. Первое, что приходит на ум,— «тайм-менеджмент», или управление временем. К сожалению, мы редко принимаем во внимание прочие [ресурсы](Ресурсы%20человека.md), необходимые для решения задач.
Чтобы быть действительно продуктивным, необходимо сначала научиться работать с теми [ресурсами](../../../../knowledge/human/Ресурсы%20человека.md), что у вас есть:
Будучи недовольны своей продуктивностью, первым делом мы задумываемся о том, где взять больше времени. Первое, что приходит на ум,— «тайм-менеджмент», или управление временем. К сожалению, мы редко принимаем во внимание прочие [ресурсы](Ресурсы%20человека.md), необходимые для решения задач:
- [Мыслетопливо](../../../../knowledge/human/ресурсы/Мыслетопливо.md)
- [Планирование](../../../../knowledge/human/ресурсы/Планирование.md)
- [Мотивация](../../../../knowledge/human/other/Мотивация.md) / [Сила воли](../../../../knowledge/human/ресурсы/Сила%20воли.md)
- [Внимание](../../../../knowledge/human/Внимание%20человека.md)
Конечно, нередко нам кажется, что заканчивается именно время, но на поверку это оказывается следствием опустошения бачка с [мыслетопливом](Мыслетопливо.md): сначала иссякает оно, потом вырубается [медленное мышление](Мышление%20по%20Даниэлю%20Канеману.md), как результат мы начинаем «тупить» и испытывать затруднения даже с элементарными вещами, делая их во много раз дольше обычного.
Чтобы быть действительно продуктивным, необходимо научиться работать со всеми [ресурсами](../../../../knowledge/human/Ресурсы%20человека.md), что у вас есть: нужно научиться не расходывать их впустую, а также эффективно восстанавливать.
## Заметки
- Конечно, нередко нам кажется, что заканчивается именно время, но на поверку это оказывается следствием опустошения бачка с [мыслетопливом](Мыслетопливо.md): сначала иссякает оно, потом вырубается [медленное мышление](Мышление%20по%20Даниэлю%20Канеману.md), как результат мы начинаем «тупить» и испытывать затруднения даже с элементарными вещами, делая их во много раз дольше обычного.
- Продуктивность не равняется времени потраченному на выполнение работы. Вы можете много работать и одновременно над несколькими задачами, но при этом быть контр-продуктивным.
- [Бракованный день](../../productivity/Бракованный%20день.md)

View File

@ -15,4 +15,8 @@ aliases:
- [Дебаг приложения на этапе компиляции IntelliJ IDEA](../../dev/snippet/Дебаг%20приложения%20на%20этапе%20компиляции%20IntelliJ%20IDEA.md)
- [Логирование SQL в Hibernate](../../dev/java/hibernate/Логирование%20SQL%20в%20Hibernate.md)
- [Бинарный поиск на Java](../../dev/java/Бинарный%20поиск%20на%20Java.md)
- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]]
- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]]
- [[../../dev/snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]]
- [[../../../../_inbox/Реализация GZIP в Java|Реализация GZIP в Java]]
- [[../../dev/snippet/Реализация Base64 на Java|Реализация Base64 на Java]]
- [[../../../../_inbox/Преобразование Json из коллекции в Java объект при помощи Jackson|Преобразование Json из коллекции в Java объект при помощи Jackson]]