Обновить
1116.39

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

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

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

URL как контейнер состояния

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

Пару недель назад, когда я писал пост The Hidden Cost of URL Design, мне нужно было добавить подсветку синтаксиса SQL. Я направился на веб-сайт PrismJS, пытаясь вспомнить, можно ли добавить его в качестве плагина. Меня утомило количество вариантов на странице скачивания, поэтому я вернулся к своему коду. Поискав в файле PrismJS, я нашёл в его начале комментарий, содержащий URL:

/* https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+css-extras+markdown+scss+sql&plugins=line-highlight+line-numbers+autolinker */

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

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

Я задумался: как часто мы, фронтенд-разработчики, забываем об URL как об инструменте управления состоянием? Мы пытаемся использовать для этого всевозможные абстракции: глобальные хранилища, контексты, кэши, забывая при этом одну из самых древних и изящных фич веба: скромный URL.

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

Читать далее

Заводим друзей в C# (аки C++ friend, однако, более того)

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

Премьера! Драматическое признание в любви (к Ф...).

100 рублей и 100_000 юаней!

Реализации аналогов друзей в C#, различные подходы, сравнительный анализ. Элвис жив!
Вах, заходи дорогой(-ая), другом будешь!

Читать далее

Паттерны ООП в 10 минутах от вас… Поведенческие шаблоны с примерами на Java

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

Ночь. Курсор мигает, как маяк в тумане. Логи шепчут о том, что в коде — своя улица, свои правила и кодекс общения. Объекты — не безмолвные элементы системы. У каждого свой характер, привычки и слабости. Один щёлчок и поведение меняется: кто-то отдаёт приказы, кто-то внимательно прислушивается, а кто-то терпеливо ждёт сигнала. Эта статья — карта такого города.

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

Шаблонизироваться

Заменяем лишние if-проверки на assert для инвариантов кода в C/C++

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

Многие разработчики привыкли везде ставить if-проверки, даже для условий, гарантированных кодом. Зачем проверять то, что не может нарушиться? Такие проверки создают шум в коде и мусор в релизе. Assert решает эту проблему: документирует допущения и исчезает из финальной сборки. В статье покажу все преимущества assert'ов и предостерегу от подводных камней их использования.

Читать далее

Ранняя история алгебраических типов данных

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

Это началось со статьи «Алгебраические типы данных на самом деле не такие страшные». Мы знаем о типах‑суммах и типах‑произведениях. Но задумывались ли вы когда‑нибудь о том, откуда они получили такие имена, и как вообще были открыты они и их свойства? Я провел последнюю неделю в кроличьей норе истории, и я просто обязан поделиться тем, что я нашёл.

Читать далее

Ноябрь 2025: обновленный рейтинг технологий от TrueIndex

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

Уже начало ноября, и мои парсеры давно собрали свежие данные. Сегодня я поделюсь анализом обновления рейтинга и новостями проекта...

Читать далее

PID 1 на минималках: свой init, который жмёт зомби

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

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

Сегодня расскажу о довольно узком, но довольно интересном моменты работы с Linux — о процессе с PID 1 и зомби-процессах. Когда запускаешь приложение в минимальном окружении и оно оказывается первым процессом, могут возникнуть небольшие сюрпрзики. Та же команда ps может показывать несколько процессов со статусом <defunct>. Эти дефекты и есть зомби-процессы. Столкнувшись с ними впервые, можно растеряться, ведь процесс уже завершился, а запись о нём всё торчит в таблице процессов. Как так, и главное, что с этим делать?

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

Разобраться, как работает PID 1

Мои личные скрипты для повседневной работы

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

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

Читать далее

Насколько Java быстрая?

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

Некоторые считают Java раздутым монстром, а Rust — чемпионом производительности. Но что, если взглянуть на современную Java с Vector API и многопоточностью? 

В новом переводе от команды Spring АйО посмотрим на запуск масштабной симуляции частиц и сравним результаты. Правда ли, что бывалая Java всё ещё умеет удивлять? 

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

Читать далее

Не искушайте пользователей делением на ноль

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

Команда разработчиков прислала мне на ревью свой API, в одной из частей которого множество поддерживаемых значений выражалось в виде трёх чисел:

• Минимального допустимого значения.
• Инкремента.
• Максимального допустимого значения.

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

Команда сообщила, что если инкремент равен нулю, то поддерживаются только минимальное и максимальное значения.

Я указал, что эта архитектура искушает пользователя делить на ноль.

Читать далее

Офлайн-конвертер PNG в WebP прямо в браузере

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

Недавно столкнулся с задачей: нужно было быстро перевести несколько сотен PNG-файлов в WebP для сайта, но делать это через онлайн-сервисы не хотелось — во-первых, передавать изображения куда-то сторонним серверам не очень удобно, а во-вторых, процесс обычно занимает заметное время.

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

Читать далее

Мой подход к обучению. ИИ-ментор

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

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

Читать далее

Scala Digest. Выпуск 34

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

Привет, Хабр! Мы — Настя, Эвелина и Михаил — бэкенд-разработчики Т-Банка, пишем код на Scala и горим желанием его популяризировать.

Приветствуем любую обратную связь! (づ ◕‿◕ )づ

Читать тридцать четвертый

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

Компилер-пассы и тегированные локаторы: делаем плагинную архитектуру на DI

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

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

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

Читать про реализацию на Symfony

Компактный runtime-DI для Java: JSR-330, Class-File API и миграция за 2 дня

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

Когда начинал разработку системы многомерного анализа данных временных рядов Dimension-UI, для внедрения зависимостей в исходном коде решил использовать Dagger 2. Практический опыт показал, что для приложений с большим количеством динамически создаваемых объектов инверсия зависимостей, реализованная в Dagger 2, не подходит.

Да, создание графа зависимостей в compile-time — это, во-первых, очень быстро, и, во-вторых, удобно: получаешь сообщения об ошибках конфигурации уже при компиляции.

Но накладные расходы на сопровождение всего этого хозяйства – прямо скажем, это боль.

Чтобы реализовать scope-зависимости, приходится писать и поддерживать много инфраструктурного кода внутри объектов, куда мы внедряем зависимости. В Dagger 2 такая реализация, во-первых, «загрязняет» код, а во-вторых, серьезно осложняет тестирование. Изолировать методы удобным способом не получается: в тестах нужно писать очень много кода, чтобы прокинуть необходимый контекст и корректно мокировать внешние зависимости. Я туда просто не полез — покрывал unit- и UI-тестами только базовую функциональность, где были Singleton-зависимости.

Даже с одними Singleton’ами приходится поднимать отдельную тестовую инфраструктуру для запуска приложения в тестовом режиме. Это не просто неудобно — это очень затратно по времени. Если сравнить усилия, которые надо потратить на реализацию тестирования подобного функционала в Spring и Dagger… Сравнение будет не в пользу Dagger. В целом я начал думать о переходе на runtime-генерацию графа зависимостей.

Читать далее

Как «жыбий рыр» кейс делал

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

В этой статье я расскажу вам, как наша команда — «жыбий рыр» участвовала в хакатоне от DDOS‑GUARD

Рассмотрим, какой кейс мы выбрали, покажу, к какой реализации пришли и покажу наше решение, а в конце подведем итоги.

Читать далее

С появлением ИИ работа опытного программиста стала намного сложнее

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

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

Читать далее

Как стримить большие ответы в Django через StreamingHttpResponse и async-генераторы

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

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

Сегодня рассмотрим решение одной непростой задачи, как в Django выдавать очень большие объёмы данных, например, выгрузку в CSV или потоковый JSON-формат NDJSON) так, чтобы сервер не ложился от нагрузки, а пользователи быстрее получали первые данные. Разберём, как использовать StreamingHttpResponse и генераторы (в том числе асинхронные) для стриминга больших ответов и поговорим нюансах.

Подробнее о стриминге

Cursor 2.0: многоагентная AI-IDE и собственная модель Composer — что это меняет для разработчиков

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

В конце октября 2025 Anysphere представила Cursor 2.0 — крупное обновление AI-IDE с параллельными агентами и новой моделью Composer. Идея проста: вы ставите цели, а агенты пишут и проверяют код, тестируют и готовят диффы, а разработчик смещается к роли менеджера ИИ-процесса. В статье разбираемся, что именно появилось, на чем это работает и какие ограничения важно учесть.

Читать далее

Rust без паник: дельная техника для системного программирования

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

Может ли Rust заменить C? Этот вопрос беспокоил меня много лет. Тем временем я успел написать upb — библиотеку C для работы с Protocol Buffers, и сейчас являюсь её техническим руководителем. Вполне понятно стремление обеспечить безопасность памяти в пределах всего программного стека — поэтому и возникла идея портировать upb на Rust.

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

Но недавно я открыл для себя одну технику, которая заставила меня немного переосмыслить этот вопрос. Я назову её «Rust без паник». Притом, что этот метод определённо не нов, мне нигде не удалось найти подробного разбора, в котором бы рассказывалось, как именно этот метод используется и какие проблемы решает. Правда, интересная дискуссия по этому поводу велась в теме Enforcing no-std and no-panic during build, где есть ссылки на некоторые релевантные треды из почтовой рассылки, посвящённой разработке ядра Linux. Вот другой интересный тред: Negative view on Rust: panicking

Надеюсь, эта статья позволит заполнить данный пробел.

Читать далее

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