
Привет, Хабр!
Сегодня мы рассмотрим, как работает Injector
в Angular, зачем нужны декораторы @Optional
, @SkipSelf
, @Host
, и чем отличаются провайдеры на уровне root
, модуля и компонента.
Motion – Peter Sandberg
Привет, Хабр!
Сегодня мы рассмотрим, как работает Injector
в Angular, зачем нужны декораторы @Optional
, @SkipSelf
, @Host
, и чем отличаются провайдеры на уровне root
, модуля и компонента.
Привет, Хабр!
Сегодня рассмотрим, как работает fillfactor
в PostgreSQL — тот самый параметр, который никто не трогает, пока таблицы не начинают раздуваться как на дрожжах. Разберём, зачем он нужен, что происходит при UPDATE
, когда стоит менять его вручную и как не наломать дров.
Привет, Хабр!
Сегодня рассмотрим, как тестировать React‑хуки с помощью @testing-library/react-hooks
.
Привет, Хабр!
В этой статье рассмотрим, что такое композиционные хуки во Vue 3, зачем они нужны и как их использовать.
Привет, Хабр!
Сегодня мы рассмотрим самый — казалось бы — скромный модификатор, который способен сэкономить кучу времени в горячих участках кода. Речь, конечно, про in
-аргументы. Рассмотрим, чем они отличаются от ref
и out
, где ими действительно стоит пользоваться, а где лучше пройти мимо.
Привет, Хабр! В этой статье рассмотрим невинный на первый взгляд параметр shuffle=True
в train_test_split
.
Под «перемешать» подразумевается применение псевдо‑рандомного пермутационного алгоритма (обычно Fisher‑Yates) к индексам выборки до того, как мы режем её на train/test. Цель — заставить train‑и-test быть независимыми и одинаково распределёнными (i.i.d.). В scikit‑learn эта логика зашита в параметр shuffle
почти всех сплиттеров. В train_test_split
он True
по умолчанию, что прямо сказано в документации — «shuffle bool, default=True
».
Привет, Хабр!
Я не знаю, как у вас, а у меня перед глазами все еще маячат толстенные исходники WinForms-эра на C#, где любой порядочный объект, умеющий держать ручку к файлу или сокету, строго реализует IDisposable
. Закрыл — молодец, забыл — получи warning от IDE и пару нехороших утечек в production.
В Python, увы-ях, аналогичный контракт традиционно строили на del
и контекст-менеджерах. Первый: если объект в циклическом мусоре, финализатор может не вызваться вообще; к тому же при выключении интерпретатора порядок разрушения объектов хаотичен. Второй (with ... as
) шикарен, но требует явного вызова, а значит — дисциплины.
С выходом PEP 442 и появлением weakref.finalize
мы получили «почти IDisposable» — финализатор, которому не страшны циклы, и который честно отработает даже на shutdown, если правильно обращаться.
Привет, Хабр!
Сегодня коротко, но по существу разберёмся, зачем вообще нужен enumerate()
в Python и почему он почти всегда лучше, чем старый добрый range(len(...))
.
Привет, Хабр!
В этой статье разбираем один из самых коварных способов убить базу — плохие JOIN
'ы. Казалось бы, простое дело: связать пару таблиц — и вперёд. Но если в ON
засунуть LOWER(email)
, забыть про индексы или перепутать LEFT JOIN
с INNER
— сервер мигом начнет дышать на ладан.
Привет, Хабр!
Если вы хоть раз писали хоть что‑то сложнее REST‑контроллера в Spring, вы наверняка ловили больную ситуацию: два бина зависят друг от друга, инициализация идёт по кругу, и вот он — BeanCurrentlyInCreationException
. И если в этот момент вы вспомнили про @Lazy
— вы молодцы.
Сегодня я расскажу, как @Lazy
может быть полезен, где он только делает вид, что спасает, и какие альтернативы работают лучше.
Привет, Хабр!
Сегодня рассмотрим JUnit 5 и разберёмся, чем дышит аннотация @TestInstance(PER_CLASS)
, — зачем переопределять жизненный цикл тестового инстанса и когда это может помочь.
Привет, Хабр!
Сегодня разберёмся с юнит‑тестами в C# на основе xUnit v3 — библиотеки, которая стала практически стандартом де‑факто в.NET‑среде.
Почему именно xUnit? Всё просто: его создали Джим Ньюкирк и Брэд Уилсон — разработчики NUnit. Они решили выкинуть всю архаику вроде [SetUp]
, [TearDown]
и прочих рудиментов и построили фреймворк с нуля, строго под TDD. Весной вышла xUnit v3 2.0.2, в которой завезли Assert.MultipleAsync
, полностью обновили сериализацию. А в.NET 9 уже штатно продвигается Microsoft.Testing.Platform (MTP) — сверхлёгкий тестовый рантайм, с которым xUnit v3 работает прямо из коробки. Короче говоря, это самый нативный выбор под.NET 9 на сегодня.
Привет, Хабр!
Сегодня разберемся с @TempDir
— мощным, но часто недооценённым инструментом JUnit 5 для работы с временными файлами и директориями в тестах.
Привет, Хабр!
Сегодня говорим о том, что в какой‑то момент словит почти каждый разработчик, особенно если вы не просто пишете скрипты, а строите проекты — будь то Django, Flask или кастомная архитектура с бизнес‑логикой в отдельных слоях. Речь про круговые импорты: они не объявляют о себе заранее, не фейлят весь проект громко и сразу, но подкрадываются исподтишка. И вот вы уже сидите с ошибкой ImportError: cannot import name ...
или AttributeError
, гуглите часами, тасуете импорты туда‑сюда и ловите дежавю — кажется, это уже было, но где?
Классический ILogger.LogInformation($"User {userId}")
выглядит безобидно, но на деле компилятор: формирует итоговую строку через string.Format
‑like логику, боксит userId
, DateTime
, struct‑ы и прочее добро, а так же линкует все в object[]
ради структурированных логов.
Аллокационная цена вопроса — порядка 80 Б на сообщение (плюс трансферы в LOH, если вы особо многословны).
В.NET 8 Microsoft даже вынесла отдельный раздел «high‑performance logging» и честно сказала: «Да, обычные extension‑методы логов боксят и аллоцируют»
С выходом C# 10 компилятор научился разбирать $"строка"
не напрямую в string
, а в handler: структуру, которая получает куски литералов и плейсхолдеры. Базовый — DefaultInterpolatedStringHandler
.
Привет, Хабр!
getopts
— это встроенный в любой POSIX-совместимый Linux/Unix-shell мини-парсер аргументов. Один shebang — и у вас CLI-утилита без единой внешней зависимости. В статье рассмотрим, как выжать из getopts
максимум, где он спотыкается и когда пора переехать на getopt
или Argbash.
Привет, Хабр!
Сегодня разбираемся, почему sync.Map
— выглядит аппетитно, но почти всегда оказывается не тем, чем вы ожидали.
Привет, Хабр!
Сегодня разбираем &&* неувядающую классику C++ — ссылки & и указатели *. Казалось бы, два оператора, делов-то, но стгоит нырнуть под крышку — и выясняется: тут и разное время жизни, и несменяемость адреса, и прочие вещички. Разберемся в статье подробнее.
Привет, Хабр!
Сегодня рассмотрим, как обезопасить бизнес-логику от случайного (или злонамеренного) изменения DTO, чем опасна мутабельность моделей и какие инструменты дают C#, Java, Python и Go, чтобы вы больше никогда не ловили эти баги.
Привет, Хабр!
Сегодня у нас на повестке интересная тема: как адекватно обрабатывать ошибки в cmd-файлах (он же — Windows Batch).
В общем, если вам приходилось писать batch-скрипт, который делает чуть больше, чем echo Hello World — добро пожаловать. Рассмотрим как работает %ERRORLEVEL%, когда и как юзать exit /b, как раскладывать try/catch на лейблы и почему всё это ломается, когда в бой идут call, for и if.