Юрий Петров | ai engineering
Открыть в Telegram
Привет! 👋 Я руководитель отдела разработки. Здесь мы изучаем LLM, автоматизацию с n8n, делаем крутые приложения на Flutter и учим их думать с помощью ИИ. Новости, лайфхаки, интересные кейсы, присоединяйся. #flutter #dart #llm #ai #ollama #n8n #agent #go
Больше1 774
Подписчики
-224 часа
-127 дней
-6030 день
Архив постов
Repost from Стас Ильин | Flutter
❤️ Спасибо большое всем кто был на трансляции
🤟 Отличный онлайн собрали для субботнего утра! И отдельное спасибо всем кто задавал вопросы, вышло интересное обсуждение
Для вашего удобства сразу добавил подробные таймкоды, ведь мы обсуждали не только книгу но и кучу других вопрсов
📺 Для тех кто не мог смотреть в онлайне запись трансляции достпуна на канале
Repost from MADTeacher | Станислав Чернышев
Начинаем стрим авторского коллектива "Основы Flutter". Подключайтесь: https://youtube.com/live/oJkjpluOhFE?feature=share
Repost from MADTeacher | Станислав Чернышев
Всем привет!
У меня для вас хорошие новости по книге "Основы Flutter" 👀
Глава по локализации утверждена, а значит, в курсе "Основы Flutter" на степике обновление ^_^
Напоминаю, что уже завтра в 11 часов по Мск состоится стрим с авторским коллективом, где немного приоткроем завесу тайны над написанием книги, почему выбран такой сквозной проект, как началось сотрудничество с Surf и Mad Brains по разработке лабораторного практикума к книге и многое другое 🪨
Какая навигация в Compose лучшая? Может ли AI писать UI за вас? Как проходит переезд на Compose в большой компании?
С 24 по 28 марта на Podlodka Android Crew разберем всё, что накопилось за 3 года продакшн-использования Compose!
🔥 Дебаты по навигации в Compose — два эксперта - Аркадий Иванов (X (ex-Twitter) и Игорь Кареньков (HH.ru), два подхода, одна истина. Кто окажется убедительнее, решат зрители!
🤖 Как AI пишет UI за вас — Павел Королев и Алексей Утепов (QazCode) на практике покажут генерацию верстки реального макета в Jetpack Compose.
🏗 Опыт Avito: переезд на Compose — изменения затрагивают дизайн-систему, архитектуру, перфоманс, процессы. Ребята из Авито делятся опытом и советами.
🔍 Публичное собеседование по Compose — реальный кандидат, реальный код, разбор ошибок и живой фидбек.
Главное — всё, что обсудим, можно сразу применять на практике! Билеты тут 👉 https://podlodka.io/droidcrew
А промокод сообщества android_crew_13_IKzHWP даёт скидку еще в 500 руб🥳
Repost from Flutter Friendly
Привет, с вами Роза, Flutter Dev Friflex👋 И сегодня мы немного погрузимся в магию FutureOr!
Представьте, вы создаете некий абстрактный класс с различными методами, но точно не знаете, будет ли реализация асинхронной или синхронной. Конечно, вы можете создать два метода или изощряться с разными подходами, но действительно ли это хорошее решение?
Лучше, если вы объявите метод, как FutureOr.
FutureOr<T> — это такой хитрый тип в Dart, который говорит: «Эй, результат моего метода может быть либо обычным значением типа T, либо Future<T>, если вдруг придется подождать».
Звучит пока не очень понятно? Давайте разберемся на примерах.
Предположим, мы разрабатываем сервис, который получает данные. Одна реализация будет синхронной, другая — асинхронной:
import 'dart:async';
abstract class SomeService {
FutureOr<String> fetch();
}
class FirstImplService extends SomeService {
@override
Future<String> fetch() async {
await Future.delayed(Duration(seconds: 2));
return 'Данные из Future';
}
}
class SecondImplService extends SomeService {
@override
String fetch() {
return 'Простые данные';
}
}
Aбстрактный класс SomeService объявляет метод fetch() с типом возвращаемого значения FutureOr<String>. Это значит, что fetch() может вернуть либо String, либо Future<String>.
⚙️Когда же использовать FutureOr?
FutureOr — ваш спаситель, когда вам нужно абстрагироваться от того, является ли результат операции асинхронным или синхронным.
🔧Как обрабатывать FutureOr?
Самый простой способ — использовать проверку типа с помощью is Future.
Да, такой вариант решения может показаться не самым элегантным. Ведь чрезмерное использование is Future может запутать логику и сделать код менее читаемым. Но в некоторых случаях, особенно при работе с абстракциями, это вполне рабочий и понятный подход.
У меня с работой так же. Иногда мне нужен await, чтобы подумать, а иногда все складывается супер. А у вас?🎉 Потрясающие новости! Вышла новая версия Flutter!
✅ Flutter: 3.29.2
✅ Dart: 3.7.2
✅ Release date: 2025-03-13
✅ hash: c23637390482d4cf9598c3ce3f2be31aa7332daf
Новости от @FlutterObserver_bot
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
Короткие изменения согласно changelog:
🔄 Импеллер: текст, повернутый на 180 градусов, отображается неправильно. Исправлено масштабирование с вместо !
🔧 Исправлены сбои на устройствах Android старше API 29 при использовании импеллера OpenGLES.
🚫 Исправлена ошибка отсутствия глифа на устройствах Android и iOS.
📱 На устройствах iOS увеличено количество одновременных задач декодирования фонового изображения, чтобы устранить ошибки «Не удалось загрузить изображение из-за потери доступа к графическому процессору».
🚀 Повышение производительности рендеринга CanvasKit для web.
iOS исправляет сбой при выделении поверхности для .
🧰 Всегда используйте аппаратные буферы Android для просмотра платформы, если они поддерживаются.
🆕 Исправлена двойная загрузка canvaskit.wasm.
🔧 Добавлен пустой ввод-вывод для Android apps после миграции встраиваемого модуля версии v2.
🛠️ Для всех платформ исправлен сбой при одновременной анимации и взаимодействии с прокручиваемым объектом.
📱 На Android используйте Open GL вместо Vulkan MediaTek Soc.
Repost from MADTeacher | Станислав Чернышев
‼️В спецификацию Dart готовится обновление‼️
Замечен черновик новой фичи - Generic Constructors 😩
Не прошло и пары месяцев с упоминания о предыдущем заходе на поле конструкторов с фичей Enhanced Constructors, как команда Dart, в тайне от сообщества, начала работу над черновиком еще одного конструктора... на этот раз - универсального... 🛑
По задумке разработчиков, Generic-конструкторы должны позволить объявлять конструкторы с собственными параметрами типов, которые не отражаются напрямую в типе возвращаемого объекта. Это значит, что можно задавать дополнительные зависимости между аргументами конструктора. Сейчас приходится приходится прибегать к менее безопасным способам.
Планируется 2 типа Generic-конструкторов 🫠
1️⃣Простой
На данный момент, если требуется задать связь между параметрами конструктора (например, значение и функция для его вычисления), приходится использовать универсальные типы вроде Object? и Function, что снижает статическую проверку типов:
class C {
final int i;
C(this.i);
C.computed(Object? x, Function func): this(func(x)); // Unsafe!
}
с появлением этого конструктора можно будет явно указать зависимость между параметрами, исключая необходимость runtime-проверок
class C {
final int i;
C(this.i);
C.computed<X>(X x, int Function(X) func) : this(func(x));
}
void main() {
C(42); // Обычный конструктор.
C.computed('Hello', (s) => s.length); // Автоматическое выведение типа.
C.computed<String>('Hello', (s) => s.length); // Явное указание типа.
}
2️⃣ Условный
С помощью этого типа Generic-конструктора можно будет объявлять конструкторы, которые корректно работают только при определенных типовых аргументах.
Сейчас приходится писать такой код
class D<X> {
final X x;
final int Function(X, X) _compare;
D(this.x, this._compare);
D.ofComparable(X x): // Unsafe!
this(x, (dynamic x1, dynamic x2) => x1.compareTo(x2)) {
// Check at run-time that `X extends Comparable<X>`.
if (<X>[] is! List<Comparable<X>>) {
throw ArgumentError("The type argument failed"
" to satisfy `X extends Comparable<X>`.");
}
}
}
использование универсального конструктора сделает его более лаконичным:
class D<X> {
final X x;
final int Function(X, X) _compare;
D(this.x, this._compare);
D<X>.ofComparable<X extends Comparable<X>>(X x)
: this(x, (x1, x2) => x1.compareTo(x2));
}
void main() {
D.ofComparable(1); // OK, num удовлетворяет Comparable.
D.ofComparable<num>(1); // Тоже OK.
D.ofComparable(C(42), (c1, c2) => c1.i.compareTo(c2.i)); // OK.
D.ofComparable(C(42)); // Ошибка компиляции – тип не соответствует.
}
p.s. Вот теперь я уже точно уверен, что в команде Dart нашелся какой-то маньяк конструкторов... иначе как объяснить такой набор: по-умолчанию, фабричный, именованный, константный, а теперь вот еще первичный, объявляющий, расширенный и универсальный?👀
👍 - больше конструкторов Богу конструкторов
👌 - сомнительно, но Окей
👎 - не вижу от него пользы
#dart_lang@madteacher_channel🎉 Exciting news! Dart new version is out. Stay updated!
✅ Dart: 3.7.2
✅ Release date: 2025-03-11
✅ hash: 9594995093f642957b780603c6435d9e7a61b923
Новости от @FlutterObserver_bot
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
🎉 Exciting news! Dart new version is out. Stay updated!
✅ Dart: 3.7.2
✅ Release date: 2025-03-11
✅ hash: 9594995093f642957b780603c6435d9e7a61b923
🔗 Breaking changes
🔗 Changelog
🔗 Commit
🔗 Tag
Repost from MADTeacher | Станислав Чернышев
🚨Большое обновление🚨 курса "Основы Flutter (в разработке)", а значит и самой книги "Основы Flutter" 🥳
Не прошло и недели, как в курс добавился сквозной проект - игра "Тетрис" для главы по Dart (2 варианта консольной версии) и Flutter (по с 2-й по 4-ю главу включительно), а нулевая глава разжилась примером работы с фичей Null-aware elements 😎
В связи с добавленным объемом материалов, цена увеличивается на 300 рублей. Если вы хотели приобрести курс, но на это все никак не было "времени", по 16 марта его можно будет купить по старой цене, воспользовавшись скидкой 🫣
Но это еще не все 😇
22-го марта (суббота) в 11 часов по Мск состоится стрим с авторским коллективом, где немного приоткроем завесу тайн над написанием книги, почему выбран такой сквозной проект, как началось сотрудничество с Surf и Mad Brains по разработке лабораторного практикума к книге и многое другое 🪨
Интересно, какой логикой руководствуются люди, которые ставят задачу создать полностью готовое приложение (клиент + бэкенд) за месяц? Откуда такой «крутой» менеджмент? Из курсов, где за две недели готовят IT-специалистов? Могли бы еще добавить в требования, чтобы код был идеальным, несмотря на сжатые сроки, и готовность работать 24/7. 😁 Я боюсь даже представить, каким будет качество кода и архитектуры. Разработчиков-то понять можно: они сдадут проект, получат деньги и уйдут в закат. Но почему собственники не задумываются о последствиях? Вот простая аналогия: вы хотите сделать ремонт в ванной, мастер говорит, что нужно неделю, а вы ему: «Нет, давай за три дня». Так никто не поступает, согласитесь. Потому что это своё, родное, и все понимают, что качество требует времени. Почему же в IT эти простые истины не понимают? Или считают, что это «не своё, не родное»? Странно конечно, и грустно.
Дорогие и прелестные наши девушки, поздравляю вас с 8 Марта 🎉, желаю счастья, радости, благополучия. Не переставайте радовать нас и будьте счастливы 💐
Repost from Flutter Friendly
Привет, это Анна, Friflex Flutter Team Lead.
Признавайтесь, кому приходилось хотя бы раз писать расширения для строк, чисел и даже списков, чтобы выполнить какие-то простые преобразования или проверки, которых нет среди стандартных функций? Уверена, почти всем! Сегодня я расскажу, как перестать это делать.
Вам нужна всего одна библиотека — dartx.
Пакет дает доступ к дополнительным расширениям классов String, int, num, Iterable, DateTime, File и других, которые используются буквально в каждом проекте. Разберем самые интересные функции.
🔸String
1️⃣
capitalize() и decapitalize() — изменят регистр только первой буквы предложения
2️⃣ isNotNullOrBlank и isNullOrBlank — проверят, есть ли читаемое содержимое, при этом не учитывая специальные символы по типу \n и пробелов
3️⃣ urlEncode и urlDecode — в строке преобразуют ссылку в формат application/x-www-form-urlencoded или обратно
final capitalizedText = 'пример заглавной буквы'.capitalize(); // Пример заглавной буквы
final isBlank = ' \n'.isNullOrBlank; // true
final decodedText = 'Пример%20декодирования'.urlDecode; // Пример декодирования
🔸Iterable
1️⃣ sortedBy() и thenBy() — позволят вам выполнить сортировку по нескольким признакам
2️⃣ chunkWhile() и splitWhen() — объединит в подсписки при выполнении или невыполнении условия
final dogs = [
Dog(name: "Charlie", age: 1),
Dog(name: "Bark", age: 3),
Dog(name: "Charlie", age: 6),
];
final sorted = dogs.sortedBy((dog) => dog.name).thenByDescending((dog) => dog.age); // Bark, Charlie (6), Charlie (3)
final chunckedList =[1, 2, 4, 9, 10, 11].chunkWhile((a, b) => a + 1 == b); // [[1, 2], [4], [9, 10, 11]]
🔸DateTime/Duration (эти функции можно подключить отдельно через пакет time)
1️⃣isAtSameYearAs(date) — проверит, находится ли текущая дата в рамках одного и того же года даты date в параметре (есть аналогичные проверки по месяцу и дню)
2️⃣ minutes.fromNow и minutes.ago — высчитает DateTime по указанной длительности в будущем и прошлом
3️⃣ hours — создаст Duration объект из целого числа
final tenMinutes = 10.minutes; // Duration(minutes: 10)
final isAtSameYear = DateTime(2025, 01, 01).isAtSameYearAs(DateTime(2020, 10, 05)); // false
final timeInFuture = 5.minutes.fromNow; // DatiTime.now() + 5 минут
Это только малая часть того, что умеет dartx!
❤️ — если уже пользуетесь пакетом
🔥 — если только сейчас открыли для себя его чудесные функцииТут Стас решил поделиться инфой, сколько он заработал на своем приложении. Интересное видео, рекомендую 😎
https://youtu.be/kDabZ5HohGQ?si=Flii4Ve15epZYtad
Repost from MADTeacher | Станислав Чернышев
Всем привет!
У меня для вас хорошие новости по книге "Основы Flutter" 👀
Глава по тестированию отредактирована и утверждена, а значит, на курсе "Основы Flutter" на степике большое обновление ^_^
Если есть предложения по функциям, которые вы бы хотели видеть в боте @FlutterObserver_bot, или есть вопросы, или нашли баги. Пишите сюда, обсудим. Специально для этого создал отдельную тему в Хижине программиста. 😎
https://t.me/FlutterObserver_bot
+1
Всем привет, @FlutterObserver_bot научился отслеживать новые статьи на Medium в разделах Flutter и Dart. Бот уведомит вас, когда на Medium появится новая статья.
Также можно всегда в разделе «Сводка» запросить три последние статьи.
Будьте в курсе новостей по Flutter с FlutterObserver_bot.
Repost from MADTeacher | Станислав Чернышев
Рубеж в 700 страниц электронной версии книги "Основы Flutter" пройден 🥳🥳
Скорей всего на следующей неделе, после утверждения, курс на степике пополнится главой "Тестирование" 🤬
