Все потоки
Поиск
Написать публикацию
Обновить
1041.09

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга
Уровень сложности

Assembler для Windows в Visual Studio. Часть вторая — MASM x64 и юникод

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров6.1K

Вторая часть рассказа об ассемблере под Windows. Здесь я расскажу про 64-разрядные приложения в Windows, чем отличается MASM 64 от MASM 32, про макросы из MASM 64 SDK, как работать с Юникодом на примере простого консольного REPL'а, а ещё как обойтись без Visual Studio и пользоваться masm просто из командной строки.

Первая часть — Assembler для Windows в Visual Studio.

Читать далее

Почему генеративные ИИ-агенты в программировании — не для меня

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров4.7K

Команда AI for Devs подготовила перевод статьи Miguel Grinberg. Его позиция проста: генеративный ИИ в программировании не даёт реального ускорения, а лишь создаёт новые риски. А что думаете вы?

Читать далее

Программируемый мастер шины I2C на FPGA

Уровень сложностиПростой
Время на прочтение18 мин
Количество просмотров2.8K

В данной статье я хочу рассказать про процесс разработки относительного простого модуля для ПЛИС (FPGA), а именно – контроллера (мастера) шины I2C. Он является ведущим устройством на шине. Я постараюсь показать последовательность всех этапов работ: проектирование, написание кода, моделирование и отладка в «железе».

Статья в первую очередь ориентирована на тех, кто только начинает своё знакомство с ПЛИС. Надеюсь, она будет им полезна. Возможно и опытные разработчики смогут найти что-то новое для себя, увидеть интересные им идеи.

В статье приводится большое количество исходных кодов контроллера (на языке VHDL) с их подробным разбором.

Читать далее

YDB в мире Java: от нативного клиента до ORM’ов за 1 год

Время на прочтение6 мин
Количество просмотров4.5K

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

Меня зовут Кирилл Курдюков, в 2024 году я выступил в Питере на Joker — конференции для Java-разработчиков — с историей о том, как мы с командой делаем СУБД Яндекса удобной для джавистов.

Под катом статья, написанная по мотивам доклада. Это история о том, как маленькими шагами пройти путь от нативного клиента на Java до поддержки Hibernate, Liquibase, jOOQ и других популярных в мире Java-разработки решений.

Читать далее

Ещё раз о генераторах (и немного о генеративных моделях)

Время на прочтение7 мин
Количество просмотров3.6K

По факту это рецензия. На статью, которая показалась мне настолько показательной, что я решил написать на неё развернутый отзыв. Причём показательна она сразу в двух плоскостях: во-первых, идея о том, что генераторы экономят память, всё ещё находит своих приверженцев; во-вторых, тема превращения человека в бессловесный придаток бездушной машины не стояла так остро со времени выхода на экраны фильма "Матрица".

Читать далее

Объяснимые нейросети (XAI): почему ИИ должен быть прозрачным?

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров1.5K

Всем привет. Сегодня хочу затронуть важную и интересную тему объясняемых нейросетей (XAI). 

«Почему ИИ принял такое решение?» — вопрос, который всё чаще задают не только разработчики, но и обычные пользователи. Нейросети уже помогают ставить диагнозы, одобрять кредиты, управлять автомобилями и даже вершить правосудие. Но как можно доверять системе, если никто — включая её создателей — не понимает, как она работает?

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

Именно поэтому на сцену выходит Explainable AI (XAI) — объяснимый искусственный интеллект.

Читать далее

GRPC в деле: проблемы реального сервиса

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров15K

Привет, Хабр! Я Владислав Кислый, разработчик отказоустойчивых нагруженных сервисов в Т-Банке. Расскажу страшную сказку о том, как в одной компании взялись разрабатывать сервис. 

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

Читать далее

Определение положения объектов на изображении: как найти пространственные координаты объекта, используя OpenCV

Время на прочтение26 мин
Количество просмотров7.8K

Как найти 3D координаты объектов на изображении?

Статья о задаче пространственной локализации объектов на изображении с одной камеры и о её решении с помощью OpenCV

Читать далее

Go по-прежнему полон проблем

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров27K

Я уже больше десяти лет критикую Go, о чём высказывался в своих предыдущих статьях «Why Go is not my favourite language» и «Go programs are not portable».

Описанные в них проблемы языка бесят меня всё больше, и в основном потому, что их явно можно было избежать. Мир знавал решения и получше, но Go почему-то состряпали именно таким.

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

Читать далее

LLM на службе разработки: как мы научили нейросети проводить код-ревью

Время на прочтение6 мин
Количество просмотров5.8K

Привет, Хабр! Меня зовут Владимир Добрынин, я ведущий разработчик в МТС Web Services. Наша команда занимается плагинами DevTools, которые упрощают и ускоряют создание софта, в том числе за счет сокращения рутинных операций.

У нас уже есть целое семейство внутренних инструментов. Один из них — DevTools Copilot, который непосредственно из среды разработки позволяет взаимодействовать с LLM в режиме чата. А теперь мы реализовали DevTools Code Review, который помогает проводить самостоятельное код-ревью. В этой статье расскажу, как работает плагин и чего мы с его помощью добились.

Читать далее

Программирование автомобилей в играх

Уровень сложностиСредний
Время на прочтение26 мин
Количество просмотров8.9K

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

С самого детства я играл во множество гоночных и транспортных игр. Я всегда старался находить новые гонки. Но со временем я понял, что меня не просто впечатляют новые машины или трассы; меня привлекала уникальность каждого игрового процесса и поведения машин, несмотря на то, что по сути своей все они были легковыми автомобилями.

Здесь важно сказать следующее: игры — это не физические движки, а впечатления. И гоночные игры больше других намеренно манипулируют реальностью, чтобы дать нам эти впечатления. Например, мы ожидаем от шутеров определённого поведения; пуль, летающих по прямой, отдачу при выстрелах, перезарядку. Если эти ожидания не оправдываются, игра начинает казаться «не такой». Но в случае транспорта степень допущений может быть огромной.

Возьмём для примера Mario Kart. Это гонки, максимально далёкие от реалистичности; машинки дрифтят по песку, вы бросаете в друзей черепашьи панцири и гоняете в картах с мультяшными пропорциями и физикой. Тем не менее, эту игру обожают, ведь она «продаёт» реализацию фантазии о гонках.

На противоположном краю спектра находятся такие реалистичные симуляторы, как iRacing и Assetto Corsa. В них игровой процесс тщательно отточен, чтобы передавать все нюансы и трудности реального автоспорта. Люди тратят тысячи долларов на оборудование, позволяющее воссоздать ощущение нахождения за рулём. Тем не менее, в основе всех этих игр лежит программирование автомобилей. Они лишь по-разному расставляют приоритеты аспектов игрового опыта.

Читать далее

Полезные конструкции Python, которые упростят работу с данными

Уровень сложностиПростой
Время на прочтение25 мин
Количество просмотров16K

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

В этой статье мы собрали конструкции, которые пригодятся как начинающим, так и более опытным разработчикам.

Читать далее

Spring Boot 4 и Spring Framework 7: Ключевые фичи и изменения

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров14K

Уже в ноябре 2025 выходит Spring Boot 4 — масштабный релиз, построенный на фундаменте Spring Framework 7.0.0 и Jakarta EE 11. Это не просто очередное обновление, а важный этап в развитии всей Java-платформы: новые возможности для REST и безопасности, улучшенная работа с Kotlin и GraalVM, мощная поддержка облаков и нативных образов, а также инструменты для создания отказоустойчивых приложений.

🧠 Эта статья — больше, чем просто перевод: в ней собрано большое кол-во комментариев от экспертов Spring АйО.

Читать далее

Ближайшие события

Циклы в JavaScript: полный обзор функции

Время на прочтение6 мин
Количество просмотров4.3K

Привет! Я — Александр Дудукало, автор базового курса по JavaScript. Продолжаем погружение в этот язык — на этот раз поговорим про циклы. Обсудим, зачем они нужны, какими бывают и как с ними работать.

Читать далее

Почему лучшие программисты — это филологи (сами того не подозревая). Что общего у переменной temp и прозвища «Очкарик»?

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров33K

Привет, Хабр!

Меня зовут Артем Лакомов, я филолог из МГУ. Да, вы не ослышались. И сегодня я хочу поговорить с вами о самой главной (и самой дорогой) боли в IT, но с совершенно неожиданной стороны.

Каждый из вас хоть раз в жизни видел код, от которого хотелось плакать или же тихо ненавидеть свою работу. Код с переменными вроде data, res, temp. Код, где есть один гигантский класс, который делает абсолютно всё, и коллеги с любовью (или ужасом) называют его godObject.

Все привыкли думать, что это просто «плохой стиль» или «технический долг». Но что, если я скажу вам, что это — не техническая, а языковая проблема? И что у монструозного godObject гораздо больше общего со школьным прозвищем «Толстый», чем вы думаете?

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

Давайте я покажу вам, как теория прозвищ, разработанная великим отечественным лингвистом А.В. Суперанской, вскрывает то, о чем инженеры только догадывались интуитивно, но, увы, не могли сформулировать.

Читать далее

CPython — сборка мусора изнутри, ч.1

Уровень сложностиСложный
Время на прочтение17 мин
Количество просмотров5.5K

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

Если вам интересно, давайте попробуем разобраться вместе.

Читать далее

Создаём собственный системный вызов в Linux 6.8

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров4.9K

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

Читать далее

Как нарисовать космического захватчика

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров4.1K

Недавно я написал Space Invader Generator в рамках соревнований по кодингу Creative Coding Amsterdam. Разумеется, я сделал это ради развлечения... но и для господства над галактикой тоже! На скриншоте показано, как он выглядит, а в посте я объясню, как он работает.

Читать далее

Что можно узнать о Max из AndroidManifest

Уровень сложностиПростой
Время на прочтение13 мин
Количество просмотров53K

Привет, Хабр!

Сегодня в сети есть много дискуссий о мессенджере Макс. Недавно я наткнулся на один пост в гитхабе с анализом Android-приложения, где приводятся страшные выводы о слежке за пользователями. Поскольку интерес к этому вопросу лично у меня велик, я решил разобрать важный файл приложения — его AndroidManifest.xml — и проверить факты. 

Сам по себе AndroidManifest.xml — это своеобразный декларативный контракт приложения с Android: в нем зашиты его идентичность, модель доступа, поверхность атаки, аппаратные и сетевые зависимости, а также внешние взаимодействия. По одному этому файлу уже видно, к каким данным приложение может проситься, что оно имеет право делать в фоне, какие входные точки открыты наружу и под какие правила безопасности платформы оно подпадает. Манифест задает границы возможностей и рисков, а код и выданные пользователем разрешения решают, воспользуется ли приложение этими возможностями.

Читать далее

Ранг-селект словари

Уровень сложностиСложный
Время на прочтение9 мин
Количество просмотров2.9K

Это первая статья из планируемой серии про succinct data structures - класс наиболее компактных структур данных. Канонический пример такой структуры - это представление дерева в виде правильной скобочной последовательности, дерево изnвершин таким образом представляется с помощью2nбит в то время как типичная динамическая реализация требовала бы как два указателя по 64-бит на каждый узел (разумеется можно немного сократить простыми оптимизациями, но даже близко 2 бита не получить). Фундамент подобных структур - это rank-select словарь, представляющий собой битовый вектор и дополнительную структуру для выполнению двух операций ранг и селект. В указанном примере с деревом с помощью ранга и селекта можно сделать базовую навигацию: найти номера потомков/родителей, узнать размер поддерева. В статье расскажу как делать эти операции быстро используя при этом всего 3,6% дополнительной памяти.

Читать далее

Вклад авторов