JuniorDevOps Engineer > Контейнеры и доставка > Скриптинг и автоматизация
Короткий ответ Относительный путь интерпретируется от текущей рабочей директории процесса, а она у cron (как правило, $HOME пользователя или /) и в терминале разработчика отличается; поэтому скрипт с относительными путями и урезанным PATH из cron часто не находит ни свои файлы, ни внешние команды, хотя при ручном запуске из нужной директории всё работает. Как это работает подробнее при ручном запуске из терминала рабочая директория — та, где вы находитесь, и PATH содержит все пути из профиля оболочки (.bashrc, .profile); cron запускает задачи с минимальным окружением, без загрузки профиля пользователя и обычно с рабочей директорией $HOME или неопределённой. Пример кода Что использовать на практике Рекомендация. в скриптах автоматизации нужно либо использовать абсолютные пути ко всем файлам и исполняемым командам, либо явно переходить в нужную директорию в начале скрипта (cd "$(dirname "$0")" или заданный абсолютный путь), а также явно задавать PATH и нужные переменные окружения в самом скрипте или в crontab.
bashcron
MiddleJava Developer > Java Core > ООП
Короткий ответ Абстрактный класс — это класс, который нельзя инстанцировать: он задаёт шаблон наследникам и может содержать абстрактные методы, обычные методы с реализацией, поля, конструкторы и статические члены. Интерфейс описывает контракт поведения: до Java 8 в нём были только абстрактные методы и константы, с Java 8 появились default- и static-методы, с Java 9 — private-методы. Как это работает подробнее Оба механизма описывают абстракции, но решают разные задачи. Класс может наследовать только один абстрактный класс, зато реализует сколько угодно интерфейсов — это частично компенсирует отсутствие множественного наследования. На практике их часто комбинируют: класс наследует абстрактную базу и дополнительно реализует один или несколько интерфейсов. Состояние — абстрактный класс может иметь поля и конструкторы (вызываются через super()); в интерфейсе только константы public static final. Методы — в абстрактном классе абстрактные и обычные методы; в интерфейсе с Java 8 — default, static, а с Java 9 — priva
abstract-classinterface
JuniorJava Developer > Java Core > Spring
Короткий ответ @Controller — MVC-контроллер классических веб-приложений: его методы возвращают имя представления (JSP или шаблон Thymeleaf), в которое передаётся модель. @RestController — специализированная аннотация для REST-сервисов: комбинация @Controller + @ResponseBody, поэтому методы сразу возвращают данные. Как это работает подробнее Методы @RestController возвращают данные (как правило, JSON или XML), которые автоматически сериализуются в тело ответа с помощью HttpMessageConverter (например, Jackson). Ни @ResponseBody на каждом методе, ни view resolver для этого не нужны. Ключевое отличие: @Controller возвращает представление (view), а @RestController — данные (JSON/XML). Сфера применения: @Controller — классические веб-приложения на Spring MVC, @RestController — REST API и микросервисы. Возврат данных из @Controller: чтобы отдать JSON или XML, к методу нужно добавить @ResponseBody. Пример кода Что использовать на практике Для REST API и микросервисов всегда используйте @RestController — в Spring Boot
javamvc
JuniorDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ L4-балансировщик работает с TCP/UDP-соединениями, маршрутизируя трафик по IP и порту без анализа содержимого запроса; L7-балансировщик понимает протокол приложения (обычно HTTP/HTTPS) и может маршрутизировать по пути URL, заголовкам, cookie, а также терминировать TLS. Как это работает подробнее L4 просто пробрасывает пакеты/соединения на backend на основе сетевых данных, что даёт минимальную задержку; L7 терминирует HTTP-соединение, разбирает запрос и может принимать решения на основе его содержимого. Пример кода Что использовать на практике Рекомендация. L7 выбирают для веб-приложений и API, где нужна маршрутизация по пути/домену; L4 — для нагрузок, где важна минимальная задержка или используется не-HTTP протокол. Проверка. запрос на /api/users маршрутизируется в api-группу, запрос на /static/logo.png — в static-группу, что видно в access-логах балансировщика по полю target group. Подводные камни Риск. пытаться делать маршрутизацию по URL на L4-балансировщике, который не видит содержимое HTTP
httplayer-4
MiddleDevOps Engineer > Контейнеры и доставка > Балансировка нагрузки
Короткий ответ L4-балансировка работает на транспортном уровне, распределяя трафик по IP-адресу и порту назначения без анализа содержимого запроса (быстрее, протокол-агностична), L7-балансировка работает на прикладном уровне (чаще HTTP/HTTPS), анализируя содержимое запроса (путь, заголовки, cookies) для более гибкой маршрутизации; health checks в обоих случаях нужны, чтобы исключать из пула нездоровые backend-серверы и не отправлять им трафик. Как это работает подробнее L4-балансировщик принимает решение о распределении на основе заголовков транспортного/сетевого уровня (например, IP:порт, иногда с учётом хэша для consistent hashing), не завершая и не разбирая прикладной протокол, что даёт низкую задержку и возможность работать с любым TCP/UDP-трафиком; L7-балансировщик терминирует соединение, разбирает HTTP-запрос и может принимать решения вроде маршрутизации по пути URL, добавления заголовков, терминации TLS, что требует больше вычислительных ресурсов, но даёт гораздо более гибкую логику. Пример кода Что ис
health-checkshigh-availability
JuniorSMM Manager > Общее > Контент и форматы
Короткий ответ Вертикальное видео (9:16) занимает весь экран смартфона и подходит для форматов, которые смотрят в полноэкранном режиме с телефона (Stories, Reels), а горизонтальное (16:9) удобнее для контента, который смотрят на большом экране или сохраняют как привычный «киношный» формат; выбор зависит от конкретного плейсмента, а не от моды на формат. Как это работает подробнее ориентация видео должна соответствовать тому, как и на каком устройстве его будут смотреть: вертикальный ролик в горизонтальном плеере будет с чёрными полями по бокам, и наоборот. Что использовать на практике Рекомендация. перед съёмкой видеопродюсеру сообщают точный плейсмент (например, Reels, обложка видео на сайте, рекламный баннер), а не просто «снимите видео», чтобы он сразу выбрал правильную ориентацию кадра и композицию. Подводные камни Риск. снимать горизонтальное видео и затем обрезать его по бокам под вертикаль, теряя важные элементы кадра; считать, что вертикальный формат всегда лучше работает, без учёта того, где именно б
content-productionimpressions
JuniorData Analyst > SQL и данные > Инструменты и инженерные практики
Короткий ответ VLOOKUP ищет значение только в первом столбце диапазона и возвращает значение из столбца правее по фиксированному номеру, а INDEX+MATCH ищет в любом столбце и возвращает значение из любого другого столбца независимо от порядка, что делает его устойчивее к добавлению новых колонок. Как это работает подробнее Как это работает: VLOOKUP(искомое; диапазон; номер_столбца; ЛОЖЬ) берёт N-й столбец от начала диапазона; MATCH находит позицию значения в одном диапазоне, а INDEX возвращает значение из другого диапазона по этой позиции, то есть столбец поиска и столбец возврата не обязаны быть рядом. Пример кода Что использовать на практике На практике: если в таблицу позже добавляют новый столбец между столбцом поиска и столбцом возврата, формула VLOOKUP с жёстко заданным номером столбца начнёт возвращать неверные данные, а INDEX+MATCH продолжит работать правильно, так как ссылается на диапазоны, а не на номер по счёту. Пример и проверка. Таблица заказов в столбце A — ID заказа, в столбце C — сумма. Формул
excelgoogle-sheets
JuniorData Analyst > SQL и данные > Статистика и теория вероятностей
Короткий ответ Генеральная совокупность — это все объекты, о которых мы хотим делать выводы (все пользователи продукта), а выборка — её часть, которую мы реально наблюдаем и анализируем; статистика используется, чтобы по выборке делать обоснованные выводы о совокупности. Как это работает подробнее параметры генеральной совокупности (истинное среднее, истинная доля) обычно неизвестны; мы оцениваем их статистиками, посчитанными по выборке, и эти оценки содержат неопределённость. На практике часто приходится явно формулировать, какую именно генеральную совокупность мы имеем в виду — всех пользователей, только платящих, или пользователей конкретного региона. Пример кода Что использовать на практике На практике: в аналитике «генеральная совокупность» часто условна — например, «все будущие пользователи» нельзя пронаблюдать целиком, поэтому мы работаем с историческими данными как выборкой. Важно, чтобы выборка была репрезентативна: случайный отбор или отбор без систематического смещения относительно совокупности, о
populationsample
JuniorDevOps Engineer > Контейнеры и доставка > Безопасность и DevSecOps
Короткий ответ Административные права дают возможность изменять и удалять любые ресурсы, что при ошибке или компрометации аккаунта приводит к максимально возможному ущербу; роль read-only ограничивает субъекта просмотром данных без возможности их изменить, резко снижая потенциальный ущерб даже при компрометации. Как это работает подробнее уровень прав определяет «блаcт-радиус» — что именно может сделать скомпрометированный или ошибочно действующий субъект. Административная роль обычно включает действия create/update/delete над широким набором ресурсов, тогда как read-only ограничивается get/list/describe и не позволяет вносить изменения. Пример кода Что использовать на практике Практика. для большинства задач мониторинга, дежурств первой линии, аналитики достаточно read-only доступа; административные права выдают точечно и временно (например, через запрос доступа с ограничением по времени — just-in-time access) только тем, кому они действительно нужны для конкретной задачи. Проверка. Ожидаемое поведение: поль
access-controliam
MiddleJava Developer > Java Core > Multithreading
Короткий ответ wait() — метод класса Object, а sleep() — статический метод класса Thread. wait() служит для межпоточной коммуникации, вызывается только из синхронизированного кода и при вызове освобождает монитор объекта. sleep() просто приостанавливает текущий поток на заданное время и не освобождает удерживаемые блокировки. Как это работает подробнее wait() вне синхронизированного метода или блока бросит IllegalMonitorStateException. Поток переходит в ожидание, пока другой поток не вызовет notify()/notifyAll() на том же объекте либо не истечёт указанный таймаут; без таймаута ожидание может длиться «вечно». sleep() можно вызывать где угодно, он всегда принимает время задержки и удобен для имитации пауз. Пара wait()/notify() — классический механизм схемы «производитель — потребитель» для ожидания наступления условия. Оба метода бросают проверяемое InterruptedException, которое нужно обрабатывать. Пример кода Что использовать на практике Используй wait()/notifyAll(), когда поток должен ждать наступления услови
javamultithreading