Ему не место на помойке: хакаем 15-летний электронный переводчик и пишем под него приложения
Дисклеймер: Статья очень подробная и во всех красках "простым языком" описывает процесс хакинга и программирования под такой необычный девайс. Так что даже если вас не интересуют электронные переводчики и минипк, статья может оказаться для вас занимательной!
Я всегда любил находить новые применения стареньким девайсам, даже если обход защиты и разработка для них чего-то полезного занимала у меня некоторое время. И если с прошлыми моими статьями, где я привносил новую жизнь смартфонам на Android 2.3, а затем и на Android 1.5, всё понятно - девайсы получили возможность не только быть звонилками, но и вполне полноценными смартфонами, то в случае таких необычных девайсов, как электронные переводчики - всё гораздо интереснее, ведь по сути, это дешёвые альтернативы таким легендарным устройствам, как HP Jornada! Недавно я купил переводчик Ectaco за 1.500 рублей на Windows CE, обошел встроенную оболочку, написал программ...
Дисклеймер: Статья очень подробная и во всех красках "простым языком" описывает процесс хакинга и программирования под такой необычный девайс. Так что даже если вас не интересуют электронные переводчики и минипк, статья может оказаться для вас занимательной!
Я всегда любил находить новые применения стареньким девайсам, даже если обход защиты и разработка для них чего-то полезного занимала у меня некоторое время. И если с прошлыми моими статьями, где я привносил новую жизнь смартфонам на Android 2.3, а затем и на Android 1.5, всё понятно - девайсы получили возможность не только быть звонилками, но и вполне полноценными смартфонами, то в случае таких необычных девайсов, как электронные переводчики - всё гораздо интереснее, ведь по сути, это дешёвые альтернативы таким легендарным устройствам, как HP Jornada! Недавно я купил переводчик Ectaco за 1.500 рублей на Windows CE, обошел встроенную оболочку, написал программ...
Media is too big
VIEW IN TELEGRAM
Реальное Собеседование на Junior Backend разработчика
0:00 - Какие вопросы задавали
1:58 - Как работает Интернет
4:10 - Как браузер формирует запрос
5:05 - Как передать файл
5:55 - Как безопасно передать банковскую транзакцию
7:14 - Что возвращает сервер
9:46 - Вопрос про авторизацию со звездочкой*
11:06 - Зачем нужна пара access и refresh токены
12:55 - JWT или сессии — что лучше?
14:11 - Проектирование авторизации (практический пример)
16:20 - Как улучшить Dockerfile
19:50 - Какую зарплату мне предложили
источник
0:00 - Какие вопросы задавали
1:58 - Как работает Интернет
4:10 - Как браузер формирует запрос
5:05 - Как передать файл
5:55 - Как безопасно передать банковскую транзакцию
7:14 - Что возвращает сервер
9:46 - Вопрос про авторизацию со звездочкой*
11:06 - Зачем нужна пара access и refresh токены
12:55 - JWT или сессии — что лучше?
14:11 - Проектирование авторизации (практический пример)
16:20 - Как улучшить Dockerfile
19:50 - Какую зарплату мне предложили
источник
Логирование, трассировка и метрики — это три столпа наблюдаемости системы.
На диаграмме выше представлены их определения и типичные архитектуры.
🔹 Логирование
Логирование записывает дискретные события в системе. Например, можно зафиксировать входящий запрос или обращение к базе данных как события. Логирование имеет наибольший объем данных. Стек ELK (Elastic-Logstash-Kibana) часто используется для построения платформы анализа логов. Обычно мы определяем стандартизированный формат логирования для различных команд, чтобы можно было использовать ключевые слова при поиске среди большого количества логов.
🔹 Трассировка
Трассировка обычно ориентирована на запросы. Например, пользовательский запрос проходит через API-шлюз, балансировщик нагрузки, сервис A, сервис B и базу данных, что может быть визуализировано в системах трассировки. Это полезно при попытках выявить узкие места в системе. Мы используем OpenTelemetry для демонстрации типичной архитектуры, объединяющей три столпа в единую структуру.
🔹 Метри...
На диаграмме выше представлены их определения и типичные архитектуры.
🔹 Логирование
Логирование записывает дискретные события в системе. Например, можно зафиксировать входящий запрос или обращение к базе данных как события. Логирование имеет наибольший объем данных. Стек ELK (Elastic-Logstash-Kibana) часто используется для построения платформы анализа логов. Обычно мы определяем стандартизированный формат логирования для различных команд, чтобы можно было использовать ключевые слова при поиске среди большого количества логов.
🔹 Трассировка
Трассировка обычно ориентирована на запросы. Например, пользовательский запрос проходит через API-шлюз, балансировщик нагрузки, сервис A, сервис B и базу данных, что может быть визуализировано в системах трассировки. Это полезно при попытках выявить узкие места в системе. Мы используем OpenTelemetry для демонстрации типичной архитектуры, объединяющей три столпа в единую структуру.
🔹 Метри...
Зачем в iPhone чип, который убивает FaceID
Начнём с начала: как система FaceID выглядит, и как она работает:
Аппаратно эта система состоит из пары камер - ИК и RGB, и двух видов ИК-излучателей - обычной подсветки, и специализированного прожектора точек.
Снимаем с iPhone X шкурку, убираем всё лишнее, и видим блок фронтальных камер в голом виде. ИК подсветка существует отдельно, но все остальные компоненты у нас в руках — они надёжно закреплены в этой металлической рамке.
Тут мы видим ИК камеру и прожектор ИК точек. Именно на этой инфракрасной парочке держится работа систем TrueDepth и FaceID. И главный герой сегодняшнего
https://habr.com/ru/articles/841708/
Начнём с начала: как система FaceID выглядит, и как она работает:
Аппаратно эта система состоит из пары камер - ИК и RGB, и двух видов ИК-излучателей - обычной подсветки, и специализированного прожектора точек.
Снимаем с iPhone X шкурку, убираем всё лишнее, и видим блок фронтальных камер в голом виде. ИК подсветка существует отдельно, но все остальные компоненты у нас в руках — они надёжно закреплены в этой металлической рамке.
Тут мы видим ИК камеру и прожектор ИК точек. Именно на этой инфракрасной парочке держится работа систем TrueDepth и FaceID. И главный герой сегодняшнего
https://habr.com/ru/articles/841708/
Кривые Безье
Кривые Безье были постоянной темой в моей карьере фронтенд-инженера. Я широко использовал их в своей работе - в анимации и SVG-путях иллюстраций и иконок. Однако только недавно я заинтересовался пониманием логики, лежащей в основе их поведения. Эта статья раскрыла для меня тайны, связанные с использованием команд кривых путей, и дала мне более глубокое понимание веб-анимации. В этой статье я поделюсь своими интересными открытиями в области кривых Безье.
В CSS-анимации функции смягчения задают скорость изменения свойства с течением времени. Существует 3 типа функций смягчения - линейная, ступенчатая и кубическая кривая Безье.
https://blog.richardekwonye.com/bezier-curves
Кривые Безье были постоянной темой в моей карьере фронтенд-инженера. Я широко использовал их в своей работе - в анимации и SVG-путях иллюстраций и иконок. Однако только недавно я заинтересовался пониманием логики, лежащей в основе их поведения. Эта статья раскрыла для меня тайны, связанные с использованием команд кривых путей, и дала мне более глубокое понимание веб-анимации. В этой статье я поделюсь своими интересными открытиями в области кривых Безье.
В CSS-анимации функции смягчения задают скорость изменения свойства с течением времени. Существует 3 типа функций смягчения - линейная, ступенчатая и кубическая кривая Безье.
https://blog.richardekwonye.com/bezier-curves
Как компании доставляют код в продакшн?
Ниже описан типичный процесс доставки программного обеспечения. В разных компаниях используются разнообразные инструменты и среды, поэтому это один из вариантов рабочего процесса, который демонстрирует некоторые общие практики. Подробности могут отличаться в зависимости от организации. Учитывая это, общие шаги выглядят следующим образом:
Шаг 1: Владелец продукта создает требования и пользовательские истории.
Шаг 2: Команда разработчиков определяет приоритеты для историй и организует спринты.
Шаг 3: Разработчики коммитят код в систему контроля версий.
Шаг 4: Сервер автоматизации собирает код и запускает тесты. Проводятся проверки покрытия кода и качества.
Шаг 5: Если сборка успешна, артефакты сохраняются в репозитории артефактов. Сборка затем разворачивается в среде разработчиков.
Шаг 6: Функции тестируются независимо в нескольких изолированных средах.
Шаг 7: Команда QA тестирует функции в средах для контроля качества. Проводятся различные виды тестирования.
...
Ниже описан типичный процесс доставки программного обеспечения. В разных компаниях используются разнообразные инструменты и среды, поэтому это один из вариантов рабочего процесса, который демонстрирует некоторые общие практики. Подробности могут отличаться в зависимости от организации. Учитывая это, общие шаги выглядят следующим образом:
Шаг 1: Владелец продукта создает требования и пользовательские истории.
Шаг 2: Команда разработчиков определяет приоритеты для историй и организует спринты.
Шаг 3: Разработчики коммитят код в систему контроля версий.
Шаг 4: Сервер автоматизации собирает код и запускает тесты. Проводятся проверки покрытия кода и качества.
Шаг 5: Если сборка успешна, артефакты сохраняются в репозитории артефактов. Сборка затем разворачивается в среде разработчиков.
Шаг 6: Функции тестируются независимо в нескольких изолированных средах.
Шаг 7: Команда QA тестирует функции в средах для контроля качества. Проводятся различные виды тестирования.
...
Как поделить не деля или оптимизация деления компиляторам(и)
Если вы никогда не пробовали смотреть как код на C++ разворачивается компилятором в код Assembly – вас ждёт много сюрпризов, причём, не нужно смотреть какой-то замудренный исходный код полный templates или других сложных конструкций: рассмотрите следующий snippet:
https://habr.com/ru/articles/833470/
Если вы никогда не пробовали смотреть как код на C++ разворачивается компилятором в код Assembly – вас ждёт много сюрпризов, причём, не нужно смотреть какой-то замудренный исходный код полный templates или других сложных конструкций: рассмотрите следующий snippet:
uint8_t div10(uint8_t x)
{
return x/10;
}
https://habr.com/ru/articles/833470/
Микросервисы для тех, кто прикидывается разработчиком. Часть 1
«Скажите, какие основные преимущества микросервисов и почему?». Вероятно, это самый популярный вопрос последних 6–10 лет на любом собеседовании для бэкенд разработчика. Каким‑то чудом он даже обогнал: «Назовите три принципа ООП» и «Чем отличается класс от объекта?»
https://habr.com/ru/articles/833544/
«Скажите, какие основные преимущества микросервисов и почему?». Вероятно, это самый популярный вопрос последних 6–10 лет на любом собеседовании для бэкенд разработчика. Каким‑то чудом он даже обогнал: «Назовите три принципа ООП» и «Чем отличается класс от объекта?»
https://habr.com/ru/articles/833544/
Media is too big
VIEW IN TELEGRAM
Пытаюсь пройти System Design интервью / Такое спрашивают в MAANG? / Mock собеседование
❗️ВАЖНО! Данное собеседование является тестовым (mock) и несет в себе образовательную цель.
00:00 - НАЧАЛО
01:30 - условие задачи
02:26 - начинаю решать
47:40 - понял, что упустил из вида
53:40 - рисую диаграмму
01:25:11 - ФИДБЕК Марка
источник
❗️ВАЖНО! Данное собеседование является тестовым (mock) и несет в себе образовательную цель.
00:00 - НАЧАЛО
01:30 - условие задачи
02:26 - начинаю решать
47:40 - понял, что упустил из вида
53:40 - рисую диаграмму
01:25:11 - ФИДБЕК Марка
источник
Знакомство с constexpr unique_ptr (С++23)
https://andreasfertig.blog/2023/10/using-cpp23s-constexpr-unique_ptr/
https://andreasfertig.blog/2023/10/using-cpp23s-constexpr-unique_ptr/
Поведенческие паттерны
Согласно Википедии, поведенческие шаблоны (behavioral patterns) — шаблоны проектирования, определяющие алгоритмы и способы реализации взаимодействия различных объектов и классов.
Проще говоря, поведенческие паттерны связаны с распределением обязанностей между объектами и описывают структуру и шаблоны для передачи сообщений / связи между компонентами.
К ним относятся:
⚫️Template Method, или Шаблонный метод;
⚫️Iterator, или Итератор;
⚫️Observer, или Наблюдатель;
⚫️Chain of Responsibility, или Цепочка обязанностей;
⚫️Command, или Команда;
⚫️Mediator, или Посредник;
⚫️Memento, или Хранитель;
⚫️Visitor, или Посетитель;
⚫️Strategy, или Стратегия;
⚫️State, или Состояние.
Согласно Википедии, поведенческие шаблоны (behavioral patterns) — шаблоны проектирования, определяющие алгоритмы и способы реализации взаимодействия различных объектов и классов.
Проще говоря, поведенческие паттерны связаны с распределением обязанностей между объектами и описывают структуру и шаблоны для передачи сообщений / связи между компонентами.
К ним относятся:
⚫️Template Method, или Шаблонный метод;
⚫️Iterator, или Итератор;
⚫️Observer, или Наблюдатель;
⚫️Chain of Responsibility, или Цепочка обязанностей;
⚫️Command, или Команда;
⚫️Mediator, или Посредник;
⚫️Memento, или Хранитель;
⚫️Visitor, или Посетитель;
⚫️Strategy, или Стратегия;
⚫️State, или Состояние.
Облачные базы данных: Шпаргалка
В современном мире, основанном на данных, выбор правильной базы данных имеет решающее значение и в то же время сложен. Сейчас облако предлагает больше возможностей для структурированных, полуструктурированных и неструктурированных баз данных, чем когда-либо. Эта шпаргалка поможет выбрать наиболее подходящую для ваших нужд.
Структурированные базы данных📌
Структурированные базы данных организуют данные в предопределенные схемы и модели.
Реляционные базы данных, такие как MySQL и PostgreSQL, хранят данные в таблицах со строками и столбцами.
Колоночные базы данных, такие как Amazon Redshift и Google BigQuery, также имеют структурированную модель данных, но хранят их по-другому, оптимизируя для аналитических запросов.
Преимущества:
- Эффективные SQL-запросы
- Возможность применения ограничений и валидации
- Последовательность там, где это необходимо
Примеры использования: CRM-системы, управление запасами, бухгалтерский учет, аналитика
Полуструктурированные базы данных📌
...
В современном мире, основанном на данных, выбор правильной базы данных имеет решающее значение и в то же время сложен. Сейчас облако предлагает больше возможностей для структурированных, полуструктурированных и неструктурированных баз данных, чем когда-либо. Эта шпаргалка поможет выбрать наиболее подходящую для ваших нужд.
Структурированные базы данных📌
Структурированные базы данных организуют данные в предопределенные схемы и модели.
Реляционные базы данных, такие как MySQL и PostgreSQL, хранят данные в таблицах со строками и столбцами.
Колоночные базы данных, такие как Amazon Redshift и Google BigQuery, также имеют структурированную модель данных, но хранят их по-другому, оптимизируя для аналитических запросов.
Преимущества:
- Эффективные SQL-запросы
- Возможность применения ограничений и валидации
- Последовательность там, где это необходимо
Примеры использования: CRM-системы, управление запасами, бухгалтерский учет, аналитика
Полуструктурированные базы данных📌
...
Regular expressions library (since C++11)
Библиотека регулярных выражений предоставляет класс, представляющий регулярные выражения, которые являются своего рода мини-языком, используемым для выполнения сопоставления шаблонов в строках.
https://en.cppreference.com/w/cpp/regex
Библиотека регулярных выражений предоставляет класс, представляющий регулярные выражения, которые являются своего рода мини-языком, используемым для выполнения сопоставления шаблонов в строках.
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
std::string s = "Some people, when confronted with a problem, think "
"\"I know, I'll use regular expressions.\" "
"Now they have two problems.";
std::regex self_regex("REGULAR EXPRESSIONS",
std::regex_constants::ECMAScript | std::regex_constants::icase);
if (std::regex_search(s, self_regex))
std::cout « "Text contains the phrase 'regular expressions'\n";
std::regex word_regex("(\\w+)");
auto words_begin =
std::sregex_iterator(s.begin(), s.end(), word_regex);
auto words_end = std::sregex_iterator();
std::cout « "Found "
« std::distance(words_begin, words_end)
« " words\n";
const int N = 6;
std::cout « "Words longer than " « N « " characters:\n";
for (std::sregex_iterator i = words_begin; i != words_end; ++i)
{
std::smatch match = *i;
std::string match_str = match.str();
if (match_str.size() > N)
std::cout « " " « match_str « '\n';
}
std::regex long_word_regex("(\\w{7,})");
std::string new_s = std::regex_replace(s, long_word_regex, "[$&]");
std::cout « new_s « '\n';
}
https://en.cppreference.com/w/cpp/regex
Как Grafanalib помогает управлять дашбордами в масштабе
Для корпоративных организаций данные - это все, но когда им приходится вручную настраивать и переносить информационные панели между средами, данные вскоре превращаются в рутину.
https://www.contino.io/insights/grafanalib
Для корпоративных организаций данные - это все, но когда им приходится вручную настраивать и переносить информационные панели между средами, данные вскоре превращаются в рутину.
https://www.contino.io/insights/grafanalib
Объединение PDF-файлов с помощью PyPDF2
Установите библиотеку с помощью pip.
Вы можете легко объединить PDF-файлы, используя приведенный ниже код. Просто замените имена в списке pdf-файлов на имена pdf-файлов, которые вы хотите объединить (если они находятся в том же каталоге, что и ваш Python-скрипт), или на ссылки на pdf-файлы.
Установите библиотеку с помощью pip.
pip install PyPDF2Вы можете легко объединить PDF-файлы, используя приведенный ниже код. Просто замените имена в списке pdf-файлов на имена pdf-файлов, которые вы хотите объединить (если они находятся в том же каталоге, что и ваш Python-скрипт), или на ссылки на pdf-файлы.
import PyPDF2
def merge files (pdf files: list):
# Create a PDF merger obiect
pdf merger = PyPDF2.PdfFileMerger ()
# Loop through the list and append each PDF to the merger
for pdf_file in pdf_files:
pdf_merger.append(pdf_file)
# Output file for the merged PDF
output_pdf = "merged_file.pdf"
pdf_merger.write(output_pdf)
pdf_merger.close()
# List of PDF files to merge
pdf_files = ["file_1", "files_2"]
if name == " main
merge_files (pdf_files)
print("PDFs merged successfully.")
Что происходит внутри HashMap.put()?
1. Вычисляется хэш ключа. Если ключ null, хэш считается равным 0. Чтобы достичь лучшего распределения, результат вызова hashCode() «перемешивается»: его старшие биты XOR-ятся на младшие.
2. Значения внутри хэш-таблицы хранятся в специальных структурах данных – нодах, в массиве. Из хэша высчитывается номер бакета – индекс для значения в этом массиве. Полученный хэш обрезается по текущей длине массива. Длина – всегда степень двойки, так что для скорости используется битовая операция &.
3. В бакете ищется нода. В ячейке массива лежит не просто одна нода, а связка всех нод, которые туда попали. Исполнение проходит по этой связке (цепочке или дереву), и ищет ноду с таким же ключом. Ключ сравнивается с имеющимися сначала на ==, затем на equals.
4. Если нода найдена – её значение просто заменяется новым. Работа метода на этом завершается.
5. Если ноды с таким же ключом в бакете пока нет – добавляемая пара ключ-значение запаковывается в новый объект типа Node, и прикрепляется к структуре существующих нод бакета. Ноды составляют структуру за счет того, что в ноде хранится ссылка на следующий элемент (для дерева – следующие элементы). Кроме самой пары и ссылок, чтобы потом не считать заново, записывается и хэш ключа.
6. В случае, когда структурой была цепочка а не дерево, и длина цепочки превысила 7 элементов – происходит процедура treeification – превращение списка в самобалансирующееся дерево. В случае коллизии это ускоряет доступ к элементам на чтение с O(n) до O(log(n)). У comparable-ключей для балансировки используется их естественный порядок. Другие ключи балансируются по порядку имен их классов и значениям identityHashCode-ов. Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением (см. п.8).
7. Если новая нода попала в пустую ячейку, заняла новый бакет – увеличивается счетчик структурных модификаций. Изменение этого счетчика сообщит всем итераторам контейнера, что при следующем обращении они должны выбросить ConcurrentModificationException.
8. Когда количество занятых бакетов массива превысило пороговое (capacity * load factor), внутренний массив увеличивается вдвое, а для всего содержимого выполняется рехэш – все имеющиеся ноды перераспределяются по бакетам по тем же правилам, но уже с учетом нового размера.
#java
1. Вычисляется хэш ключа. Если ключ null, хэш считается равным 0. Чтобы достичь лучшего распределения, результат вызова hashCode() «перемешивается»: его старшие биты XOR-ятся на младшие.
2. Значения внутри хэш-таблицы хранятся в специальных структурах данных – нодах, в массиве. Из хэша высчитывается номер бакета – индекс для значения в этом массиве. Полученный хэш обрезается по текущей длине массива. Длина – всегда степень двойки, так что для скорости используется битовая операция &.
3. В бакете ищется нода. В ячейке массива лежит не просто одна нода, а связка всех нод, которые туда попали. Исполнение проходит по этой связке (цепочке или дереву), и ищет ноду с таким же ключом. Ключ сравнивается с имеющимися сначала на ==, затем на equals.
4. Если нода найдена – её значение просто заменяется новым. Работа метода на этом завершается.
5. Если ноды с таким же ключом в бакете пока нет – добавляемая пара ключ-значение запаковывается в новый объект типа Node, и прикрепляется к структуре существующих нод бакета. Ноды составляют структуру за счет того, что в ноде хранится ссылка на следующий элемент (для дерева – следующие элементы). Кроме самой пары и ссылок, чтобы потом не считать заново, записывается и хэш ключа.
6. В случае, когда структурой была цепочка а не дерево, и длина цепочки превысила 7 элементов – происходит процедура treeification – превращение списка в самобалансирующееся дерево. В случае коллизии это ускоряет доступ к элементам на чтение с O(n) до O(log(n)). У comparable-ключей для балансировки используется их естественный порядок. Другие ключи балансируются по порядку имен их классов и значениям identityHashCode-ов. Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением (см. п.8).
7. Если новая нода попала в пустую ячейку, заняла новый бакет – увеличивается счетчик структурных модификаций. Изменение этого счетчика сообщит всем итераторам контейнера, что при следующем обращении они должны выбросить ConcurrentModificationException.
8. Когда количество занятых бакетов массива превысило пороговое (capacity * load factor), внутренний массив увеличивается вдвое, а для всего содержимого выполняется рехэш – все имеющиеся ноды перераспределяются по бакетам по тем же правилам, но уже с учетом нового размера.
#java
Университет Сириус объявляет набор на программу «Современные методы робототехники и теории управления»
На нашей программе ты изучишь:
• современные подходы и методы исследования актуальных проблем механики, робототехники и теории управления;
• познакомишься с постановками актуальных тематических задач в приложениях;
• приобретешь навыки по использованию современных аналитических и численных методов их решения.
Кроме того, это отличная возможность стать частью комьюнити, которое разделяет твою страсть к робототехнике!
Сроки проведения: 11-16 ноября 2024.
Успей подать заявку до 13 октября 2024.
Если ты задался вопросами: «А как я поеду в Сириус? Где я буду там жить?»
У нас есть ответ:
Проживание, проезд/перелет по территории РФ и питание для участников программы осуществляется за счет средств партнера ГК «Росатом».
Плата за обучение на программе не взимается.
Более подробная информация: https://siriusuniversity.ru/admission/educational-modules-and-activities/informatsionnie-te...
На нашей программе ты изучишь:
• современные подходы и методы исследования актуальных проблем механики, робототехники и теории управления;
• познакомишься с постановками актуальных тематических задач в приложениях;
• приобретешь навыки по использованию современных аналитических и численных методов их решения.
Кроме того, это отличная возможность стать частью комьюнити, которое разделяет твою страсть к робототехнике!
Сроки проведения: 11-16 ноября 2024.
Успей подать заявку до 13 октября 2024.
Если ты задался вопросами: «А как я поеду в Сириус? Где я буду там жить?»
У нас есть ответ:
Проживание, проезд/перелет по территории РФ и питание для участников программы осуществляется за счет средств партнера ГК «Росатом».
Плата за обучение на программе не взимается.
Более подробная информация: https://siriusuniversity.ru/admission/educational-modules-and-activities/informatsionnie-te...
Шардинг как паттерн архитектуры базы данных
Шардинг (сегментирование) — паттерн архитектуры базы данных, предполагающий разбиение базы данных на более мелкие, быстрые и управляемые части, называемые шардами (сегментами). Каждый шард представляет собой отдельную базу данных, а в совокупности эти шарды составляют единую базу данных. Шардинг особенно полезен для управления крупными базами данных, обеспечивая значительное повышение производительности, удобство обслуживания и масштабируемость.
https://lab.scub.net/architecture-patterns-sharding-09f759150d3d
#db
Шардинг (сегментирование) — паттерн архитектуры базы данных, предполагающий разбиение базы данных на более мелкие, быстрые и управляемые части, называемые шардами (сегментами). Каждый шард представляет собой отдельную базу данных, а в совокупности эти шарды составляют единую базу данных. Шардинг особенно полезен для управления крупными базами данных, обеспечивая значительное повышение производительности, удобство обслуживания и масштабируемость.
https://lab.scub.net/architecture-patterns-sharding-09f759150d3d
#db
This media is not supported in your browser
VIEW IN TELEGRAM
Copycolors
Это интерфейс командной строки для быстрого извлечения доминирующих цветов из локальных или удаленных изображений.
Он построен на Rust и по сути основан на реализации алгоритма Colors Thief.
https://github.com/AbdoulMa/copycolors
Это интерфейс командной строки для быстрого извлечения доминирующих цветов из локальных или удаленных изображений.
Он построен на Rust и по сути основан на реализации алгоритма Colors Thief.
https://github.com/AbdoulMa/copycolors