MiddleJava Developer > Java Core > Multithreading
Короткий ответ Синхронизированные коллекции — это обёртки над обычными коллекциями, создаваемые через Collections.synchronizedList(), synchronizedMap() и т. п., а также исторические Vector и Hashtable: в них каждый публичный метод синхронизирован целиком, все операции захватывают один общий монитор коллекции. Concurrent-коллекции из java.util.concurrent (ConcurrentHashMap, CopyOnWriteArrayList и др.) спроектированы для высокой конкуренции: они используют гранулярную синхронизацию, CAS и слабо консистентные итераторы. Как это работает подробнее Synchronized-коллекции гарантируют потокобезопасность, но создают сильную конкуренцию: чем больше потоков обращается одновременно, тем больше времени они проводят в ожидании общей блокировки, поэтому масштабируемость плохая. Итерироваться по ним нужно внутри собственного блока synchronized, иначе поведение при параллельном изменении недетерминировано. ConcurrentHashMap в современных версиях синхронизирует доступ по корзинам таблицы: операции над разными корзинами не меш
concurrentcopyonwritearraylist
MiddleJava Developer > Java Core > Multithreading
Короткий ответ Синхронизированный нестатический метод захватывает монитор экземпляра this на всё время выполнения всего метода; статический синхронизированный метод блокирует монитор объекта класса (SomeClass.class). synchronized-блок позволяет указать, какой объект использовать как монитор, и ограничить синхронизацию только нужным фрагментом кода. Как это работает подробнее Пока поток внутри synchronized-метода на this, другой поток не сможет войти ни в один другой synchronized-метод того же объекта. Статические методы синхронизируются между собой на объекте Class, поэтому говорят про «класс-лок» в отличие от «объект-лока». Блок уменьшает время удержания блокировки и снижает конкуренцию (contention), поэтому считается более гибким и, как правило, более производительным: остальной код метода выполняется без блокировки. Монитор в Java реентерабелен: поток, уже владеющий монитором, может повторно войти в синхронизированный код по тому же объекту без взаимной блокировки самого себя. Пример кода Что использовать
javalock
JuniorPerformance Marketer > Google Ads > Атрибуция и оценка
Короткий ответ Click-through conversion засчитывается, если пользователь кликнул по объявлению и затем совершил целевое действие; view-through conversion засчитывается, если пользователь только увидел объявление (без клика) и позже совершил действие — это более «мягкая» и спорная форма атрибуции. Как это работает подробнее Для view-through площадка фиксирует факт показа объявления конкретному пользователю (через cookie/ID устройства) и затем проверяет, не совершил ли этот же пользователь конверсию в течение отдельного, как правило более короткого, окна показа (обычно от 1 до 7 дней, в зависимости от платформы). Технически оба типа конверсии фиксируются похожим образом — платформа сохраняет факт взаимодействия пользователя с объявлением (клик или показ) с привязкой к идентификатору пользователя, а затем при конверсии ищет совпадение в пределах соответствующего окна — просто для показов это окно почти всегда короче, чем для кликов. Что использовать на практике Практика. View-through конверсии часто используют в
analyticsattribution
SeniorJava Developer > Java Core > Multithreading
Короткий ответ volatile решает проблему видимости: чтение и запись volatile-переменной выполняются напрямую из основной памяти, а между записью одним потоком и чтением другим устанавливается отношение happens-before. Однако volatile не обеспечивает атомарность: составная операция «прочитать — изменить — записать» вроде counter++ остаётся неатомарной. Атомарные классы из java.util.concurrent.atomic дают атомарные операции без блокировок — на базе аппаратной инструкции CAS. Как это работает подробнее volatile идеален для флагов состояния вроде boolean running, которые один поток выставляет, а другой читает. При counter++ два потока могут одновременно прочитать старое значение и записать результат, «потеряв» одно из увеличений, — даже если поле объявлено volatile. Атомарные классы AtomicInteger, AtomicLong, AtomicReference предоставляют методы getAndIncrement(), addAndGet(), compareAndSet(expected, newValue), реализованные на аппаратной инструкции CAS (Compare-And-Swap). CAS действует оптимистично: compareAndSet
atomiccas
JuniorData Analyst > SQL и данные > SQL
Короткий ответ При LEFT JOIN условие в ON определяет, какие правые строки можно присоединить, но не удаляет строку слева. Фильтр в WHERE применяется к уже соединённому результату и может исключить строку с NULL справа. Как это работает подробнее Если оплаченного заказа нет, соединение с условием o.status = 'paid' в ON всё равно вернёт клиента, а поля заказа будут NULL. При таком же условии в WHERE выражение для этого клиента станет неизвестным, и строка исчезнет. Исключение возможно, если фильтр WHERE явно сохраняет отсутствующую правую часть, например WHERE o.status = 'paid' OR o.order_id IS NULL, но условие в ON обычно выражает намерение яснее. Пример кода Что использовать на практике Фильтруйте правые совпадения в ON. Это сохраняет все объекты левой таблицы. Фильтруйте итоговый набор в WHERE. Делайте так только когда действительно хотите исключить часть строк после соединения. Подводные камни Скрытый INNER JOIN. Условие WHERE o.status = 'paid' удалит клиентов без подходящего заказа. Проверка по nullable-по
join-conditionleft-join
SeniorPython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ WSGI и ASGI — это интерфейсы, которые позволяют Python-веб-приложениям общаться с веб-серверами. WSGI спроектирован для синхронных приложений, а ASGI дополнительно поддерживает асинхронный код, WebSocket и конкурентную обработку множества соединений. Как это работает подробнее Выбор интерфейса влияет на сервер и архитектуру приложения. WSGI. Web Server Gateway Interface традиционно используется при развёртывании Django и подходит для приложений без асинхронной обработки запросов. ASGI. Asynchronous Server Gateway Interface поддерживает синхронные и асинхронные приложения, включая асинхронные представления Django. Соединения. ASGI допускает долгоживущие соединения, например WebSocket, и асинхронные рабочие процессы. Серверы. Для WSGI используют Gunicorn и uWSGI, для ASGI — Uvicorn и Daphne. Обработка. WSGI обрабатывает каждый запрос синхронно, а ASGI позволяет обрабатывать множество соединений конкурентно. Что использовать на практике Классический Django. Для синхронного приложения оставайся на
asgideployment
JuniorJava Developer > Java Core > Основы Java
Короткий ответ Java — строго pass-by-value. При вызове метода создаётся копия значения аргумента. Для примитивных типов копируется само значение, для ссылочных — копия ссылки на тот же объект. Поэтому изменения состояния объекта внутри метода видны снаружи, а переприсваивание параметра — нет. Как это работает подробнее Разница между передачей по ссылке (как в C++) и по значению проявляется в двух типовых сценариях. Примитивный аргумент. Изменение параметра внутри метода никак не влияет на переменную в вызывающем коде: метод работает с копией значения. Ссылочный аргумент. По значению передаётся копия ссылки, но объект тот же самый: вызов list.add(...) или изменение поля будет видно снаружи. Переприсваивание. Если внутри метода выполнить param = new Something(), изменится только локальная копия ссылки, а исходная переменная продолжит указывать на прежний объект. Пример кода Что использовать на практике Помнить, что классический «обмен значений двух переменных» через метод в Java не работает — меняются лишь копи
javamethods
JuniorSMM Manager > Общее > Маркировка и рекламный комплаенс
Короткий ответ Здесь совмещены непроверяемая гарантия («результат гарантирован») и ложная срочность («мест ограничено»), а это распространённые признаки вводящей в заблуждение рекламы, которые во многих юрисдикциях могут нарушать правила защиты потребителей и, помимо юридического риска, подрывают доверие аудитории при разоблачении. Как это работает подробнее ложные гарантии и искусственно созданная срочность/дефицит — известная категория риска, которую регуляторы и площадки могут квалифицировать как недобросовестную рекламу независимо от качества самого продукта. Что использовать на практике Действия. Перед публикацией нужно проверять фактическую точность утверждений (можно ли реально гарантировать результат всем), не придумывать несуществующий дефицит и при сомнениях согласовывать текст с юристом или руководителем маркетинга. Проверка. Правка текста: «Результат гарантирован» заменено на «Многие клиенты отмечают улучшение в течение двух недель по данным внутреннего опроса»; ложное «мест ограничено» убрано, та
ad-disclosureadvertising-compliance
JuniorSMM Manager > Общее > Брендбук и Tone of Voice
Короткий ответ Нужно передать документ ToV, брендбук, список шаблонов ответов, архив ранее одобренных постов и, по возможности, провести совместный разбор нескольких черновиков, чтобы у обоих авторов было одинаковое понимание границ допустимого. Как это работает подробнее письменные документы задают формальные рамки, а совместный разбор конкретных примеров помогает выровнять интерпретацию неоднозначных моментов (например, где заканчивается «уместный юмор»). Что использовать на практике Подход. полезно ввести этап взаимной проверки черновиков друг друга в первые недели работы вдвоём, чтобы быстро выявлять расхождения в трактовке гайдлайна. Пример. Два SMM-специалиста в первую неделю совместной работы разбирают по 3 черновика друг друга и фиксируют спорные моменты (например, допустим ли конкретный мем) в общем FAQ-документе к ToV. Через месяц проводится повторная проверка 10 случайных постов обоих авторов на единообразие стиля. Проверка — субъективная оценка редактором или клиентом: «читается ли канал так, будт
brand-guidelinesbrand-management
MiddleData Analyst > SQL и данные > Аналитическое мышление
Короткий ответ Проверяю фактическое соотношение групп статистическим тестом (например, хи-квадрат на соответствие ожидаемому сплиту); если SRM подтверждён, результаты теста по основной метрике нельзя считать надёжными до устранения причины смещения в разбиении. Как это работает подробнее SRM означает, что сам механизм рандомизации или сбора данных работает не так, как задумано (баг в сплиттере, разное время жизни кук, различие в логировании между группами), и любое различие в метриках между группами может быть артефактом смещённой выборки, а не эффектом фичи. Пример кода Что использовать на практике Порядок действий. считаю наблюдаемое количество пользователей в каждой группе и сравниваю с ожидаемым хи-квадрат тестом; если p-value очень мал — SRM есть. Дальше ищу причину: разная задержка загрузки для одной из групп (что теряет часть событий), баг в условии сплита, различие в ботах/исключениях между группами, проблема с кэшированием для одного варианта. Не интерпретирую метрики теста, пока SRM не устранён. Под
ab-testingchi-square