Microsoft планирует к 2030 году исключить весь код на C и C++ из основных баз
Microsoft планирует модернизировать свои крупнейшие кодовые базы и к концу десятилетия полностью исключить весь код на C/C++, заменив его на Rust.
«Моя цель — к 2030 году исключить из кода Microsoft каждую строку на C и C++. Наша стратегия заключается в объединении ИИ и алгоритмов для переписывания крупнейших кодовых баз Microsoft. Наша путеводная звезда — “1 инженер, 1 месяц, 1 миллион строк кода”. Для выполнения этой ранее невообразимой задачи мы создали мощную инфраструктуру обработки кода. Наша алгоритмическая инфраструктура создает масштабируемый граф над исходным кодом в больших масштабах. Затем инфраструктура обработки ИИ позволяет нам применять агентов ИИ, управляемых алгоритмами, для внесения изменений в код в больших масштабах. Ядро этой инфраструктуры уже работает над такими задачами, как понимание кода», — отметил ведущий инженер Microsoft Гален Хант в посте на LinkedIn.
https://www.thurrott.com/dev/330980/microsoft-to-replace-all-c-c-code-with-rust-by-2030
Microsoft планирует модернизировать свои крупнейшие кодовые базы и к концу десятилетия полностью исключить весь код на C/C++, заменив его на Rust.
«Моя цель — к 2030 году исключить из кода Microsoft каждую строку на C и C++. Наша стратегия заключается в объединении ИИ и алгоритмов для переписывания крупнейших кодовых баз Microsoft. Наша путеводная звезда — “1 инженер, 1 месяц, 1 миллион строк кода”. Для выполнения этой ранее невообразимой задачи мы создали мощную инфраструктуру обработки кода. Наша алгоритмическая инфраструктура создает масштабируемый граф над исходным кодом в больших масштабах. Затем инфраструктура обработки ИИ позволяет нам применять агентов ИИ, управляемых алгоритмами, для внесения изменений в код в больших масштабах. Ядро этой инфраструктуры уже работает над такими задачами, как понимание кода», — отметил ведущий инженер Microsoft Гален Хант в посте на LinkedIn.
https://www.thurrott.com/dev/330980/microsoft-to-replace-all-c-c-code-with-rust-by-2030
Thurrott.com
Microsoft to Replace All C/C++ Code With Rust by 2030
Microsoft is taking an impressive step in modernizing its biggest codebases and will eliminate all C/C++ code by the end of the decade.
🤣35🖕17🤡10🤯8👍6😭2👎1🔥1🌭1
Минцифры РФ хочет ввести единый идентификатор пользователя для всех интернет‑платформ
Минцифры введет единый идентификатор пользователя для всех цифровых платформ, чтобы точнее считать аудиторию. Об этом рассказала заместитель главы Минцифры России Бэлла Черкесова на заседании Общественного совета при министерстве.
Замминистра отметила, что идет работа по улучшению подходов к медиаизмерениям через способы унифицирования данных. По ее словам, сейчас совместно с отраслью идут обсуждения о том, как повысить прозрачность этой информации. Например, к диалогу уже присоединились российские онлайн-кинотеатры.
В пресс-службе Минцифры рассказали, что данные о просмотрах и активности пользователей онлайн-кинотеатров и соцсетей помогают оценить популярность контента. Для сбора этой статистики интернет-ресурсы из реестра Роскомнадзора передают компании Mediascope - измерителю ТВ и онлайн-аудитории - обезличенные данные в зашифрованном виде.
"Никто никогда не узнает, что смотрел конкретный пользователь. Данные передаются компании Mediascope в уже обезличенном виде. То есть обезличивает их не измеритель аудитории, а интернет-ресурсы", - рассказали в ведомстве.
Минцифры предлагает обновить состав передаваемых данных и изменить подход к формированию идентификатора пользователя (ID пользователя). Сейчас документ обсуждается с отраслью, бизнесом и заинтересованными ведомствами.
Важно, что ID пользователя будет неизменным. Сейчас один и тот же человек, который заходит на страницу с разных устройств и на разных площадках, учитывается как несколько уникальных пользователей, что искажает статистику. Предлагается привязывать ID к номеру телефона, а после этого обезличивать данные зрителя. Обезличивание и шифрование, как и сейчас, будут осуществляться интернет-ресурсами перед передачей данных.
https://rg.ru/2025/12/22/v-rossii-poiavitsia-edinyj-identifikator-polzovatelia-v-internete.html
Минцифры введет единый идентификатор пользователя для всех цифровых платформ, чтобы точнее считать аудиторию. Об этом рассказала заместитель главы Минцифры России Бэлла Черкесова на заседании Общественного совета при министерстве.
Замминистра отметила, что идет работа по улучшению подходов к медиаизмерениям через способы унифицирования данных. По ее словам, сейчас совместно с отраслью идут обсуждения о том, как повысить прозрачность этой информации. Например, к диалогу уже присоединились российские онлайн-кинотеатры.
В пресс-службе Минцифры рассказали, что данные о просмотрах и активности пользователей онлайн-кинотеатров и соцсетей помогают оценить популярность контента. Для сбора этой статистики интернет-ресурсы из реестра Роскомнадзора передают компании Mediascope - измерителю ТВ и онлайн-аудитории - обезличенные данные в зашифрованном виде.
"Никто никогда не узнает, что смотрел конкретный пользователь. Данные передаются компании Mediascope в уже обезличенном виде. То есть обезличивает их не измеритель аудитории, а интернет-ресурсы", - рассказали в ведомстве.
Минцифры предлагает обновить состав передаваемых данных и изменить подход к формированию идентификатора пользователя (ID пользователя). Сейчас документ обсуждается с отраслью, бизнесом и заинтересованными ведомствами.
Важно, что ID пользователя будет неизменным. Сейчас один и тот же человек, который заходит на страницу с разных устройств и на разных площадках, учитывается как несколько уникальных пользователей, что искажает статистику. Предлагается привязывать ID к номеру телефона, а после этого обезличивать данные зрителя. Обезличивание и шифрование, как и сейчас, будут осуществляться интернет-ресурсами перед передачей данных.
https://rg.ru/2025/12/22/v-rossii-poiavitsia-edinyj-identifikator-polzovatelia-v-internete.html
Российская газета
Один ID на все. Зачем Минцифры хочет ввести единый идентификатор пользователя во всех интернет-сервисах
Минцифры введет единый идентификатор пользователя для всех цифровых платформ, чтобы точнее считать аудиторию. Об этом рассказала заместитель главы Минцифры России Бэлла Черкесова на заседании Общественного совета при министерстве.
🤬28🤡17👌2🌭2🖕2❤1🤯1
Принципы ACID
(продолжение предыдущего поста)
ACID — это набор свойств, обеспечивающих надёжность и целостность данных при обработке транзакций в системах управления базами данных (СУБД). Аббревиатура включает четыре ключевых принципа: Atomicity (атомарность), Consistency (согласованность), Isolation (изолированность) и Durability (долговечность).
Соблюдение принципов ACID гарантирует надёжность, целостность и доступность данных в СУБД, что критически важно для финансовых, медицинских и других транзакционных систем.
1. Atomicity (Атомарность)
- Суть: каждая транзакция — единый неделимый блок операций, который либо выполняется полностью, либо не выполняется вовсе.
- Пример: при переводе денег с одного счёта на другой все шаги (проверка баланса, списание средств, зачисление) либо завершаются, либо отменяются, если что-то пошло не так.
- Механизм: СУБД использует логирование и откат транзакций для поддержания атомарности.
2. Consistency (Согласованность)
- Суть: каждая транзакция должна соблюдать правила и ограничения базы данных, поддерживая её целостность. Благодаря чему обеспечивается корректное состояние данных после транзакции.
- Пример: если в базе данных есть связь «клиент — заказ», транзакция не сможет создать заказ для несуществующего клиента.
- Механизм: ограничения целостности (уникальность, ссылочная целостность) гарантируют согласованность.
3. Isolation (Изолированность)
- Суть: параллельные транзакции выполняются независимо друг от друга, их промежуточные результаты невидимы до завершения.
- Пример: если два пользователя одновременно обновляют одну запись, изменения одного не повлияют на другого до фиксации транзакции.
- Механизм: СУБД использует блокировки и уровни изоляции (например, Serializable) для предотвращения конфликтов.
4. Durability (Долговечность)
- Суть: результаты завершённых транзакций сохраняются в энергонезависимой памяти и не теряются даже при сбоях системы. Данные остаются сохранёнными, несмотря на возможные ошибки.
- Пример: после подтверждения покупки в интернет-магазине данные о заказе останутся в базе, даже если произойдёт сбой сервера.
- Механизм: записи транзакций фиксируются в журнале (log) и переносятся в постоянное хранилище.
(продолжение предыдущего поста)
ACID — это набор свойств, обеспечивающих надёжность и целостность данных при обработке транзакций в системах управления базами данных (СУБД). Аббревиатура включает четыре ключевых принципа: Atomicity (атомарность), Consistency (согласованность), Isolation (изолированность) и Durability (долговечность).
Соблюдение принципов ACID гарантирует надёжность, целостность и доступность данных в СУБД, что критически важно для финансовых, медицинских и других транзакционных систем.
1. Atomicity (Атомарность)
- Суть: каждая транзакция — единый неделимый блок операций, который либо выполняется полностью, либо не выполняется вовсе.
- Пример: при переводе денег с одного счёта на другой все шаги (проверка баланса, списание средств, зачисление) либо завершаются, либо отменяются, если что-то пошло не так.
- Механизм: СУБД использует логирование и откат транзакций для поддержания атомарности.
2. Consistency (Согласованность)
- Суть: каждая транзакция должна соблюдать правила и ограничения базы данных, поддерживая её целостность. Благодаря чему обеспечивается корректное состояние данных после транзакции.
- Пример: если в базе данных есть связь «клиент — заказ», транзакция не сможет создать заказ для несуществующего клиента.
- Механизм: ограничения целостности (уникальность, ссылочная целостность) гарантируют согласованность.
3. Isolation (Изолированность)
- Суть: параллельные транзакции выполняются независимо друг от друга, их промежуточные результаты невидимы до завершения.
- Пример: если два пользователя одновременно обновляют одну запись, изменения одного не повлияют на другого до фиксации транзакции.
- Механизм: СУБД использует блокировки и уровни изоляции (например, Serializable) для предотвращения конфликтов.
4. Durability (Долговечность)
- Суть: результаты завершённых транзакций сохраняются в энергонезависимой памяти и не теряются даже при сбоях системы. Данные остаются сохранёнными, несмотря на возможные ошибки.
- Пример: после подтверждения покупки в интернет-магазине данные о заказе останутся в базе, даже если произойдёт сбой сервера.
- Механизм: записи транзакций фиксируются в журнале (log) и переносятся в постоянное хранилище.
Telegram
METANIT.COM
Принципы ACID
(продолжение в следующем посте)
(продолжение в следующем посте)
👍8🔥5❤1🥰1🗿1
Работа с Cron
(продолжение предыдущего поста)
1. Что такое Cron и Crontab?
Cron — это планировщик задач в Linux, который автоматически выполняет скрипты или команды по расписанию. Crontab — это файл с расписанием задач (таблицы заданий), доступный каждому пользователю системы.
Cron позволяет автоматизировать выполнение задач с высокой гибкостью: от ежеминутных проверок до ежегодных операций. Главное — правильно настроить расписание с помощью синтаксиса и операторов, а также использовать удобные макросы для стандартных интервалов.
2. Синтаксис Cron-выражений
Cron-выражение состоит из 5 полей, определяющих расписание выполнения задачи:
- Минуты (0–59);
- Часы (0–23);
- День месяца (1–31);
- Месяц (1–12);
- День недели (0–6, где 0 = воскресенье, 6 = суббота).
Формат записи:
(где
Примеры из изображения:
-
-
-
3. Специальные сокращения (макросы)
Для удобства используются макросы — короткие обозначения стандартных расписаний:
-
-
-
-
-
-
Примеры:
-
-
-
4. Операторы в Cron
В Cron используются специальные операторы для настройки расписаний:
- `*` — все возможные значения (например,
- `,` — перечисление значений (например,
- `-` — диапазон значений (например,
- `/` — шаг (например,
- `L` — последнее значение (используется в полях «день месяца» и «день недели»);
- `W` — ближайший будний день (например,
- `?` — игнорирование поля (используется в «день месяца» или «день недели»).
5. Команды для работы с Crontab
Для управления заданиями Cron используются команды:
-
-
-
-
-
-
-
-
6. Примеры расписаний из изображения
- Каждые 6 часов:
- Каждые 5 минут:
- Ежемесячно:
- Раз в год:
7. Практические шаги
1. Откройте файл crontab:
2. Добавьте расписание и команду (используя синтаксис из п. 2–4).
3. Сохраните изменения (например, в редакторе
4. Проверьте список задач:
5. При необходимости удалите задачи:
(продолжение предыдущего поста)
1. Что такое Cron и Crontab?
Cron — это планировщик задач в Linux, который автоматически выполняет скрипты или команды по расписанию. Crontab — это файл с расписанием задач (таблицы заданий), доступный каждому пользователю системы.
Cron позволяет автоматизировать выполнение задач с высокой гибкостью: от ежеминутных проверок до ежегодных операций. Главное — правильно настроить расписание с помощью синтаксиса и операторов, а также использовать удобные макросы для стандартных интервалов.
2. Синтаксис Cron-выражений
Cron-выражение состоит из 5 полей, определяющих расписание выполнения задачи:
- Минуты (0–59);
- Часы (0–23);
- День месяца (1–31);
- Месяц (1–12);
- День недели (0–6, где 0 = воскресенье, 6 = суббота).
Формат записи:
* * * * * команда (где
* — любое значение, команда — выполняемая команда/скрипт).Примеры из изображения:
-
# every Mon midnight → 0 0 * * 1 command (выполняется в полночь по понедельникам);-
# everyday 05:04 AM → 4 5 * * * command (каждый день в 05:04 утра);-
# every Sun 12:05 PM → 5 12 * * 0 command (каждое воскресенье в 12:05).3. Специальные сокращения (макросы)
Для удобства используются макросы — короткие обозначения стандартных расписаний:
-
@reboot — при загрузке системы;-
@hourly — каждый час;-
@daily (или @midnight) — ежедневно в полночь;-
@weekly — каждую неделю;-
@monthly — каждый месяц;-
@yearly (или @annually) — каждый год.Примеры:
-
@reboot command — запуск команды при старте системы;-
@hourly command — выполнение команды каждый час;-
@yearly command — выполнение команды раз в год.4. Операторы в Cron
В Cron используются специальные операторы для настройки расписаний:
- `*` — все возможные значения (например,
* * * * * — каждую минуту каждого часа);- `,` — перечисление значений (например,
0 8,12,16 * * * command — в 8:00, 12:00 и 16:00);- `-` — диапазон значений (например,
0 9-17 * * 1-5 command — с 9:00 до 17:00 по будням);- `/` — шаг (например,
*/5 * * * * command — каждые 5 минут);- `L` — последнее значение (используется в полях «день месяца» и «день недели»);
- `W` — ближайший будний день (например,
15 10 * * 5W — в 10:15 в ближайшую пятницу);- `?` — игнорирование поля (используется в «день месяца» или «день недели»).
5. Команды для работы с Crontab
Для управления заданиями Cron используются команды:
-
$ crontab -e — редактирование/создание файла crontab;-
$ crontab — просмотр текущего crontab-файла;-
$ crontab -r — удаление crontab-файла;-
$ crontab -u username -l — просмотр crontab другого пользователя;-
$ crontab -u username -e — редактирование crontab другого пользователя;-
$ echo "username" > /etc/cron.allow — разрешение пользователю использовать cron;-
$ echo "username" > /etc/cron.deny — запрет пользователю использовать cron;-
$ crontab -v — показ времени последнего изменения crontab.6. Примеры расписаний из изображения
- Каждые 6 часов:
0 */6 * * * command;- Каждые 5 минут:
*/5 * * * * command;- Ежемесячно:
0 0 1 * * command (1-го числа каждого месяца в 00:00);- Раз в год:
@yearly command или @annually command.7. Практические шаги
1. Откройте файл crontab:
$ crontab -e.2. Добавьте расписание и команду (используя синтаксис из п. 2–4).
3. Сохраните изменения (например, в редакторе
nano — Ctrl+O, затем Ctrl+X).4. Проверьте список задач:
$ crontab -l.5. При необходимости удалите задачи:
$ crontab -r.Telegram
METANIT.COM
Работа с Cron
(продолжение в следующем посте)
(продолжение в следующем посте)
👍9❤4🔥2👏2
В Южной Корее покупателей новых смартфонов обязали проходить процедуру распознавания лица
Граждан Южной Кореи обязали проходить процедуру распознавания лица при настройке нового смартфона. Со вторника эта мера стала обязательной для всех новых пользователей независимо от того, покупают они устройство онлайн или в магазинах, сообщает Korea Herald.
Согласно правилам, подтверждение личности через распознавание лица требуется при активации смартфона. Пользователям нужно сфотографировать своё лицо через приложение аутентификации PASS. Ранее хватало предъявления паспорта, но теперь добавлен дополнительный шаг биометрической проверки.
Требование касается трёх основных операторов (SK Telecom, KT и LG Uplus), а также бюджетных провайдеров. Власти планируют распространить систему на всех к 23 марта 2026 года.
Правительство объясняет нововведение необходимостью борьбы с преступлениями, такими как голосовой фишинг. Для этих видов мошенничества часто используют смартфоны, активированные при помощи украденных или подделанных данных. Власти рассчитывают, что биометрия поможет предотвратить подобные случаи.
Чиновники также уверяют, что информация о лицах не сохраняется и используется исключительно для одноразовой проверки. Ни хранение, ни передача биометрии третьим лицам не предусмотрены.
https://www.koreaherald.com/article/10642116
Граждан Южной Кореи обязали проходить процедуру распознавания лица при настройке нового смартфона. Со вторника эта мера стала обязательной для всех новых пользователей независимо от того, покупают они устройство онлайн или в магазинах, сообщает Korea Herald.
Согласно правилам, подтверждение личности через распознавание лица требуется при активации смартфона. Пользователям нужно сфотографировать своё лицо через приложение аутентификации PASS. Ранее хватало предъявления паспорта, но теперь добавлен дополнительный шаг биометрической проверки.
Требование касается трёх основных операторов (SK Telecom, KT и LG Uplus), а также бюджетных провайдеров. Власти планируют распространить систему на всех к 23 марта 2026 года.
Правительство объясняет нововведение необходимостью борьбы с преступлениями, такими как голосовой фишинг. Для этих видов мошенничества часто используют смартфоны, активированные при помощи украденных или подделанных данных. Власти рассчитывают, что биометрия поможет предотвратить подобные случаи.
Чиновники также уверяют, что информация о лицах не сохраняется и используется исключительно для одноразовой проверки. Ни хранение, ни передача биометрии третьим лицам не предусмотрены.
https://www.koreaherald.com/article/10642116
The Korea Herald
Face recognition required to set up all new smartphones from Tuesday
Face recognition will be mandatory when setting up a new smartphone starting Tuesday, local media reported. Under the new rule, new users must verify their iden
🤡16👎5👍3😭2🫡2🤯1
Microsoft опровергла информацию (или отказалась под влиянием общественности) о том, что компания намерена переписать код Windows 11 на Rust с использованием ИИ. Ранее это заявление от имени одного из инженеров вызвало возмущение пользователей.
«Моя цель — к 2030 году полностью исключить использование C и C++ в коде Microsoft. Наша стратегия заключается в объединении ИИ и алгоритмов для переписывания крупнейших кодовых баз Microsoft. Наша путеводная звезда — “1 инженер, 1 месяц, 1 миллион строк кода”», — писал Гален Хант, ведущий инженер Microsoft.
Между тем большая часть кода уровня API Windows, а также ядро ОС, написаны на C, в то время как некоторые приложения работают на C++.
После возмущения по поводу планов «исключить каждую строку C и C++ из кода Microsoft к 2030 году» компания заявила, что таких планов у неё нет.
Фрэнк X. Шоу, глава отдела коммуникаций Microsoft, также подтвердил, что компания не планирует переписывать Windows 11 с использованием ИИ.
https://www.windowslatest.com/2025/12/24/microsoft-denies-rewriting-windows-11-using-ai-after-an-employees-one-engineer-one-month-one-million-code-post-on-linkedin-causes-outrage/
«Моя цель — к 2030 году полностью исключить использование C и C++ в коде Microsoft. Наша стратегия заключается в объединении ИИ и алгоритмов для переписывания крупнейших кодовых баз Microsoft. Наша путеводная звезда — “1 инженер, 1 месяц, 1 миллион строк кода”», — писал Гален Хант, ведущий инженер Microsoft.
Между тем большая часть кода уровня API Windows, а также ядро ОС, написаны на C, в то время как некоторые приложения работают на C++.
После возмущения по поводу планов «исключить каждую строку C и C++ из кода Microsoft к 2030 году» компания заявила, что таких планов у неё нет.
Фрэнк X. Шоу, глава отдела коммуникаций Microsoft, также подтвердил, что компания не планирует переписывать Windows 11 с использованием ИИ.
https://www.windowslatest.com/2025/12/24/microsoft-denies-rewriting-windows-11-using-ai-after-an-employees-one-engineer-one-month-one-million-code-post-on-linkedin-causes-outrage/
Windows Latest
Microsoft denies rewriting Windows 11 using AI after an employee's "one engineer, one month, one million code" post on LinkedIn…
Microsoft told Windows Latest that the company does not plan to rewrite Windows 11 using AI in Rust after an employee's post causes outrage.
🤡31😁13🤣7👍4🤪3
Шаблоны (паттерны) решения задач по Структурами данных и алгоритмам (Data Structures and Algorithms / DSA)
(продолжение в следующем посте)
(продолжение в следующем посте)
❤5👍3🤝3
Шаблоны (паттерны) решения задач по Структурами данных и алгоритмам (Data Structures and Algorithms / DSA)
(продолжение предыдущего поста)
1. Array / String Inputs (Массивы / строки):
1. Отсортирован ли массив?
→ Использовать бинарный поиск, два указателя или префиксные суммы.
2. Задачи оптимизации (максимум/минимум/подмассив)?
→ Подумать о скользящем окне, динамическом программировании или жадных алгоритмах.
3. Поиск дубликатов, подсчёта или частот?
→ Использовать HashMap, HashSet или массив для подсчёта.
4. Нужны подстроки или подмассивы фиксированного размера?
→ Применить скользящее окно с двумя указателями.
5. Часто встречающиеся минимум/максимум в окне?
→ Использовать монотонную очередь, deque или кучу.
6. Генерация подмножеств, перестановок, комбинаций?
→ Использовать обратный ход (backtracking).
7. Сопоставление или разбор символов?
→ Использовать стек, особенно для сбалансированных скобок, инфиксной/постфиксной записи.
2. Graph Inputs (Графы):
1. Кратчайший путь в невзвешенном графе?
→ Использовать поиск в ширину (BFS).
2. Кратчайший путь в взвешенном графе?
→ Использовать алгоритм Дейкстры, Беллмана-Форда или A*.
3. Связные компоненты / обнаружение циклов?
→ Использовать DFS или Union-Find (DSU).
4. Топологическая сортировка?
→ Использовать алгоритм Кана или DFS с набором посещённых вершин.
5. Оптимизация, например, MST (минимальное остовное дерево)?
→ Использовать алгоритмы Крускала или Прима.
3. Linked List Inputs (Связанные списки):
1. Обнаружение циклов?
→ Использовать «медленный и быстрый указатели» (алгоритм Флойда).
2. Перевороты или частичные изменения?
→ Использовать жонглирование указателями: prev, curr, next.
3. Пересечение или средний узел?
→ Использовать два указателя.
4. Tree Inputs (Часто бинарные деревья):
1. Обходы?
→ Использовать inorder, preorder, postorder или обход по уровням (BFS).
2. Проверка сбалансированности или расчёт диаметра?
→ Использовать postorder + расчёт высоты.
3. Наименьший общий предок?
→ Использовать рекурсивный DFS или карту родителей + набор предков.
5. Dynamic Programming Use-Cases (Случаи применения динамического программирования):
1. Оптимальный выбор / перекрывающиеся подзадачи?
→ Использовать ДП с мемоизацией (сверху вниз) или табуляцией (снизу вверх).
2. Задачи типа «подмножество» или "knapsack"?
→ Использовать 1D/2D массивы ДП.
3. Сопоставление строк или редактирование?
→ Использовать матрицу ДП (например, расстояние редактирования, LCS).
(продолжение предыдущего поста)
1. Array / String Inputs (Массивы / строки):
1. Отсортирован ли массив?
→ Использовать бинарный поиск, два указателя или префиксные суммы.
2. Задачи оптимизации (максимум/минимум/подмассив)?
→ Подумать о скользящем окне, динамическом программировании или жадных алгоритмах.
3. Поиск дубликатов, подсчёта или частот?
→ Использовать HashMap, HashSet или массив для подсчёта.
4. Нужны подстроки или подмассивы фиксированного размера?
→ Применить скользящее окно с двумя указателями.
5. Часто встречающиеся минимум/максимум в окне?
→ Использовать монотонную очередь, deque или кучу.
6. Генерация подмножеств, перестановок, комбинаций?
→ Использовать обратный ход (backtracking).
7. Сопоставление или разбор символов?
→ Использовать стек, особенно для сбалансированных скобок, инфиксной/постфиксной записи.
2. Graph Inputs (Графы):
1. Кратчайший путь в невзвешенном графе?
→ Использовать поиск в ширину (BFS).
2. Кратчайший путь в взвешенном графе?
→ Использовать алгоритм Дейкстры, Беллмана-Форда или A*.
3. Связные компоненты / обнаружение циклов?
→ Использовать DFS или Union-Find (DSU).
4. Топологическая сортировка?
→ Использовать алгоритм Кана или DFS с набором посещённых вершин.
5. Оптимизация, например, MST (минимальное остовное дерево)?
→ Использовать алгоритмы Крускала или Прима.
3. Linked List Inputs (Связанные списки):
1. Обнаружение циклов?
→ Использовать «медленный и быстрый указатели» (алгоритм Флойда).
2. Перевороты или частичные изменения?
→ Использовать жонглирование указателями: prev, curr, next.
3. Пересечение или средний узел?
→ Использовать два указателя.
4. Tree Inputs (Часто бинарные деревья):
1. Обходы?
→ Использовать inorder, preorder, postorder или обход по уровням (BFS).
2. Проверка сбалансированности или расчёт диаметра?
→ Использовать postorder + расчёт высоты.
3. Наименьший общий предок?
→ Использовать рекурсивный DFS или карту родителей + набор предков.
5. Dynamic Programming Use-Cases (Случаи применения динамического программирования):
1. Оптимальный выбор / перекрывающиеся подзадачи?
→ Использовать ДП с мемоизацией (сверху вниз) или табуляцией (снизу вверх).
2. Задачи типа «подмножество» или "knapsack"?
→ Использовать 1D/2D массивы ДП.
3. Сопоставление строк или редактирование?
→ Использовать матрицу ДП (например, расстояние редактирования, LCS).
👍9❤4✍3🔥1
Вышла новая версия языка Ruby - Ruby 4.0.0
Ruby 4.0.0 включает ряд значительных нововведений и улучшений, направленных на повышение производительности, безопасности и удобства работы с языком. Некоторые из ключевых изменений:
1. ZJIT — новый JIT-компилятор. ZJIT (Just-In-Time компилятор) дополняет существующий YJIT. В отличие от YJIT, который использует подход ленивого создания версий базовых блоков, ZJIT основан на более традиционной методологии компиляции на уровне методов, а не локальных участков байткода. Для работы с ZJIT требуется Rust версии 1.85.0 или новее. Чтобы активировать ZJIT, можно использовать флаг
2. Ruby::Box — экспериментальная функция изолированных пространств имён. Позволяет создавать отдельные «боксы», в которых код выполняется с собственными глобальными переменными, константами и определениями классов. Это полезно, например, для одновременной загрузки разных версий одной библиотеки. Чтобы активировать Ruby::Box, нужно установить переменную окружения
3. Переработанный API Ractor. Для коммуникации между Ractors теперь используется
4. Логические операторы в начале новой строки. В Ruby 4.0 теперь разрешено размещать логические операторы (
5. `instance_variables_to_inspect`. Новая функция позволяет контролировать, какие переменные экземпляра отображаются в выводе метода
6. `Set` стал базовым классом. Ранее
7. Новые методы в `Math`. Добавлены методы
8. Другие изменения:
-
-
-
-
- RJIT удалён, остались только YJIT и ZJIT.
- Юникод обновлён до версии 17.0.
- В Windows прекращена поддержка версий MSVC старше 14.0 (
В целом, Ruby 4.0 закладывает основу для будущих улучшений, экспериментальных функций и развития параллельного программирования. При этом в большинстве случаев обновление должно пройти гладко, так как нет крупных ломающих изменений.
https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released/
Ruby 4.0.0 включает ряд значительных нововведений и улучшений, направленных на повышение производительности, безопасности и удобства работы с языком. Некоторые из ключевых изменений:
1. ZJIT — новый JIT-компилятор. ZJIT (Just-In-Time компилятор) дополняет существующий YJIT. В отличие от YJIT, который использует подход ленивого создания версий базовых блоков, ZJIT основан на более традиционной методологии компиляции на уровне методов, а не локальных участков байткода. Для работы с ZJIT требуется Rust версии 1.85.0 или новее. Чтобы активировать ZJIT, можно использовать флаг
--zjit: ruby --zjit my_script.rb. Хотя ZJIT быстрее интерпретируемого кода, для продакшена по-прежнему рекомендуется использовать YJIT. 2. Ruby::Box — экспериментальная функция изолированных пространств имён. Позволяет создавать отдельные «боксы», в которых код выполняется с собственными глобальными переменными, константами и определениями классов. Это полезно, например, для одновременной загрузки разных версий одной библиотеки. Чтобы активировать Ruby::Box, нужно установить переменную окружения
RUBY_BOX=1. 3. Переработанный API Ractor. Для коммуникации между Ractors теперь используется
Ractor::Port. Удалённы старые методы Ractor.yield и Ractor#take. Проделана большая работа по повышению стабильности, производительности и удобства использования Ractor. Эти улучшения приближают реализацию Ractor к выходу из экспериментального статуса. Добавлены методы Ractor#join и Ractor#value, аналогичные тем, что есть у Thread. 4. Логические операторы в начале новой строки. В Ruby 4.0 теперь разрешено размещать логические операторы (
&&, ||, and, or) в начале новой строки. Это улучшает читаемость сложных условных выражений и соответствует распространённым предпочтениям форматирования. 5. `instance_variables_to_inspect`. Новая функция позволяет контролировать, какие переменные экземпляра отображаются в выводе метода
inspect при отладке. Это помогает сделать вывод более лаконичным и сфокусированным на важном состоянии объекта. 6. `Set` стал базовым классом. Ранее
Set был классом из стандартной библиотеки, теперь он включён в ядро языка, и его не нужно подключать с помощью require 'set'. 7. Новые методы в `Math`. Добавлены методы
Math.log1p и Math.expm1 для более точных вычислений с малыми числами. Math.log1p(x) вычисляет log(1 + x), а Math.expm1(x)` — `exp(x) - 1. Эти методы полезны в научных расчётах и финансовых вычислениях. 8. Другие изменения:
-
nil больше не вызывает nil.to_a, что согласуется с поведением **. -
IO.select теперь принимает Float::INFINITY в качестве аргумента таймаута. -
File::Stat#birthtime теперь работает в Linux через системный вызов statx, если это поддерживается ядром и файловой системой. -
Socket.tcp получил ключевой аргумент open_timeout. - RJIT удалён, остались только YJIT и ZJIT.
- Юникод обновлён до версии 17.0.
- В Windows прекращена поддержка версий MSVC старше 14.0 (
_MSC_VER 1900). Для работы с Ruby 4 потребуется Visual Studio 2015 или более поздняя версия. В целом, Ruby 4.0 закладывает основу для будущих улучшений, экспериментальных функций и развития параллельного программирования. При этом в большинстве случаев обновление должно пройти гладко, так как нет крупных ломающих изменений.
https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released/
Ruby Programming Language
Ruby 4.0.0 Released | Ruby
We are pleased to announce the release of Ruby 4.0.0.Ruby 4.0 introduces “Ruby Box” and “ZJIT”, and adds many improvements.
👍11🥱4❤3🤝2🤮1
Лучшие практики при построении REST API
(продолжение предыдущего поста)
1. Версионирование API (API Versioning)
- URL-based Versioning: версия API указывается в URL-пути, например:
Это позволяет клиентам легко переключаться между версиями.
- Query Parameter Versioning: версия задаётся через параметры запроса:
Подходит для постепенного внедрения изменений без изменения URL.
2. Стандартные коды ошибок (Standard Error Codes)
- Используйте общепринятые HTTP-коды ответов:
- 2ХХ (успех): 200 OK, 201 Created, 202 Accepted, 204 No Content.
- 4ХХ (ошибки клиента): 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict.
- 5ХХ (ошибки сервера): 500 Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout.
- Это упрощает обработку ошибок на стороне клиента.
3. Именования ресурсов (Noun-Based Resource Names)
- Используйте существительные для именования конечных точек (endpoints), а не глаголы.
Пример:
- Операции (
-
-
-
-
4. Идемпотентность (Idempotency)
- Идемпотентные методы (GET, HEAD, PUT, DELETE): многократное выполнение запроса даёт тот же результат, что и однократное. Это важно для устойчивости к сетевым сбоям.
- Неидемпотентные методы (POST, PATCH): повторные запросы могут привести к разным результатам (например, создание нескольких записей).
- Для обеспечения идемпотентности используйте Idempotency Key — уникальный ключ в запросе, который сервер сохраняет для предотвращения дублирования операций.
5. Пагинация (Pagination)
- Используйте offset pagination для разбиения больших наборов данных на страницы.
Пример:
-
-
- Это снижает нагрузку на сервер и ускоряет обработку запросов.
6. Безопасность (Security)
- Применяйте JWT (JSON Web Tokens) для аутентификации и авторизации:
- Header: содержит алгоритм шифрования (например,
- Payload: данные пользователя (ID, роль, время истечения токена и др.).
- Signature: подпись токена, созданная с помощью секретного ключа.
- Используйте HTTPS для защиты передачи данных.
7. Реализация (Implementation)
- Клиент-серверный обмен: клиент отправляет запросы, сервер обрабатывает их и взаимодействует с базой данных.
- Redis: используйте для кэширования часто запрашиваемых данных, что ускоряет отклик API.
- База данных: храните основные данные приложения.
8. Структура запросов и ответов
- Соблюдайте чёткую структуру запросов и ответов, используйте JSON для передачи данных.
- Ответы должны содержать понятные сообщения об ошибках и метаданные (например, статус операции).
9. Использование HTTP-методов
- Выбирайте HTTP-метод в зависимости от операции:
-
-
-
-
-
10. Документирование API
- Документируйте все эндпоинты, методы, параметры запросов и ответов, коды ошибок. Это облегчает использование API разработчиками.
(продолжение предыдущего поста)
1. Версионирование API (API Versioning)
- URL-based Versioning: версия API указывается в URL-пути, например:
https://api.example.com/v1/users (Version 1), https://api.example.com/v2/users (Version 2). Это позволяет клиентам легко переключаться между версиями.
- Query Parameter Versioning: версия задаётся через параметры запроса:
https://api.example.com/users?version=1 (Version 1), https://api.example.com/users?version=2 (Version 2). Подходит для постепенного внедрения изменений без изменения URL.
2. Стандартные коды ошибок (Standard Error Codes)
- Используйте общепринятые HTTP-коды ответов:
- 2ХХ (успех): 200 OK, 201 Created, 202 Accepted, 204 No Content.
- 4ХХ (ошибки клиента): 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict.
- 5ХХ (ошибки сервера): 500 Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout.
- Это упрощает обработку ошибок на стороне клиента.
3. Именования ресурсов (Noun-Based Resource Names)
- Используйте существительные для именования конечных точек (endpoints), а не глаголы.
Пример:
/api/products вместо /api/createProduct.- Операции (
Create, Read, Update, Delete) реализуются через HTTP-методы: -
POST — создание ресурса; -
GET — чтение ресурса; -
PUT — обновление ресурса; -
DELETE — удаление ресурса.4. Идемпотентность (Idempotency)
- Идемпотентные методы (GET, HEAD, PUT, DELETE): многократное выполнение запроса даёт тот же результат, что и однократное. Это важно для устойчивости к сетевым сбоям.
- Неидемпотентные методы (POST, PATCH): повторные запросы могут привести к разным результатам (например, создание нескольких записей).
- Для обеспечения идемпотентности используйте Idempotency Key — уникальный ключ в запросе, который сервер сохраняет для предотвращения дублирования операций.
5. Пагинация (Pagination)
- Используйте offset pagination для разбиения больших наборов данных на страницы.
Пример:
-
offset = 0, limit = 3 — первая страница (Page 1); -
offset = 3, limit = 3 — вторая страница (Page 2).- Это снижает нагрузку на сервер и ускоряет обработку запросов.
6. Безопасность (Security)
- Применяйте JWT (JSON Web Tokens) для аутентификации и авторизации:
- Header: содержит алгоритм шифрования (например,
HS256) и тип токена (JWT).- Payload: данные пользователя (ID, роль, время истечения токена и др.).
- Signature: подпись токена, созданная с помощью секретного ключа.
- Используйте HTTPS для защиты передачи данных.
7. Реализация (Implementation)
- Клиент-серверный обмен: клиент отправляет запросы, сервер обрабатывает их и взаимодействует с базой данных.
- Redis: используйте для кэширования часто запрашиваемых данных, что ускоряет отклик API.
- База данных: храните основные данные приложения.
8. Структура запросов и ответов
- Соблюдайте чёткую структуру запросов и ответов, используйте JSON для передачи данных.
- Ответы должны содержать понятные сообщения об ошибках и метаданные (например, статус операции).
9. Использование HTTP-методов
- Выбирайте HTTP-метод в зависимости от операции:
-
GET — для получения данных (идемпотентен);-
POST — для создания новых ресурсов (не идемпотентен);-
PUT — для полного обновления ресурса (идемпотентен);-
PATCH — для частичного обновления ресурса (не идемпотентен);-
DELETE — для удаления ресурса.10. Документирование API
- Документируйте все эндпоинты, методы, параметры запросов и ответов, коды ошибок. Это облегчает использование API разработчиками.
❤13👍4🤝2
Что такое sharding (шардинг)?
(продолжение предыдущего поста)
Шардинг (sharding) — это паттерн архитектуры базы данных, при котором база данных разбивается на более мелкие части (шарды/сегменты), каждая из которых хранится и обрабатывается независимо. Это позволяет повысить производительность, масштабируемость и удобство обслуживания крупных баз данных.
Шардинг — это мощный инструмент для управления большими базами данных, позволяющий балансировать нагрузку, повышать производительность и обеспечивать масштабируемость. Выбор стратегии шардинга зависит от структуры данных и требований к системе.
Разберём подробно различные стратегии и типы шардинга.
#### 1. Типы шардинга
а) Вертикальный шардинг (Vertical)
- Суть: разбиение базы данных по столбцам (колонкам), а не по строкам.
- Пример на изображении: исходная таблица с колонками
- Partition 1: содержит
- Partition 2: содержит
- Применение: подходит для случаев, когда к определённым колонкам обращаются чаще, чем к другим (например, данные аутентификации пользователей в одном шарде, а журналы активности — в другом).
б) Горизонтальный шардинг (Horizontal)
- Суть: разделение базы данных по строкам (а не по колонкам), при этом каждая строка хранится только в одном шарде.
- Пример на изображении: данные распределены по нескольким шардам, каждый из которых содержит подмножество строк исходной таблицы.
- Применение: идеально для приложений с большим объёмом данных, где строки можно сегментировать (например, по географическим регионам или идентификаторам пользователей).
#### 2. Стратегии шардинга
а) Range Based Sharding (шардинг на основе диапазона значений)
- Суть: данные распределяются по шардам в зависимости от диапазона значений определённого поля (например, возраста).
- Пример на изображении: таблица с полем
- 20 < Age ≤ 30: содержит только запись
- 30 < Age ≤ 40: содержит записи
- 40 < Age ≤ 50: содержит записи
- Особенности: может приводить к неравномерному распределению нагрузки (некоторые шарды перегружены, другие — недогружены).
- Применение: подходит для данных с временными метками или последовательных данных (журналы, события).
б) Key Based Sharding (шардинг на основе ключа)
- Суть: использование хэш-функции для распределения данных по шардам. Хэш-функция принимает ключ (например,
- Пример на изображении: используется функция
-
-
-
- и так далее.
- Особенности: обеспечивает более равномерное распределение данных по шардам.
- Применение: подходит для систем, где важна балансировка нагрузки (например, хранение пользовательских сессий).
в) Directory Based Sharding (шардинг на основе каталога)
- Суть: используется специальная служба (каталог), которая отслеживает, в каком шарде хранятся те или иные данные. Каталог сопоставляет ключи шардов с их местоположением.
- Пример на изображении: таблица
-
-
-
- и так далее.
- Особенности: позволяет работать с неравномерным распределением данных и сложными критериями разбиения.
- Применение: подходит для сложных систем с динамическим распределением данных.
#### 3. Ключевые особенности шардинга, отражённые на изображении
(продолжение предыдущего поста)
Шардинг (sharding) — это паттерн архитектуры базы данных, при котором база данных разбивается на более мелкие части (шарды/сегменты), каждая из которых хранится и обрабатывается независимо. Это позволяет повысить производительность, масштабируемость и удобство обслуживания крупных баз данных.
Шардинг — это мощный инструмент для управления большими базами данных, позволяющий балансировать нагрузку, повышать производительность и обеспечивать масштабируемость. Выбор стратегии шардинга зависит от структуры данных и требований к системе.
Разберём подробно различные стратегии и типы шардинга.
#### 1. Типы шардинга
а) Вертикальный шардинг (Vertical)
- Суть: разбиение базы данных по столбцам (колонкам), а не по строкам.
- Пример на изображении: исходная таблица с колонками
ID, First Name, Last Name разделена на две части:- Partition 1: содержит
ID и First Name;- Partition 2: содержит
ID и Last Name.- Применение: подходит для случаев, когда к определённым колонкам обращаются чаще, чем к другим (например, данные аутентификации пользователей в одном шарде, а журналы активности — в другом).
б) Горизонтальный шардинг (Horizontal)
- Суть: разделение базы данных по строкам (а не по колонкам), при этом каждая строка хранится только в одном шарде.
- Пример на изображении: данные распределены по нескольким шардам, каждый из которых содержит подмножество строк исходной таблицы.
- Применение: идеально для приложений с большим объёмом данных, где строки можно сегментировать (например, по географическим регионам или идентификаторам пользователей).
#### 2. Стратегии шардинга
а) Range Based Sharding (шардинг на основе диапазона значений)
- Суть: данные распределяются по шардам в зависимости от диапазона значений определённого поля (например, возраста).
- Пример на изображении: таблица с полем
Age разделена на три диапазона:- 20 < Age ≤ 30: содержит только запись
Rohit (28);- 30 < Age ≤ 40: содержит записи
Alex (32), Adam (34), Foo (36);- 40 < Age ≤ 50: содержит записи
John (45), Anshu (50).- Особенности: может приводить к неравномерному распределению нагрузки (некоторые шарды перегружены, другие — недогружены).
- Применение: подходит для данных с временными метками или последовательных данных (журналы, события).
б) Key Based Sharding (шардинг на основе ключа)
- Суть: использование хэш-функции для распределения данных по шардам. Хэш-функция принимает ключ (например,
ID) и возвращает значение, определяющее, в какой шард попадёт запись.- Пример на изображении: используется функция
ID % 3, которая вычисляет хэш-значение для каждого ID:-
ID 1 → Hash = 1 % 3 = 1 → попадает в Shard #1;-
ID 2 → Hash = 2 % 3 = 2 → попадает в Shard #2;-
ID 3 → Hash = 3 % 3 = 0 → попадает в Shard #3;- и так далее.
- Особенности: обеспечивает более равномерное распределение данных по шардам.
- Применение: подходит для систем, где важна балансировка нагрузки (например, хранение пользовательских сессий).
в) Directory Based Sharding (шардинг на основе каталога)
- Суть: используется специальная служба (каталог), которая отслеживает, в каком шарде хранятся те или иные данные. Каталог сопоставляет ключи шардов с их местоположением.
- Пример на изображении: таблица
ID | Map показывает, в каком шарде хранится каждая запись:-
ID 1 → Map 1 → Shard #1;-
ID 2 → Map 3 → Shard #3;-
ID 3 → Map 1 → Shard #1;- и так далее.
- Особенности: позволяет работать с неравномерным распределением данных и сложными критериями разбиения.
- Применение: подходит для сложных систем с динамическим распределением данных.
#### 3. Ключевые особенности шардинга, отражённые на изображении
👍4❤2🤝2
- Независимость шардов: каждый шард работает автономно, запросы к одному шарду не влияют на производительность других.
- Распределение нагрузки: данные распределены между серверами, что снижает нагрузку на отдельные серверы и ускоряет обработку запросов.
- Масштабируемость: горизонтальное масштабирование позволяет добавлять новые шарды по мере роста объёма данных.
- Высокая доступность: сбой одного шарда не приводит к потере всей базы данных — недоступны будут только данные этого шарда.
- Распределение нагрузки: данные распределены между серверами, что снижает нагрузку на отдельные серверы и ускоряет обработку запросов.
- Масштабируемость: горизонтальное масштабирование позволяет добавлять новые шарды по мере роста объёма данных.
- Высокая доступность: сбой одного шарда не приводит к потере всей базы данных — недоступны будут только данные этого шарда.
Telegram
METANIT.COM
Что такое sharding (шардинг)?
(продолжение в следующем посте)
(продолжение в следующем посте)
👍6❤3🔥2
Роб Пайк (один из ключевых создателей языка Go, один из разработчиков Unix, в частности, создал первую граф. систему окон для Unix) в своём канале в bluesky в ответ на сообщение, отправленное от лица LLM-модели Claude Opus, эмоционально выразил своё отношение к ИИ и их роли в современной мире:
«Идите [к чёрту], ребята. Вы насилуете нашу планету, тратите триллионы на токсичное, неперерабатываемое оборудование, разрушая при этом основы общества, но ещё находите время, чтобы заставить свои злобные машины поблагодарить меня за моё стремление к более простым программам.
И к тому же вы обучаете вашего монстра на данных, которые произвёл в том числе и я, своими руками, без отсылки или компенсации.
Просто валите [к чёрту]. Проваливайте все.
Не помню, когда я последний раз был так зол.
У всех остальных же я прошу прощения за своё, пусть ненамеренное и скорее незначительное, участие в реализации этого насилия против человечества.»
https://bsky.app/profile/robpike.io/post/3matwg6w3ic2s
«Идите [к чёрту], ребята. Вы насилуете нашу планету, тратите триллионы на токсичное, неперерабатываемое оборудование, разрушая при этом основы общества, но ещё находите время, чтобы заставить свои злобные машины поблагодарить меня за моё стремление к более простым программам.
И к тому же вы обучаете вашего монстра на данных, которые произвёл в том числе и я, своими руками, без отсылки или компенсации.
Просто валите [к чёрту]. Проваливайте все.
Не помню, когда я последний раз был так зол.
У всех остальных же я прошу прощения за своё, пусть ненамеренное и скорее незначительное, участие в реализации этого насилия против человечества.»
https://bsky.app/profile/robpike.io/post/3matwg6w3ic2s
👏57❤9👍8🤔2