Как стать автором
Поиск
Написать публикацию
Обновить

Разработка

Сначала показывать
Порог рейтинга
Пройдите квиз и узнайте, какое направление Data Science выбрать
Пройдите квиз и узнайте, какое направление Data Science выбрать

🎓 Пройдите квиз и узнайте, какое направление Data Science вам подходит.

В онлайн-магистратуре «Науки о данных» доступны три профильных направления.
Чтобы выбрать подходящий трек, пройдите мини-квиз — он учитывает ваши интересы и бэкграунд.

🔹 ML Engineer
Создает и внедряет модели для обработки данных, изображений, видео и текстов — от прогнозирования оттока до диагностики по снимкам и разработки чат-ботов поддержки клиентов.

🔹 Data Analyst
Проектирует модели для анализа данных: сбор, очистка, визуализация, интерпретация данных. Например, создает дашборд для анализа продаж.

🔹 Data Engineer
Строит инфраструктуру для работы с большими данными: создает каналы и пайплайны для сбора, обработки и хранения данных.

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

👉 Пройти кви: https://t.me/mipt_ds_spec_bot

Теги:
Рейтинг0
Комментарии0

Дайджест открытых мероприятий на май:

1️⃣ AI-агенты в облаке
🗓 13 мая, 18:00 по Мск, онлайн
Узнаем, как строятся AI-агенты, какие инфраструктуры стоят за их работой и какие возможности открывает стажировка в Cloud.ru.
🔗 Регистрация

2️⃣Вебинар от Московского инновационного кластера: «Защита и регистрация интеллектуальной собственности в России»
🗓 14 мая, 12:00 по Мск, онлайн
Практические советы о том, как защитить свои разработки и оформить права на них.
🔗 Регистрация

3️⃣MTS Startup Hub: как найти и реализовать идею для технологического проекта
🗓15 мая, 19:00 по Мск, онлайн
Как придумать идею для стартапа, пройти путь предпринимателя и найти ресурсы на развитие.
🔗 Регистрация

4️⃣ Т-Банк: образовательный кредит — как получить высшее образование с господдержкой
🗓 20 мая, 19:00 по Мск, онлайн
Разберем условия образовательного кредита, преимущества, оформление и действия в случае отказа.
🔗 Регистрация

5️⃣MTS Startup Hub: анализ единорогов как топливо для развития стартапов
🗓 22 мая, 19:00 по Мск, онлайн
Как изучение успешных стартапов помогает понять рынок, находить инновации и строить перспективные бизнес-модели.
🔗 Регистрация

6️⃣ Карьерный буст: как ускорить профессиональный рост
🗓 29 мая, 19:00 по Мск, онлайн
Поговорим о карьерных стратегиях, востребованных навыках и росте в новых реалиях.
🔗 Регистрация

7️⃣MTS Startup Hub: создание прототипов и MVP
🗓 29 мая, 19:00 по Мск, онлайн
Как быстро и эффективно протестировать идеи на практике.
🔗 Регистрация

8️⃣Экскурсия в Сбер
🗓 30 мая, 16:30 по Мск, онлайн
Смотрим, как работает один из самых технологичных банков страны изнутри.
🔗 Регистрация

Участие во всех мероприятиях - бесплатное. Регистрируйтесь по ссылкам выше, а также:

➡️ Скачайте брошюру о магистратуре «Науки о данных»
➡️ Проходите курс «Введение в машинное обучение»
➡️ Получите доступ к записи Дня открытых дверей онлайн-магистратуры «Науки о данных»

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

Теги:
Рейтинг0
Комментарии0

Как правильно работать с паттернами кода?

Всем привет! Это третий сезон курса «Паттерны и практики написания кода». Первая серия вводная: в ней бэкенд-инженер Юра Афанасьев знакомит вас с историей паттернов и их функциями, а также рассказывает, как с ними правильно работать.

Смотреть VK
Смотреть YouTube

Подписывайтесь на канал AvitoTech в Telegram, там мы рассказываем больше о профессиональном опыте наших инженеров, проектах и работе в Авито, а также анонсируем митапы и статьи.

Теги:
Всего голосов 29: ↑29 и ↓0+29
Комментарии0

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

Каждый раз когда я сталкиваюсь с туториалами про корутины — самым первым примером идёт конечно sleep на 10 тысяч "потоков". Притом как вы понимаете, вызывать нужно специально подготовленный для этого sleep, а не настоящий Thread.sleep — потому что с ним никакой магии не получится. Это создаёт обманчивое впечатление будто бы любая блокирующая операция автоматически волшебным образом превращается в асинхронную, за бесплатно увеличивая пропускную способность приложения. Хотелось бы напомнить любителям корутин что это не так.

Никто за вас не перепишет обычное чтение из сокета/файлового дескриптора на асинхронные ввод-вывод с проверкой наличия байт для чтения во входящем потоке через Selector::select — чудес не бывает. И как бы вы не увеличивали kotlinx.coroutines.io.parallelism рано или поздно при безудержном использовании корутин пул потоков забьётся чем-нибудь медленным и ваше приложение просто встанет раком.

Для примера попросите чатжпт написать вам простейший echo socket server на корутинах. Ну и клиента, который попробует работать с этим сервером в 100 обычных потоков (не так уж и много для нормального продакшн бэкенда). Надеюсь для вас не будет сюрпризом то, что сервер будет обрабатывать только 64 первых счастливых клиентов, а к остальным доберётся только когда эти первые клиенты закроют соединения.

Теги:
Рейтинг0
Комментарии2

Кардинальное упрощение привязки GitHub, GitLab, Bitbucket в Amvera Cloud

Привязка репозиториев GitHub, GitLab, BitBucket вызывала у наших пользователей затруднения, и мы обещали упростить процесс.

Теперь для привязки репозитория достаточно указать токен и выбрать ветку и репозиторий.

Способ позволяет организовать максимально простой деплой и обновление приложений через git push. Для обновления приложения достаточно сделать коммит в привязанный репозиторий, и оно соберется и бесшовно запустится автоматически.

Заполняем три поля и CI/CD готов
Заполняем три поля и CI/CD готов

Подробная инструкция по подключению доступна по ссылке.

Amvera Cloud — это облако для простого деплоя приложений через git push (или интерфейс). Встроенный CI/CD, бэкапы и мониторинг позволяют развернуть проект тремя командами в IDE и не думать о настойке инфраструктуры. Amvera проще, чем использование VPS.

Теги:
Всего голосов 2: ↑1 и ↓1+1
Комментарии0

Как тестируют функцию Circuit Switched Fallback, которая помогает общаться с родственниками

Представим, что вы звоните семье со смартфона в 4G-сети. В вашей сети нет (или временно недоступна) поддержка голосового звонка через сеть 4G. Не имеет значения, в какой сети находится второе устройство.

Что происходит в сети оператора при таком звонке:

  • Телефон отправляет на базовую станцию (eNB) вызов.

  • Базовая станция связывается с ядром сети (MME) и запрашивает процедуру CSFB для исходящего звонка, дожидается от ядра сети подтверждения о возможности такого перехода.

  • После этого отправляет телефону информацию о новом подключении к 2G-сети, которое он должен установить.

  • После этого базовая станция завершает обслуживание абонента в 4G-сети, обслуживание переходит к станции 2G.

  • Голосовой вызов осуществляется через 2G-сеть.

Для тестирования такого сценария используют симулятор окружения базовой станции. Он имитирует обмен как с мобильным телефоном, так и с пакетным ядром сети. При этом базовая станция работает в обычном режиме, используются штатные методы управления и разъемы подключения, что позволяет нам рассматривать ее как черный ящик. 

Симулятор позволяет автоматизировать этот этап тестирования и увеличить скорость тестов и повторяемость результатов. CSFB — это базовая функциональность, поэтому проверка проходит регулярно.

Для успешной проверки CSFB задачу декомпозируют, разделяют на уровни. О двух других ступенях «пирамиды» — тестировании в GSM-сети и системном тестировании — рассказала инженер YADRO Анастасия Беднова в своей статье.

Теги:
Всего голосов 4: ↑4 и ↓0+5
Комментарии0

Магические шестиугольники. Обзор соревнования по программированию

Приветствую всех любителей спортивного программирования!

В данной статье рассмотрим интересный сайт для программистов - Al Zimmermann's Programming Contests.

На этой площадке проводится несколько соревнований в год. Каждое соревнование (контест) длится в среднем несколько месяцев. Задачи по своей формулировке не очень сложные. Но вот над решениями вам придётся изрядно потрудится.

Теги:
Рейтинг0
Комментарии0

Как быстрее и эффективнее расширять облачные ресурсы при пиковых нагрузках? Расскажем на бесплатном вебинаре.

📆 Когда: 13 мая в 11:00 мск

📍 Где: онлайн

Когда автомасштабирования кластера Kubernetes и масштабирования подов становится недостаточно, кластер необходимо расширять по событиям от внешних систем. На вебинаре вы узнаете, что делать, если триггер масштабирования кластера не утилизация, а события от внешних систем, например, сообщений Kafka или платформы CI/CD.

Эксперт покажет, как запустить приложение с учетом внешних систем, расскажет о классических подходах автомасштабирования, а также как масштабировать кластер по событиям с помощью KEDA (Kubernetes-based Event Driven Autoscaler).

Вебинар будет полезен разработчикам, DevOps-инженерам и архитекторам облачных решений.

Зарегистрироваться 👈

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Масштабирование Ethereum L1 и L2 в 2025 году и далее

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

Коротко по вступлению. Ethereum — это все еще про дух опенсорса, про трушность и киберпанк, про децентрализацию, социальные технологии и долгосрочную стратегию с далеко идущими планами.

🧐 От философии к делу

За последний год удалось добиться низкой платы за газ — это значит, что L2 работают. Они увеличивают пропускную способность Ethereum в 17 раз. Но есть и проблемки.

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

Курс Ethereum на L2 — максимальный, но от них также требуется следование общим идеям. Это значит, что каждый должен сфокусироваться на своих задачах: L1 улучшает блобы и другие фундаментальные аспекты сети (эффективность PoS, верификацию без хранения состояния, легкие клиенты, EVM, криптографию и хранение данных), а также наращивает стоимость ETH.

В свою очередь, L2 должны работать над:
• улучшением безопасности;
• улучшением стандартизации: пользователь должен использовать L1+L2 как единую экосистему, а не как десятки разных чейнов;
• улучшением времени ввода/вывода средств на L2;
• превращением гетерогенности из недостатка в преимущество: при базовой совместимости одни rollup'ы могут быть копиями EVM, другие - экспериментировать с виртуальными машинами или решать специфические задачи. Именно это и будет формировать мощную экосистему.

💾 Блобы, блобы, блобы

Блоб (blob) — это дешёвое, временное хранилище данных для rollup'ов (L2) в Ethereum. Блобы были добавлены в хардфорке Dencun (март 2024).

Основной упор масштабирования L1 — на блобы. Сейчас выделяется 3 блоба на слот, с форком Pectra это число удвоится. В дальнейшем весь фокус разработчиков Ethereum будет на увеличении количества блобов — уже есть идеи, как достигнуть 128 блобов на слот, а это около 100 000 транзакций в секунду.

🛡Улучшение безопасности

По градации L2Beat только три L2 достигли Stage 2, и ещё три находятся на Stage 1 — Optimism, Arbitrum и Ink. Это не есть гуд: стадии отражают уровень децентрализации и безопасности протоколов (от 0 до 2). Поэтому Ethereum должен продолжать работу по усилению безопасности L2, в том числе через нативно обрабатывая доказательства для rollup'ов через прекомпиляции.

🕸Интероперабельность и стандартизация

Цель — сделать перемещение активов между L2 таким же простым, как если бы это были шарды одного блокчейна.

Что для этого можно сделать в билжашем будущем:
• Адреса, отражающие связь с цепочкой. Например, ERC-3770.
• Стандартизация кросс-чейн взаимодействий — сообщения между цепочками должны полагаться только на криптографическую безопасность самих L2, без доверенных участников!!! Это булыжник 🗿 в сторону таких протоколов, как Axelar, LayerZero, Chainlink CCIP и т.д.
• Ускорение ввода-вывода средств с помощью ZK.
• Быстрое чтение из L1 повысит скорость синхронизации между L1 и L2.
• Общий секвенсор на базе L1. Секвенсор — это компонент rollup'а, который принимает и упорядочивает транзакции. Он определяет, в каком порядке данные попадут в блок и на L1.

💸 Экономика ETH

Поддерживать ценность ETH как тройного актива (triple-point asset: средство обмена, средство накопления, актив в DeFi), а также:
• ETH дожен быть главным активом всей экосистемы (L1 + L2).
• Мотивировать L2 отдавать часть комиссий в ETH.
• Увеличить количество блобов и рассмотреть минимальную цену за них.

Заключение

Все будет ок ☺️. Но нужно еще проделать большую работу и быть максимально активным гражданином участником сообщества вместо того, чтобы ругать Виталика и Ethereum Fondation.

@yarlykovrv

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии1

Architecture Meetup #2

Приглашаем на Architecture Meetup #2 — 21 мая в 18:30. Обсудим, почему процесс проектирования настолько сложен, как компании внедряют архитектурные репозитории, зачем нужна собственная система RSMА, а также к чему приводит использование архитектурных паттернов.

В программе:

  • Опыт внедрения архитектурных репозиториев в разных компаниях: что получилось, какие сложности возникают, сравнение разных подходов и несколько советов, как выбрать и внедрить архитектурный репозиторий.

  • Рассказа о том, как полностью изменился процесс создания архитектурных решений в банке — от ручного рисования разноцветных «детских» схем в Visio до масштабируемой автоматизации, которой пользуются сотни сотрудников, и зачем понадобилось изобретение собственного монстра Франкенштейна — системы RSM.

  • Обсудим, почему процесс проектирования ИТ-решений сложно представить в виде фиксированного набора задач, как адаптировать процесс проектирования к разным типам изменений.

  • Как прийти совсем не к тому результату, который ожидался, даже следуя паттернам и принимая на первый взгляд правильные решения.

Где: Офис Альфа-Банка по адресу Москва, Андропова пр-т., 18 к.3, в трёх минутах пешком от метро «Технопарк».

Присоединяйтесь онлайн и офлайн — зарегистрироваться можно по ссылке.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Отец канадского стартапера Маянка Джайна порезался кухонным ножом. К счастью, Маянк не запостил фотку с серьёзностью раны, однако можно понять, что достаточно сильно — сын повёл мужчину к врачу. Джайн с удивлением обнаружил, что врач сделал запрос в ChatGPT.

@mayankja1n

Однако не всё так возмутительно. Если судить по фотографии, терапевт просто забил в GPT-4o (видимо, не хочет расходовать лимит запросов к o3) полный список жалоб пацента: «Порез левого указательного пальца кухонным ножом, направление на хирургическую обработку раны и наложение швов». В ответ чат-бот записал ему историю заболевания (HPI, History of Present Illness) с какими-то шаблонными данными (нет аллергических реакций, не принимает никакие препараты, медицинской истории заболевания нет), результаты осмотра, оценку и план лечения.

Насколько можно судить, врач сгенерировал себе текст, чтобы не стучать самому по клавиатуре, заполняя стандартные формы. Однако заметно, что у него платный (тариф ChatGPT Plus) личный аккаунт, а не корпоративный. Лишь в последнем случае данные от пользователя для последующего обучения моделей использоваться не будут. Как известно, данные даже с платных персональных аккаунтов ChatGPT будут использованы для улучшения продуктов OpenAI.

С другой стороны, если судить по фото, то персональных данных пациента в бота врач не вводил.

Сам Маянк не сильно возмущён. Он тоже считает, что это просто экономия времени на бумажной волоките.

Вообще, любопытно подглядеть, что может спрашивать у ChatGPT врач-терапевт. Собственно чат про порез на пальце озаглавлен «План оценки похожего на грипп заболевания» — то ли этот чат продолжен от другого запроса, то ли врач редактировал запрос в этом же чате. После тоже идёт что-то медицинское: «Диагностика грибка ногтей на ногах», «Калькулятор углеводов в арахисовых M&M’s», «Боль в спине и одышка», «Дифференциальная диагностика кожного поражения», «Обзор анамнеза и текущих препаратов (PMH и Rx)».

Далее о потребностях в информации можно только гадать: «Приказ Аврааму о жертвоприношении», «Дифференциальная диагностика хронической сыпи на ногах». По-арабски там записано «كيفية قول علامة بالعربية» («Как сказать „знак“ по‑арабски»). Ниже опять продолжаются запросы, контекст которых ясен: «Запрос на краткое содержание разговора», «Ответ „Спасибо“», «Головные боли при наклоне».

Теги:
Всего голосов 3: ↑3 и ↓0+5
Комментарии7

Научите, как пользоваться Хабром

К примеру, открыл я сайт. Увидел статью (оказалось пост)

Статья и Пост
Статья и Пост

Решил поставить комментарий под постом. Просит залогиниться. Жму залогиниться...

И всё, нет поста. Потерялся видимо в моих "рекомендациях". Необоснованные трудности для пользователя на пустом месте.

При этом пост не имеет простой ссылки открываемой кликом по заголовку или тип того

Решил вопрос, нажав - поделиться, скопировал. Залогинился. Вставил ссылку. Перешёл....

Мне кажется не такой должен быть пользовательский путь

Теги:
Всего голосов 8: ↑7 и ↓1+9
Комментарии3

В феврале 2025 вышел релиз Docker Engine 28.0.0, устранивший проблемы безопасности:

Fix a security issue that was allowing remote hosts to connect directly to a container on its published ports. moby/moby#49325
Fix a security issue that was allowing neighbor hosts to connect to ports mapped on a loopback address. moby/moby#49325

В официальном блоге вышла статья с подробностями проблемы и возможными сценариями атак. Но, CVE заводить разработчики не захотели. Я не знаю какими принципами руководствовались разаботчики. По мне слова "Fix a security issue" тождественны созданию CVE. Я обратился в MITRE с описанием ситуации через эту форму (выбрал Request type - other). И получил такой ответ:

Thanks for the submission. We will treat this as a dispute/escalation request and reach out to Docker next. Hopefully that will spur them on to assign (it often does) but if not, we will take a look at assignment. 

Once we hear back we'll let you know if they changed their mind and decided to assign or what the next steps will be.

Надеюсь, CVE заведут. Мне и моим коллегам по цеху по безопасности гораздо удобнее оценивать безопасность архитектуры, имея единый источник проблем безопасности (база CVE). А не рыскать по всему интернету, пытаясь собрать воедино информацию о проблемах безопасности конктерных продуктов, придумывая какие-то запросы, вовзращающие релевантную информацию. Даже если описание в самом CVE сухое - всегда проще искать подробности по уникальному идентификатору CVE, чем выдумывать разные запросы для каждого конктерного продукта.

К сожалению, нежелание признавать CVE со стороны различных разработчиков случается периодически. В моей практике была ситуация, когда разработчик не просто не хотел заводить CVE, а ещё и желал, чтоб я сам отозвал CVE. После моего отказа пытался CVE оспорить (но, неудачно). Подробности - в статье "Как я зарегистрировал CVE и разозлил вендора"

Теги:
Всего голосов 6: ↑6 и ↓0+10
Комментарии0

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

Энтузиасты YouTube-канала Budget-Builds Official запустили Minecraft на ПК с Windows XP, процессором Athlon 64 и видеокартой Pine 3D Phantom XP-2800 2005 года выпуска, которая основана на SiS-чипе и обладает всего 8 МБ видеопамяти.

Изначально версия Minecraft 1.6.4 загрузилась, но выдавала всего 1 кадр в секунду и через две минуты вылетала. Чтобы добиться хоть какой-то стабильности, пришлось отключить все эффекты — облака, туман и анимации, а также снизить разрешение до минимума и использовать пакет текстур 8x8, чтобы предотвратить вылет игры. Даже генерация мира была перенесена на отдельный ноутбук, чтобы повысить производительность. Также игра изначально работала в такой старой конфигурации только на CRT-мониторе.

Теги:
Всего голосов 1: ↑1 и ↓0+2
Комментарии1

Класс расширения (Extension) для компонентов Joomla 5

Перевод с английского: Joomla! Programmers Documentation for Joomla 5.2

В ряде случаев Joomla может взаимодействовать с нашим компонентом. Например:

  • Роутер Joomla может использовать роутер нашего компонента для анализа и создания ЧПУ-адресов;

  • Если наш компонент поддерживает категории, то com_categories будет отображать в представлении категорий сводку по каждой категории, содержащую количество материалов с этой категорией, с разбивкой по статусу публикации;

  • Если наш компонент поддерживает пользовательские поля, то com_fields будет вызывать метод getContexts(), чтобы получить типы материалов, к которым можно привязать пользовательские поля;

  • Если наш компонент поддерживает мультиязычные связи, то com_associations потребуется знать типы материалов, для которых возможны связи;

  • И, конечно же, Joomla потребуется запустить наш компонент, чтобы получить вывод.

Причины введения класса расширения становятся понятнее, если рассмотреть, как другие части кода Joomla взаимодействовали с нашим расширением в Joomla 3.

В Joomla 3 все эти части кода обращались к кодовой базе нашего компонента довольно хаотичным образом — вызывая функции из различных вспомогательных файлов.

А в Joomla 4 это упрощено:

Начиная с Joomla 4, другие компоненты получают доступ к нашему компоненту com_example, вызывая метод:

$extension = $app->bootComponent("com_example");

Затем они могут вызывать необходимые им методы через этот экземпляр класса расширения.

Справка:

Класс расширения (Extension) компонента вы можете найти в административной части компонента. Например, для компонента com_content это файл Root/administrator/components/com_content/src/Extension/ContentComponent.php, для com_exampleRoot/administrator/components/com_example/src/Extension/ExampleComponent.php

Сразу после создания экземпляра класса расширения компонента код библиотеки Joomla вызовет метод boot вашего класса расширения, передавая дочерний экземпляр Контейнера внедрения зависимостей (Dependency Injection Container):

$extension->boot($container);

По сути, это возможность делать буквально всё, что вам нужно. Например, метод иногда используется для настройки определённых классов, которые будут использоваться с вызовами HtmlHelper::_(). Или же можно сохранить ссылку на ваш дочерний DI-контейнер (который иначе может быть сложно получить).

После первого создания экземпляра вашего компонента Joomla кэширует этот экземпляр. При повторном вызове

$extension = $app->bootComponent("com_example");

Joomla просто возвращает существующий экземпляр вашего класса расширения, вместо повторного создания объекта и вызова метода boot(). Вы даже можете вызвать bootComponent, передав свой компонент, чтобы получить ссылку на свой собственный объект расширения.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Ютубер с ником SAP-D1MA представил свою версию приключений Шурика из советских комедий в антураже Half-Life. Персонаж пробежался по лабораториям «Чёрной Меcы», поучаствовал в перестрелке со спецназом, попал в мир Зен и согласился на предложение G-Man'а.

— Операция «λ»!—А почему «λ»?—Чтобы никто не догадался…

— У вас в «Чёрной Месе» несчастные случаи были?— Нет, пока еще ни одного не было...— Будут!

—Простите, каскадный резонанс тоже я вызвал?

Теги:
Всего голосов 4: ↑2 и ↓20
Комментарии1

Расширения и дочерние контейнеры в Joomla 5

Перевод с английского: Joomla! Programmers Documentation for Joomla 5.2

Всякий раз, когда Joomla загружает расширение, она создает дочерний Dependency Injection Container (далее контейнер), исключительно для использования этого расширения. Это показано на схеме ниже.

Child DIC
Child DIC

Дочерний контейнер содержит указатель на родительский контейнер и функционирует аналогично основному контейнеру, но с некоторыми отличиями:

  • При каждом вызове метода set() для этого дочернего контенера пара ключ-значение добавляется в дочерний контейнер;

  • При каждом вызове метода get() для этого дочернего контейнера ресурс извлекается из дочернего контейнера, но если он там не найден, то поиск выполняется также в родительском контейнере.

Начиная с версии Joomla 4, разработчики Joomla рекомендуют создателям расширений использовать внедрение зависимостей (dependency injection) для своих расширений, определяя файл services/provider.php. Загрузка расширения теперь выполняется в два этапа, которые обрабатываются внутри файла services/provider.php:

  1. Класс расширения регистрируется в дочернем контейнере;

  2. Класс расширения извлекается из дочернего контейнера, создавая экземпляр этого класса.

Давайте рассмотрим минимальный пример этого для компонента com_example с пространством имён Mycompany\Component\Example.

use Joomla\CMS\Extension\ComponentInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Mycompany\Component\Example\Administrator\Extension\ExampleComponent;
return new class implements ServiceProviderInterface
{
  public function register(Container $container): void
  {
    $container->set(
      ComponentInterface::class,
      function (Container $container)
      {
        $component = new ExampleComponent();
        return $component;
      }
    );
  }
};

Мы видим, что когда Joomla выполняет require этого PHP-файла, возвращается экземпляр класса.

$provider = require $path;  // $path points to the relevant services/provider.php file

Переменная $provider указывает на объект, который является экземпляром этого анонимного класса. Кроме того, класс реализует интерфейс Joomla\DI\ServiceProviderInterface, что, по сути, означает, что он содержит метод register с указанной выше сигнатурой.

Когда Joomla выполняет

if ($provider instanceof ServiceProviderInterface)
{
  $provider->register($container);

будет вызван метод register, который добавит запись в дочерний контейнер с

  • key - ComponentInterface::class – это сокращённый способ в PHP указать строку 'Joomla\CMS\Extension\ComponentInterface';

  • value - функция, которая возвращает новый экземпляр класса ExampleComponent (основного класса расширения компонента com_example).

$extension = $container->get($type);

Функция выше будет запущена и вернет новый экземпляр ExampleComponent.

Вы можете самостоятельно изучить код Joomla в файле libraries/src/Extension/ExtensionManagerTrait.php и убедиться, что описанный выше шаблон также применяется к модулям и плагинам.

Обратите также внимание на следующую строку в этом файле:

if ($extension instanceof BootableExtensionInterface)
{
  $extension->boot($container);
}

Таким образом, если класс расширения реализует интерфейс BootableExtensionInterface, Joomla немедленно вызовет метод boot() экземпляра расширения, как описано в документации по расширениям.

Теги:
Всего голосов 2: ↑2 и ↓0+3
Комментарии0

Личный кабинет налогоплательщика, или как потерять доступ, если бы не длинный буфер обмена Windows 11

Обнаружил сценарий, при котором можно потерять доступ к личному кабинету (ЛК) налогоплательщика, если не сохранять в отдельном месте генерируемые пароли.

  1. Входим в ЛК.

  2. Нажимаем "Изменить пароль" в настройках профиля.

  3. Генерируем пароль сторонним сервисом, назовем его "Пароль 1".

  4. Вводим пароль, сохраняем.

  5. Вдруг система говорит, что в пароле нет цифр!..

  6. Хорошо, генерируем новый пароль, с цифрами.

  7. Вводим новый пароль... О-па, а в поле "Старый пароль" уже неверный пароль.

  8. Нервно ищем Пароль 1. Оказывается, что он применился, несмотря на ругань системы. Если не нашли, то всё... Мне помог длинный буфер обмена Windows 11.

Шёл 21-й век.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии6

Поддержка должна быть бесплатной. Всегда!

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

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

Я основатель облака для простого деплоя проектов через Git push – Amvera Cloud. И вижу, что пользователи пишут нам в поддержку. И говоря честно – люди пишут только тогда, когда другие способы не помогли и они не знают, как решить их насущную проблему. А это значит мы не доработали и сделали что-то непонятно или неудобно. И это наша обязанность постараться им помочь. И я не вижу морального права просить за это с них деньги.

Поддержка может работать не идеально, можно даже разделять клиентов во время высокой нагрузки на постоянных или новых, с высоким или низким чеком или любым другим образом, чтобы кому-то помочь в первую очередь. Но помочь нужно всем.

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

Поддержка должна быть бесплатной, всегда, и без всяких но! 

Теги:
Всего голосов 8: ↑7 и ↓1+6
Комментарии3

Российская студия Garden of Dreams выпустила трейлер Silicone Heart — симулятора фермы, чьё действие развернётся на планете, населённой сломанными роботами, которые недолюбливают людей. В ролике показали геймплейные кадры. Демоверсия Silicone Heart выйдет в Steam летом 2025 года.

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

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

Согласно анонсу, в Silicone Heart можно будет скрещивать растения и разводить животных, выполнять задания от местных роботов и развивать отношения с ними, а также автоматизировать добычу ресурсов.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии2