14544
Блог Lead JS-разработчика из Хельсинки Автор: @bekharsky По рекламе: https://telega.in/channels/htmlshit/card?r=GLOiHluU или https://t.me/it_adv Чат: https://t.me/htmlshitchat
#новость дня
Итак, мы писали Джаваскрипт в браузере, в консоли, на серверах, на микроконтроллерах, в играх, в кофеварках, в аудиоплеерах, телевизорах, в макросах офисных пакетов, в NoSQL базах данных...
Но до сих пор не писали его в хранимых процедурах MySQL!
Итак, встречайте: JavaScript Stored Programs in MySQL. И соответствующий пост в блоге Oracle: https://blogs.oracle.com/mysql/post/introducing-javascript-support-in-mysql
Зачем? Ну для разных целей:
1. Извлечение данных, очевидно
2. Форматирование
3. Примерный поиск
4. Валидация данных
5. Собственные алгоритмы сжатия, сериализации и десериализации данных
Пример:
CREATE FUNCTION gcd_js (a INT, b INT) RETURNS INT
LANGUAGE JAVASCRIPT AS $$
let [x, y] = [Math.abs(a), Math.abs(b)];
while(y) [x, y] = [y, x % y];
return x;
$$;
Котаны, мечтаете об айти-карьере за границей? Тогда обязательно стоит узнать о визе цифрового кочевника в Испании! 👨💻
🌐 Виза цифрового кочевника предоставляет уникальную возможность фрилансерам и удаленным сотрудникам освоить Испанию и получить вид на жительство после 5 лет пребывания!
🚀 Быстрое оформление, переезд с семьей и официальный статус пребывания делают испанскую визу наилучшим выбором для тех, кто стремится к новым горизонтам!
📈 Получайте свежие обновления и полезные советы о релокации в канале миграционного центра Mircare.
🔗 Ищете лайфхаки и подробные инструкции по каждому этапу? Так они прямо здесь — /channel/+6rQlKo-canRlNDc6
ООО «НД Коммерц Групп» ИНН: 7713410700 erid: 2SDnjcirWNL
#фишка дня
Даже две, но об одном и том же: как сделать "альбомный" бэкдроп у картинки.
Что такое бэкдроп? Это фон, который полностью зависит от контента, например, заливается усредненным цветом. Вы наверняка видели похожие эффекты в разных аудиоплеерах, отсюда и название — альбомный. Да и на ютубе раньше было модно заполнять края у вертикальных видео тем же размытым видео.
Итак, два варианта.
1. От Артура Бьена. Надо предупредить, он немного упоротый:
а) заполняем фон контейнера однопиксельными копиями картинки:
background-image: url(var(--bg));
background-size: 1px 1px;
background-repeat: repeat;
div::after {
--backdrop: invert(0.2) contrast(0.8) saturate(1.7) blur(8px);
backdrop-filter: var(--backdrop);
}
mix-blend-mode: overlay;
div: before {
content:"";
border- image:
var (--img) 2/
calc(50% - var (--w)/2 + var (--b)) /
calc (1.5*var(--b));
filter: contrast(.8) blur(var(--b));
}
#инструмент дня
Раз уж упомянули пару постов назад Кори Хауса, то давайте ещё чего-нибудь по его рекомендации.
И сегодня это инструмент для поиска дубликатов кода: jscpd.
Сразу ссылка на GitHub: https://github.com/kucherenko/jscpd
Как получаются дубликаты, клоны кода? Да от плохих абстракций. Сами по себе они ничем не плохи, ну есть у вас повторы там-сям, кому от этого плохо?
Ну, пока лежат — никому. Но если в одном таком куске кода баг — это лишь вопрос времени, когда он себя проявит в другим таком же куске. А чинить-то его везде надо.
Ну и на фронтенде банально раздувается размер бандла. Тоже такое себе.
Вообще, клонированный код это показатель того, что где-то у вас плохо с абстракциями, одна и та же логика применяется к, казалось бы, разным сущностям и так далее. Само по себе, это не так плохо, не просто же так в оппозиции к DRY (do not repeat yourself) существует WET (write everything twice).
Но иметь инструмент для поиска совсем уж лишнего — весьма неплохо.
А для тех, кому надо докопаться до сути, имеется целое исследование по поиску клонов кода, на 115 страниц: https://research.cs.queensu.ca/TechReports/Reports/2007-541.pdf
Но все, что я могу сказать — это что jscpd является реализацией детектора копий первого типа 🫠
Пользуется кто-нибудь чем-то подобным в своих проектах? Делитесь.
#js #clone #lint
Cloud Native DIY — бесплатный практический тьюториал от VK Cloud
В программе — все базовые знания по работе с современными облачными платформами на примере VK Cloud. Вы изучаете теорию и сразу же применяете ее на практике, выполняя домашние задания на платформе.
Что входит в Cloud Native DIY
✅ 20+ видеолекций от практикующих экспертов — инженеров и архитекторов облачной платформы.
✅ 3000 бонусных рублей каждому новому пользователю облачной платформы для выполнения практических заданий.
✅ Доступ к чат-боту с дополнительными видео и статьями, которых нет в открытом доступе.
✅ Сертификат о повышении квалификации после выполнения всех практических заданий.
Зарегистрироваться на курс: https://bit.ly/4b0R9ad
#баг дня
Дисклеймер: возможно, кто-то мне снова напишет, что стыдно таким делиться. Как правило, это характеризует людей, далёких как от разработки, так и от сути ведения блогов и каналов.
Преамбула
Некий сервис, назовём его Doodle Lampolytics, заставил всех своих клиентов переползти с модели подсчёта просмотров страниц на модель подсчёта событий.
Суть проблемы Doodle очевидна: постраничная модель слабо подходила для серьёзной аналитики данных в веб-приложениях. Даже элементарные лендинги стали гораздо сложнее, чем просто переходы по ссылкам.
И если раньше мы в нагрузку к «просмотру» передавали так называемые индивидуальные размерности и метрики, привязанные к сессии, то теперь — каждое событие могло нести индивидуальный их набор.
Не в последнюю очередь это связано с ужесточением запретов на слежку за посетителями сайтов.
Поскольку в типичном проекте зачастую присутствует не одна сотня событий/страниц, то переезд сопровождается знатным перетряхиванием всей аналитики проекта.
Суть
Суд да дело, приходим мы к идее передачи события с неком контекстом:
trackEvent('event_name', context) {}
{
productId,
optionId,
orderId,
locale,
}
product_id,
product_ıd
option_id,
option_ıd
const lowercase = (input = '', options) => input.toLocaleLowerCase(options?.locale);
Всем привет! 17 февраля в Питере пройдет первый DUMP Spb — масштабная IT-конференция для разработчиков и IT-менеджеров.
В программе — 32 доклада в 4 треках: Backend, Frontend, Testing&QA и Management. Уровень докладов — middle+. Будет очень много нетворкинга, общения со спикерами, движухи на стендах партнеров и теплая неформальная афтепати.
Вы сможете остановиться на каком-то одном треке или перемещаться из зала в зал, чтобы послушать самые интересные доклады. Вся программа конфы тут.
Что еще:
- Активный нетворкинг,
- Общение со спикерами и участниками конференции,
- Движухи на стендах партнеров,
- Большая афтепати,
- Горячий обед и кофе-брейки,
- Мерч, фотограф, записи докладов после конференции
По промокоду РАЗРАБОТЧИК скидка 10% на билеты.
#детектив дня
Сегодня в чат пришёл подписчик с забавной проблемой.
Дано: форма с двумя полями, одно просто как HTML-тег, второе — React-компонент. Ну, очевидно, компонент тоже содержит поле ввода.
При нажатию на клавишу Ввод событие onSubmit не происходит, форма не отправляется. Хотя, вроде как, всем известно, что это — стандартное поведение.
Было замечено, что при удалении React-компонента всё отлично работает. И первым предположением стало, что React что-то испортил, или песочница кривая.
Кто-то догадался сделать ванильный пример, поведение сохранилось.
То есть, вот такое:
<form onSubmit="alert('aha')">
<input type="text"/>
<input type="text"/>
</form>
<input type="submit" hidden/>
#статья дня
Smashing Magazine — один из старейших онлайн-журналов по веб-разработке. Статьи там как правило подбираются весьма подробные и полные, объясняющие все аспекты даже, казалось бы, простых эффектов.
Сегодня в наш канал залетает как раз такая статья: 3D-эффекты для картинок. Блеск, параллакс и поворот.
Весьма впечатляющий разбор, включающий в себя даже немного геометрических расчётов, чтоб вы понимали, откуда ноги растут.
Сразу ссылки на кодпены с примерами, чтоб далеко не ходить:
1. https://codepen.io/t_afif/pen/VwEJqKV
2. https://codepen.io/t_afif/pen/qBJyXNy
3. https://codepen.io/t_afif/pen/yLRRBKj
Ну и, конечно, сама статья: https://www.smashingmagazine.com/2023/07/shines-perspective-rotations-css-3d-effects-images/
Будет полезно не только лишь всем.
#css #3d #image #бородач
Прокачайте скилы c Холдингом Т1! 💙 🚀
➕ Если вы уже более года работаете разработчиком JS+React и хотите освоить новые перспективы для развития внутри профессии, то Открытые школы Холдинга Т1 для вас!
Мы поможем вам улучшить свои навыки и пригласим лучших в нашу команду!
В программе интенсива:
🔹 Паттерны и принципы программирования
🔹 Тестирования ПО, написание юнит тестов
🔹 Микросервисная архитектура + микрофронты
Как это работает:
🔹 подать заявку на сайте
🔹 пройти входное тестирование
🔹 достаточно 8 часов в неделю: 4 часа на вебинары и 4 часа на практические задания
🔹 всё онлайн и без отрыва от работы
Продолжительность - 1 месяц, стартуем уже в январе 🎓
🌟 Подавайте заявку до 24 января!
Реклама. ООО "ГК "ИННОТЕХ". ИНН 9703073496.
Материалы из этого канала дают на платных курсах
Frontend Portal — настоящий портал для тех кто хочет стать востребованным frontend-разработчиком. Полезные ресурсы, шпаргалки, разбор вопросов с собеседований, задачи, викторины и многое другое
👉 Присоединяйтесь к @FrontendPortal и станьте частью дружного frontend-комьюнити!
Короч, котаны, сейчас расскажу, как обстоят дела.
С появлением общедоступных чат-ботов, которые могут моментально сгенерить нужный код по запросу, планка начинающих специалистов во фронте стремительно растёт.
А значит растёт и конкуренция — ИИ выравнивает и усредняет уровень скиллов. Это как при ручной рубке деревьев был очень важен личный скилл, а после изобретения бензопилы все стали резко равны.
Но что же теперь отличает условного синьора от джуна? На мой взгляд, это две вещи: широкое понимание рабочей области и насмотренность. В непонятной ситуации синьор будет в курсе, в какую сторону копать в фундаментальных вещах, либо какая из блидинг-эдж технологий будет в тему.
То есть, чтобы оставаться на плаву, нужно одновременно и знать, куда идёт индустрия, и шарить в основах, на которых индустрия строится.
За новинками во фронтенде и за базой можно следить в авторском канале «Виталий и Веб-платформа». Примеры постов: Proxy и мемоизация функции, таймер с помощью Web Worker, URL Pattern API или фича-флаги в CSS. Также Виталий каждую пятницу публикует подборку новостей и свежих публикаций на тему фронта.
👉 @web_platform
#такое дня
Январь — время заполнения годовых Performance Review aka оценки эффективности работы.
Я, честно, в русскоязычном пространстве не работал в компаниях, где они проводились бы. Как в вашей компании это называется?
Как правило, степень упоротости глубины проработки проблем в отчётах зависит от... да ни от чего она не зависит. Бывает, что в компании на 10 человек проводится оценка по Методу 360 градусов, а бывает, что в огромной корпорации опираются только на число закрытых PR-ов и мнение менеджера.
В любом случае, очень часто приходится писать отчёт на самого себя. С одной стороны, сам себя не похвалишь — никто не похвалит, с другой — почти все мы подвержены синдрому самозванца.
Сегодня я услышал интересное мнение:
— Я просто везде отметил «выше ожиданий» и в комментарии попросил менеджера объяснить, почему он так не считает.
Позиция, как минимум, смелая. Она точно лучше чем отчёт, котором просто бы стояло «Соответствую ожиданиям» и всё.
Но насколько ж сильна вера в менеджера...
В любом случае, мне интересно, проходят ли и как подобные раунды оценки в ваших компаниях?
#work #review
#фишка дня
Что, котан, поймал ошибку CORS aka Cross-origin resource sharing error? В переводе на русский — ошибка совместного использования ресурсов между разными источниками.
Поздравляю, ты только что перешёл на следующий уровень в разработке.
В Википедии очень простое и понятное объяснение, что это такое. А нам же с тобой нужно как-то эту проблему обойти, пусть и временно.
Весь прикол ситуации в том, что отношения между сервером и браузером построены на доверии одного другому. CORS нужен не для защиты сервера, а для защиты клиента.
Кстати, именно поэтому первым решением проблемы с CORS могут быть специальные прокси: https://nordicapis.com/10-free-to-use-cors-proxies/
Если хотите, я подробнее потом о них расскажу. И о CORS тоже.
Но что делать если использование прокси не представляется возможным?
Всё просто, открываем Chrome DevTools и меняем заголовок Access-Control-Allow-Origin на *, нажав на карандашик рядом.
Естественно, таким образом можно менять и добавлять любые заголовки.
А ещё можно создать файлик с заранее прописанными заголовками — .headers — и включить его как правило через Add overrrde rule в Sources 👉 Overrides.
Всем безоблачной разработки, котаны!
#javascript #network #cors
#фишка дня от Гарри Робертса aka csswizardry.com
Когда-то очень давно поднялся вопрос красивого обтекания картинок. И появилась такая вещь: shape-outside.
Естественно, IE эту штуку не поддерживал вообще никогда, да и в целом современное направление фронтенда больше идёт в сторону приложений и блочной структуры, нежели документов с иллюстрациями.
Тем не менее, иногда надо. И поэтому, спешу напомнить: shape-outside нынче очень хорошо поддерживается и если вам нужно оформлять тексты, книги и статьи — самое время!
Если коротко, shape-outside позволяет описать контуры объекта, чтобы текст обтекал его именно по этим контурам. Более того, браузерам не нужен контур, они могут определить его самостоятельно по прозрачным областям PNG!
Вот только в Firefox требуется насильный репейнт... будем думать, как победить. А Safari чуть иначе определяет форму по альфа-каналу, нежели Chrome.
Upd. Важное дополнение! Чтобы правило shape-outside работало адекватно, не прячьте изображения в блоки; Firefox сходит с ума.
Ну и кодпен, конечно же: https://codepen.io/alinaki/pen/WNLVGae
Важный момент, это правило shape-margin, без него текст начинает прилипать к объекту.
Ну а статья, откуда взята фишка, вот: https://csswizardry.com/2023/07/the-http1liness-of-http2/
Весьма интересный обзор проблем протокола HTTP/2, если что.
#css #shape #img #бородач
#фишка дня
Стопудово вы делали эффекты как на видео через три div-а или span-а. Ну просто потому что трансформации на SVG это абсолютная боль.
Типа такого: https://codepen.io/alinaki/pen/abXpvyQ
Да, пример очень простой, но даже это на SVG бывает проблемно санимировать.
Хотя, казалось бы, для этого и предназначено.
А вся проблема в том, что для SVG определение координат для преобразований происходит немного иначе, нежели чем для элементов. Выходов из ситуации есть несколько.
Первый, от Аны Тюдор: исправить viewBox, поставив вместо 0, 0 (левый верхний угол) — -width/2,-height/2, соответственно, исправив остальные координаты.
Второй, интереснее, от Джея: указать следующие правила в CSS:
transform-box: fill-box;
transform-origin: 50% 50%;
#статья дня
На связи опять стилизация скроллбаров. Мы только недавно обсудили, как избежать некоторых связанных с этим багов в Safari, как подоспел Chrome 121 с интересным обновлением.
И что он нам принёс? Вы не поверите, поддержу стандартных правил scrollbar-width и scrollbar-color.
В Firefox они с 2018 года, а Chrome всё это время использовал правила от WebKit. Впрочем, все пользовались и было пофигу.
Пример:
.scroller {
--scrollbar-color-thumb: hotpink;
--scrollbar-color-track: blue;
--scrollbar-width: thin;
--scrollbar-width-legacy: 10px;
}
/* Modern browsers with `scrollbar-*` support */
@supports (scrollbar-width: auto) {
.scroller {
scrollbar-color: var(--scrollbar-color-thumb) var(--scrollbar-color-track);
scrollbar-width: var(--scrollbar-width);
}
}
В «Аптечной сети 36,6» выросла скорость загрузки приложений после миграции ИТ-ландшафта в облако
«Аптечная сеть 36,6» продает товары для здоровья через сайты и мобильное приложение. Компания столкнулась с проблемой: старая ИТ-инфраструктура перестала отвечать ее растущим потребностям.
Чтобы улучшить пользовательский опыт, повысить управляемость и безопасность инфраструктуры, приложение для электронной торговли перенесли в облако VK Cloud. Вот какие результаты компания получила:
🔹Сайты и мобильное приложение работают быстрее — загрузка страниц сократилась с 1 до 0,67 секунды.
🔹Уменьшились затраты на построение инфраструктуры: развертывание обошлось на 35% дешевле, чем предыдущее.
🔹Компания соблюдает ФЗ-152 «О персональных данных».
Облако помогает улучшить работу любых интернет-магазинов и маркетплейсов. Вы можете перенести в облако готовый сайт или разработать его с нуля, используя готовые сервисы.
Узнайте о возможностях VK Cloud для интернет-магазинов
#такое дня
Решил принести вам на ночь. В 2013 году в официальной документации React предлагалось использовать jQuery для AJAX-запросов, а в качестве mock-сервера использовать встроенный в Python HTTP-сервер.
Правда, я, помню, использовал для таких задач сервер, встроенный в PHP... ну кто что умел.
С тех пор прошло 10 лет. Где мы теперь, котаны? :)
#заметка дня
Иногда полезно спорить с мэтрами по поводу разных штук. Не стоит всё подряд принимать на веру.
Вот, например, Кори Хаус, весьма известный консультант по React, предложил буквально следующее: чтобы не запутаться в бесконечных хуках useEffect в React, вместо неименованной функции передавайте именованную.
То бишь, вместо:
useEffect(() => {
// do stuff
}, [...deps]);
useEffect(function doSomething() {
// do stuff
}, [...deps]);
function useDoSomething(deps) {
useEffect(() => {
// some effect
}, [...deps]);
}
#такое дня
Уже довольно поздно. Отметьтесь реакциями, кто ещё онлайн.
Наберём достаточное количество — скину историю смешного бага, который у нас недавно произошёл по невнимательности.
Не наберём — скину её утром. Никуда она не денется.
Upd. Хорошо разогнались. Сейчас всё будет.
#фишка дня
Как легко и быстро добиться эффекта фаски на кнопке без использования вложенных и псевдоэлементов?
Конечно же, использовать градиентный бордер!
— Ну да, конечно, это кто делает градиентные границы без вложенных элементов?
Ну как, кто. Мы и делаем. Всё довольно просто:
border: 0.5vw solid transparent;
background: linear-gradient(#17181c, #17181c) padding-box, linear-gradient(to right, #1e1e22, #121316, #1e1e22) border-box;
🖼️📤🖼️📤🖼️📤🖼️📤🖼️📤🖼️📤🖼️📤🖼️📤🖼️📤🖼️
Ошибка 78% фронтендеров — часами искать макеты
Кто поумнее, тот уже давно подписался на культовый канал для поиска — Макеты для вёрстки.
Админ этого канала уже давно экономит время и нервы тысячам разработчиков.
Короче, если хотите быстро собрать себе крутое портфолио, подписывайтесь: тыык
#фишка дня
Как заставить элемент изменять свою ширину... ступенчато?
Ну, например, вам нужно, чтобы шахматная сетка при любых условиях оставалась цельной.
И сегодня у нас аж несколько вариантов, как этого добиться.
1. От Аны Тюдор: https://codepen.io/thebabydino/pen/zYbZpBq
Используем функцию модуля:
width: calc(95vmin + -1*mod(95vmin, 15px));
min-width: round(95vmin,15px);
grid-template-columns: repeat(auto-fill, 15px);
#фишка дня
Сегодня на ваших экранах новая серия сериала "Не боги горшки обжигают".
На сей раз отличился Kent C. Dodds, которого уж никак нельзя упрекнуть в незнании фронтенда 🙂
Но давайте разбираться. Что же случилось?
Если пройти по ссылке, то можно понять, что случилась типичная для интернет-каталогов ситуация: карточка товара со ссылкой куда-нибудь ещё.
И да, если раньше всем было вообще пофигу на валидацию — рендерит и ладно — то нынче в дело вступают SSR/SSG и они не позволяют гидрацию невалидного HTML 🥁
А попасть в ситуацию такую ну просто слишком легко: достаточно обозвать пару компонентов как-то иначе, чем просто a, и всё, потерялись. Нет, кнопки тоже нельзя. Нет, любой интерактивный контент нельзя.
Так что же делать-то? Псевдоэлементы к спасению!
Верстаем как обычно, вставляем просто две ссылки: одну на товар, вторую куда-нибудь ещё. И растягиваем псевдоэлемент первой на всю ширину. Как-то так: https://codepen.io/alinaki/pen/OJdJQyB
Все довольны, котята спасены!
#css #trick #card #validation #бородач
#тип дня
Типом дня назначается вон тот в кожаной куртке. Да-да, о тебе говорю!
TL;DR: вычисленный тип функции с дженерик-аргументом можно сузить, декларируя тип как const.
Кроме шуток, разве тебя не бесит, что указываешь вот дженерик тип аргумента функции, производишь манипуляции над переданным объектом — а в ответ тебе вычисленный базовый тип?
Непонятно? Давай так:
function wrapNames <T>(names:T[]) {
return names.map<{name: T}>(name => ({name}));
}
const [first, second] = wrapNames(['Sergey', 'Alex'])
{
name: string;
}
function wrapNames <const T>(names:T[])
{
name: "Sergey" | "Alex";
}
// initValidator
function parse<const T extends { name: string; surname: string }>(users: T[]) {
return (name: T['name']) => users.find(u => u.name === name)?.surname;
}
// validate
const getSurname = parse([
{
name: 'Joe',
surname: 'Doe',
age: 30,
},
{
name: 'John',
surname: 'Dohn'
}
]);
getSurname: (name: "Joe" | "John") => string | undefined
#codepen дня
Давно собирался написать игру по Гарри Поттеру, но не знал, как?
Не расстраивайся, я принёс решение! Steve Gardner и его прекрасное создание Spell Caster!
Вот: https://codepen.io/ste-vg/full/zYerxoR
Я обожаю подобные примеры. Игра буквально укладывается в несколько экранов кода, но красива до безобразия.
Из технологий — Three.js и стейт-машина Stately, позволяющая описывать состояния приложения через удобные диаграммы.
Много комментариев по коду, интересная реализация распознавания жестов. Хоть сейчас бери и в магазин выкладывай :)
Я залип, в общем, как в игре, так и в её исходниках.
#webgl #threejs #game #бородач
Ваш Level Up в мире Frontend-разработки
WEBIK — канал для каждого, кто стремится проверить и углубить свои знания в вебе.
Там публикуют:
✓ Тесты на понимание кода с объяснениями
✓ Разборы задач и вопросов с собеседований
✓ Авторские обучающие статьи простым языком
✓ Макеты и эффекты для ваших пет-проектов
✓ Крутые рецепты кода
✓ Очень смешные мемасики
Вступай в WEBIK и становись крутым web разрабом!
#codepen дня
Ну что, кажется, настало то время, когда для стилизации радиокнопок и чекбоксов не нужно больше изгаляться с input:checked+i. Это освобождает мозг и руки для более приятных вещей.
Итак, смотрим на пример от Джона Кантнера: https://codepen.io/alinaki/pen/ExMXbqz
1. Для начала, обнуляем все браузерные стили и предположения браузера об внешнем виде радиокнопок вообще через appearance: none.
2. Я вам этого не говорил, но, технически, уже давно можно на поля ввода накладывать псевдоэлементы. Но не на select. Я всё хочу написать большой пост про реализацию select, пока вот так.
Благодаря этой возможности, собственно, можно стилизовать чекбокс как душе угодно: ::before, ::after, :checked::before, :checked::after... В целом, лично я бы обошёлся радиальным градиентом и одним псевдоэлементом.
3. Освободившиеся ресурсы мозга и тот факт, что теперь все элементы красиво вложены в label (как минимум, не нужны for и id), можно отправить на реализацию разных эффектов.
Например, проверить, есть ли лейбл с выделенным чекбоксом и подвинуть к нему рамку:
label:nth-of-type(2):has(input[type="radio"]:checked) ~ .selection {
transform: translateY(100%);
}
Каналы любого уважающего себя разработчика:
Java Developer — поможет узнать обо всех тонкостях и секретах языка Java.
Python Developer — научит программировать на Python как настоящий разработчик.
Подписывайся и прокачивай свои навыки👇🏻