Как стать автором
Обновить
1076.64

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

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

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

Struct IEnumerator

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

Как-то было свободных полчаса перед встречей. Ни туда, ни сюда. Дай, думаю, сниму трейс с приложения. Вдруг что-то интересное найдётся.

А в качестве бонуса: использование var может привести к багам? Узнаем в самом конце ;)

Читать далее

Hibernate. Оптимизму здесь (не) место. Блокировки в БД

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

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

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

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

Читать далее

Быстрый старт: пишем фреймворк для фронтенда

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

Привет, Хабр. Меня зовут Марат Исаев. В этой статье я кратко рассмотрю устройство самописного микрофреймворка и его применение для написания приложения-планировщика, чтобы вы могли написать свой фреймворк, для своих приложений. Подчеркну: статья образовательная и не охватывает enterprise-разработку.

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

Читать далее

Три совета, как не выучить C++ за 21 день (субъективный гайд с дополнениями)

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

Типичная проблема новичков при изучении языка программирования — они тонут в море учебных материалов. Интернет предлагает тонны статей, курсов и книг по C++, но как выбрать действительно стоящие?

Меня зовут Владислав Столяров, я руководитель команды анализа безопасности продуктов в мультипродуктовой экосистеме МойОфис. Наши решения — Документы Настольные и Документы Онлайн — во многом работают благодаря C++, так что мне есть чем поделиться. В этой статье расскажу, что делать, если вы вдруг решили залететь в плюсы, но уже чувствуете, как накрывает экзистенциальный кризис от обилия информации.

Читать далее

Fail Case: Реализация полиморфизма без virtual на C++: концепты, трейты и Ref (и почему я отказался от этого подхода)

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

Как был переработан подход к полиморфизму в C++‑фреймворке Flox: замена virtual на статически сгенерированные vtable с концептами. В статье описана архитектура, проблемы, решение и метрики прироста производительности.

Читать далее

Обучение детей программированию, какой инструмент выбрать?

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

Для детей, изучающих программирование, существует несколько отличных сред, включая визуальные среды для начинающих и текстовые языки для более продвинутых. Scratch, Tynker, Swift Playgrounds подходят для начального уровня. Для детей постарше, Python является популярным выбором из-за простоты синтаксиса. 

Давайте теперь рассмотрим подробнее универсальные  среды программирования:

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

Читать далее

Need for speed: оценка ошибок измерений в футбольной аналитике. Часть 1

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

Привет! Меня зовут Артем, и я занимаюсь разработкой систем компьютерного зрения в сервисе Яндекс Спорттех. Среди основных задач нашей команды — футбольная аналитика и работа со статистическими данными.

Яндекс Спорттех обеспечил интеграцию технологических решений в РПЛ — все стадионы участников чемпионата были оборудованы камерами 6К, для клубов организована передача в режиме онлайн фитнес-данных и продвинутых данных на стыке технико-тактических действий. С помощью современных методов компьютерного зрения мы осуществляем детекцию игроков и мяча, ведём их трекинг, а также вычисляем различные ключевые спортивные метрики — пройденные дистанции, максимальные скорости, спринты и рывки, а также экстренные торможения и другие фитнес-показатели, важные как для аналитиков, так и для тренеров и поклонников игры.

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

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

Читать далее

Подключение Spring AI к локальным AI-моделям с помощью Foundry Local

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

Команда Spring АйО перевела статью, которая покажет, как интегрировать Spring AI с Foundry Local — десктопным приложением от Microsoft, совместимым с OpenAI API. Вы узнаете, как настроить локальную AI-модель, подключить её к Spring Boot и создать REST-эндпоинты для чат-бота и суммаризации текста. Всё это — с акцентом на производительность, безопасность и автономность.

Читать далее

QapGen: Создаём мощные парсеры на C++

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

QapDSLv2 — это язык который транслируется в обычный C++ код. Он позволяет удобно и компактно задавать грамматики/правила разбора кода программ, значительно упрощая разработку компиляторов/анализаторов/трансляторов.

QapGen — это генератор дерева_лексеров/парсеров описанных на QapDSLv2. Сама грамматика QapDSLv2 описана на QapDSLv2 на 100%. Поэтому QapGen как основной читатель этой грамматики сам генерирует часть своего кода(весь парсер QapDSLv2).

Основные фишки QapDSLv2 + QapGen — это:

1) Отсутствие этапа токенизации — дерево лексеров разбивает входной поток на лексемы и сохраняет их в строго типизированных древовидных С++ структурах пропуская этап токенизации.

2) Генерация оптимизированного кода полиморфных лексеров.

3) Полное сохранение всех лексем(даже разделители сохраняются, такие как пробелы/переходы на новую строку и комментарии) в результирующем дереве.

4) Возможность сохранить как оригинальное дерево, так и модифицированное обратно в код/текст без потери разделителей/комментариев.

5) Автоматическая генерация кода посетителей(это такой паттерн проектирования).

А теперь пример самой сочной части(рекурсивно самоописывающийся код):

structt_target_struct:i_target_item{
structt_keyword{
stringkw=any_str_from_vec(split("struct,class",","));
" "? // optional separator
};
structt_body_semicolon:i_struct_impl{";"};
structt_body_impl:i_struct_impl{
"{" // жрём скобочку
vector<TAutoPtr<i_target_item>>nested?; //рекурсия!
" "?
vector<TAutoPtr<i_struct_field>>arr?; // парсим поля
" "?
TAutoPtr<t_cpp_code>c?; // остальной С++ код
" "?
"}"
};
structt_parent{
stringa_or_c=any_str_from_vec(split("=>,:",","));
" "?
t_namename;
};
//точка входа в парсер:
TAutoPtr<t_keyword>kw?; //парсимstruct/class
t_namename; //парсим имя
" "?
TAutoPtr<t_parent>parent?;
" "?
TAutoPtr<i_struct_impl>body;
};

Читать далее

COBOL в XXI веке: почему банки и госслужбы не могут отказаться от языка 1959 года

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

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

Как старейший «серверный» язык справляется с XXI веком, где безопасность и гибкость важнее вечной стабильности?

Читать далее

Я написал свой VPN-клиент для Android. Зачем, если их сотни, и что скрывается под капотом?

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

Каждый раз, нажимая кнопку «Connect» в очередном VPN-приложении, я ловил себя на мысли: а что там, под капотом? Как эта магия на самом деле работает на уровне Android? Вокруг сотни готовых решений, но простое пользовательское любопытство переросло в профессиональное: мне захотелось не просто использовать, а понять. Понять, какие подводные камни скрывает VpnService, как реализовать весь цикл от авторизации до поднятия защищённого туннеля и что на этом пути может пойти не так.

Эта статья — мой личный "бортовой журнал". Я не претендую на создание самого безопасного решения, это скорее история о пути, граблях и открытиях для тех, кто тоже решит заглянуть под капот VPN-технологий на Android.

Так родилась идея этого проекта — создать свой, пусть и простой, VPN-клиент. Это не попытка сделать коммерческий продукт, а скорее исследовательское погружение, мой личный "челлендж" и способ разложить всё по полочкам.

Заглянуть под капот

Гайд на полиморфизм. Rust

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

В прошлых статьях мы разобрали теорию: что такое полиморфизм и какие существуют способы его реализации. Настало время посмотреть, как это реализуется на практике. В качестве примера был выбран Rust — язык с богатой функциональностью, с одной стороны, и простой, прозрачной реализацией — с другой.

Читать далее

Сейчас открою вкладку с ИИ и стану программистом

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

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

Читать далее

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

Как перестать бояться кодировок в Java — лайфхак для новичков

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

Когда вы работаете с текстовыми файлами в Java, особенно содержащими кириллические символы, то важно правильно управлять кодировкой. Ошибки в кодировке приводят к искажению текста, появлению квадратных символов или нечитаемых строк. В этой статье мы разберём примеры чтения и записи файлов с кириллицей, используя базовые классы ввода и вывода в Java.

Читать далее

RainLoop: от шелла через аттач, до кэша в инбоксе

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

Мы в Beget традиционно делаем ставку на безопасность и стабильность предоставляемых сервисов. Именно поэтому ещё в 2017 году запустили собственную программу поиска уязвимостей, а в прошлом году присоединились к инициативе BI.ZONE Bug Bounty, где продолжаем активно взаимодействовать с исследователями со всего мира.

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

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

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

Если вы интересуетесь безопасностью PHP-приложений, работой с legacy-софтом или просто любите хорошие багхантерские истории — этот текст определённо для вас.

Читать далее

Сорцы на выходные на «расте»

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

Наибольший кайф античных книг в их выдержке, актуальности. Книги точно проверены временем, актуальны (правда если знаешь в чем) и как ни странно, честны (книги хотели бы, чтобы их читали через сотню или тысячу лет). В программировании античные скрипты, наверно, написал Деннис Ритчи, сегодня же почитаем современников - Sean Parent (довольно известный чел в c++ тусовке) начал писать на расте (возможно, как начал так и закончил, но мы живем в моменте - поэтому предлагаю насладиться). Читать на расте сложнее, чем писать (это прям факт) - пишут его двое (автор и компилятор), а читают, ну читают на гитхабе. Далее в прозаическом сочинении свободной композиции, подразумевающем впечатления и соображения автора по конкретному поводу или предмету, рассмотрим компоненты новой библиотеки и попробуем насладиться примерами кода.

Читать далее

Языки программирования на все случаи жизни. Часть 1

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

В программировании существует десятки разных направлений, языков ещё больше, около 9000. Эта статья будет интересна для тех, кто только-только начинает свой путь разработчика или же для тех, кому просто интересно. К языку будут прилагаться библиотеки и фреймворки, которые нужны для обсуждаемых направлений (например, django для python в бэкэнде).

Читать далее

Flame-графики Doom для GPU

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

Код AI Flame Graphs теперь открыт, этот проект поддерживает GPU Intel Battlemage. Это значит, что AI Flame Graphs теперь способен генерировать flame-графики (Flame Graph, граф пламени, диаграмма пламени), охватывающие полный стек GPU — это даёт пользователям новые аналитические данные о производительности игр. Особенно полезным AI Flame Graphs выглядит в связке с FlameScope (это — мой опенсорсный проект, созданный несколько лет назад). Вот — пример профилирования игры GZDoom. Тут показаны результаты визуализации использования CPU и GPU, проведённые с помощью FlameScope и снабжённые комментариями.

Читать далее

Сотворение мира за 20 минут на JavaScript, или минималистичная модель эволюции

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

Впервые про моделирование эволюции я прочитал в 13 лет в статье «Жить и умереть в компьютере» (Техника — Молодежи, №5 1993 год). Она произвела на меня столь неизгладимое впечатление, что я тут же загорелся идеей создать что-то подобное.

Однако никак не удавалось проработать законы мира. Как организмы будут «смотреть» на окружающий мир? Как общаться? Как атаковать? Как кушать друг друга? Наконец, как будет устроен их «мозг»? Реализовать виртуальную машину, как в статье из журнала, или использовать что-нибудь проще, типа конечного автомата или схемы из блоков И-НЕ?

Короче, муки творчества да и, что уж там греха таить, ограниченные технические навыки, не позволили довести идею до ума. Я вернулся к ней уже в зрелом возрасте, лишенный юношеского максимализма и перфекционизма. Решил: раз сделать навороченную модель не получается, стоит начать с чего-то более простого. А лень и остатки перфекционизма в организме прошептали: с чего-то максимально простого.

Запустить эволюцию

ИИ заменит или изменит программистов? Техлиды рассказали правду

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

Волна паники захлестнула IT-сообщество. Гуру из Кремниевой долины наперебой объявляют о «смерти программирования». Стартапы хвастаются ИИ-инженерами, которые пишут код лучше людей. Новостные ленты пестрят заголовками о массовых увольнениях разработчиков. На этом фоне мы решили поговорить с теми, кто каждый день работает с кодом, — практикующими разработчиками, техлидами и архитекторами. Их откровения удивили. Оказалось, что между громкими заявлениями и реальностью — пропасть. ИИ действительно умеет писать код, но есть нюансы, о которых молчат в корпоративных презентациях. Разбираемся, где искусственный интеллект незаменим, а где он беспомощен как первокурсник, и почему программисты не торопятся переквалифицироваться в курьеров.

Читать далее

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