METANIT.COM – Telegram
METANIT.COM
5.76K subscribers
1.64K photos
80 videos
9 files
975 links
Канал о программировании и разработке сайта metanit.com
Download Telegram
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/
🤡28😁12🤣7🤪3👍1
Шаблоны (паттерны) решения задач по Структурами данных и алгоритмам (Data Structures and Algorithms / DSA)
(продолжение в следующем посте)
3👍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).
👍743
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1🥰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, можно использовать флаг --zjit: ruby --zjit my_noscript.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/
👍9🥱43🤝2🤮1
Please open Telegram to view this post
VIEW IN TELEGRAM
👎7🖕4🔥1👏1😁1
Диаграмма подсистемы ввода-вывода в Linux
🔥52👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
🖕31🔥1🤮1
Лучшие практики при построении REST API
(продолжение в следующем посте)
🔥32👍2
Лучшие практики при построении REST 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 разработчиками.
8👍3🤝2